public float teamDistanceToTarget = 100.0f; //Tracks the distance from the teamCenterPoint to the teamTarget //======================================================================================================================================= /// <summary> /// Initializes a Commander_FSM object. Builds the strategic finite state machine. /// </summary> public void Start() { Team teamRED = GameManager.instance.teams[0]; // The team will be triggered to use orders based on the current strategic state SetTeamUseOrders(false); teamCount = teamRED.members.Count; teamTarget = GameManager.instance.teams[1].members[0]; //Define Strategic Transitions var teammateDeath = new Transition(State.Strategic_Regroup, (manager) => { return(teamCountDelta > 0); }); var targetEliminated = new Transition(State.Strategic_FocusFire, (manager) => { return(teamTarget.getHealth() <= 0.0f); }); var teamFannedOut = new Transition(State.Strategic_FocusFire, (manager) => { return(GetTeamAvgDistanceFromTeamCenter() > 6.0f); }); var teamGrouped = new Transition(State.Strategic_HoldPosition, (manager) => { return(GetTeamAvgDistanceFromTeamCenter() < 5.0f); }); var teamLocationReached = new Transition(State.Strategic_FocusFire, (manager) => { var TeamRED = GameManager.instance.teams[0].members; bool inPosition = false; int numberOfTeamInPosition = 0; foreach (var teammate in TeamRED) { if (Mathf.Abs(Vector3.Distance(teammate.transform.position, teammate.destination)) < 3.0f) { numberOfTeamInPosition += 1; } } if (numberOfTeamInPosition == TeamRED.Count - 1) { inPosition = true; } return(inPosition); }); var teamAmbush = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { return(teamDistanceToTarget < 12.0f); }); var targetHidden = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { var TeamRED = GameManager.instance.teams[0].members; int numberOfVisible = 0; foreach (var teammate in TeamRED) { if (manager.tileManager.PositionCanSeePosition(teammate.transform.position, teamTarget.transform.position)) { numberOfVisible += 1; } } return(numberOfVisible > (TeamRED.Count / 2)); }); // Focus fire on an enemy when it becomes weak var enemyWeak = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { var teamBlue = manager.teams[1]; foreach (var enemy in teamBlue.members) { if (enemy.HasLowHealth()) { return(true); } } return(false); }); // Define null strategy transitions var nullTransitions = new List <Transition>(); nullTransitions.Add(enemyWeak); //Define Regroup Transitions var regroupTransitions = new List <Transition>(); regroupTransitions.Add(teamGrouped); //Define FanOut Transitions var fanOutTransitions = new List <Transition>(); fanOutTransitions.Add(teamFannedOut); //Define FocusFire Transitions var focusFireTransitions = new List <Transition>(); focusFireTransitions.Add(targetEliminated); focusFireTransitions.Add(targetHidden); focusFireTransitions.Add(teammateDeath); //Define MoveToFiringPosition Transitions var moveToFiringPositionTransitions = new List <Transition>(); moveToFiringPositionTransitions.Add(teamLocationReached); //Define HoldPosition Transitions var holdPositionTransitions = new List <Transition>(); holdPositionTransitions.Add(teamAmbush); holdPositionTransitions.Add(teammateDeath); //Define Dictionary of State/Transition Pairs - to be used by the Strategic State Machine var transitions = new Dictionary <State, IEnumerable <Transition> >(); transitions.Add(State.Strategic_FanOut, fanOutTransitions); transitions.Add(State.Strategic_FocusFire, focusFireTransitions); transitions.Add(State.Strategic_Regroup, regroupTransitions); transitions.Add(State.Strategic_HoldPosition, holdPositionTransitions); transitions.Add(State.Strategic_MoveToFiringPosition, moveToFiringPositionTransitions); transitions.Add(State.Strategic_Null, nullTransitions); //Define and Create the Strategic State Machine strategyFSM = new StrategicStateMachine(State.Strategic_HoldPosition, transitions); strategyFSM.AddStateBehavior(State.Strategic_FanOut, new FanOutState()); strategyFSM.AddStateBehavior(State.Strategic_FocusFire, new FocusFireState()); strategyFSM.AddStateBehavior(State.Strategic_Regroup, new RegroupState()); strategyFSM.AddStateBehavior(State.Strategic_MoveToFiringPosition, new MoveToFiringPosition()); strategyFSM.AddStateBehavior(State.Strategic_HoldPosition, new HoldPositionState()); }//END: Start() Function
public float teamDistanceToTarget = 100.0f; //Tracks the distance from the teamCenterPoint to the teamTarget //======================================================================================================================================= // Use this for initialization public void Start () { Team teamRED = GameManager.instance.teams[0]; foreach(var teammate in teamRED.members) { // Notifies agents to execute StrategicFSM Commands - rather than TacticalFSM Commands teammate.SetOrders(true); } teamCount = teamRED.members.Count; teamTarget = GameManager.instance.teams[1].members[0]; //Define Strategic Transitions var teammateDeath = new Transition(State.Strategic_Regroup, (manager) => { return teamCountDelta > 0; }); var targetEliminated = new Transition(State.Strategic_FocusFire, (manager) => { return teamTarget.getHealth() <= 0.0f; }); var teamFannedOut = new Transition(State.Strategic_FocusFire, (manager) => { return GetTeamAvgDistanceFromTeamCenter() > 6.0f; }); var teamGrouped = new Transition(State.Strategic_HoldPosition, (manager) => { return GetTeamAvgDistanceFromTeamCenter() < 5.0f; }); var teamLocationReached = new Transition(State.Strategic_FocusFire, (manager) => { var TeamRED = GameManager.instance.teams[0].members; bool inPosition = false; int numberOfTeamInPosition = 0; foreach (var teammate in TeamRED) { if (Mathf.Abs(Vector3.Distance(teammate.transform.position, teammate.destination)) < 3.0f) { numberOfTeamInPosition += 1; } } if (numberOfTeamInPosition == TeamRED.Count - 1) { inPosition = true; } return inPosition; }); var teamAmbush = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { return teamDistanceToTarget < 7.0f; }); var targetHidden = new Transition(State.Strategic_MoveToFiringPosition, (manager) => { var TeamRED = GameManager.instance.teams[0].members; int numberOfVisible = 0; foreach (var teammate in TeamRED) { if (manager.tileManager.PositionCanSeePosition(teammate.transform.position, teamTarget.transform.position)) { numberOfVisible += 1; } } return numberOfVisible > (TeamRED.Count / 2);}); //Debug.Log("FannedOut fired");Debug.Log("TeamGrouped Fired");Debug.Log("TeammateDeath Fired");Debug.Log("Team Target is " + teamTarget);Debug.Log("Ambush Launched"); //Define Regroup Transitions var regroupTransitions = new List<Transition>(); regroupTransitions.Add(teamGrouped); //Define FanOut Transitions var fanOutTransitions = new List<Transition>(); //fanOutTransitions.Add(teammateDeath); fanOutTransitions.Add(teamFannedOut); //Define FocusFire Transitions var focusFireTransitions = new List<Transition>(); focusFireTransitions.Add(targetEliminated); focusFireTransitions.Add(targetHidden); focusFireTransitions.Add(teammateDeath); //Define MoveToFiringPosition Transitions var moveToFiringPositionTransitions = new List<Transition>(); moveToFiringPositionTransitions.Add(teamLocationReached); //Define HoldPosition Transitions var holdPositionTransitions = new List<Transition>(); holdPositionTransitions.Add(teamAmbush); holdPositionTransitions.Add(teammateDeath); var transitions = new Dictionary<State, IEnumerable<Transition>>(); transitions.Add(State.Strategic_FanOut, fanOutTransitions); transitions.Add(State.Strategic_FocusFire, focusFireTransitions); transitions.Add(State.Strategic_Regroup, regroupTransitions); transitions.Add(State.Strategic_HoldPosition, holdPositionTransitions); transitions.Add(State.Strategic_MoveToFiringPosition, moveToFiringPositionTransitions); strategyFSM = new StrategicStateMachine(State.Strategic_MoveToFiringPosition, transitions); strategyFSM.AddStateBehavior(State.Strategic_FanOut, new FanOutState()); strategyFSM.AddStateBehavior(State.Strategic_FocusFire, new FocusFireState()); strategyFSM.AddStateBehavior(State.Strategic_Regroup, new RegroupState()); strategyFSM.AddStateBehavior(State.Strategic_MoveToFiringPosition, new MoveToFiringPosition()); strategyFSM.AddStateBehavior(State.Strategic_HoldPosition, new HoldPositionState()); }//END: Start() Function