public override StateGraph CreateGraph() { StateGraph graphArrive = new StateGraph(); var travelGraph = new LordJob_Travel(chillSpot).CreateGraph(); travelGraph.StartingToil = new LordToil_CustomTravel(chillSpot, 0.49f); // CHANGED: override StartingToil LordToil toilArrive = graphArrive.AttachSubgraph(travelGraph).StartingToil; var toilVisit = new LordToil_VisitPoint(chillSpot); // CHANGED graphArrive.lordToils.Add(toilVisit); LordToil toilTakeWounded = new LordToil_TakeWoundedGuest(); graphArrive.lordToils.Add(toilTakeWounded); StateGraph graphExit = new LordJob_TravelAndExit(IntVec3.Invalid).CreateGraph(); LordToil toilExit = graphArrive.AttachSubgraph(graphExit).StartingToil; LordToil toilLeaveMap = graphExit.lordToils[1]; LordToil toilLost = new LordToil_End(); graphExit.AddToil(toilLost); Transition t1 = new Transition(toilArrive, toilVisit); t1.triggers.Add(new Trigger_Memo("TravelArrived")); graphArrive.transitions.Add(t1); LordToil_ExitMapBest toilExitCold = new LordToil_ExitMapBest(); // ADDED TOIL graphArrive.AddToil(toilExitCold); Transition t6 = new Transition(toilArrive, toilExitCold); // ADDED TRANSITION t6.triggers.Add(new Trigger_UrgentlyCold()); t6.preActions.Add(new TransitionAction_Message("MessageVisitorsLeavingCold".Translate(new object[] { faction.Name }))); t6.preActions.Add(new TransitionAction_Custom(() => StopPawns(lord.ownedPawns))); graphArrive.transitions.Add(t6); Transition t2 = new Transition(toilVisit, toilTakeWounded); t2.triggers.Add(new Trigger_WoundedGuestPresent()); t2.preActions.Add(new TransitionAction_Message("MessageVisitorsTakingWounded".Translate(new object[] { faction.def.pawnsPlural.CapitalizeFirst(), faction.Name }))); graphArrive.transitions.Add(t2); Transition t3 = new Transition(toilVisit, toilLeaveMap); t3.triggers.Add(new Trigger_BecameColonyEnemy()); t3.preActions.Add(new TransitionAction_WakeAll()); t3.preActions.Add(new TransitionAction_SetDefendLocalGroup()); graphArrive.transitions.Add(t3); Transition t4 = new Transition(toilArrive, toilExit); t4.triggers.Add(new Trigger_BecameColonyEnemy()); //t4.triggers.Add(new Trigger_VisitorsPleasedMax(MaxPleaseAmount(faction.ColonyGoodwill))); // CHANGED t4.triggers.Add(new Trigger_VisitorsAngeredMax(IncidentWorker_VisitorGroup.MaxAngerAmount(faction.PlayerGoodwill))); // CHANGED t4.preActions.Add(new TransitionAction_WakeAll()); t4.preActions.Add(new TransitionAction_EnsureHaveExitDestination()); graphArrive.transitions.Add(t4); Transition t5 = new Transition(toilVisit, toilExit); t5.triggers.Add(new Trigger_TicksPassed(Rand.Range(16000, 44000))); t5.preActions.Add(new TransitionAction_Message("VisitorsLeaving".Translate(new object[] { faction.Name }))); t5.preActions.Add(new TransitionAction_WakeAll()); t5.preActions.Add(new TransitionAction_EnsureHaveExitDestination()); graphArrive.transitions.Add(t5); return(graphArrive); }
public override StateGraph CreateGraph() { StateGraph graphArrive = new StateGraph(); StateGraph graphExit = new LordJob_TravelAndExit(IntVec3.Invalid).CreateGraph(); StateGraph travelGraph = new LordJob_Travel(chillSpot).CreateGraph(); travelGraph.StartingToil = new LordToil_CustomTravel(chillSpot, 0.49f, 85); // Arriving LordToil toilArriving = graphArrive.AttachSubgraph(travelGraph).StartingToil; // Visiting var toilVisiting = new LordToil_VisitPoint(); graphArrive.lordToils.Add(toilVisiting); // Exit LordToil toilExit = graphArrive.AttachSubgraph(graphExit).StartingToil; // Leave map LordToil toilLeaveMap = graphExit.lordToils[1]; // Take wounded LordToil toilTakeWounded = new LordToil_TakeWoundedGuest { lord = lord }; // This fixes the issue of missing lord when showing leave message graphExit.AddToil(toilTakeWounded); // Exit (TODO: Remove for 1.2) LordToil_ExitMap toilExitMap = new LordToil_ExitMap(); graphArrive.AddToil(toilExitMap); // Arrived { Transition t1 = new Transition(toilArriving, toilVisiting); t1.triggers.Add(new Trigger_Memo("TravelArrived")); graphArrive.transitions.Add(t1); } // Too cold / hot { Transition t6 = new Transition(toilArriving, toilExit); t6.AddTrigger(new Trigger_PawnExperiencingDangerousTemperatures()); t6.AddPreAction(new TransitionAction_Message("MessageVisitorsDangerousTemperature".Translate(faction?.def.pawnsPlural.CapitalizeFirst(), faction?.Name))); t6.AddPreAction(new TransitionAction_EnsureHaveExitDestination()); t6.AddPostAction(new TransitionAction_EndAllJobs()); graphArrive.AddTransition(t6); } // Became enemy while arriving { Transition t3 = new Transition(toilVisiting, toilLeaveMap); t3.triggers.Add(new Trigger_BecamePlayerEnemy()); t3.preActions.Add(new TransitionAction_SetDefendLocalGroup()); t3.postActions.Add(new TransitionAction_WakeAll()); graphArrive.transitions.Add(t3); } // Leave if became angry { Transition t4 = new Transition(toilArriving, toilExit); t4.triggers.Add(new Trigger_BecamePlayerEnemy()); t4.triggers.Add(new Trigger_VisitorsAngeredMax(IncidentWorker_VisitorGroup.MaxAngerAmount(faction?.PlayerGoodwill ?? 0))); t4.preActions.Add(new TransitionAction_EnsureHaveExitDestination()); t4.postActions.Add(new TransitionAction_WakeAll()); graphArrive.transitions.Add(t4); } // Leave if stayed long enough { Transition t5 = new Transition(toilVisiting, toilExit); t5.triggers.Add(new Trigger_TicksPassedAndOkayToLeave(stayDuration)); t5.triggers.Add(new Trigger_SentAway()); // Sent away during stay t5.preActions.Add(new TransitionAction_Message("VisitorsLeaving".Translate(faction?.Name))); t5.preActions.Add(new TransitionAction_EnsureHaveExitDestination()); t5.postActions.Add(new TransitionAction_WakeAll()); graphArrive.transitions.Add(t5); } // Leave if sent away (before fully arriving!) { Transition t7 = new Transition(toilArriving, toilExit); t7.triggers.Add(new Trigger_SentAway()); t7.preActions.Add(new TransitionAction_Message("VisitorsLeaving".Translate(faction?.Name))); t7.preActions.Add(new TransitionAction_WakeAll()); t7.preActions.Add(new TransitionAction_SendAway()); graphArrive.transitions.Add(t7); } // Take wounded guest when arriving { Transition t8 = new Transition(toilArriving, toilTakeWounded); t8.AddTrigger(new Trigger_WoundedGuestPresent()); t8.AddPreAction(new TransitionAction_Message("MessageVisitorsTakingWounded".Translate(faction?.def.pawnsPlural.CapitalizeFirst(), faction?.Name))); graphArrive.AddTransition(t8); } // Take wounded guest when leaving - couldn't get this to work //{ //Transition t9 = new Transition(toilExit, toilTakeWounded); //t9.AddTrigger(new Trigger_WoundedGuestPresent()); //t9.AddPreAction(new TransitionAction_Message("MessageVisitorsTakingWounded".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name))); //graphExit.AddTransition(t9); //} return(graphArrive); }
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); }
// defence and flee subgraph public StateGraph TraderDefence(List<LordToil> sourceLordToils) { var graph = new StateGraph(); var toilFlee = new LordToil_TakeWoundedGuest(); graph.lordToils.Add(toilFlee); var toilDefence = new LordToil_DefendCaravan(); graph.lordToils.Add(toilDefence); var transitionToFlee = new Transition(toilDefence, toilFlee); transitionToFlee.sources.AddRange(sourceLordToils); transitionToFlee.triggers.Add(new Trigger_ImportantCaravanPeopleLost()); transitionToFlee.preActions.Add(new TransitionAction_Message( "MessageVisitorsTakingWounded".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name))); transitionToFlee.preActions.Add(new TransitionAction_WakeAll()); graph.transitions.Add(transitionToFlee); // for each lordToil added transition to the defence lordToil, and it's toils index is kept to get back to it later foreach (var currentToil in sourceLordToils) { var transitionToDefence = new Transition(currentToil, toilDefence); transitionToDefence.triggers.Add(new Trigger_PawnHarmed()); // keep the toil index that actually triggered transition as reference to return back to transitionToDefence.preActions.Add(new TransitionAction_Custom(() => { toilDefence.Data.initialLordToilIndex = sourceLordToils.IndexOf(currentToil); })); transitionToDefence.preActions.Add(new TransitionAction_WakeAll()); graph.transitions.Add(transitionToDefence); } // adds transitions back to the initial lordToil, initialize target toil with temporary null var transitionToSource = new Transition(toilDefence, null); transitionToSource.triggers.Add(new Trigger_Memo("DefenceSuccessful")); // asign target toil to return towith transitionAction transitionToSource.preActions.Add(new TransitionAction_Custom(() => { transitionToSource.target = sourceLordToils[toilDefence.Data.initialLordToilIndex]; })); graph.transitions.Add(transitionToSource); return graph; }
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); }