aboutsummaryrefslogtreecommitdiffstats
path: root/Assets/Scripts/Actors/Actor.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Actors/Actor.cs')
-rw-r--r--Assets/Scripts/Actors/Actor.cs208
1 files changed, 208 insertions, 0 deletions
diff --git a/Assets/Scripts/Actors/Actor.cs b/Assets/Scripts/Actors/Actor.cs
new file mode 100644
index 0000000..eb8185e
--- /dev/null
+++ b/Assets/Scripts/Actors/Actor.cs
@@ -0,0 +1,208 @@
+using System.Collections;
+using System.Collections.ObjectModel;
+using System.Linq;
+using MontanaJohns.Core;
+using MontanaJohns.Items;
+using UnityEngine;
+
+namespace MontanaJohns.Actors
+{
+ [RequireComponent(typeof(Rigidbody2D))]
+ public abstract class Actor : MonoBehaviour
+ {
+ [SerializeField] protected float gravityScale = 1.5f;
+ [SerializeField] protected Stats baseStats = Stats.DefaultBaseStats();
+ [SerializeField] protected Transform groundCheckPoint1;
+ [SerializeField] protected Transform groundCheckPoint2;
+ [SerializeField] protected float invulnTime = 0f;
+ [SerializeField] protected float hangTime;
+
+ protected Rigidbody2D _rigidBody;
+ protected SpriteRenderer _renderer;
+ protected Animator _animator;
+ protected Transform _transform;
+ protected AudioManager _audio;
+
+ protected Active activeItem;
+ protected bool isGrappling;
+ protected bool isMoving;
+ protected Vector2? grapplePoint = null;
+ protected LayerMask groundLayers;
+ protected Collection<Item> items;
+ protected int jumpCount;
+ protected Vector2 acceleration;
+ protected bool invuln;
+ protected float hangCount;
+
+ public Stats stats;
+ public int health;
+
+
+ protected virtual void Awake()
+ {
+ _rigidBody = GetComponent<Rigidbody2D>();
+ _transform = GetComponent<Transform>();
+ _renderer = GetComponent<SpriteRenderer>();
+ _animator = GetComponent<Animator>();
+ _audio = FindObjectOfType<AudioManager>();
+ groundLayers = LayerMask.GetMask("Grapple", "Ground");
+
+ _rigidBody.freezeRotation = true;
+ _rigidBody.collisionDetectionMode = CollisionDetectionMode2D.Continuous;
+ _rigidBody.gravityScale = gravityScale;
+
+ items = new();
+ stats = baseStats;
+ health = stats.maxHealth;
+ jumpCount = stats.maxJumps;
+ }
+
+ protected virtual void Start()
+ {
+
+ }
+
+ protected virtual void FixedUpdate()
+ {
+ if (!_animator.GetBool("airborn") && !(Physics2D.OverlapCircle(groundCheckPoint1.position, 0.2f, groundLayers) || Physics2D.OverlapCircle(groundCheckPoint2.position, 0.2f, groundLayers)))
+ {
+ _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) > 1);
+ isMoving = Mathf.Abs(_rigidBody.velocity.x) > 1;
+
+ if (_rigidBody.velocity.x < -0.1) {
+ _renderer.flipX = true;
+ for (int i = 0; i < transform.childCount; i++) {
+ var rot = transform.GetChild(i).rotation;
+ rot.y = 180f;
+ transform.GetChild(i).rotation = rot;
+ }
+ }
+ else if (_rigidBody.velocity.x > 0.1) {
+ _renderer.flipX = false;
+ for (int i = 0; i < transform.childCount; i++) {
+ var rot = transform.GetChild(i).rotation;
+ rot.y = 0f;
+ transform.GetChild(i).rotation = rot;
+ }
+ }
+ }
+ public virtual void MoveY(float input)
+ {
+ var target = new Vector2(_rigidBody.velocity.x, input * stats.speedMultiplier * 10);
+ _rigidBody.velocity = Vector2.SmoothDamp(_rigidBody.velocity, target, ref acceleration, .05f);
+ }
+
+ public virtual void Jump()
+ {
+ if (isGrappling)
+ Use();
+ if(Physics2D.OverlapCircle(groundCheckPoint1.position, 0.2f, groundLayers) || Physics2D.OverlapCircle(groundCheckPoint2.position, 0.2f, groundLayers))
+ {
+ jumpCount = stats.maxJumps;
+ hangCount = hangTime;
+ }
+ else
+ {
+ hangCount -= Time.deltaTime;
+ }
+ if (jumpCount > 0 && hangCount > 0f)
+ {
+ jumpCount--;
+ _rigidBody.AddForce(Vector2.up * stats.jumpForce);
+ _animator.SetTrigger("jump");
+ _animator.SetBool("airborn", true);
+ StartCoroutine(Falling());
+ }
+ }
+
+ public virtual void Use()
+ {
+ Vector2? grapplePoint;
+ if (activeItem != null)
+ {
+ grapplePoint = activeItem.Use();
+ if (grapplePoint != null)
+ isGrappling = true;
+ else
+ isGrappling = false;
+ }
+ else
+ grapplePoint = null;
+ this.grapplePoint = grapplePoint;
+ }
+
+ public virtual void Cancel()
+ {
+ if (PauseMenu.isPaused)
+ {
+ PauseMenu.Resume();
+ }
+ else
+ {
+ PauseMenu.Pause();
+ }
+ }
+
+ public virtual void AddItem(Item item)
+ {
+ items.Add(item);
+ stats = baseStats + items.Select(i => i.stats).Sum();
+ }
+
+ public virtual void Grapple(float xInput, float yInput, Vector2 grapplePoint)
+ {
+ Move(xInput);
+ MoveY(yInput);
+ }
+
+ public virtual void TakeDamage(int damage)
+ {
+ StartCoroutine(Damage(damage));
+ }
+
+ private IEnumerator Damage(int damage)
+ {
+ if(!invuln)
+ {
+ invuln = true;
+ health -= damage;
+ StartCoroutine(DamageAnimation());
+ yield return new WaitForSeconds(invulnTime);
+ invuln = false;
+ }
+ }
+
+ private IEnumerator DamageAnimation()
+ {
+ _renderer.color = Color.red;
+ yield return new WaitForSeconds(0.5f);
+ _renderer.color = Color.white;
+ }
+
+ private IEnumerator Falling()
+ {
+ _animator.SetBool("airborn", true);
+
+ bool falling = true;
+ while (falling)
+ {
+ if (Physics2D.OverlapCircle(groundCheckPoint1.position, 0.2f, groundLayers) || Physics2D.OverlapCircle(groundCheckPoint2.position, 0.2f, groundLayers))
+ falling = false;
+ yield return new WaitForEndOfFrame();
+ }
+
+ _animator.SetBool("airborn", false);
+
+ yield break;
+ }
+ }
+} \ No newline at end of file