You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

143 lines
4.1 KiB

  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class Water : ActiveBlock
  5. {
  6. [Header("Water Settings")]
  7. [SerializeField]
  8. [Tooltip("GameObject which appears when character respawns")]
  9. private GameObject lillyPad;
  10. [SerializeField]
  11. [Tooltip("Distance character will be submerged into the water")]
  12. private float FallDistance = 0.5f;
  13. [SerializeField]
  14. private bool lillyPadStartUp = false;
  15. private bool isLillyPadUp = false;
  16. private Character trappedCharacter;
  17. public override int GetInitative()
  18. {
  19. return 0;
  20. }
  21. private void Start()
  22. {
  23. if (lillyPadStartUp)
  24. {
  25. StartCoroutine(LerpToPosition(lillyPad.transform, VisualPosition, 0));
  26. isLillyPadUp = true;
  27. }
  28. }
  29. public override IEnumerator OnWalkedOnByPlayer(Character player, Vector3 moveDirection)
  30. {
  31. yield return StartCoroutine(base.OnWalkedOnByPlayer(player, moveDirection));
  32. if (trappedCharacter == null && !isLillyPadUp)
  33. {
  34. CurrentPlayer = null;
  35. trappedCharacter = player;
  36. trappedCharacter.stuck = true;
  37. trappedCharacter.StartAnimation(Character.Animation.Hit);
  38. yield return StartCoroutine(LerpToPosition(trappedCharacter.transform, VisualPosition + Vector3.down * FallDistance, 1));
  39. }
  40. }
  41. public override void OnLeftByPlayer(Character player)
  42. {
  43. base.OnLeftByPlayer(player);
  44. if (isLillyPadUp && CurrentPlayer == null)
  45. {
  46. StartCoroutine(LerpToPosition(lillyPad.transform, VisualPosition + Vector3.down * FallDistance, 1));
  47. isLillyPadUp = false;
  48. }
  49. }
  50. public override IEnumerator OnRoundEnd(PlayerData[] allPlayers)
  51. {
  52. //Debug.Log("reseting water");
  53. if (trappedCharacter != null)
  54. {
  55. //if character is on an angle undo their last rotation
  56. if (trappedCharacter.transform.eulerAngles.y % 90 > 10 && trappedCharacter.transform.eulerAngles.y % 90 < 80)
  57. {
  58. trappedCharacter.transform.Rotate(Vector3.up, -trappedCharacter.lastRotation);
  59. trappedCharacter.lastRotation = 0;
  60. //if they are still on an angle fix to the closest rotation
  61. if (trappedCharacter.transform.eulerAngles.y % 90 != 0)
  62. {
  63. Vector3 newRot = trappedCharacter.transform.eulerAngles;
  64. newRot.y = Mathf.Round(newRot.y / 90) * 90;
  65. trappedCharacter.transform.eulerAngles = newRot;
  66. }
  67. }
  68. StartCoroutine(LerpToPosition(trappedCharacter.transform, VisualPosition, 1));
  69. StartCoroutine(LerpToPosition(lillyPad.transform, VisualPosition, 1));
  70. if (CurrentPlayer != null)
  71. {
  72. yield return new WaitForSeconds(0.2f);
  73. yield return StartCoroutine(PushPlayOnTop());
  74. }
  75. else
  76. {
  77. yield return new WaitForSeconds(1);
  78. CurrentPlayer = trappedCharacter;
  79. }
  80. trappedCharacter.stuck = false;
  81. isLillyPadUp = true;
  82. trappedCharacter = null;
  83. }
  84. isFinished = true;
  85. }
  86. private IEnumerator PushPlayOnTop()
  87. {
  88. Direction[] possibleDirections = DirectionExtras.RandomOrder();
  89. for (int i = 0; i < 4; i++)
  90. {
  91. if (Block.isBlockAtPosition(position + possibleDirections[i].ToVector() + Vector3.up, 1, ~0))
  92. continue;
  93. yield return StartCoroutine(DoPush(trappedCharacter, possibleDirections[i].ToVector()));
  94. break;
  95. }
  96. }
  97. private IEnumerator LerpToPosition(Transform target, Vector3 endPos, float time)
  98. {
  99. Vector3 _startPos = target.position;
  100. float elapsedTime = 0;
  101. while (elapsedTime / time < 1)
  102. {
  103. target.position = Vector3.Lerp(_startPos, endPos, (elapsedTime / time));
  104. yield return new WaitForEndOfFrame();
  105. elapsedTime += Time.deltaTime;
  106. }
  107. target.position = endPos;
  108. }
  109. }