Beispiel #1
0
        /// <summary>
        /// Creates a new <c>LordJob</c> that controls any pawn during military deployment.
        /// <paramref name="currentOrderPosition"/> is the initial deployment position of the deployed pawns
        /// <paramref name="squad"/> is the squad that contains the pawns deployed
        /// <paramref name="maxDeploymentTime"/> is the time a squad has before being forced into the leave command. It is set at 30000 by default
        /// </summary>
        /// <param name="currentOrderPosition"></param>
        /// <param name="squad"></param>
        /// <param name="maxDeploymentTime"></param>
        public LordJob_DeployMilitary(IntVec3 currentOrderPosition, MercenarySquadFC squad, int maxDeploymentTime = 30000)
        {
            this.currentOrderPosition = currentOrderPosition;
            this.squad = squad;

            whenToForceLeave = maxDeploymentTime + Find.TickManager.TicksGame;
            timeDeployed     = Find.TickManager.TicksGame;

            Init();
        }
        public DeployedMilitaryCommandMenu()
        {
            layer = WindowLayer.Super;
            closeOnClickedOutside = false;
            closeOnAccept         = false;
            closeOnCancel         = false;
            doCloseX            = false;
            draggable           = true;
            drawShadow          = false;
            doWindowBackground  = false;
            preventCameraMotion = false;
            faction             = Find.World.GetComponent <FactionFC>();

            selectedSquad = faction.militaryCustomizationUtil.DeployedSquads.Where(squad => squad.getSettlement != null).RandomElementWithFallback();
        }
Beispiel #3
0
        static bool Prefix(Pawn __instance)
        {
            if (__instance.IsMercenary())
            {
                if (__instance.Faction != FactionColonies.getPlayerColonyFaction())
                {
                    __instance.SetFaction(FactionColonies.getPlayerColonyFaction());
                }
                MercenarySquadFC squad = Find.World.GetComponent <FactionFC>().militaryCustomizationUtil.returnSquadFromUnit(__instance);
                if (squad != null)
                {
                    Mercenary merc = Find.World.GetComponent <FactionFC>().militaryCustomizationUtil.returnMercenaryFromUnit(__instance, squad);
                    if (merc != null)
                    {
                        if (squad.settlement != null)
                        {
                            if (FactionColonies.Settings().deadPawnsIncreaseMilitaryCooldown)
                            {
                                squad.dead += 1;
                            }

                            squad.settlement.happiness -= 1;
                        }

                        squad.PassPawnToDeadMercenaries(merc);
                    }

                    squad.removeDroppedEquipment();
                }
                else
                {
                    Log.Message("Mercenary Errored out. Did not find squad.");
                }

                __instance.equipment?.DestroyAllEquipment();
                __instance.apparel?.DestroyAll();
                //__instance.Destroy();
                return(true);
            }

            return(true);
        }
        public MercenarySquadFC createMercenarySquad(SettlementFC settlement, bool isExtra = false)
        {
            MercenarySquadFC squad = new MercenarySquadFC();

            squad.initiateSquad();
            mercenarySquads.Add(squad);
            if (!isExtra)
            {
                settlement.militarySquad = findSquad(squad);
            }
            squad.settlement   = settlement;
            squad.isExtraSquad = isExtra;

            if (settlement.militarySquad == null)
            {
                Log.Message("Empire - createMercenarySquad fail. Found squad is Null");
            }

            return(findSquad(squad));
        }
