using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class AprilFools_Longshot : MonoBehaviour { [Header("-= Longshot Stats =-")] public int HP = 60; public float MovementSpeed = 4f; public bool CanWalkToPos; public bool Damageable = true; private bool Attacking; [SerializeField] private Transform[] RandomWalkPositions; [SerializeField] private Animator LongshotAnimator; [SerializeField] private AprilFools_PlayerController Player; [SerializeField] private AudioClip SFX_LongshotDamaged; private Vector3 LastFramePos; [Header("-= UI =-")] [SerializeField] private Image LongshotHPBar; [SerializeField] private Image LongshotHPTransition; [Header("-= Attacks =-")] [SerializeField] private GameObject LongshotAttackPrefab_Rocket; [SerializeField] private GameObject LongshotAttackPrefab_Dynamite; [SerializeField] private GameObject LongshotAttackPrefab_RocketHoming; [SerializeField] private List RandomDynamiteDropPositions = new List(); [Header("-= Sounds =-")] [SerializeField] private AudioClip SFX_Jump; [SerializeField] private AudioClip SFX_ThrowDynamite; [SerializeField] private AudioClip SFX_DoubleMissile; [SerializeField] private AudioClip SFX_LongshotPissed; [SerializeField] private AudioClip SFX_LongshotLaugh; private void Start() { StartCoroutine(RandomWalkLoop()); } private void Update() { LongshotAnimator.SetFloat("VelocityMagnitude", Vector3.Distance(base.transform.position, LastFramePos)); if (base.transform.position.x > Player.transform.position.x) { LongshotAnimator.SetFloat("VelocityX", 1f); } else { LongshotAnimator.SetFloat("VelocityX", -1f); } LastFramePos = base.transform.position; LongshotHPBar.fillAmount = Mathf.Lerp(LongshotHPBar.fillAmount, (float)HP / 60f, 6f * Time.deltaTime); LongshotHPTransition.fillAmount = Mathf.Lerp(LongshotHPTransition.fillAmount, (float)HP / 60f, 2.5f * Time.deltaTime); if (Input.GetKeyDown(KeyCode.B)) { StartCoroutine(LongshotAttack_JumpRocket()); } } public void DamageLongshot() { float num = HP; if (Damageable) { CutsceneUtils.PlaySound(SFX_LongshotDamaged, CutsceneUtils.DRH_MixerChannels.Dialogue, 0.75f); HP--; MovementSpeed += 0.25f; if (num == 30f && HP < 30) { StartCoroutine(LongshotPhase2()); } if (num == 1f && HP < 1) { StartCoroutine(DelayEndingFight()); } StartCoroutine(DamageAnim()); } } private IEnumerator DelayEndingFight() { yield return new WaitForSeconds(0.1f); AprilFools_Manager.instance.EndFight(); } public void BeginLongshotAI() { StartCoroutine(AttackLoop()); CanWalkToPos = true; } private IEnumerator DamageAnim() { CanWalkToPos = false; LongshotAnimator.Play("Shock"); yield return new WaitForSeconds(0.25f); LongshotAnimator.Play("Idle"); CanWalkToPos = true; } private IEnumerator LongshotPhase2() { Damageable = false; CanWalkToPos = false; Attacking = true; LongshotAnimator.GetComponent().color = new Color(1f, 0.4575472f, 0.4575472f); MusicManager.PauseMusic(); LongshotAnimator.speed = 4f; LongshotAnimator.SetBool("InCutscene", value: true); LongshotAnimator.Play("Walk"); CutsceneUtils.instance.UtilSource.pitch = 1f; CutsceneUtils.PlaySound(SFX_LongshotPissed, CutsceneUtils.DRH_MixerChannels.Effect, 0.45f); CutsceneUtils.PlaySound(SFX_LongshotLaugh, CutsceneUtils.DRH_MixerChannels.Dialogue, 0.75f); AprilFools_Manager.instance.LockIn(); yield return new WaitForSeconds(2f); LongshotAnimator.speed = 1f; LongshotAnimator.SetBool("InCutscene", value: false); MusicManager.Instance.source.pitch = 1.15f; MusicManager.Instance.source.Play(); Damageable = true; CanWalkToPos = true; Attacking = false; } private IEnumerator RandomWalkLoop() { yield return new WaitForSeconds(Random.Range(0.35f, 1f)); Vector3 randomPos = RandomWalkPositions[Random.Range(0, RandomWalkPositions.Length)].position; while (Vector3.Distance(base.transform.position, randomPos) > 0.1f) { yield return null; if (CanWalkToPos) { base.transform.position = Vector3.MoveTowards(base.transform.position, randomPos, MovementSpeed * Time.deltaTime); } } StartCoroutine(RandomWalkLoop()); } private IEnumerator AttackLoop() { float t = (float)HP / 60f; float minInclusive = Mathf.Lerp(0.25f, 1f, t); float maxInclusive = Mathf.Lerp(0.5f, 2f, t); yield return new WaitForSeconds(Random.Range(minInclusive, maxInclusive)); Attacking = true; if (Damageable) { PlayRandomAttack(); } else { Attacking = false; } while (Attacking) { yield return null; } StartCoroutine(AttackLoop()); } private void PlayRandomAttack() { switch (Random.Range(0, 4)) { case 0: Attacking = false; break; case 1: StartCoroutine(LongshotAttack_JumpRocket()); break; case 2: StartCoroutine(LongshotAttack_DynamiteSpread()); break; case 3: StartCoroutine(LongshotAttack_JumpRocketHoming()); break; default: Attacking = false; break; } } private IEnumerator LongshotAttack_JumpRocket() { CanWalkToPos = false; Damageable = false; CutsceneUtils.MoveTransformOnArc(base.transform, base.transform.position, 4f, 0.5f); CutsceneUtils.PlaySound(SFX_Jump, CutsceneUtils.DRH_MixerChannels.Effect, 0.35f, Random.Range(0.9f, 1.1f)); LongshotAnimator.Play("AprilFools25_Jump"); yield return new WaitForSeconds(0.25f); Object.Instantiate(LongshotAttackPrefab_Rocket, base.transform.position, Quaternion.identity).transform.LookAt(Player.transform.position + Vector3.down * 0.75f); Damageable = true; yield return new WaitForSeconds(0.25f); LongshotAnimator.Play("Idle"); yield return new WaitForSeconds(0.5f); CanWalkToPos = true; Attacking = false; } private IEnumerator LongshotAttack_DynamiteSpread() { CanWalkToPos = false; Damageable = true; List PossibleDropLocations = new List(RandomDynamiteDropPositions); for (int i = 0; i < 5 - HP * 5 / 60; i++) { LongshotAnimator.Play("AprilFools25_FireDynamite", -1, 0f); CutsceneUtils.PlaySound(SFX_ThrowDynamite, CutsceneUtils.DRH_MixerChannels.Effect, 0.25f, Random.Range(0.9f, 1.1f)); Damageable = true; GameObject obj = Object.Instantiate(LongshotAttackPrefab_Dynamite, base.transform.position, Quaternion.identity); Transform transform = PossibleDropLocations[Random.Range(0, PossibleDropLocations.Count)]; PossibleDropLocations.Remove(transform); CutsceneUtils.MoveTransformOnArc(obj.transform, transform.position, Random.Range(5, 8), Random.Range(2, 3)); yield return new WaitForSeconds(0.25f); } yield return new WaitForSeconds(0.5f); Damageable = true; CanWalkToPos = true; Attacking = false; } private IEnumerator LongshotAttack_JumpRocketHoming() { CanWalkToPos = false; Damageable = false; CutsceneUtils.MoveTransformOnArc(base.transform, base.transform.position, 4f, 0.5f); LongshotAnimator.Play("AprilFools25_FireTwoMissiles"); yield return new WaitForSeconds(0.25f); GameObject obj = Object.Instantiate(LongshotAttackPrefab_RocketHoming, base.transform.position + Vector3.up, Quaternion.identity); CutsceneUtils.PlaySound(SFX_DoubleMissile, CutsceneUtils.DRH_MixerChannels.Effect, 0.35f, Random.Range(0.9f, 1.1f)); obj.transform.rotation = Quaternion.Euler(0f, 90f, 0f); yield return new WaitForSeconds(0.25f); GameObject obj2 = Object.Instantiate(LongshotAttackPrefab_RocketHoming, base.transform.position + Vector3.up, Quaternion.identity); CutsceneUtils.PlaySound(SFX_DoubleMissile, CutsceneUtils.DRH_MixerChannels.Effect, 0.35f, Random.Range(0.9f, 1.1f)); obj2.transform.rotation = Quaternion.Euler(0f, -90f, 0f); Damageable = true; yield return new WaitForSeconds(0.5f); LongshotAnimator.Play("Idle"); yield return new WaitForSeconds(0.25f); CanWalkToPos = true; Attacking = false; } }