public void createAvailableMissionPanel(MissionDetails missionDetails)
        {
            //converts the string address to an integer array to be used with the sprite list
            int[] address = DestinationUtil.convertStringKeyToAddress(missionDetails.destinationDetails.destinationDefinition.address);

            //instantiating the new available mission panel and adding to the view
            Transform availablePanel = Instantiate(availableMissionPanel, Vector3.zero, Quaternion.identity).transform;

            availablePanel.SetParent(availableMissionView, false);

            //Set the panel title to something meaningful
            string title = missionDetails.missionDefinition.missionType.ToString() + " on " + missionDetails.destinationDetails.destinationDefinition.designation;

            availablePanel.Find("Title").GetComponent <Text>().text = title;

            //using the convert string address set all the address symbol images
            availablePanel.Find("Symbol1").GetComponent <Image>().sprite = symbolSprites[address[0]];
            availablePanel.Find("Symbol2").GetComponent <Image>().sprite = symbolSprites[address[1]];
            availablePanel.Find("Symbol3").GetComponent <Image>().sprite = symbolSprites[address[2]];
            availablePanel.Find("Symbol4").GetComponent <Image>().sprite = symbolSprites[address[3]];
            availablePanel.Find("Symbol5").GetComponent <Image>().sprite = symbolSprites[address[4]];
            availablePanel.Find("Symbol6").GetComponent <Image>().sprite = symbolSprites[address[5]];
            availablePanel.Find("Symbol7").GetComponent <Image>().sprite = symbolSprites[address[6]];

            //converting the mission time to a more readable text
            System.TimeSpan time        = System.TimeSpan.FromSeconds(missionDetails.missionTime);
            string          missionTime = "Mission Time: ";

            missionTime += time.Days > 0 ? time.Days + "d " : "";
            missionTime += time.Hours > 0 ? time.Hours + "h " : "";
            missionTime += time.Minutes > 0 ? time.Minutes + "m " : "";
            missionTime += time.Seconds > 0 ? time.Seconds + "s" : "";

            //set the mission time text on the panel
            availablePanel.Find("MissionTime").GetComponent <Text>().text = missionTime;

            //set the pass rate text on the panel
            availablePanel.Find("PassRate").GetComponent <Text>().text = "Pass Chance: " + (missionDetails.passRate * 100) + "%";

            //add a new listener to the selection button for the panel which calls the onMissionActivated function
            //passing in the mission details for this mission
            availablePanel.Find("SelectButton").GetComponent <Button>().onClick.AddListener(() => { onMissionActivated(missionDetails, availablePanel.gameObject); });
        }
    override protected BehaviorTreeResults Tick()
    {
        BehaviorVariableValue variableValue = tree.GetBehaviorVariableValue(BehaviorVariableName.String_LancePostAttackDestinationGUID);

        if (variableValue == null)
        {
            return(new BehaviorTreeResults(BehaviorNodeState.Failure));
        }

        string destinationGUID = variableValue.StringVal;

        RoutePointGameLogic destination = DestinationUtil.FindDestinationByGUID(tree, destinationGUID);

        if (destination == null)
        {
            return(new BehaviorTreeResults(BehaviorNodeState.Failure));
        }

        return(new BehaviorTreeResults(BehaviorNodeState.Success));
    }
        public void createActiveMissionPanel(int index)
        {
            //retrieve the active mission details using the team index
            ActiveMissionDetails activeMissionDetails = this.activeMissions.missions[index];

            //converts the string address to an integer array to be used with the sprite list
            int[] address = DestinationUtil.convertStringKeyToAddress(activeMissionDetails.missionDetails.destinationDetails.destinationDefinition.address);

            //instantiating the new active mission panel and adding to the view
            Transform activePanel = Instantiate(activeMissionPanel, Vector3.zero, Quaternion.identity).transform;

            activePanel.SetParent(activeMissionView, false);

            //add and set up the active mission object
            ActiveMission activeMission = (ActiveMission)activePanel.gameObject.AddComponent(typeof(ActiveMission));

            activeMission.initialise(activeMissionDetails);

            //Set the panel title to something meaningful
            string title = activeMissionDetails.missionDetails.missionDefinition.missionType.ToString() + " on " + activeMissionDetails.missionDetails.destinationDetails.destinationDefinition.designation;

            activePanel.Find("Title").GetComponent <Text>().text = title;

            //using the convert string address set all the address symbol images
            //possibly change this to be a new compoentn type for the class which sets the images up itself
            activePanel.Find("Symbol1").GetComponent <Image>().sprite = symbolSprites[address[0]];
            activePanel.Find("Symbol2").GetComponent <Image>().sprite = symbolSprites[address[1]];
            activePanel.Find("Symbol3").GetComponent <Image>().sprite = symbolSprites[address[2]];
            activePanel.Find("Symbol4").GetComponent <Image>().sprite = symbolSprites[address[3]];
            activePanel.Find("Symbol5").GetComponent <Image>().sprite = symbolSprites[address[4]];
            activePanel.Find("Symbol6").GetComponent <Image>().sprite = symbolSprites[address[5]];
            activePanel.Find("Symbol7").GetComponent <Image>().sprite = symbolSprites[address[6]];


            //set the pass rate text on the panel
            activePanel.Find("PassRate").GetComponent <Text>().text = "Pass Chance: " + (activeMissionDetails.missionDetails.passRate * 100) + "%";

            //add a new listener to the selection button for the panel which calls the onMissionActivated function
            //passing in the mission details for this mission
            activePanel.Find("SelectButton").GetComponent <Button>().onClick.AddListener(() => { onMissionCompleted(index, activePanel.gameObject); });
        }
    override protected BehaviorTreeResults Tick()
    {
        BehaviorVariableValue variableValue = tree.GetBehaviorVariableValue(destinationBVarName);

        if (variableValue == null)
        {
            return(new BehaviorTreeResults(BehaviorNodeState.Failure));
        }

        string destinationGUID = variableValue.StringVal;

        RoutePointGameLogic destination = DestinationUtil.FindDestinationByGUID(tree, destinationGUID);

        if (destination == null)
        {
            return(new BehaviorTreeResults(BehaviorNodeState.Failure));
        }

        float sprintDistance = Mathf.Max(unit.MaxSprintDistance, unit.MaxWalkDistance);

        if (waitForLance)
        {
            for (int lanceMemberIndex = 0; lanceMemberIndex < unit.lance.unitGuids.Count; ++lanceMemberIndex)
            {
                ITaggedItem item = unit.Combat.ItemRegistry.GetItemByGUID(unit.lance.unitGuids[lanceMemberIndex]);
                if (item == null)
                {
                    continue;
                }
                AbstractActor lanceUnit = item as AbstractActor;
                if (lanceUnit == null)
                {
                    continue;
                }
                float unitMoveDistance = Mathf.Max(lanceUnit.MaxWalkDistance, lanceUnit.MaxSprintDistance);
                sprintDistance = Mathf.Min(sprintDistance, unitMoveDistance);
            }
        }

        MoveType moveType = tree.GetBehaviorVariableValue(BehaviorVariableName.Bool_RouteShouldSprint).BoolVal ?
                            MoveType.Sprinting : MoveType.Walking;

        unit.Pathing.UpdateAIPath(destination.Position, destination.Position, moveType);

        Vector3 offset = unit.Pathing.ResultDestination - unit.CurrentPosition;

        if (offset.magnitude > sprintDistance)
        {
            offset = offset.normalized * sprintDistance;
        }

        Vector3 destinationThisTurn = RoutingUtil.Decrowd(unit.CurrentPosition + offset, unit);

        destinationThisTurn = RegionUtil.MaybeClipMovementDestinationToStayInsideRegion(unit, destinationThisTurn);

        float destinationRadius = unit.BehaviorTree.GetBehaviorVariableValue(BehaviorVariableName.Float_RouteWaypointRadius).FloatVal;

        List <AbstractActor> unitsToWaitFor = new List <AbstractActor>();

        if (waitForLance)
        {
            if (unit.lance != null)
            {
                for (int lanceGUIDIndex = 0; lanceGUIDIndex < unit.lance.unitGuids.Count; ++lanceGUIDIndex)
                {
                    string      guid = unit.lance.unitGuids[lanceGUIDIndex];
                    ITaggedItem item = unit.Combat.ItemRegistry.GetItemByGUID(guid);
                    if (item != null)
                    {
                        AbstractActor lanceUnit = item as AbstractActor;
                        if (lanceUnit != null)
                        {
                            unitsToWaitFor.Add(lanceUnit);
                        }
                    }
                }
            }
            else
            {
                unitsToWaitFor.Add(unit);
            }
        }
        if (RoutingUtil.AllUnitsInsideRadiusOfPoint(unitsToWaitFor, destination.Position, destinationRadius))
        {
            tree.RemoveBehaviorVariableValue(destinationBVarName);
        }

        bool isSprinting = tree.GetBehaviorVariableValue(BehaviorVariableName.Bool_RouteShouldSprint).BoolVal;

        unit.Pathing.UpdateAIPath(destinationThisTurn, destination.Position, isSprinting ? MoveType.Sprinting : MoveType.Walking);
        destinationThisTurn = unit.Pathing.ResultDestination;

        float        movementBudget = unit.Pathing.MaxCost;
        PathNodeGrid grid           = unit.Pathing.CurrentGrid;
        Vector3      successorPoint = destination.Position;

        if ((grid.GetValidPathNodeAt(destinationThisTurn, movementBudget) == null) ||
            ((destinationThisTurn - destination.Position).magnitude > 1.0f))
        {
            // can't get all the way to the destination.
            if (unit.Combat.EncounterLayerData.inclineMeshData != null)
            {
                float maxSteepnessRatio         = Mathf.Tan(Mathf.Deg2Rad * AIUtil.GetMaxSteepnessForAllLance(unit));
                List <AbstractActor> lanceUnits = AIUtil.GetLanceUnits(unit.Combat, unit.LanceId);
                destinationThisTurn = unit.Combat.EncounterLayerData.inclineMeshData.GetDestination(
                    unit.CurrentPosition,
                    destinationThisTurn,
                    movementBudget,
                    maxSteepnessRatio,
                    unit,
                    isSprinting,
                    lanceUnits,
                    unit.Pathing.CurrentGrid,
                    out successorPoint);
            }
        }

        Vector3 cur = unit.CurrentPosition;

        AIUtil.LogAI(string.Format("issuing order from [{0} {1} {2}] to [{3} {4} {5}] looking at [{6} {7} {8}]",
                                   cur.x, cur.y, cur.z,
                                   destinationThisTurn.x, destinationThisTurn.y, destinationThisTurn.z,
                                   successorPoint.x, successorPoint.y, successorPoint.z
                                   ));

        BehaviorTreeResults results      = new BehaviorTreeResults(BehaviorNodeState.Success);
        MovementOrderInfo   mvtOrderInfo = new MovementOrderInfo(destinationThisTurn, successorPoint);

        mvtOrderInfo.IsSprinting = isSprinting;
        results.orderInfo        = mvtOrderInfo;
        results.debugOrderString = string.Format("{0} moving toward destination: {1} dest: {2}", this.name, destinationThisTurn, destination.Position);
        return(results);
    }