public override void Tick()
 {
     base.Tick();
     if (this.count++ > 1)
     {
         this.count = 0;
         List <Lord> lords    = base.Map.lordManager.lords;
         IntVec3     position = base.Position;
         checked
         {
             for (int i = 0; i < lords.Count; i++)
             {
                 Lord lord = lords[i];
                 if (lord.LordJob is LordJob_TradeWithColony)
                 {
                     FieldInfo field  = lord.LordJob.GetType().GetField("chillSpot", BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                     IntVec3   intVec = (IntVec3)field.GetValue(lord.LordJob);
                     if (intVec.x != position.x || intVec.y != position.y || intVec.z != position.z)
                     {
                         field.SetValue(lord.LordJob, position);
                     }
                     LordToil curLordToil = lord.CurLordToil;
                     if (curLordToil is LordToil_Travel)
                     {
                         LordToil_Travel lordToil_Travel = (LordToil_Travel)curLordToil;
                         if (lordToil_Travel.FlagLoc != position)
                         {
                             lordToil_Travel.SetDestination(position);
                             lordToil_Travel.UpdateAllDuties();
                         }
                     }
                     else if (curLordToil is LordToil_DefendPoint)
                     {
                         LordToil_DefendPoint lordToil_DefendPoint = (LordToil_DefendPoint)curLordToil;
                         if (lordToil_DefendPoint.FlagLoc != position)
                         {
                             lordToil_DefendPoint.SetDefendPoint(position);
                             lordToil_DefendPoint.UpdateAllDuties();
                         }
                     }
                     foreach (Pawn current in lord.ownedPawns)
                     {
                         if (current.RaceProps.Animal)
                         {
                             if (current.needs != null && current.needs.food != null && current.needs.food.CurLevel <= current.needs.food.MaxLevel)
                             {
                                 current.needs.food.CurLevel = current.needs.food.MaxLevel;
                             }
                         }
                     }
                 }
             }
         }
     }
 }
예제 #2
0
        // Token: 0x060007C3 RID: 1987 RVA: 0x00043DC0 File Offset: 0x000421C0
        public override StateGraph CreateGraph()
        {
            //    Log.Message("LordJob_PawnsDefendShip CreateGraph ");
            StateGraph stateGraph = new StateGraph();

            //    Log.Message("LordJob_PawnsDefendShip CreateGraph 0");
            if (!this.defSpot.IsValid)
            {
                Log.Warning("LordJob_PawnsDefendShip defSpot is invalid. Returning graph for LordJob_AssaultColony.", false);
                stateGraph.AttachSubgraph(new LordJob_AssaultColony(this.faction, true, true, false, false, true).CreateGraph());
                return(stateGraph);
            }
            //    Log.Message("LordJob_PawnsDefendShip CreateGraph 1");
            //    Log.Message("defspot "+ this.defSpot+" defradius "+ this.defendRadius);
            LordToil_DefendPoint lordToil_DefendPoint = new LordToil_DefendPoint(this.defSpot, this.defendRadius);

            stateGraph.StartingToil = lordToil_DefendPoint;
            LordToil_AssaultColony lordToil_AssaultColony = new LordToil_AssaultColony(false);

            stateGraph.AddToil(lordToil_AssaultColony);
            LordToil_AssaultColony lordToil_AssaultColony2 = new LordToil_AssaultColony(false);

            stateGraph.AddToil(lordToil_AssaultColony2);
            Transition transition = new Transition(lordToil_DefendPoint, lordToil_AssaultColony2, false, true);

            transition.AddSource(lordToil_AssaultColony);
            transition.AddTrigger(new Trigger_PawnCannotReachMapEdge());
            stateGraph.AddTransition(transition, false);
            Transition transition2 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony, false, true);

            transition2.AddTrigger(new Trigger_PawnHarmed(0.5f, true, null));
            transition2.AddTrigger(new Trigger_PawnLostViolently(true));
            transition2.AddTrigger(new Trigger_Memo(CompSpawnerOnDamaged.MemoDamaged));
            transition2.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition2, false);
            Transition transition3 = new Transition(lordToil_AssaultColony, lordToil_DefendPoint, false, true);

            transition3.AddTrigger(new Trigger_TicksPassedWithoutHarmOrMemos(1380, new string[]
            {
                CompSpawnerOnDamaged.MemoDamaged
            }));
            transition3.AddPostAction(new TransitionAction_EndAttackBuildingJobs());
            stateGraph.AddTransition(transition3, false);
            Transition transition4 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony2, false, true);

            transition4.AddSource(lordToil_AssaultColony);
            transition4.AddTrigger(new Trigger_ThingDamageTaken(this.shipPart, 0.5f));
            transition4.AddTrigger(new Trigger_Memo(HediffGiver_Heat.MemoPawnBurnedByAir));
            stateGraph.AddTransition(transition4, false);
            return(stateGraph);
        }
        public override StateGraph CreateGraph()
        {
            StateGraph stateGraph = new StateGraph();

            if (!defSpot.IsValid)
            {
                Log.Warning("LordJob_MechanoidsDefendShip defSpot is invalid. Returning graph for LordJob_AssaultColony.");
                stateGraph.AttachSubgraph(new LordJob_AssaultColony(faction).CreateGraph());
                return(stateGraph);
            }
            LordToil_DefendPoint   lordToil_DefendPoint   = (LordToil_DefendPoint)(stateGraph.StartingToil = new LordToil_DefendPoint(defSpot, defendRadius));
            LordToil_AssaultColony lordToil_AssaultColony = new LordToil_AssaultColony();

            stateGraph.AddToil(lordToil_AssaultColony);
            if (canAssaultColony)
            {
                LordToil_AssaultColony lordToil_AssaultColony2 = new LordToil_AssaultColony();
                stateGraph.AddToil(lordToil_AssaultColony2);
                Transition transition = new Transition(lordToil_DefendPoint, lordToil_AssaultColony);
                transition.AddSource(lordToil_AssaultColony2);
                transition.AddTrigger(new Trigger_PawnCannotReachMapEdge());
                stateGraph.AddTransition(transition);
                Transition transition2 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony2);
                transition2.AddTrigger(new Trigger_PawnHarmed(0.5f, requireInstigatorWithFaction: true));
                transition2.AddTrigger(new Trigger_PawnLostViolently());
                transition2.AddTrigger(new Trigger_Memo(MemoDamaged));
                transition2.AddPostAction(new TransitionAction_EndAllJobs());
                stateGraph.AddTransition(transition2);
                Transition transition3 = new Transition(lordToil_AssaultColony2, lordToil_DefendPoint);
                transition3.AddTrigger(new Trigger_TicksPassedWithoutHarmOrMemos(1380, MemoDamaged));
                transition3.AddPostAction(new TransitionAction_EndAttackBuildingJobs());
                stateGraph.AddTransition(transition3);
                Transition transition4 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony);
                transition4.AddSource(lordToil_AssaultColony2);
                transition4.AddTrigger(new Trigger_AnyThingDamageTaken(things, 0.5f));
                transition4.AddTrigger(new Trigger_Memo(HediffGiver_Heat.MemoPawnBurnedByAir));
                stateGraph.AddTransition(transition4);
            }
            Transition transition5 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony);

            transition5.AddTrigger(new Trigger_ChanceOnSignal(TriggerSignalType.MechClusterDefeated, 1f));
            stateGraph.AddTransition(transition5);
            if (!isMechCluster)
            {
                Transition transition6 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony);
                transition6.AddTrigger(new Trigger_AnyThingDamageTaken(things, 1f));
                stateGraph.AddTransition(transition6);
            }
            return(stateGraph);
        }
