using Assets.Scripts.Enums; using Assets.Scripts.Helpers; using System; using System.Collections; using System.ComponentModel.Design; using Unity.VisualScripting; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Tilemaps; [RequireComponent(typeof(Rigidbody2D))] public class PlayerController : MonoBehaviour { public float moveSpeed = 5f; public float maxFallSpeed = -20f; public float maxFallSpeedDamge = -10f; private float maxFallSpeedCurrent = 0f; Vector2 moveInput; [NonSerialized] public Rigidbody2D rb; Animator animator; Animator animator_rotor; public GameObject rotorGO; TouchingDirections touchingDirections; [NonSerialized] public Damageable health; // Time it takes to drill public float drillingTime = 1f; private float timeSinceDrill = 0f; [SerializeField] private bool _isMoving; public bool IsMoving { get { return _isMoving; } private set { _isMoving = value; animator.SetBool(AnimationStrings.Player.isMoving, value); } } [SerializeField] private bool _isFlying; public bool IsFlying { get { return _isFlying; } private set { _isFlying = value; animator.SetBool(AnimationStrings.Player.isFlying, value); animator_rotor.SetBool(AnimationStrings.Player.isFlying, value); } } [SerializeField] private bool _isDrilling; public bool IsDrilling { get { return _isDrilling; } set { _isDrilling = value; //animator.SetBool(AnimationStrings.Player.isDrilling, value); } } private bool _isFacingRight = true; public bool IsFacingRight { get { return _isFacingRight; } set { if (_isFacingRight != value) { transform.localScale *= new Vector2(-1, 1); } _isFacingRight = value; } } public bool CanMove { get { return animator.GetBool(AnimationStrings.canMove) && !PauseMenu.GameIsPaused && !IsDrilling; } } private void Awake() { rb = GetComponent(); animator = GetComponent(); animator_rotor = rotorGO.GetComponent(); touchingDirections = GetComponent(); health = GetComponent(); if (SaveSystem.isGameLoaded) { GameObject uiManager = GameObject.Find("GameManager"); uiManager.GetComponent().GameLoaded(); SaveData save = SaveSystem.LoadPlayer(); health.MaxHealth = save.maxHealth; health.Health = save.health; transform.position = VectorHelper.ConvertToVector3(save.position); rb.velocity = VectorHelper.ConvertToVector2(save.velocity); SaveSystem.isGameLoaded = false; } } private void FixedUpdate() { if (CanMove) { if (moveInput.y == 0) { if (rb.velocity.y <= maxFallSpeed) { // max fall speed, dont accelerate more rb.velocity = new Vector2(moveInput.x * moveSpeed, maxFallSpeed); } else { // normal fall rb.velocity = new Vector2(moveInput.x * moveSpeed, rb.velocity.y); } } else { if (rb.velocity.y < 0 && moveInput.y > 0) { // falling but moving upwards rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed) + rb.velocity.y); } else { // moving upwards no falling rb.velocity = new Vector2(moveInput.x * moveSpeed, (moveInput.y * moveSpeed)); } } if (touchingDirections.IsGrounded) { if (maxFallSpeedCurrent < maxFallSpeedDamge) { TakeFallDamage(Math.Abs((int)maxFallSpeedCurrent)); maxFallSpeedCurrent = 0; } } else if (IsFlying) { maxFallSpeedCurrent = rb.velocity.y; } else { if (maxFallSpeedCurrent > rb.velocity.y) { maxFallSpeedCurrent = rb.velocity.y; } } if (touchingDirections.IsGrounded && moveInput.y < 0 && !IsDrilling) { //IsDrilling = true; Drill(DrillDirection.Down); } if (touchingDirections.IsGrounded && moveInput.x != 0 && !IsDrilling) { if (touchingDirections.IsAtWallLeft && moveInput.x < 0) { Drill(DrillDirection.Left); } else if (touchingDirections.IsAtWallRight && moveInput.x > 0) { Drill(DrillDirection.Right); } } } if (IsDrilling) { rb.velocity = Vector2.zero; if (timeSinceDrill > drillingTime) { IsDrilling = false; timeSinceDrill = 0; } else { timeSinceDrill += Time.deltaTime; } } } public void OnMove(InputAction.CallbackContext context) { moveInput = context.ReadValue(); IsMoving = moveInput.x != 0; IsFlying = (moveInput.y != 0); SetFacingDirection(moveInput); if (IsDrilling) { IsMoving = false; IsFlying = false; //moveInput = Vector2.zero; } } private void Drill(DrillDirection drillDirection) { IsDrilling = true; ContactPoint2D[] contactPoints = new ContactPoint2D[1]; Debug.Log("drillDirection: " + drillDirection.ToString()); //rb.GetContacts(contactPoints); switch (drillDirection) { case DrillDirection.Left: touchingDirections.wallHitsLeft[0].collider.GetContacts(contactPoints); break; case DrillDirection.Right: touchingDirections.wallHitsRight[0].collider.GetContacts(contactPoints); break; case DrillDirection.Down: touchingDirections.groundHits[0].collider.GetContacts(contactPoints); break; } CharacterEvents.characterDrill.Invoke(contactPoints[0], drillDirection); } //private void DrillLeftOrRight() //{ // ContactPoint2D[] contactPoints = new ContactPoint2D[1]; // touchingDirections.wallHits[0].collider.GetContacts(contactPoints); // CharacterEvents.characterDrillLeftOrRight.Invoke(contactPoints[0]); //} private void SetFacingDirection(Vector2 moveInput) { if (moveInput.x > 0 && !IsFacingRight) { IsFacingRight = true; } else if (moveInput.x < 0 && IsFacingRight) { IsFacingRight = false; } } public void TakeDamage(int damage) { health.Hit(damage); } public void TakeFallDamage(int fallDamage) { TakeDamage(fallDamage); } //public void OnRun(InputAction.CallbackContext context) //{ // if (context.started) // Button pressed // { // _isRunning = true; // } // else if (context.canceled) // Button released // { // _isRunning = false; // } //} }