public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); List <LordToil> list = new List <LordToil>(); LordToil assaultToil = new LordToil_AssaultColonyWendigo(attackDownedIfStarving: true); stateGraph.AddToil(assaultToil); LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.Jog, canDig: false, interruptCurrentJob: true); lordToil_ExitMap.useAvoidGrid = true; stateGraph.AddToil(lordToil_ExitMap); Transition transitionLeaveOnSunLight = new Transition(assaultToil, lordToil_ExitMap); transitionLeaveOnSunLight.AddTrigger(new Trigger_SunLight()); transitionLeaveOnSunLight.AddPreAction(new TransitionAction_Message("Wendigos.MessageRaidersLeavingDueSunLight" .Translate(assaulterFaction.def.pawnsPlural.CapitalizeFirst(), assaulterFaction.Name))); stateGraph.AddTransition(transitionLeaveOnSunLight); if (assaulterFaction != null) { Transition transition7 = new Transition(assaultToil, lordToil_ExitMap); transition7.AddSources(list); transition7.AddTrigger(new Trigger_BecameNonHostileToPlayer()); transition7.AddPreAction(new TransitionAction_Message("MessageRaidersLeaving".Translate(assaulterFaction.def.pawnsPlural.CapitalizeFirst(), assaulterFaction.Name))); stateGraph.AddTransition(transition7); } return(stateGraph); }
public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); LordToil_HuntEnemies lordToil_HuntEnemies = new LordToil_HuntEnemies(this.fallbackLocation); stateGraph.AddToil(lordToil_HuntEnemies); StateGraph stateGraph2 = new LordJob_Travel(IntVec3.Invalid).CreateGraph(); LordToil startingToil = stateGraph.AttachSubgraph(stateGraph2).StartingToil; LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.None, false); stateGraph.AddToil(lordToil_ExitMap); LordToil_ExitMap lordToil_ExitMap2 = new LordToil_ExitMap(LocomotionUrgency.Jog, true); stateGraph.AddToil(lordToil_ExitMap2); Transition transition = new Transition(lordToil_HuntEnemies, startingToil, false, true); transition.AddPreAction(new TransitionAction_Message("MessageVisitorsDangerousTemperature".Translate(new object[] { this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name }), null, 1f)); transition.AddPreAction(new TransitionAction_EnsureHaveExitDestination()); transition.AddTrigger(new Trigger_PawnExperiencingDangerousTemperatures()); transition.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition, false); Transition transition2 = new Transition(lordToil_HuntEnemies, lordToil_ExitMap2, false, true); transition2.AddSource(lordToil_ExitMap); transition2.AddSources(stateGraph2.lordToils); transition2.AddPreAction(new TransitionAction_Message("MessageVisitorsTrappedLeaving".Translate(new object[] { this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name }), null, 1f)); transition2.AddTrigger(new Trigger_PawnCannotReachMapEdge()); stateGraph.AddTransition(transition2, false); Transition transition3 = new Transition(lordToil_ExitMap2, startingToil, false, true); transition3.AddTrigger(new Trigger_PawnCanReachMapEdge()); transition3.AddPreAction(new TransitionAction_EnsureHaveExitDestination()); stateGraph.AddTransition(transition3, false); Transition transition4 = new Transition(lordToil_HuntEnemies, startingToil, false, true); transition4.AddPreAction(new TransitionAction_Message("MessageFriendlyFightersLeaving".Translate(new object[] { this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name }), null, 1f)); transition4.AddTrigger(new Trigger_TicksPassed(25000)); transition4.AddPreAction(new TransitionAction_EnsureHaveExitDestination()); stateGraph.AddTransition(transition4, false); Transition transition5 = new Transition(startingToil, lordToil_ExitMap, false, true); transition5.AddTrigger(new Trigger_Memo("TravelArrived")); stateGraph.AddTransition(transition5, false); return(stateGraph); }
public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); LordToil_Travel lordToil_Travel = new LordToil_Travel(this.groupUpLoc); lordToil_Travel.maxDanger = Danger.Deadly; lordToil_Travel.avoidGridMode = AvoidGridMode.Smart; stateGraph.StartingToil = lordToil_Travel; LordToil_PrisonerEscape lordToil_PrisonerEscape = new LordToil_PrisonerEscape(this.exitPoint, this.sapperThingID); lordToil_PrisonerEscape.avoidGridMode = AvoidGridMode.Smart; stateGraph.AddToil(lordToil_PrisonerEscape); LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.Jog, false); lordToil_ExitMap.avoidGridMode = AvoidGridMode.Smart; stateGraph.AddToil(lordToil_ExitMap); LordToil_ExitMap lordToil_ExitMap2 = new LordToil_ExitMap(LocomotionUrgency.Jog, true); stateGraph.AddToil(lordToil_ExitMap2); Transition transition = new Transition(lordToil_Travel, lordToil_ExitMap2); transition.AddSources(new LordToil[] { lordToil_PrisonerEscape, lordToil_ExitMap }); transition.AddTrigger(new Trigger_PawnCannotReachMapEdge()); stateGraph.AddTransition(transition); Transition transition2 = new Transition(lordToil_ExitMap2, lordToil_ExitMap); transition2.AddTrigger(new Trigger_PawnCanReachMapEdge()); transition2.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition2); Transition transition3 = new Transition(lordToil_Travel, lordToil_PrisonerEscape); transition3.AddTrigger(new Trigger_Memo("TravelArrived")); stateGraph.AddTransition(transition3); Transition transition4 = new Transition(lordToil_Travel, lordToil_PrisonerEscape); transition4.AddTrigger(new Trigger_PawnLost()); stateGraph.AddTransition(transition4); Transition transition5 = new Transition(lordToil_PrisonerEscape, lordToil_PrisonerEscape); transition5.canMoveToSameState = true; transition5.AddTrigger(new Trigger_PawnLost()); transition5.AddTrigger(new Trigger_PawnHarmed(1f, false)); stateGraph.AddTransition(transition5); Transition transition6 = new Transition(lordToil_PrisonerEscape, lordToil_ExitMap); transition6.AddTrigger(new Trigger_Memo("TravelArrived")); stateGraph.AddTransition(transition6); return(stateGraph); }
public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); string noFulfilledTradeMsg = "IR.LordJobFulfillItemRequest.NoFulfillTrade".Translate(); string partiallyFulfilledTradeMsg = "IR.LordJobFulfillItemRequest.NoFulfillAllTrade".Translate(); string addedMessageText = faction.RelationKindWith(playerFaction) == FactionRelationKind.Neutral ? "IR.LordJobFulfillItemRequest.AttackingOutOfAnger".Translate() : "IR.LordJobFulfillItemRequest.RelationsDropped".Translate(); TransitionAction_Custom clearCaravanRequest = new TransitionAction_Custom(() => { Find.World.GetComponent <RequestSession>().CloseOpenDealWith(faction); }); // =================== // TOILS // =================== LordToil_Travel moving = new LordToil_Travel(chillSpot); stateGraph.StartingToil = moving; LordToil_DefendPoint defending = new LordToil_DefendTraderCaravan(); stateGraph.AddToil(defending); LordToil_DefendPoint defendingChillPoint = new LordToil_DefendTraderCaravan(chillSpot, 40); stateGraph.AddToil(defendingChillPoint); LordToil_ExitMapAndEscortCarriers exitingAndEscorting = new LordToil_ExitMapAndEscortCarriers(); stateGraph.AddToil(exitingAndEscorting); LordToil_ExitMap exiting = new LordToil_ExitMap(); stateGraph.AddToil(exiting); LordToil_ExitMap urgentExiting = new LordToil_ExitMap(LocomotionUrgency.Walk, true); stateGraph.AddToil(urgentExiting); LordToil_ExitMapTraderFighting exitWhileFighting = new LordToil_ExitMapTraderFighting(); stateGraph.AddToil(exitWhileFighting); // =================== // TRANSITIONS // =================== Transition leaveIfDangerousTemp = new Transition(moving, exitingAndEscorting); leaveIfDangerousTemp.AddSources(new LordToil[] { defending, defendingChillPoint }); leaveIfDangerousTemp.AddTrigger(new Trigger_PawnExperiencingDangerousTemperatures()); leaveIfDangerousTemp.AddPreAction(new TransitionAction_Message("MessageVisitorsDangerousTemperature".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name))); leaveIfDangerousTemp.AddPostAction(new TransitionAction_EndAllJobs()); leaveIfDangerousTemp.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(leaveIfDangerousTemp); Transition leaveIfTrapped = new Transition(moving, urgentExiting); leaveIfTrapped.AddSources(new LordToil[] { defending, defendingChillPoint, exitingAndEscorting, exiting, exitWhileFighting }); leaveIfTrapped.AddTrigger(new Trigger_PawnCannotReachMapEdge()); leaveIfTrapped.AddPostAction(new TransitionAction_Message("MessageVisitorsTrappedLeaving".Translate(faction.def.pawnsPlural.CapitalizeFirst(), faction.Name))); leaveIfTrapped.AddPostAction(new TransitionAction_WakeAll()); leaveIfTrapped.AddPostAction(new TransitionAction_EndAllJobs()); leaveIfTrapped.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(leaveIfTrapped); Transition fightIfTrapped = new Transition(urgentExiting, exitWhileFighting); fightIfTrapped.AddTrigger(new Trigger_PawnCanReachMapEdge()); fightIfTrapped.AddPostAction(new TransitionAction_EndAllJobs()); fightIfTrapped.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(fightIfTrapped); Transition fightIfFractionPawnsLost = new Transition(moving, exitWhileFighting); fightIfFractionPawnsLost.AddSources(new LordToil[] { defending, defendingChillPoint, exitingAndEscorting, exiting }); fightIfFractionPawnsLost.AddTrigger(new Trigger_FractionPawnsLost(0.2f)); fightIfFractionPawnsLost.AddPostAction(new TransitionAction_EndAllJobs()); fightIfFractionPawnsLost.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(fightIfFractionPawnsLost); Transition defendIfPawnHarmed = new Transition(moving, defending); defendIfPawnHarmed.AddTrigger(new Trigger_PawnHarmed()); defendIfPawnHarmed.AddPreAction(new TransitionAction_SetDefendTrader()); defendIfPawnHarmed.AddPostAction(new TransitionAction_WakeAll()); defendIfPawnHarmed.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(defendIfPawnHarmed); Transition returnToNormalAfterTimePasses = new Transition(defending, moving); returnToNormalAfterTimePasses.AddTrigger(new Trigger_TicksPassedWithoutHarm(1200)); stateGraph.AddTransition(returnToNormalAfterTimePasses); Transition stayPutAtSpot = new Transition(moving, defendingChillPoint); stayPutAtSpot.AddTrigger(new Trigger_Memo("TravelArrived")); stateGraph.AddTransition(stayPutAtSpot); Transition leaveIfRequestFulfilled = new Transition(moving, exitingAndEscorting); leaveIfRequestFulfilled.AddSources(new LordToil[] { defending, defendingChillPoint, }); leaveIfRequestFulfilled.AddTrigger(new Trigger_Memo(MemoOnFulfilled)); leaveIfRequestFulfilled.AddPreAction(new TransitionAction_Message("IR.LordJobFulfillItemRequest.RequestedCaravanLeaving".Translate(faction.Name))); leaveIfRequestFulfilled.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(leaveIfRequestFulfilled); int ticksUntilBadThings = Rand.Range( Mathf.RoundToInt(CaravanManager.fullDayInTicks / 2), // 0.5 days CaravanManager.fullDayInTicks + Mathf.RoundToInt(CaravanManager.fullDayInTicks / 4)); // 1.25 days // Determine actions if request goes unfulfilled based on faction relation Trigger_TicksPassed ticksPassed = new Trigger_TicksPassed(ticksUntilBadThings); TransitionAction_Message actionMessage = new TransitionAction_Message("IR.LordJobFulfillItemRequest.FactionInsulted".Translate(faction.Name) + "\n" + addedMessageText); TransitionAction_Message leavingMessage = new TransitionAction_Message("IR.LordJobFulfillItemRequest.RequestedCaravanLeaving".Translate(faction.Name)); if (isFactionNeutral) { Action setFactionToHostile = () => faction.TrySetRelationKind(playerFaction, FactionRelationKind.Hostile, true, noFulfilledTradeMsg); Transition attackIfNotEnoughSilver = new Transition(moving, defending, true); attackIfNotEnoughSilver.AddSources(new LordToil[] { defending, defendingChillPoint, exiting, exitingAndEscorting }); attackIfNotEnoughSilver.AddTrigger(new Trigger_Memo(MemoOnUnfulfilled)); attackIfNotEnoughSilver.AddPreAction(new TransitionAction_Message("IR.LordJobFulfillItemRequest.TradersAttacking".Translate(faction.Name))); attackIfNotEnoughSilver.AddPreAction(new TransitionAction_Custom(setFactionToHostile)); attackIfNotEnoughSilver.AddPostAction(new TransitionAction_WakeAll()); attackIfNotEnoughSilver.AddPostAction(new TransitionAction_SetDefendLocalGroup()); stateGraph.AddTransition(attackIfNotEnoughSilver, true); Transition attackIfRequestUnfulfilled = new Transition(defendingChillPoint, defending); attackIfRequestUnfulfilled.AddTrigger(ticksPassed); attackIfRequestUnfulfilled.AddPreAction(actionMessage); attackIfRequestUnfulfilled.AddPreAction(new TransitionAction_Custom(setFactionToHostile)); attackIfRequestUnfulfilled.AddPostAction(new TransitionAction_WakeAll()); attackIfRequestUnfulfilled.AddPostAction(new TransitionAction_SetDefendLocalGroup()); stateGraph.AddTransition(attackIfRequestUnfulfilled, true); Transition leaveAfterAttacking = new Transition(defendingChillPoint, exitingAndEscorting); leaveAfterAttacking.AddSource(defending); leaveAfterAttacking.AddTrigger(new Trigger_TicksPassed(ticksUntilBadThings + 10000)); leaveAfterAttacking.AddPreAction(leavingMessage); leaveAfterAttacking.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(leaveAfterAttacking); } else { Transition leaveIfRequestUnfulfilled = new Transition(moving, exitingAndEscorting); leaveIfRequestUnfulfilled.AddSources(new LordToil[] { defending, defendingChillPoint }); leaveIfRequestUnfulfilled.AddTrigger(new Trigger_Memo(MemoOnUnfulfilled)); leaveIfRequestUnfulfilled.AddTrigger(ticksPassed); leaveIfRequestUnfulfilled.AddPreAction(actionMessage); leaveIfRequestUnfulfilled.AddPreAction(new TransitionAction_Custom(() => { faction.TryAffectGoodwillWith(playerFaction, -30, true, false, noFulfilledTradeMsg); })); leaveIfRequestUnfulfilled.AddPostAction(leavingMessage); leaveIfRequestUnfulfilled.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(leaveIfRequestUnfulfilled); } // Partial fulfillment Transition leaveIfRequestMostlyFulfilled = new Transition(moving, exiting); leaveIfRequestMostlyFulfilled.AddSources(new LordToil[] { defending, defendingChillPoint }); leaveIfRequestMostlyFulfilled.AddTrigger(new Trigger_Memo(MemoOnPartiallyFulfilled_S)); leaveIfRequestMostlyFulfilled.AddPreAction(new TransitionAction_Message("IR.LordJobFulfillItemRequest.DisappointedTraders".Translate(faction.Name), MessageTypeDefOf.CautionInput)); leaveIfRequestMostlyFulfilled.AddPreAction(new TransitionAction_Custom(() => { faction.TryAffectGoodwillWith(playerFaction, -5, true, false, partiallyFulfilledTradeMsg); })); leaveIfRequestMostlyFulfilled.AddPostAction(leavingMessage); leaveIfRequestMostlyFulfilled.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(leaveIfRequestMostlyFulfilled); Transition leaveIfRequestSomewhatFulfilled = new Transition(moving, exiting); leaveIfRequestSomewhatFulfilled.AddSources(new LordToil[] { defending, defendingChillPoint }); leaveIfRequestSomewhatFulfilled.AddTrigger(new Trigger_Memo(MemoOnPartiallyFulfilled_M)); leaveIfRequestSomewhatFulfilled.AddPreAction(new TransitionAction_Message("IR.LordJobFulfillItemRequest.AnnoyedTraders".Translate(faction.Name), MessageTypeDefOf.CautionInput)); leaveIfRequestSomewhatFulfilled.AddPreAction(new TransitionAction_Custom(() => { faction.TryAffectGoodwillWith(playerFaction, -10, true, false, partiallyFulfilledTradeMsg); })); leaveIfRequestSomewhatFulfilled.AddPostAction(leavingMessage); leaveIfRequestSomewhatFulfilled.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(leaveIfRequestSomewhatFulfilled); Transition leaveIfRequestHardlyFulfilled = new Transition(moving, exiting); leaveIfRequestHardlyFulfilled.AddSources(new LordToil[] { defending, defendingChillPoint }); leaveIfRequestHardlyFulfilled.AddTrigger(new Trigger_Memo(MemoOnPartiallyFulfilled_L)); leaveIfRequestHardlyFulfilled.AddPreAction(new TransitionAction_Message("IR.LordJobFulfillItemRequest.OutragedTraders".Translate(faction.Name), MessageTypeDefOf.CautionInput)); leaveIfRequestHardlyFulfilled.AddPreAction(new TransitionAction_Custom(() => { faction.TryAffectGoodwillWith(playerFaction, -20, true, false, partiallyFulfilledTradeMsg); })); leaveIfRequestHardlyFulfilled.AddPostAction(leavingMessage); leaveIfRequestHardlyFulfilled.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(leaveIfRequestHardlyFulfilled); Transition continueToLeaveMap = new Transition(exitingAndEscorting, exitingAndEscorting, true); continueToLeaveMap.AddTrigger(new Trigger_PawnLost()); continueToLeaveMap.AddTrigger(new Trigger_TickCondition(() => LordToil_ExitMapAndEscortCarriers.IsAnyDefendingPosition(lord.ownedPawns) && !GenHostility.AnyHostileActiveThreatTo(Map, faction), 60)); continueToLeaveMap.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(continueToLeaveMap); Transition finishLeavingMap = new Transition(exitingAndEscorting, exiting); finishLeavingMap.AddTrigger(new Trigger_TicksPassed(60000)); finishLeavingMap.AddPostAction(new TransitionAction_WakeAll()); finishLeavingMap.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(finishLeavingMap); Transition leaveIfBadThingsHappen = new Transition(defendingChillPoint, exitingAndEscorting); leaveIfBadThingsHappen.AddSources(new LordToil[] { moving, defending }); leaveIfBadThingsHappen.AddTrigger(new Trigger_ImportantTraderCaravanPeopleLost()); leaveIfBadThingsHappen.AddPostAction(new TransitionAction_WakeAll()); leaveIfBadThingsHappen.AddPostAction(new TransitionAction_EndAllJobs()); leaveIfBadThingsHappen.AddPostAction(clearCaravanRequest); stateGraph.AddTransition(leaveIfBadThingsHappen); return(stateGraph); }
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); }
public override StateGraph CreateGraph() { StateGraph stateGraph = new StateGraph(); LordToil_Travel lordToil_Travel = new LordToil_Travel(this.chillSpot); stateGraph.StartingToil = lordToil_Travel; LordToil_DefendTraderCaravan lordToil_DefendTraderCaravan = new LordToil_DefendTraderCaravan(); stateGraph.AddToil(lordToil_DefendTraderCaravan); LordToil_DefendTraderCaravan lordToil_DefendTraderCaravan2 = new LordToil_DefendTraderCaravan(this.chillSpot); stateGraph.AddToil(lordToil_DefendTraderCaravan2); LordToil_ExitMapAndEscortCarriers lordToil_ExitMapAndEscortCarriers = new LordToil_ExitMapAndEscortCarriers(); stateGraph.AddToil(lordToil_ExitMapAndEscortCarriers); LordToil_ExitMap lordToil_ExitMap = new LordToil_ExitMap(LocomotionUrgency.None, false); stateGraph.AddToil(lordToil_ExitMap); LordToil_ExitMap lordToil_ExitMap2 = new LordToil_ExitMap(LocomotionUrgency.Walk, true); stateGraph.AddToil(lordToil_ExitMap2); LordToil_ExitMapTraderFighting lordToil_ExitMapTraderFighting = new LordToil_ExitMapTraderFighting(); stateGraph.AddToil(lordToil_ExitMapTraderFighting); Transition transition = new Transition(lordToil_Travel, lordToil_ExitMapAndEscortCarriers, false, true); transition.AddSources(new LordToil[] { lordToil_DefendTraderCaravan, lordToil_DefendTraderCaravan2 }); transition.AddPreAction(new TransitionAction_Message("MessageVisitorsDangerousTemperature".Translate(new object[] { this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name }), null, 1f)); transition.AddPostAction(new TransitionAction_EndAllJobs()); transition.AddTrigger(new Trigger_PawnExperiencingDangerousTemperatures()); stateGraph.AddTransition(transition, false); Transition transition2 = new Transition(lordToil_Travel, lordToil_ExitMap2, false, true); transition2.AddSources(new LordToil[] { lordToil_DefendTraderCaravan, lordToil_DefendTraderCaravan2, lordToil_ExitMapAndEscortCarriers, lordToil_ExitMap, lordToil_ExitMapTraderFighting }); transition2.AddTrigger(new Trigger_PawnCannotReachMapEdge()); transition2.AddPostAction(new TransitionAction_Message("MessageVisitorsTrappedLeaving".Translate(new object[] { this.faction.def.pawnsPlural.CapitalizeFirst(), this.faction.Name }), null, 1f)); transition2.AddPostAction(new TransitionAction_WakeAll()); transition2.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition2, false); Transition transition3 = new Transition(lordToil_ExitMap2, lordToil_ExitMapTraderFighting, false, true); transition3.AddTrigger(new Trigger_PawnCanReachMapEdge()); transition3.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition3, false); Transition transition4 = new Transition(lordToil_Travel, lordToil_ExitMapTraderFighting, false, true); transition4.AddSources(new LordToil[] { lordToil_DefendTraderCaravan, lordToil_DefendTraderCaravan2, lordToil_ExitMapAndEscortCarriers, lordToil_ExitMap }); transition4.AddTrigger(new Trigger_FractionPawnsLost(0.2f)); transition4.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition4, false); Transition transition5 = new Transition(lordToil_Travel, lordToil_DefendTraderCaravan, false, true); transition5.AddTrigger(new Trigger_PawnHarmed(1f, false, null)); transition5.AddPreAction(new TransitionAction_SetDefendTrader()); transition5.AddPostAction(new TransitionAction_WakeAll()); transition5.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition5, false); Transition transition6 = new Transition(lordToil_DefendTraderCaravan, lordToil_Travel, false, true); transition6.AddTrigger(new Trigger_TicksPassedWithoutHarm(1200)); stateGraph.AddTransition(transition6, false); Transition transition7 = new Transition(lordToil_Travel, lordToil_DefendTraderCaravan2, false, true); transition7.AddTrigger(new Trigger_Memo("TravelArrived")); stateGraph.AddTransition(transition7, false); Transition transition8 = new Transition(lordToil_DefendTraderCaravan2, lordToil_ExitMapAndEscortCarriers, false, true); transition8.AddTrigger(new Trigger_TicksPassed((!DebugSettings.instantVisitorsGift) ? Rand.Range(27000, 45000) : 0)); transition8.AddPreAction(new TransitionAction_CheckGiveGift()); transition8.AddPreAction(new TransitionAction_Message("MessageTraderCaravanLeaving".Translate(new object[] { this.faction.Name }), null, 1f)); transition8.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(transition8, false); Transition transition9 = new Transition(lordToil_ExitMapAndEscortCarriers, lordToil_ExitMapAndEscortCarriers, true, true); transition9.canMoveToSameState = true; transition9.AddTrigger(new Trigger_PawnLost()); transition9.AddTrigger(new Trigger_TickCondition(() => LordToil_ExitMapAndEscortCarriers.IsAnyDefendingPosition(this.lord.ownedPawns) && !GenHostility.AnyHostileActiveThreatTo(base.Map, this.faction), 60)); stateGraph.AddTransition(transition9, false); Transition transition10 = new Transition(lordToil_ExitMapAndEscortCarriers, lordToil_ExitMap, false, true); transition10.AddTrigger(new Trigger_TicksPassed(60000)); transition10.AddPostAction(new TransitionAction_WakeAll()); stateGraph.AddTransition(transition10, false); Transition transition11 = new Transition(lordToil_DefendTraderCaravan2, lordToil_ExitMapAndEscortCarriers, false, true); transition11.AddSources(new LordToil[] { lordToil_Travel, lordToil_DefendTraderCaravan }); transition11.AddTrigger(new Trigger_ImportantTraderCaravanPeopleLost()); transition11.AddTrigger(new Trigger_BecamePlayerEnemy()); transition11.AddPostAction(new TransitionAction_WakeAll()); transition11.AddPostAction(new TransitionAction_EndAllJobs()); stateGraph.AddTransition(transition11, false); return(stateGraph); }
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); }
public override StateGraph CreateGraph() { var mainGraph = new StateGraph(); // Use LordJob_Travel as starting toil for this graph: var toil_MoveToSetup = mainGraph.AttachSubgraph(new LordJob_Travel(Info.setupCentre).CreateGraph()).StartingToil; // Next toil is to set up var toil_Setup = new LordToil_SetupCarnival(); mainGraph.AddToil(toil_Setup); var trans_Setup = new Transition(toil_MoveToSetup, toil_Setup); trans_Setup.AddTrigger(new Trigger_Memo("TravelArrived")); mainGraph.AddTransition(trans_Setup); // Meat of the event: entertaining the colony var toil_Entertain = new LordToil_EntertainColony(); mainGraph.AddToil(toil_Entertain); var trans_Entertain = new Transition(toil_Setup, toil_Entertain); trans_Entertain.AddTrigger(new Trigger_Memo("SetupDoneEntertain")); trans_Entertain.AddPostAction(new TransitionAction_Message("CarnEntertainNow".Translate(this.lord.faction))); mainGraph.AddTransition(trans_Entertain); // Rest the carnival between 22:00 and 10:00, or if anyone needs rest var toil_Rest = new LordToil_RestCarnival(); mainGraph.AddToil(toil_Rest); var trans_ToRestFromSetup = new Transition(toil_Setup, toil_Rest); trans_ToRestFromSetup.AddTrigger(new Trigger_Memo("SetupDoneRest")); mainGraph.AddTransition(trans_ToRestFromSetup); var trans_ToRest = new Transition(toil_Entertain, toil_Rest); trans_ToRest.AddTrigger(new Trigger_TickCondition(() => Info.AnyCarnyNeedsRest || !Info.CanEntertainNow)); trans_ToRest.AddPostAction(new TransitionAction_Message("CarnResting".Translate(this.lord.faction))); mainGraph.AddTransition(trans_ToRest); var trans_FromRest = new Transition(toil_Rest, toil_Entertain); trans_FromRest.AddTrigger(new Trigger_TickCondition(() => !Info.AnyCarnyNeedsRest && Info.CanEntertainNow)); trans_FromRest.AddPostAction(new TransitionAction_WakeAll()); trans_FromRest.AddPostAction(new TransitionAction_Message("CarnEntertainNow".Translate(this.lord.faction))); mainGraph.AddTransition(trans_FromRest); // Strike buildings var toil_Strike = new LordToil_StrikeCarnival(); mainGraph.AddToil(toil_Strike); var trans_Strike = new Transition(toil_Rest, toil_Strike); trans_Strike.AddSources(toil_Entertain); trans_Strike.AddTrigger(new Trigger_TicksPassed(this.durationTicks)); trans_Strike.AddPostAction(new TransitionAction_Message("CarnPackingUp".Translate(this.lord.faction))); mainGraph.AddTransition(trans_Strike); // Defend if attacked var toil_Defend = new LordToil_DefendCarnival(); mainGraph.AddToil(toil_Defend); var trans_ToDefend = new Transition(toil_Setup, toil_Defend); trans_ToDefend.AddSources(toil_Entertain, toil_Rest, toil_Strike); trans_ToDefend.AddTrigger(new Trigger_BecameColonyEnemy()); trans_ToDefend.AddTrigger(new Trigger_TickCondition(delegate { if (Find.TickManager.TicksGame % 223 == 0) { var hostiles = Map.attackTargetsCache.TargetsHostileToFaction(lord.faction); foreach (var hostile in hostiles) { if (GenHostility.IsActiveThreat(hostile)) { return(true); } } } return(false); })); trans_ToDefend.AddPreAction(new TransitionAction_WakeAll()); trans_ToDefend.AddPostAction(new TransitionAction_EndAllJobs()); trans_ToDefend.AddPostAction(new TransitionAction_Message("CarnDefending".Translate(this.lord.faction))); mainGraph.AddTransition(trans_ToDefend); var trans_DefendToStrike = new Transition(toil_Defend, toil_Strike); trans_DefendToStrike.AddTrigger(new Trigger_Memo("BattleDonePawnsLost")); trans_DefendToStrike.AddPreAction(new TransitionAction_EndAllJobs()); trans_DefendToStrike.AddPostAction(new TransitionAction_Message("CarnPackingUpHostile".Translate(this.lord.faction))); mainGraph.AddTransition(trans_DefendToStrike); var trans_DefendToRest = new Transition(toil_Defend, toil_Rest); trans_DefendToRest.AddTrigger(new Trigger_Memo("BattleDone")); trans_DefendToRest.AddPreAction(new TransitionAction_EndAllJobs()); trans_DefendToRest.AddPostAction(new TransitionAction_Message("CarnResting".Translate(this.lord.faction))); mainGraph.AddTransition(trans_DefendToRest); // exit map toil var toil_Exit = new LordToil_Leave(); mainGraph.AddToil(toil_Exit); var trans_Exit = new Transition(toil_Strike, toil_Exit); trans_Exit.AddSource(toil_Setup); trans_Exit.AddTrigger(new Trigger_Memo("StrikeDone")); trans_Exit.AddTrigger(new Trigger_Memo("NoBuildings")); trans_Exit.AddPostAction(new TransitionAction_EndAllJobs()); trans_Exit.AddPostAction(new TransitionAction_WakeAll()); mainGraph.AddTransition(trans_Exit); var trans_ExitError = new Transition(toil_MoveToSetup, toil_Exit); trans_ExitError.AddTrigger(new Trigger_TicksPassedWithoutHarmOrMemos(GenDate.TicksPerHour * 8, "TravelArrived")); trans_ExitError.AddPreAction(new TransitionAction_Message("CarnLeavingError".Translate(lord.faction))); trans_ExitError.AddPostAction(new TransitionAction_EndAllJobs()); trans_ExitError.AddPostAction(new TransitionAction_WakeAll()); mainGraph.AddTransition(trans_ExitError); // panic exit map (handled in def?) var trans_ExitPanic = new Transition(toil_Defend, toil_Exit); trans_ExitPanic.AddSources(toil_Strike, toil_Entertain, toil_Rest); trans_ExitPanic.AddTrigger(new Trigger_FractionPawnsLost(0.4f)); trans_ExitPanic.AddTrigger(new Trigger_Memo("LeaderKilled")); trans_ExitPanic.AddPreAction(new TransitionAction_Custom(() => Info.leavingUrgency = LocomotionUrgency.Sprint)); trans_ExitPanic.AddPostAction(new TransitionAction_Message("MessageFightersFleeing".Translate(lord.faction.def.pawnsPlural.CapitalizeFirst(), lord.faction))); mainGraph.AddTransition(trans_ExitPanic); return(mainGraph); }
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); }