예제 #4
0
        static bool Prefix(LordToil_DefendPoint __instance)
        {
            LordToilData_DefendPoint data = Traverse.Create(__instance).Field("data").GetValue <LordToilData_DefendPoint>();

            for (int i = 0; i < __instance.lord.ownedPawns.Count; i++)
            {
                Pawn pawn = __instance.lord.ownedPawns[i];
                pawn.mindState.duty             = new PawnDuty(DutyDefOf.Defend, data.defendPoint, -1f);
                pawn.mindState.duty.focusSecond = data.defendPoint;
                if (pawn.RaceProps.Animal)
                {
                    Log.Message("setting radius to 1 for animal");
                    pawn.mindState.duty.radius = 1f;
                }
            }
            return(false);
        }
예제 #5
0
        /// <summary>
        /// Initializes some variables after loading is complete or when the deployment is first started
        /// </summary>
        private void Init()
        {
            deployedMilitaryCommandMenu = new DeployedMilitaryCommandMenu();
            if (!Find.WindowStack.IsOpen(typeof(DeployedMilitaryCommandMenu)))
            {
                Find.WindowStack.Add(deployedMilitaryCommandMenu);
            }
            else
            {
                deployedMilitaryCommandMenu = (DeployedMilitaryCommandMenu)Find.WindowStack.Windows.First(window => window.GetType() == typeof(DeployedMilitaryCommandMenu));
            }

            deployedMilitaryCommandMenu.squadMilitaryOrderDic.SetOrAdd(squad, currentOrder);
            deployedMilitaryCommandMenu.currentOrderPositionDic[squad] = currentOrderPosition;

            lordToil_DefendPoint = new LordToil_DefendPoint(currentOrderPosition);
            lordToil_HuntEnemies = new LordToil_HuntEnemies(currentOrderPosition);
        }
예제 #6
0
        public override StateGraph CreateGraph()
        {
            StateGraph stateGraph = new StateGraph();

            if (!this.defSpot.IsValid)
            {
                Log.Warning("LordJob_MechanoidsDefendShip defSpot is invalid. Returning graph for LordJob_AssaultColony.");
                stateGraph.AttachSubgraph(new LordJob_AssaultColony(this.faction, true, true, false, false, true).CreateGraph());
                return(stateGraph);
            }
            LordToil_DefendPoint   lordToil_DefendPoint   = (LordToil_DefendPoint)(stateGraph.StartingToil = new LordToil_DefendPoint(this.defSpot, this.defendRadius));
            LordToil_AssaultColony lordToil_AssaultColony = new LordToil_AssaultColony();

            stateGraph.AddToil(lordToil_AssaultColony);
            LordToil_AssaultColony lordToil_AssaultColony2 = new LordToil_AssaultColony();

            stateGraph.AddToil(lordToil_AssaultColony2);
            Transition transition = new Transition(lordToil_DefendPoint, lordToil_AssaultColony2);

            transition.AddSource(lordToil_AssaultColony);
            transition.AddTrigger(new Trigger_PawnCannotReachMapEdge());
            stateGraph.AddTransition(transition);
            Transition transition2 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony);

            transition2.AddTrigger(new Trigger_PawnHarmed(0.5f, true));
            transition2.AddTrigger(new Trigger_PawnLostViolently());
            transition2.AddTrigger(new Trigger_Memo(CompSpawnerMechanoidsOnDamaged.MemoDamaged));
            transition2.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition2);
            Transition transition3 = new Transition(lordToil_AssaultColony, lordToil_DefendPoint);

            transition3.AddTrigger(new Trigger_TicksPassedWithoutHarmOrMemos(1380, CompSpawnerMechanoidsOnDamaged.MemoDamaged));
            transition3.AddPostAction(new TransitionAction_EndAttackBuildingJobs());
            stateGraph.AddTransition(transition3);
            Transition transition4 = new Transition(lordToil_DefendPoint, lordToil_AssaultColony2);

            transition4.AddSource(lordToil_AssaultColony);
            transition4.AddTrigger(new Trigger_ThingDamageTaken(this.shipPart, 0.5f));
            transition4.AddTrigger(new Trigger_Memo(HediffGiver_Heat.MemoPawnBurnedByAir));
            stateGraph.AddTransition(transition4);
            return(stateGraph);
        }
        public void ChangeDefendPoint(Faction faction)
        {
            Lord        defendLord = null;
            List <Lord> allLords   = this.SingleMap.lordManager.lords;

            for (int i = 0; i < allLords.Count; i++)
            {
                Lord lord = allLords[i];
                if (lord.faction != null && lord.faction == faction)
                {
                    if (lord.CurLordToil != null && lord.CurLordToil is LordToil_DefendPoint)
                    {
                        defendLord = lord;
                        LordToil_DefendPoint lordToil = defendLord.CurLordToil as LordToil_DefendPoint;
                        lordToil.SetDefendPoint(this.centerLocation.ToIntVec3);
                    }
                }
            }
            defendLord.CurLordToil.UpdateAllDuties();
        }
