/// <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(); }
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)); }
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; }
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; }
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)); }