Beispiel #5
0
        public override void DoWindowContents(Rect rect)
        {
            FactionFC faction = Find.World.GetComponent <FactionFC>();

            if (faction.militaryCustomizationUtil.DeployedSquads.Count() == 0)
            {
                this.Close();
            }

            GameFont   oldFont   = Text.Font;
            TextAnchor oldAnchor = Text.Anchor;

            Text.Font   = GameFont.Small;
            Text.Anchor = TextAnchor.MiddleCenter;

            Rect selectSquad   = new Rect(0, 0, 160, 40);
            Rect commandAttack = new Rect(0, 40, 160, 40);
            Rect commandMove   = new Rect(0, 80, 160, 40);
            Rect commandHeal   = new Rect(0, 120, 160, 40);


            if (selectedSquad == null)
            {
                squadText = "Select Deployed Squad";
            }
            else
            {
                squadText = selectedSquad.getSettlement.name + "'s " + selectedSquad.outfit.name;
            }

            //Select a squad
            if (Widgets.ButtonText(selectSquad, squadText))
            {
                List <FloatMenuOption> list = new List <FloatMenuOption>();
                foreach (MercenarySquadFC squad in faction.militaryCustomizationUtil.DeployedSquads)
                {
                    if (squad.getSettlement != null)
                    {
                        list.Add(new FloatMenuOption(squad.getSettlement.name + "'s " + squad.outfit.name, delegate
                        {
                            selectedSquad = squad;
                        }));
                    }
                }
                if (!list.Any())
                {
                    list.Add(new FloatMenuOption("No squads available", null));
                }

                Find.WindowStack.Add(new FloatMenu(list));
            }



            if (Widgets.ButtonTextSubtle(commandAttack, "Attack"))
            {
                if (selectedSquad != null)
                {
                    selectedSquad.order = MilitaryOrders.Attack;
                    Messages.Message(selectedSquad.outfit.name + " are now charging the enemy.", MessageTypeDefOf.NeutralEvent);
                    //selectedSquad.orderLocation = Position;
                }
            }
            if (Widgets.ButtonTextSubtle(commandMove, "Move"))
            {
                if (selectedSquad != null)
                {
                    DebugTool tool;
                    IntVec3   Position;
                    tool = new DebugTool("Select Move Position", delegate()
                    {
                        Position = UI.MouseCell();

                        selectedSquad.order         = MilitaryOrders.Standby;
                        selectedSquad.orderLocation = Position;
                        Messages.Message(selectedSquad.outfit.name + " are moving to the position and standing by.", MessageTypeDefOf.NeutralEvent);

                        DebugTools.curTool = null;
                    });
                    DebugTools.curTool = tool;
                }
            }
            if (Widgets.ButtonTextSubtle(commandHeal, "Leave"))
            {
                if (selectedSquad != null)
                {
                    selectedSquad.order = MilitaryOrders.Leave;
                    Messages.Message(selectedSquad.outfit.name + " are now leaving the map. " + selectedSquad.dead + " dead.",
                                     MessageTypeDefOf.NeutralEvent);
                }
            }

            //Example command:

            //DebugTool tool = null;
            //IntVec3 Position;
            //tool = new DebugTool("Select Drop Position", delegate ()
            //{
            //   Position = UI.MouseCell();

            //    selectedSquad.order = MilitaryOrders.Standby;
            //    selectedSquad.orderLocation = Position;

            //    DebugTools.curTool = null;
            //});
            //DebugTools.curTool = tool;


            Text.Font   = oldFont;
            Text.Anchor = oldAnchor;
        }
