using System; using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using MontanaJohns.Core; using MontanaJohns.Items; using UnityEngine; namespace MontanaJohns.Actors { [RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(CapsuleCollider2D))] public abstract class Actor : MonoBehaviour { [SerializeField] protected float gravityScale = 1.5f; [SerializeField] protected Stats baseStats = Stats.DefaultBaseStats(); [SerializeField] protected LayerMask groundLayer; [SerializeField] protected Transform groundCheckPoint; protected CapsuleCollider2D _collider; protected Rigidbody2D _rigidBody; protected SpriteRenderer _renderer; protected Animator _animator; protected Transform _transform; protected Stats stats; protected Active activeItem; Collection items; bool isFalling; public int health; protected int jumpCount; protected Vector2 acceleration; protected virtual void Awake() { _collider = GetComponent(); _rigidBody = GetComponent(); _transform = GetComponent(); _renderer = GetComponent(); _animator = GetComponent(); } protected virtual void Start() { _rigidBody.freezeRotation = true; _rigidBody.collisionDetectionMode = CollisionDetectionMode2D.Continuous; _rigidBody.gravityScale = gravityScale; items = new(); stats = baseStats; health = stats.maxHealth; jumpCount = stats.maxJumps; } protected virtual void FixedUpdate() { if (!_animator.GetBool("airborn") && !Physics2D.OverlapCircle(groundCheckPoint.position, 0.2f, groundLayer)) { _animator.SetTrigger("fall"); StartCoroutine(Falling()); } } public virtual void Move(float input) { var target = new Vector2(input * stats.speedMultiplier * 10, _rigidBody.velocity.y); _rigidBody.velocity = Vector2.SmoothDamp(_rigidBody.velocity, target, ref acceleration, .05f); _animator.SetBool("moving", Mathf.Abs(_rigidBody.velocity.x) > 0.001); if (_rigidBody.velocity.x < -0.001) _renderer.flipX = true; else if (_rigidBody.velocity.x > 0.001) _renderer.flipX = false; } public virtual void Jump() { if (jumpCount++ <= stats.maxJumps) { _rigidBody.AddForce(Vector2.up * stats.jumpForce); _animator.SetTrigger("jump"); _animator.SetBool("airborn", true); StartCoroutine(Falling()); } } public virtual void Use() { if (activeItem != null) activeItem.Use(); } public virtual void AddItem(Item item) { items.Add(item); stats = baseStats + items.Select(i => i.stats).Sum(); } public virtual void TakeDamage(int damage) { health -= damage; } IEnumerator Falling() { _animator.SetBool("airborn", true); while (_rigidBody.velocity.y > 0 || !Physics2D.OverlapCircle(groundCheckPoint.position, 0.2f, groundLayer)) { yield return new WaitForFixedUpdate(); } jumpCount = 0; _animator.SetBool("airborn", false); yield break; } } }