예제 #8
0
        public override StateGraph CreateGraph()
        {
            StateGraph           stateGraph           = new StateGraph();
            LordToil_Travel      lordToil_Travel      = (LordToil_Travel)(stateGraph.StartingToil = new LordToil_Travel(this.travelDest));
            LordToil_DefendPoint lordToil_DefendPoint = new LordToil_DefendPoint(false);

            stateGraph.AddToil(lordToil_DefendPoint);
            Transition transition = new Transition(lordToil_Travel, lordToil_DefendPoint);

            transition.AddTrigger(new Trigger_PawnHarmed(1f, false));
            transition.AddPreAction(new TransitionAction_SetDefendLocalGroup());
            transition.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition);
            Transition transition2 = new Transition(lordToil_DefendPoint, lordToil_Travel);

            transition2.AddTrigger(new Trigger_TicksPassedWithoutHarm(1200));
            transition2.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            stateGraph.AddTransition(transition2);
            return(stateGraph);
        }
        public override void DoAction(Transition trans)
        {
            LordToil_DefendPoint lordToil_DefendPoint = (LordToil_DefendPoint)trans.target;

            lordToil_DefendPoint.SetDefendPoint(lordToil_DefendPoint.lord.ownedPawns.RandomElement().Position);
        }
        public void SendAssaultWave(Faction faction, bool finalAssault = false)
        {
            Lord        assaultLord = null;
            Lord        defendLord  = null;
            List <Lord> allLords    = this.SingleMap.lordManager.lords;

            for (int i = 0; i < allLords.Count; i++)
            {
                Lord lord = allLords[i];
                if (lord.faction != null && lord.faction == faction)
                {
                    if (lord.CurLordToil != null && lord.CurLordToil is LordToil_DefendPoint)
                    {
                        defendLord = lord;
                        LordToil_DefendPoint lordToil = defendLord.CurLordToil as LordToil_DefendPoint;
                        lordToil.SetDefendPoint(this.centerLocation.ToIntVec3);
                    }
                    else if (lord.CurLordToil != null && lord.CurLordToil is LordToil_AssaultColony)
                    {
                        assaultLord = lord;
                    }
                }
            }
            if (assaultLord == null)
            {
                LordJob_AssaultColony lordJob = new LordJob_AssaultColony(faction, false, false, false, false, false);
                Traverse.Create(root: lordJob).Field(name: "canTimeoutOrFlee").SetValue(false);
                assaultLord = LordMaker.MakeNewLord(faction, lordJob, this.SingleMap, null);
            }
            if (defendLord == null)
            {
                LordJob_DefendPoint lordJob = new LordJob_DefendPoint(this.centerLocation.ToIntVec3);
                defendLord = LordMaker.MakeNewLord(faction, lordJob, this.SingleMap, null);
            }

            List <Pawn> allPawns = this.SingleMap.mapPawns.AllPawnsSpawned;

            for (int i = 0; i < allPawns.Count; i++)
            {
                if (allPawns[i].Faction != null && allPawns[i].Faction == faction)
                {
                    Lord pawnLord = allPawns[i].GetLord();
                    if (allPawns[i].def == TorannMagicDefOf.TM_SkeletonR && pawnLord != null)
                    {
                        if (pawnLord != null)
                        {
                            if (pawnLord != assaultLord && (Rand.Chance(.4f) || finalAssault))
                            {
                                allPawns[i].GetLord()?.Notify_PawnLost(allPawns[i], PawnLostCondition.ForcedToJoinOtherLord);
                                assaultLord.AddPawn(allPawns[i]);
                            }
                        }
                        else
                        {
                            defendLord.AddPawn(allPawns[i]);
                        }
                    }
                    if (allPawns[i].def == TorannMagicDefOf.TM_GiantSkeletonR && pawnLord != null)
                    {
                        if (pawnLord != null)
                        {
                            if (pawnLord != assaultLord && (Rand.Chance(.25f) || finalAssault))
                            {
                                allPawns[i].GetLord()?.Notify_PawnLost(allPawns[i], PawnLostCondition.ForcedToJoinOtherLord);
                                assaultLord.AddPawn(allPawns[i]);
                            }
                        }
                        else
                        {
                            defendLord.AddPawn(allPawns[i]);
                        }
                    }
                    if (allPawns[i].def == TorannMagicDefOf.TM_SkeletonLichR)
                    {
                        if (finalAssault)
                        {
                            if (pawnLord != null && pawnLord != assaultLord)
                            {
                                allPawns[i].GetLord()?.Notify_PawnLost(allPawns[i], PawnLostCondition.ForcedToJoinOtherLord);
                                //pawnLord.ownedPawns.Remove(allPawns[i]);
                            }
                            assaultLord.AddPawn(allPawns[i]);
                        }
                    }
                }
            }
        }
        public override StateGraph CreateGraph()
        {
            List <Pawn> lordPawns          = this.lord.ownedPawns;
            StateGraph  stateGraph         = new StateGraph();
            IntVec3     retrieversPosition = default(IntVec3);

            stateGraph.StartingToil = stateGraph.AttachSubgraph(new LordJob_Travel(this.targetCaravan.Position).CreateGraph()).StartingToil;
            LordToil_DefendPoint defendPointLordToil = new LordToil_DefendPoint();

            stateGraph.AddToil(defendPointLordToil);
            LordToil_ExitMap exitMapLordToil = new LordToil_ExitMap();

            stateGraph.AddToil(exitMapLordToil);
            LordToil_ExitMap exitMapOnConditionLordToil = new LordToil_ExitMap();

            stateGraph.AddToil(exitMapOnConditionLordToil);
            stateGraph.AddTransition(new Transition(stateGraph.StartingToil, defendPointLordToil)
            {
                triggers =
                {
                    new Trigger_Memo("TravelArrived")
                },
                postActions =
                {
                    new TransitionAction_Custom(new Action(delegate
                    {
                        if (this.targetCaravan == null || this.targetCaravan.Faction == Faction.OfPlayer)
                        {
                            this.TargetCaravnLost();
                            this.lord.ReceiveMemo("TargetCaravanGone");
                            return;
                        }
                        this.targetCaravan.pather.StartPath(retrieversPosition = lordPawns.First().Position, PathEndMode.ClosestTouch);
                        this.lord.AddPawn(this.targetCaravan);
                    }))
                }
            });
            Transition exitMapTransition = new Transition(defendPointLordToil, exitMapLordToil)
            {
                triggers =
                {
                    new Trigger_Memo("TargetCaravanGone"),
                    new Trigger_Custom(t => t.type == TriggerSignalType.Tick && lordPawns.Contains(this.targetCaravan))
                }
            };

            exitMapTransition.AddSource(stateGraph.StartingToil);
            stateGraph.AddTransition(exitMapTransition);
            stateGraph.AddTransition(new Transition(exitMapLordToil, exitMapOnConditionLordToil)
            {
                triggers =
                {
                    new Trigger_PawnLost()
                },
                preActions =
                {
                    new TransitionAction_Custom(new Action(delegate
                    {
                        if (!lordPawns.Contains(this.targetCaravan))
                        {
                            this.TargetCaravnLost();
                        }
                    }))
                }
            });
            return(stateGraph);
        }