Beispiel #6
0
        public override void DoWindowContents(Rect rect)
        {
            FactionFC faction = Find.World.GetComponent <FactionFC>();

            if (faction.militaryCustomizationUtil.DeployedSquads.Count() == 0)
            {
                Close();
            }

            GameFont   oldFont   = Text.Font;
            TextAnchor oldAnchor = Text.Anchor;

            Text.Font   = GameFont.Small;
            Text.Anchor = TextAnchor.MiddleCenter;

            float rectBaseHeight = 40f;
            float rectWidth      = 160f;

            Rect selectSquad   = new Rect(0, 0, rectWidth, rectBaseHeight);
            Rect commandAttack = new Rect(0, rectBaseHeight, rectWidth, rectBaseHeight);
            Rect commandMove   = new Rect(0, rectBaseHeight * 2, rectWidth, rectBaseHeight);
            Rect commandHeal   = new Rect(0, rectBaseHeight * 3, rectWidth, rectBaseHeight);


            if (selectedSquad == null)
            {
                squadText = "selectDeployedSquad".Translate();
            }
            else
            {
                squadText = "selectedDeployedSquad".Translate(selectedSquad.getSettlement.name, selectedSquad.outfit.name);
            }

            //Select a squad
            if (Widgets.ButtonText(selectSquad, squadText))
            {
                List <FloatMenuOption> list = new List <FloatMenuOption>();
                foreach (MercenarySquadFC squad in faction.militaryCustomizationUtil.DeployedSquads)
                {
                    if (squad.getSettlement != null)
                    {
                        list.Add(new FloatMenuOption("selectedDeployedSquad".Translate(squad.getSettlement.name, squad.outfit.name), delegate
                        {
                            selectedSquad = squad;
                        }));
                    }
                }
                if (!list.Any())
                {
                    list.Add(new FloatMenuOption("noSquadsAvailable".Translate(), null));
                }

                Find.WindowStack.Add(new FloatMenu(list));
            }



            if (Widgets.ButtonTextSubtle(commandAttack, "commandAttack".Translate()))
            {
                if (selectedSquad != null)
                {
                    selectedSquad.order = MilitaryOrders.Attack;
                    Messages.Message("attackSuccess".Translate(selectedSquad.outfit.name), MessageTypeDefOf.NeutralEvent);
                    //selectedSquad.orderLocation = Position;
                }
            }
            if (Widgets.ButtonTextSubtle(commandMove, "commandMove".Translate()))
            {
                if (selectedSquad != null)
                {
                    DebugTool tool;
                    IntVec3   Position;
                    tool = new DebugTool("Select Move Position", delegate()
                    {
                        Position = UI.MouseCell();

                        selectedSquad.order         = MilitaryOrders.Standby;
                        selectedSquad.orderLocation = Position;
                        Messages.Message("moveSuccess".Translate(selectedSquad.outfit.name), MessageTypeDefOf.NeutralEvent);

                        DebugTools.curTool = null;
                    });
                    DebugTools.curTool = tool;
                }
            }
            if (Widgets.ButtonTextSubtle(commandHeal, "commandLeave".Translate()))
            {
                if (selectedSquad != null)
                {
                    selectedSquad.order = MilitaryOrders.Leave;
                    Messages.Message("commandLeave".Translate(selectedSquad.outfit.name, selectedSquad.dead), MessageTypeDefOf.NeutralEvent);
                }
            }

            //Example command:

            //DebugTool tool = null;
            //IntVec3 Position;
            //tool = new DebugTool("Select Drop Position", delegate ()
            //{
            //   Position = UI.MouseCell();

            //    selectedSquad.order = MilitaryOrders.Standby;
            //    selectedSquad.orderLocation = Position;

            //    DebugTools.curTool = null;
            //});
            //DebugTools.curTool = tool;


            Text.Font   = oldFont;
            Text.Anchor = oldAnchor;
        }
