/// <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);
    }
Beispiel #3
0
    /// <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);
    }