예제 #12
0
        public override StateGraph CreateGraph()
        {
            StateGraph stateGraph    = new StateGraph();
            LordToil   lordToil_wait = new LordToil_DefendPoint(baseCenter, 50f);

            lordToil_wait.AddFailCondition(() => CorruptionStoryTrackerUtilities.currentStoryTracker.PlanetaryGovernor.Dead);
            stateGraph.AddToil(lordToil_wait);

            LordToil lordToil_leaveInShip = new LordToil_LeaveInShip();

            LordToil lordToil_leaveMap = new LordToil_ExitMapBest(LocomotionUrgency.Jog);

            Transition leaveMapEarly = new Transition(lordToil_leaveInShip, lordToil_leaveMap);

            leaveMapEarly.AddTrigger(new Trigger_Custom((TriggerSignal x) => ship.Destroyed || !ship.Spawned));

            stateGraph.AddTransition(leaveMapEarly);

            LordToil lordToil_main = new LordToil_ArrestGovernor();

            stateGraph.AddToil(lordToil_main);

            Transition governorDiedWaiting = new Transition(lordToil_wait, lordToil_leaveInShip);

            governorDiedWaiting.AddTrigger(new Trigger_Custom((TriggerSignal x) => CorruptionStoryTrackerUtilities.currentStoryTracker.PlanetaryGovernor.Dead));

            stateGraph.AddTransition(governorDiedWaiting);

            Transition transition_fetchingGovernor = new Transition(lordToil_wait, lordToil_main);

            transition_fetchingGovernor.AddTrigger(new Trigger_TicksPassed(2500));
            transition_fetchingGovernor.AddPreAction(new TransitionAction_Message("MessageGovernorIsBeingArrested".Translate(new object[]
            {
                CorruptionStoryTrackerUtilities.currentStoryTracker.PlanetaryGovernor.Name
            })));
            stateGraph.AddTransition(transition_fetchingGovernor);

            LordToil lordToil_goAggressive = new LordToil_AssaultColony();

            lordToil_goAggressive.avoidGridMode = AvoidGridMode.Smart;

            stateGraph.AddToil(lordToil_goAggressive);

            Transition transition_useForce = new Transition(lordToil_main, lordToil_goAggressive);

            transition_useForce.AddTrigger(new Trigger_BecameColonyEnemy());
            transition_useForce.AddTrigger(new Trigger_PawnHarmed());
            transition_useForce.AddPreAction(new TransitionAction_Message("MessageGovernorArrestGoneHostile".Translate()));

            transition_useForce.AddPreAction(new TransitionAction_Custom(new Action(delegate
            {
                this.lord.ownedPawns[0].Faction.SetHostileTo(Faction.OfPlayer, true);
            })));

            stateGraph.AddTransition(transition_useForce);

            Transition downedGovernor = new Transition(lordToil_goAggressive, lordToil_main);

            downedGovernor.AddTrigger(new Trigger_Custom((TriggerSignal x) => CorruptionStoryTrackerUtilities.currentStoryTracker.PlanetaryGovernor.Downed));
            stateGraph.AddTransition(downedGovernor);

            Transition killedGovernor = new Transition(lordToil_goAggressive, lordToil_leaveInShip);

            killedGovernor.AddTrigger(new Trigger_Custom((TriggerSignal x) => CorruptionStoryTrackerUtilities.currentStoryTracker.PlanetaryGovernor.Dead));
            stateGraph.AddTransition(killedGovernor);

            Transition transition_leaveWithGovernor = new Transition(lordToil_main, lordToil_leaveInShip);

            transition_leaveWithGovernor.AddTrigger(new Trigger_Custom((TriggerSignal x) => this.ship.GetInnerContainer().Contains(CorruptionStoryTrackerUtilities.currentStoryTracker.PlanetaryGovernor)));

            stateGraph.AddToil(lordToil_leaveInShip);
            stateGraph.AddTransition(transition_leaveWithGovernor);


            Transition transition_leaveUnderFire = new Transition(lordToil_main, lordToil_leaveInShip);

            transition_leaveUnderFire.AddPreAction(new TransitionAction_Custom(new Action(delegate
            {
                this.lord.ownedPawns[0].Faction.SetHostileTo(Faction.OfPlayer, true);
            })));

            stateGraph.AddToil(lordToil_leaveMap);
            LordToil_End lordToil_End = new LordToil_End();

            stateGraph.AddToil(lordToil_End);
            Transition endTransition = new Transition(lordToil_leaveMap, lordToil_End);

            endTransition.AddTrigger(new Trigger_TicksPassed(60000));
            stateGraph.AddTransition(endTransition);

            return(stateGraph);
        }
