BloodAndGore/Assets/Scripts/AI/Behaviours/Stomp.cs

98 lines
3.7 KiB
C#

using UnityEngine;
using Saltosion.OneWeapon.Enemies;
using Saltosion.OneWeapon.Effects;
namespace Saltosion.OneWeapon.AI.Behaviours {
enum StompState {
ReadyToStomp,
PreparingStomp,
RecoveringFromStomp,
CoolingDown,
}
[RequireComponent(typeof(Follow))]
public class Stomp : AIBehaviour {
public float StompCooldown;
[Tooltip("How long the stomp animation is")]
public float StompDuration;
[Tooltip("If StompDuration is 1.0 and this is 0.75, the stomp explosion will happen after the first 3/4ths of the stomp animation.")]
public float StompExplosionTime;
public float StompRadius;
public float LoweredStompCooldown;
public float LoweredStompCooldownRadius;
public bool PreparingStomp { get { return State == StompState.PreparingStomp; } }
public bool Stomping { get { return State == StompState.RecoveringFromStomp; } }
public bool CoolingDown { get { return State == StompState.CoolingDown; } }
private float CurrentCooldown;
private StompState State = StompState.ReadyToStomp;
private Follow FollowBehaviour;
private void Start() {
FollowBehaviour = GetComponent<Follow>();
}
private void Update() {
if (CurrentCooldown > 0) {
CurrentCooldown -= Time.deltaTime;
} else {
// This is reached every time the cooldown reaches zero, for one frame
// (except when ReadyToStomp, when this is called every loop until the next stomp,
// since then the cooldown isn't reset to something >0)
switch (State) {
case StompState.PreparingStomp:
// TODO(jens): Consider adding squish and stretch animation for this
CurrentStatus = "STOMP";
DoStomp();
CurrentCooldown = StompDuration - StompExplosionTime;
State = StompState.RecoveringFromStomp;
break;
case StompState.RecoveringFromStomp:
CurrentStatus = "CoolingDown";
CurrentCooldown = GetDistance() < LoweredStompCooldownRadius ? LoweredStompCooldown : StompCooldown;
State = StompState.CoolingDown;
break;
case StompState.CoolingDown:
CurrentStatus = "CooledDown";
State = StompState.ReadyToStomp;
break;
case StompState.ReadyToStomp:
CurrentStatus = "ReadyToStomp";
break;
}
}
}
public override bool CanBehave() {
return State != StompState.CoolingDown;
}
public override void Execute() {
if (State == StompState.ReadyToStomp) {
CurrentCooldown = StompExplosionTime;
State = StompState.PreparingStomp;
CurrentStatus = "Stomping";
}
}
private float GetDistance() {
return FollowBehaviour.Target == null ? float.PositiveInfinity : (FollowBehaviour.Target.position - transform.position).magnitude;
}
private void DoStomp() {
Debug.Log("STOMP");
Camera.main.GetComponent<CameraFX>().ScreenShake(7f);
}
private void OnDrawGizmosSelected() {
Gizmos.color = new Color(1f, 0f, 0f, 0.3f);
Gizmos.DrawWireSphere(transform.position, LoweredStompCooldownRadius);
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(transform.position, StompRadius);
}
}
}