/// <summary> /// Handles the case where the current Audio AiTarget contains a current Audio Threat. /// </summary> /// <returns>A new state or NONE if nothing needed to be handled</returns> private AiStateType HandleAudioThreat() { AiStateType state = AiStateType.None; AiThreatManager manager = zombieStateMachine.ThreatManager; AiTarget audioThreat = zombieStateMachine.ThreatManager.CurrentAudioThreat; if (manager.IsTargeting(AiTargetType.Visual_Food)) { state = AiStateType.Alerted; } else if (manager.IsTargeting(AiTargetType.Audio)) { // Get unique ID of the collider of our target int currentID = zombieStateMachine.ThreatManager.CurrentTarget.GetColliderID(); // If this is the same light if (currentID == zombieStateMachine.ThreatManager.CurrentAudioThreat.GetColliderID()) { RepathToThreatIfNecessary(audioThreat); state = AiStateType.Pursuit; } else { state = AiStateType.Alerted; } } manager.TrackTarget(audioThreat); return(state); }
/// <summary> /// Handles the case where the current visual threat is a Visual_light. /// </summary> /// <returns>A new state or NONE if nothing needed to be handled</returns> private AiStateType HandleVisualLightThreats() { AiStateType state = AiStateType.None; AiThreatManager manager = zombieStateMachine.ThreatManager; AiTarget visualThreat = zombieStateMachine.ThreatManager.CurrentVisualThreat; // and we currently have a lower priority target then drop into alerted // mode and try to find source of light if (manager.IsTargeting(AiTargetType.Audio) || manager.IsTargeting(AiTargetType.Visual_Food)) { state = AiStateType.Alerted; } else if (manager.IsTargeting(AiTargetType.Visual_Light)) { // Get unique ID of the collider of our target int currentID = zombieStateMachine.ThreatManager.CurrentTarget.GetColliderID(); // If this is the same light if (currentID == visualThreat.GetColliderID()) { RepathToThreatIfNecessary(visualThreat); state = AiStateType.Pursuit; } else { state = AiStateType.Alerted; } } manager.TrackTarget(visualThreat); return(state); }
/// <summary> /// Called by the state machine each frame. /// </summary> /// <returns>Either Idle or a new state based upon the threats that were processed</returns> public override AiStateType OnUpdate() { IncrementTimer(); AiStateType state = GetDefaultStateType(); // if we got to this state, but its not hungry, go back to alert state if (!zombieStateMachine.IsHungery()) { zombieStateMachine.WaypointManager.TrackWayPoint(); state = AiStateType.Alerted; } else { AiThreatManager manager = zombieStateMachine.ThreatManager; if (manager.DoesPlayerThreatExist() || manager.DoesLightThreatExist()) { manager.TrackTarget(zombieStateMachine.ThreatManager.CurrentVisualThreat); state = AiStateType.Alerted; } else if (manager.DoesAudioThreatExist()) { manager.TrackTarget(zombieStateMachine.ThreatManager.CurrentAudioThreat); state = AiStateType.Alerted; } else if (manager.IsTargeting(AiTargetType.Visual_Food)) { if (IsZombieCurrentlyEating()) { ReplenishSatisfaction(); } } FaceTargetGradually(this.slerpSpeed); } return(state); }