예제 #13
0
        public override StateGraph CreateGraph()
        {
            StateGraph      stateGraph = new StateGraph();
            LordToil_Travel travelToil = new LordToil_Travel(this.targetDestination);

            stateGraph.StartingToil = travelToil;
            LordToil_DefendPoint defendPointToil = new LordToil_DefendPoint(false);

            stateGraph.AddToil(defendPointToil);
            LordToil_BoardSpaceship boardSpaceshipToil = new LordToil_BoardSpaceship(this.targetDestination, LocomotionUrgency.Walk);

            stateGraph.AddToil(boardSpaceshipToil);
            LordToil_EscortDownedPawn escortDownedPawnPeacefullyToil = new LordToil_EscortDownedPawn(this.targetDestination, LocomotionUrgency.Walk);

            stateGraph.AddToil(escortDownedPawnPeacefullyToil);
            LordToil exitMap = stateGraph.AttachSubgraph(new LordJob_ExitMap(IntVec3.Invalid).CreateGraph()).StartingToil;

            // Defend.
            stateGraph.AddTransition(new Transition(travelToil, defendPointToil)
            {
                triggers =
                {
                    new Trigger_PawnHarmed(1f, false)
                },
                preActions =
                {
                    new TransitionAction_SetDefendLocalGroup()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Back to travel after defending.
            stateGraph.AddTransition(new Transition(defendPointToil, travelToil)
            {
                triggers =
                {
                    new Trigger_TicksPassedWithoutHarm(1200)
                }
            });
            // Escort downed pawn peacefully.
            stateGraph.AddTransition(new Transition(travelToil, escortDownedPawnPeacefullyToil)
            {
                triggers =
                {
                    new Trigger_ReachableDownedPawn()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Back to travel after escorting pawn peacefully.
            stateGraph.AddTransition(new Transition(escortDownedPawnPeacefullyToil, travelToil)
            {
                triggers =
                {
                    new Trigger_Memo("RescueEnded")
                }
            });
            // Board dispatcher.
            stateGraph.AddTransition(new Transition(travelToil, boardSpaceshipToil)
            {
                triggers =
                {
                    new Trigger_Memo("TravelArrived")
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Exit map.
            stateGraph.AddTransition(new Transition(travelToil, exitMap)
            {
                sources =
                {
                    escortDownedPawnPeacefullyToil,
                    boardSpaceshipToil
                },
                triggers =
                {
                    new Trigger_PawnCannotReachTargetDestination()
                },
                postActions =
                {
                    new TransitionAction_CancelDispatcherPick(),
                    new TransitionAction_EndAllJobs()
                }
            });
            // Exit map. This transition does not include travelToil as the dispatcher is not landed when the team begins travelling.
            stateGraph.AddTransition(new Transition(escortDownedPawnPeacefullyToil, exitMap)
            {
                sources =
                {
                    boardSpaceshipToil
                },
                triggers =
                {
                    new Trigger_SpaceshipNotFound()
                },
                postActions =
                {
                    new TransitionAction_CancelDispatcherPick(),
                    new TransitionAction_EndAllJobs()
                }
            });
            return(stateGraph);
        }
        public override StateGraph CreateGraph()
        {
            StateGraph           stateGraph           = new StateGraph();
            LordToil             lordToil             = stateGraph.StartingToil = stateGraph.AttachSubgraph(new LordJob_Travel(chillSpot).CreateGraph()).StartingToil;
            LordToil_DefendPoint lordToil_DefendPoint = new LordToil_DefendPoint(chillSpot);

            stateGraph.AddToil(lordToil_DefendPoint);
            LordToil_TakeWoundedGuest lordToil_TakeWoundedGuest = new LordToil_TakeWoundedGuest();

            stateGraph.AddToil(lordToil_TakeWoundedGuest);
            StateGraph stateGraph2 = new LordJob_TravelAndExit(IntVec3.Invalid).CreateGraph();

            LordToil         startingToil2    = stateGraph.AttachSubgraph(stateGraph2).StartingToil;
            LordToil         target           = stateGraph2.lordToils[1];
            LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.Walk, canDig: true);

            stateGraph.AddToil(lordToil_ExitMap);

            //
            Transition transition = new Transition(lordToil, startingToil2);

            transition.AddSources(lordToil_DefendPoint);
            transition.AddTrigger(new Trigger_PawnExperiencingDangerousTemperatures());
            transition.AddPreAction(new TransitionAction_Message("MessageVisitorsDangerousTemperature".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name)));
            transition.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            transition.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition);

            //
            Transition transition2 = new Transition(lordToil, lordToil_ExitMap);

            transition2.AddSources(lordToil_DefendPoint, lordToil_TakeWoundedGuest);
            transition2.AddSources(stateGraph2.lordToils);
            transition2.AddTrigger(new Trigger_PawnCannotReachMapEdge());
            transition2.AddPreAction(new TransitionAction_Message("MessageVisitorsTrappedLeaving".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name)));
            stateGraph.AddTransition(transition2);

            //
            Transition transition3 = new Transition(lordToil_ExitMap, startingToil2);

            transition3.AddTrigger(new Trigger_PawnCanReachMapEdge());
            transition3.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            transition3.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition3);

            //
            Transition transition4 = new Transition(lordToil, lordToil_DefendPoint);

            transition4.AddTrigger(new Trigger_Memo("TravelArrived"));
            stateGraph.AddTransition(transition4);

            //
            Transition transition5 = new Transition(lordToil_DefendPoint, lordToil_TakeWoundedGuest);

            transition5.AddTrigger(new Trigger_WoundedGuestPresent());
            transition5.AddPreAction(new TransitionAction_Message("MessageVisitorsTakingWounded".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name)));
            stateGraph.AddTransition(transition5);

            //?
            Transition transition6 = new Transition(lordToil_DefendPoint, target);

            transition6.AddSources(lordToil_TakeWoundedGuest, lordToil);
            transition6.AddTrigger(new Trigger_BecamePlayerEnemy());
            transition6.AddPreAction(new TransitionAction_SetDefendLocalGroup());
            transition6.AddPostAction(new TransitionAction_WakeAll());
            transition6.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition6);

            //Leaving!
            Transition transition7 = new Transition(lordToil_DefendPoint, startingToil2);

            transition7.AddTrigger(new Trigger_TickCondition(() => Find.World.GetComponent <WorldComponent_FactionsTracker>().joinedFactionDef != null, 250));
            //transition7.AddTrigger(new Trigger_Memo("GetOutOfDodge"));
            //Trigger_Custom((TriggerSignal x) =>
            //));
            //transition7.AddTrigger(new Trigger_TicksPassed((!DebugSettings.instantVisitorsGift) ? Rand.Range(8000, 22000) : 0));
            transition7.AddPreAction(new TransitionAction_Message("VisitorsLeaving".Translate(faction.Name)));
            transition7.AddPreAction(new TransitionAction_CheckGiveGift());
            transition7.AddPostAction(new TransitionAction_WakeAll());
            transition7.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            stateGraph.AddTransition(transition7);
            return(stateGraph);
        }
        public override StateGraph CreateGraph()
        {
            StateGraph stateGraph = new StateGraph();
            LordToil   lordToil   = null;
            LordToil   lordToil2  = null;

            if (this.sappers)
            {
                lordToil = new LordToil_AssaultColonySappers();
                if (this.useAvoidGridSmart)
                {
                    lordToil.avoidGridMode = AvoidGridMode.Smart;
                }
                stateGraph.AddToil(lordToil);
                lordToil2 = new LordToil_DefendPoint(false);
                stateGraph.AddToil(lordToil2);
                Transition transition = new Transition(lordToil, lordToil2);
                transition.AddTrigger(new Trigger_PawnHarmed(1f, false).WithFilter(new TriggerFilter_NoSapperSapping()));
                transition.AddPreAction(new TransitionAction_SetDefendLocalGroup());
                stateGraph.AddTransition(transition);
                Transition transition2 = new Transition(lordToil2, lordToil);
                transition2.AddTrigger(new Trigger_TicksPassedWithoutHarm(900));
                stateGraph.AddTransition(transition2);
            }
            LordToil lordToil3 = new LordToil_AssaultColony();

            if (this.useAvoidGridSmart)
            {
                lordToil3.avoidGridMode = AvoidGridMode.Smart;
            }
            stateGraph.AddToil(lordToil3);
            LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.Jog, false);

            lordToil_ExitMap.avoidGridMode = AvoidGridMode.Smart;
            stateGraph.AddToil(lordToil_ExitMap);
            if (this.sappers)
            {
                Transition transition3 = new Transition(lordToil, lordToil3);
                transition3.AddSource(lordToil2);
                transition3.AddTrigger(new Trigger_NoFightingSappers());
                stateGraph.AddTransition(transition3);
            }
            if (this.assaulterFaction.def.humanlikeFaction)
            {
                if (this.canTimeoutOrFlee)
                {
                    Transition transition4 = new Transition(lordToil3, lordToil_ExitMap);
                    if (lordToil != null)
                    {
                        transition4.AddSource(lordToil);
                    }
                    transition4.AddTrigger(new Trigger_TicksPassed((!this.sappers) ? LordJob_AssaultColony.AssaultTimeBeforeGiveUp.RandomInRange : LordJob_AssaultColony.SapTimeBeforeGiveUp.RandomInRange));
                    transition4.AddPreAction(new TransitionAction_Message("MessageRaidersGivenUpLeaving".Translate(this.assaulterFaction.def.pawnsPlural.CapitalizeFirst(), this.assaulterFaction.Name)));
                    stateGraph.AddTransition(transition4);
                    Transition transition5 = new Transition(lordToil3, lordToil_ExitMap);
                    if (lordToil != null)
                    {
                        transition5.AddSource(lordToil);
                    }
                    float randomInRange = new FloatRange(0.25f, 0.35f).RandomInRange;
                    transition5.AddTrigger(new Trigger_FractionColonyDamageTaken(randomInRange, 900f));
                    transition5.AddPreAction(new TransitionAction_Message("MessageRaidersSatisfiedLeaving".Translate(this.assaulterFaction.def.pawnsPlural.CapitalizeFirst(), this.assaulterFaction.Name)));
                    stateGraph.AddTransition(transition5);
                }
                if (this.canKidnap)
                {
                    LordToil   startingToil = stateGraph.AttachSubgraph(new LordJob_Kidnap().CreateGraph()).StartingToil;
                    Transition transition6  = new Transition(lordToil3, startingToil);
                    if (lordToil != null)
                    {
                        transition6.AddSource(lordToil);
                    }
                    transition6.AddPreAction(new TransitionAction_Message("MessageRaidersKidnapping".Translate(this.assaulterFaction.def.pawnsPlural.CapitalizeFirst(), this.assaulterFaction.Name)));
                    transition6.AddTrigger(new Trigger_KidnapVictimPresent());
                    stateGraph.AddTransition(transition6);
                }
                if (this.canSteal)
                {
                    LordToil   startingToil2 = stateGraph.AttachSubgraph(new LordJob_Steal().CreateGraph()).StartingToil;
                    Transition transition7   = new Transition(lordToil3, startingToil2);
                    if (lordToil != null)
                    {
                        transition7.AddSource(lordToil);
                    }
                    transition7.AddPreAction(new TransitionAction_Message("MessageRaidersStealing".Translate(this.assaulterFaction.def.pawnsPlural.CapitalizeFirst(), this.assaulterFaction.Name)));
                    transition7.AddTrigger(new Trigger_HighValueThingsAround());
                    stateGraph.AddTransition(transition7);
                }
            }
            Transition transition8 = new Transition(lordToil3, lordToil_ExitMap);

            if (lordToil != null)
            {
                transition8.AddSource(lordToil);
            }
            transition8.AddTrigger(new Trigger_BecameColonyAlly());
            transition8.AddPreAction(new TransitionAction_Message("MessageRaidersLeaving".Translate(this.assaulterFaction.def.pawnsPlural.CapitalizeFirst(), this.assaulterFaction.Name)));
            stateGraph.AddTransition(transition8);
            return(stateGraph);
        }
예제 #16
0
        public override StateGraph CreateGraph()
        {
            StateGraph stateGraph   = new StateGraph();
            LordToil   startingToil = stateGraph.AttachSubgraph(new LordJob_Travel(this.chillSpot).CreateGraph()).StartingToil;

            stateGraph.StartingToil = startingToil;
            LordToil_DefendPoint lordToil_DefendPoint = new LordToil_DefendPoint(this.chillSpot, 28f);

            stateGraph.AddToil(lordToil_DefendPoint);
            LordToil_TakeWoundedGuest lordToil_TakeWoundedGuest = new LordToil_TakeWoundedGuest();

            stateGraph.AddToil(lordToil_TakeWoundedGuest);
            StateGraph       stateGraph2      = new LordJob_TravelAndExit(IntVec3.Invalid).CreateGraph();
            LordToil         startingToil2    = stateGraph.AttachSubgraph(stateGraph2).StartingToil;
            LordToil         target           = stateGraph2.lordToils[1];
            LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.Walk, true);

            stateGraph.AddToil(lordToil_ExitMap);
            Transition transition = new Transition(startingToil, startingToil2, false, true);

            transition.AddSources(new LordToil[]
            {
                lordToil_DefendPoint
            });
            transition.AddTrigger(new Trigger_PawnExperiencingDangerousTemperatures());
            transition.AddPreAction(new TransitionAction_Message("MessageVisitorsDangerousTemperature".Translate(this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name), null, 1f));
            transition.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            transition.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition, false);
            Transition transition2 = new Transition(startingToil, lordToil_ExitMap, false, true);

            transition2.AddSources(new LordToil[]
            {
                lordToil_DefendPoint,
                lordToil_TakeWoundedGuest
            });
            transition2.AddSources(stateGraph2.lordToils);
            transition2.AddTrigger(new Trigger_PawnCannotReachMapEdge());
            transition2.AddPreAction(new TransitionAction_Message("MessageVisitorsTrappedLeaving".Translate(this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name), null, 1f));
            stateGraph.AddTransition(transition2, false);
            Transition transition3 = new Transition(lordToil_ExitMap, startingToil2, false, true);

            transition3.AddTrigger(new Trigger_PawnCanReachMapEdge());
            transition3.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            transition3.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition3, false);
            Transition transition4 = new Transition(startingToil, lordToil_DefendPoint, false, true);

            transition4.AddTrigger(new Trigger_Memo("TravelArrived"));
            stateGraph.AddTransition(transition4, false);
            Transition transition5 = new Transition(lordToil_DefendPoint, lordToil_TakeWoundedGuest, false, true);

            transition5.AddTrigger(new Trigger_WoundedGuestPresent());
            transition5.AddPreAction(new TransitionAction_Message("MessageVisitorsTakingWounded".Translate(this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name), null, 1f));
            stateGraph.AddTransition(transition5, false);
            Transition transition6 = new Transition(lordToil_DefendPoint, target, false, true);

            transition6.AddSources(new LordToil[]
            {
                lordToil_TakeWoundedGuest,
                startingToil
            });
            transition6.AddTrigger(new Trigger_BecamePlayerEnemy());
            transition6.AddPreAction(new TransitionAction_SetDefendLocalGroup());
            transition6.AddPostAction(new TransitionAction_WakeAll());
            transition6.AddPostAction(new TransitionAction_EndAllJobs());
            stateGraph.AddTransition(transition6, false);
            Transition transition7 = new Transition(lordToil_DefendPoint, startingToil2, false, true);

            transition7.AddTrigger(new Trigger_TicksPassed((!DebugSettings.instantVisitorsGift) ? Rand.Range(8000, 22000) : 0));
            transition7.AddPreAction(new TransitionAction_Message("VisitorsLeaving".Translate(this.faction.Name), null, 1f));
            transition7.AddPreAction(new TransitionAction_CheckGiveGift());
            transition7.AddPostAction(new TransitionAction_WakeAll());
            transition7.AddPreAction(new TransitionAction_EnsureHaveExitDestination());
            stateGraph.AddTransition(transition7, false);
            return(stateGraph);
        }