Beispiel #7
0
        public static void SquadAI(ref MercenarySquadFC squad)
        {
            Faction playerFaction     = Find.FactionManager.OfPlayer;
            Faction settlementFaction = FactionColonies.getPlayerColonyFaction();

            FactionFC factionfc = Find.World.GetComponent <FactionFC>();
            MilitaryCustomizationUtil militaryCustomizationUtil = factionfc.militaryCustomizationUtil;
            bool deployed = false;


            //Log.Message("1");

            foreach (Mercenary merc in squad.DeployedMercenaries)
            {
                //If pawn is deployed
                deployed = true;
                if (!(squad.hitMap))
                {
                    squad.hitMap = true;
                }

                if (merc.pawn.health.State == PawnHealthState.Mobile)
                {
                    //if pawn is up and moving
                    if (squad.order != null && squad.order != MilitaryOrders.Leave)
                    {
                        if (squad.timeDeployed + 30000 >= Find.TickManager.TicksGame && merc.pawn.Faction != playerFaction)
                        {
                            merc.pawn.SetFaction(playerFaction);
                        }
                    }
                    else
                    {
                        if (merc.pawn.drafter != null)
                        {
                            merc.pawn.drafter.Drafted = false;
                        }
                        if (merc.pawn.Faction != settlementFaction)
                        {
                            merc.pawn.SetFaction(settlementFaction);
                        }
                    }


                    JobGiver_AIFightEnemies jobGiver = new JobGiver_AIFightEnemies();
                    ThinkResult             result   = jobGiver.TryIssueJobPackage(merc.pawn, new JobIssueParams());
                    bool isValid = result.IsValid;


                    if (isValid)
                    {
                        //Log.Message("Success");
                        if (merc.pawn.jobs.curJob == null || ((merc.pawn.jobs.curJob.def == JobDefOf.Goto || merc.pawn.jobs.curJob.def != result.Job.def) && merc.pawn.jobs.curJob.def.defName != "ReloadWeapon" && merc.pawn.jobs.curJob.def.defName != "ReloadTurret" && !merc.pawn.Drafted))
                        {
                            merc.pawn.jobs.StartJob(result.Job, JobCondition.Ongoing);
                            //Log.Message(result.Job.ToString());
                        }
                    }
                    else
                    {
                        //Log.Message("Fail");
                        if (squad.timeDeployed + 30000 >= Find.TickManager.TicksGame)
                        {
                            if (merc.pawn.drafter == null || merc.pawn.Drafted == false)
                            {
                                if (squad.order == MilitaryOrders.Standby)
                                {
                                    //Log.Message("Standby");
                                    merc.pawn.mindState.forcedGotoPosition = squad.orderLocation;
                                    JobGiver_ForcedGoto jobGiver_Standby = new JobGiver_ForcedGoto();
                                    ThinkResult         resultStandby    = jobGiver_Standby.TryIssueJobPackage(merc.pawn, new JobIssueParams());
                                    bool isValidStandby = resultStandby.IsValid;
                                    if (isValidStandby)
                                    {
                                        //Log.Message("valid");
                                        merc.pawn.jobs.StartJob(resultStandby.Job, JobCondition.InterruptForced);
                                    }
                                }
                                else
                                if (squad.order == MilitaryOrders.Attack)
                                {
                                    //Log.Message("Attack");
                                    //If time is up, leave, else go home
                                    JobGiver_AIGotoNearestHostile jobGiver_Move = new JobGiver_AIGotoNearestHostile();
                                    ThinkResult resultMove  = jobGiver_Move.TryIssueJobPackage(merc.pawn, new JobIssueParams());
                                    bool        isValidMove = resultMove.IsValid;
                                    //Log.Message(resultMove.ToString());
                                    if (isValidMove)
                                    {
                                        merc.pawn.jobs.StartJob(resultMove.Job, JobCondition.InterruptForced);
                                    }
                                }
                                else
                                if (squad.order == MilitaryOrders.Leave)
                                {
                                    JobGiver_ExitMapBest jobGiver_Rescue = new JobGiver_ExitMapBest();
                                    ThinkResult          resultLeave     = jobGiver_Rescue.TryIssueJobPackage(merc.pawn, new JobIssueParams());
                                    bool isValidLeave = resultLeave.IsValid;

                                    if (isValidLeave)
                                    {
                                        merc.pawn.jobs.StartJob(resultLeave.Job, JobCondition.InterruptForced);
                                    }
                                }
                                else
                                if (squad.order == MilitaryOrders.RecoverWounded)
                                {
                                    JobGiver_RescueNearby jobGiver_Rescue = new JobGiver_RescueNearby();
                                    ThinkResult           resultRescue    = jobGiver_Rescue.TryIssueJobPackage(merc.pawn, new JobIssueParams());
                                    bool isValidRescue = resultRescue.IsValid;

                                    if (isValidRescue)
                                    {
                                        merc.pawn.jobs.StartJob(resultRescue.Job, JobCondition.InterruptForced);
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (merc.pawn.drafter != null)
                            {
                                merc.pawn.drafter.Drafted = false;
                            }
                            if (merc.pawn.Faction != settlementFaction)
                            {
                                merc.pawn.SetFaction(settlementFaction);
                            }
                        }
                    }



                    //end of if pawn is mobile
                }
                else
                {
                    //if pawn is down or dead
                    if (merc.pawn.health.Dead)     //if pawn is on map and is dead
                    {
                        //squad.removeDroppedEquipment();
                        //squad.PassPawnToDeadMercenaries(merc);
                        //squad.hasDead = true;
                    }
                    else
                    {     //If alive but downed
                        if (merc.pawn.drafter != null)
                        {
                            merc.pawn.drafter.Drafted = false;
                        }
                        if (merc.pawn.Faction != settlementFaction)
                        {
                            merc.pawn.SetFaction(settlementFaction);
                        }
                    }
                }
            }


            //Log.Message("2");
            foreach (Mercenary animal in squad.DeployedMercenaryAnimals)
            {
                //if on map
                deployed = true;
                if (animal.pawn.health.State == PawnHealthState.Mobile)
                {
                    animal.pawn.mindState.duty     = new PawnDuty();
                    animal.pawn.mindState.duty.def = DutyDefOf.Defend;
                    animal.pawn.mindState.duty.attackDownedIfStarving = false;
                    //animal.pawn.mindState.duty.radius = 2;
                    animal.pawn.mindState.duty.focus = animal.handler.pawn;
                    //If master is not dead
                    JobGiver_AIFightEnemies jobGiver = new JobGiver_AIFightEnemies();
                    ThinkResult             result   = jobGiver.TryIssueJobPackage(animal.pawn, new JobIssueParams());
                    bool isValid = result.IsValid;
                    if (isValid)
                    {
                        //Log.Message("att");
                        if (animal.pawn.jobs.curJob.def != result.Job.def)
                        {
                            animal.pawn.jobs.StartJob(result.Job, JobCondition.InterruptForced);
                        }
                    }
                    else
                    {
                        animal.pawn.mindState.duty.def    = DutyDefOf.Defend;
                        animal.pawn.mindState.duty.radius = 2;
                        animal.pawn.mindState.duty.focus  = animal.handler.pawn;
                        //if defend master not valid, follow master
                        JobGiver_AIFollowEscortee jobGiverFollow = new JobGiver_AIFollowEscortee();
                        ThinkResult resultFollow  = jobGiverFollow.TryIssueJobPackage(animal.pawn, new JobIssueParams());
                        bool        isValidFollow = resultFollow.IsValid;
                        if (isValidFollow)
                        {
                            //Log.Message("foloor");
                            if (animal.pawn.jobs.curJob.def != resultFollow.Job.def)
                            {
                                animal.pawn.jobs.StartJob(resultFollow.Job, JobCondition.Ongoing);
                            }
                        }
                        else
                        {
                            JobGiver_ExitMapBest jobGiver_Rescue = new JobGiver_ExitMapBest();
                            ThinkResult          resultLeave     = jobGiver_Rescue.TryIssueJobPackage(animal.pawn, new JobIssueParams());
                            bool isValidLeave = resultLeave.IsValid;

                            if (isValidLeave)
                            {
                                animal.pawn.jobs.StartJob(resultLeave.Job, JobCondition.InterruptForced);
                            }
                        }
                    }
                }
            }

            if (deployed == false && squad.hitMap)
            {
                foreach (Mercenary merc in squad.mercenaries)
                {
                    merc.pawn.SetFaction(settlementFaction);
                }
                squad.hasLord    = false;
                squad.isDeployed = false;
                squad.removeDroppedEquipment();

                if (squad.map != null)
                {
                    squad.map.lordManager.RemoveLord(squad.lord);
                    squad.lord = null;
                    squad.map  = null;
                }
                squad.hitMap = false;

                if (squad.isExtraSquad)
                {
                    militaryCustomizationUtil.mercenarySquads.Remove(squad);
                    //Log.Message("Squad deleted");
                    return;
                }

                squad.getSettlement.cooldownMilitary();

                //Log.Message("Reseting Squad");
                militaryCustomizationUtil.checkMilitaryUtilForErrors();
                squad.OutfitSquad(squad.outfit);
            }
        }
        /// <summary>
        /// Lets the user select a squad from the squads active on the map
        /// </summary>
        private void DoSelectSquadCommand()
        {
            List <FloatMenuOption> list = new List <FloatMenuOption>();

            foreach (MercenarySquadFC squad in faction.militaryCustomizationUtil.DeployedSquads)
            {
                if (squad.getSettlement != null)
                {
                    list.Add(new FloatMenuOption("selectedDeployedSquad".Translate(squad.getSettlement.name, squad.outfit.name), () => selectedSquad = squad));
                }
            }
            if (!list.Any())
            {
                //This should never happen
                Log.Error("No deployed squad, but window is still open? Closing..");
                Close();
                list.Add(new FloatMenuOption("noSquadsAvailable".Translate(), null));
            }

            Find.WindowStack.Add(new FloatMenu(list));
        }
 public MercenarySquadFC findSquad(MercenarySquadFC squad)
 {
     return(mercenarySquads.FirstOrDefault(mercSquad => squad == mercSquad));
 }
 public Mercenary returnMercenaryFromUnit(Pawn unit, MercenarySquadFC squad)
 {
     return(squad.mercenaries.FirstOrDefault(merc => merc.pawn == unit));
 }