public void SetJob(LordJob lordJob) { if (this.curJob != null) { this.curJob.Cleanup(); } this.curJob = lordJob; this.curLordToil = null; lordJob.lord = this; Rand.PushState(); Rand.Seed = this.loadID * 193; this.graph = lordJob.CreateGraph(); Rand.PopState(); this.graph.ErrorCheck(); if (this.faction != null && !this.faction.IsPlayer && this.faction.def.autoFlee && lordJob.AddFleeToil) { LordToil_PanicFlee lordToil_PanicFlee = new LordToil_PanicFlee(); lordToil_PanicFlee.avoidGridMode = AvoidGridMode.Smart; for (int i = 0; i < this.graph.lordToils.Count; i++) { Transition transition = new Transition(this.graph.lordToils[i], lordToil_PanicFlee, false, true); transition.AddPreAction(new TransitionAction_Message("MessageFightersFleeing".Translate(new object[] { this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name }), null, 1f)); transition.AddTrigger(new Trigger_FractionPawnsLost(0.5f)); this.graph.AddTransition(transition, true); } this.graph.AddToil(lordToil_PanicFlee); } for (int j = 0; j < this.graph.lordToils.Count; j++) { this.graph.lordToils[j].lord = this; } for (int k = 0; k < this.ownedPawns.Count; k++) { this.Map.attackTargetsCache.UpdateTarget(this.ownedPawns[k]); } }
public void SetJob(LordJob lordJob) { if (curJob != null) { curJob.Cleanup(); } curJob = lordJob; curLordToil = null; lordJob.lord = this; Rand.PushState(); Rand.Seed = loadID * 193; graph = lordJob.CreateGraph(); Rand.PopState(); graph.ErrorCheck(); if (faction != null && !faction.IsPlayer && faction.def.autoFlee && lordJob.AddFleeToil) { LordToil_PanicFlee lordToil_PanicFlee = new LordToil_PanicFlee(); lordToil_PanicFlee.useAvoidGrid = true; for (int i = 0; i < graph.lordToils.Count; i++) { Transition transition = new Transition(graph.lordToils[i], lordToil_PanicFlee); transition.AddPreAction(new TransitionAction_Message("MessageFightersFleeing".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name))); transition.AddTrigger(new Trigger_FractionPawnsLost(faction.def.attackersDownPercentageRangeForAutoFlee.RandomInRangeSeeded(loadID))); graph.AddTransition(transition, highPriority: true); } graph.AddToil(lordToil_PanicFlee); } for (int j = 0; j < graph.lordToils.Count; j++) { graph.lordToils[j].lord = this; } for (int k = 0; k < ownedPawns.Count; k++) { Map.attackTargetsCache.UpdateTarget(ownedPawns[k]); } }
public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); LordToil startingToil = stateGraph.AttachSubgraph(new LordJob_Travel(this.chillSpot).CreateGraph()).StartingToil; stateGraph.StartingToil = startingToil; var lordToil_WanderAndChat = IoM_StoryUtilities.GetWandererChatToil(this.chatType); stateGraph.AddToil(lordToil_WanderAndChat); 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_ExitMapBest lordToil_ExitMapBest = new LordToil_ExitMapBest(LocomotionUrgency.Walk, true); stateGraph.AddToil(lordToil_ExitMapBest); Transition transition = new Transition(startingToil, lordToil_ExitMapBest); transition.AddSources(new LordToil[] { lordToil_WanderAndChat, lordToil_TakeWoundedGuest }); transition.AddSources(stateGraph2.lordToils); transition.AddTrigger(new Trigger_PawnCannotReachMapEdge()); string leavingMessage; if (this.isLonePawn) { leavingMessage = "MessageLoneWandererLeaving".Translate(new object[] { this.centralPawn.Name }); } else { leavingMessage = "MessageGroupWandererLeaving".Translate(); } transition.AddPreAction(new TransitionAction_Message(leavingMessage)); stateGraph.AddTransition(transition); Transition transition2 = new Transition(lordToil_ExitMapBest, startingToil2); transition2.AddTrigger(new Trigger_PawnCanReachMapEdge()); transition2.AddPreAction(new TransitionAction_EnsureHaveExitDestination()); transition2.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition2); Transition transition3 = new Transition(startingToil, lordToil_WanderAndChat); transition3.AddTrigger(new Trigger_Memo("TravelArrived")); stateGraph.AddTransition(transition3); Transition transition4 = new Transition(lordToil_WanderAndChat, lordToil_TakeWoundedGuest); transition4.AddTrigger(new Trigger_WoundedGuestPresent()); stateGraph.AddTransition(transition4); Transition transition5 = new Transition(lordToil_WanderAndChat, target); transition5.AddSources(new LordToil[] { lordToil_TakeWoundedGuest, startingToil }); transition5.AddTrigger(new Trigger_PawnLostViolently()); transition5.AddPreAction(new TransitionAction_Custom(new Action(delegate { this.SwitchToHostileFaction(); }))); transition5.AddPreAction(new TransitionAction_WakeAll()); transition5.AddPreAction(new TransitionAction_SetDefendLocalGroup()); transition5.AddPreAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition5); Transition transition6 = new Transition(lordToil_WanderAndChat, startingToil2); transition6.AddTrigger(new Trigger_TicksPassed(Rand.Range(8000, 22000))); transition6.AddPreAction(new TransitionAction_Message(leavingMessage)); transition6.AddPreAction(new TransitionAction_WakeAll()); transition6.AddPreAction(new TransitionAction_EnsureHaveExitDestination()); stateGraph.AddTransition(transition6); LordToil_AssaultColony lordtoilAssault = new LordToil_AssaultColony(); stateGraph.AddToil(lordtoilAssault); lordtoilAssault.avoidGridMode = AvoidGridMode.Smart; Transition transition7 = new Transition(lordToil_WanderAndChat, lordtoilAssault); transition7.AddPreAction(new TransitionAction_Custom(new Action(delegate { this.factionInt.SetHostileTo(Faction.OfPlayer, true); }))); transition7.AddTrigger(new Trigger_Custom((TriggerSignal x) => this.InquisitorFoundHeretic && IoM_StoryUtilities.InquisitorShouldStartDirectAttack(this.Map, this.centralPawn.GetLord().ownedPawns))); stateGraph.AddTransition(transition7); LordToil_PanicFlee lordToilFlee = new LordToil_PanicFlee(); Transition transition8 = new Transition(lordToil_WanderAndChat, lordToilFlee); transition8.AddPreAction(new TransitionAction_Custom(new Action(delegate { this.factionInt.SetHostileTo(Faction.OfPlayer, true); }))); transition8.AddTrigger(new Trigger_Custom((TriggerSignal x) => this.InquisitorFoundHeretic && !IoM_StoryUtilities.InquisitorShouldStartDirectAttack(this.Map, this.centralPawn.GetLord().ownedPawns))); stateGraph.AddTransition(transition8); return(stateGraph); }