예제 #17
0
        public override StateGraph CreateGraph()
        {
            StateGraph           stateGraph = new StateGraph();
            LordToil_DefendPoint dropToil   = new LordToil_DefendPoint(true);

            stateGraph.StartingToil = dropToil; // Just used to verify the exit spot is valid.
            LordToil_Travel travelToil = new LordToil_Travel(this.targetDestination);

            stateGraph.AddToil(travelToil);
            LordToil_DefendPoint defendPointToil = new LordToil_DefendPoint(false);

            stateGraph.AddToil(defendPointToil);
            LordToil_ExitMap exitMapPeacefullyToil = new LordToil_ExitMap(LocomotionUrgency.Walk, false);

            stateGraph.AddToil(exitMapPeacefullyToil);
            LordToil_EscortDownedPawn escortDownedPawnPeacefullyToil = new LordToil_EscortDownedPawn(this.targetDestination, LocomotionUrgency.Walk);

            stateGraph.AddToil(escortDownedPawnPeacefullyToil);
            LordToil_ExitMap exitMapHurryToil = new LordToil_ExitMap(LocomotionUrgency.Jog, true);

            stateGraph.AddToil(exitMapHurryToil);
            LordToil_DefendPoint defendPointHurryToil = new LordToil_DefendPoint(false);

            stateGraph.AddToil(defendPointHurryToil);
            LordToil_EscortDownedPawn escortDownedPawnHurryToil = new LordToil_EscortDownedPawn(this.targetDestination, LocomotionUrgency.Jog);

            stateGraph.AddToil(escortDownedPawnHurryToil);

            // Begin travel.
            stateGraph.AddTransition(new Transition(dropToil, travelToil)
            {
                triggers =
                {
                    new Trigger_TicksPassedWithoutHarm(1)
                },
                preActions =
                {
                    new TransitionAction_CheckExitSpotIsValid()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Defend.
            stateGraph.AddTransition(new Transition(travelToil, defendPointToil)
            {
                triggers =
                {
                    new Trigger_PawnHarmed(1f, false)
                },
                preActions =
                {
                    new TransitionAction_SetDefendLocalGroup()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Back to travel after defending.
            stateGraph.AddTransition(new Transition(defendPointToil, travelToil)
            {
                triggers =
                {
                    new Trigger_TicksPassedWithoutHarm(1200)
                },
                preActions =
                {
                    new TransitionAction_EnsureHaveExitDestination()
                }
            });
            // Escort downed pawn peacefully.
            stateGraph.AddTransition(new Transition(travelToil, escortDownedPawnPeacefullyToil)
            {
                sources =
                {
                    exitMapPeacefullyToil
                },
                triggers =
                {
                    new Trigger_ReachableDownedPawn()
                },
                preActions =
                {
                    new TransitionAction_CheckExitSpotIsValid()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Back to travel after escorting pawn peacefully.
            stateGraph.AddTransition(new Transition(escortDownedPawnPeacefullyToil, travelToil)
            {
                triggers =
                {
                    new Trigger_Memo("RescueEnded")
                }
            });
            // Exit peacefully.
            stateGraph.AddTransition(new Transition(travelToil, exitMapPeacefullyToil)
            {
                triggers =
                {
                    new Trigger_Memo("TravelArrived")
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Exit in hurry.
            stateGraph.AddTransition(new Transition(travelToil, exitMapHurryToil)
            {
                sources =
                {
                    exitMapPeacefullyToil,
                    escortDownedPawnPeacefullyToil
                },
                triggers =
                {
                    new Trigger_PawnCannotReachTargetDestination(),
                    new Trigger_HostileToColony()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Defend in hurry.
            stateGraph.AddTransition(new Transition(exitMapHurryToil, defendPointHurryToil)
            {
                triggers =
                {
                    new Trigger_PawnHarmed(1f, false)
                },
                preActions =
                {
                    new TransitionAction_SetDefendLocalGroup()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Back to exit in hurry after defending.
            stateGraph.AddTransition(new Transition(defendPointHurryToil, exitMapHurryToil)
            {
                triggers =
                {
                    new Trigger_TicksPassedWithoutHarm(1200)
                }
            });
            // Escort downed pawn in hurry.
            stateGraph.AddTransition(new Transition(exitMapHurryToil, escortDownedPawnHurryToil)
            {
                triggers =
                {
                    new Trigger_ReachableDownedPawn()
                },
                preActions =
                {
                    new TransitionAction_CheckExitSpotIsValid()
                },
                postActions =
                {
                    new TransitionAction_EndAllJobs()
                }
            });
            // Back to exit in hurry after escorting pawn in hurry.
            stateGraph.AddTransition(new Transition(escortDownedPawnHurryToil, exitMapHurryToil)
            {
                triggers =
                {
                    new Trigger_Memo("RescueEnded")
                }
            });
            return(stateGraph);
        }