static bool Prefix(ref LordToil_Travel __instance) { if (Find.TickManager.TicksGame % 205 > RefcellRespeedConfig.currentTimeMultiplier - 1) { return(false); } LordToilData_Travel data = (LordToilData_Travel)__instance.data; bool flag = true; for (int index = 0; index < __instance.lord.ownedPawns.Count; ++index) { Pawn ownedPawn = __instance.lord.ownedPawns[index]; if (!ownedPawn.Position.InHorDistOf(data.dest, 10) || !ownedPawn.CanReach((LocalTargetInfo)data.dest, PathEndMode.ClosestTouch, Danger.Deadly)) { flag = false; break; } } if (!flag) { return(false); } __instance.lord.ReceiveMemo("TravelArrived"); return(false); }
public override StateGraph CreateGraph() { var StateGraph = new StateGraph(); Mailbox ??= Map.listerThings.ThingsOfDef(ThingDefOf.Tenants_MailBox).RandomElement(); LordToil toilTravel = new LordToil_Travel(Mailbox.Position) { useAvoidGrid = true }; StateGraph.AddToil(toilTravel); LordToil toilDeliver = new LordToil_CourierDeliver(Mailbox); StateGraph.AddToil(toilDeliver); LordToil toilLeave = new LordToil_ExitMap { useAvoidGrid = true }; StateGraph.AddToil(toilLeave); var transitionWait = new Transition(toilTravel, toilDeliver); transitionWait.AddTrigger(new Trigger_Memo("TravelArrived")); StateGraph.AddTransition(transitionWait); var transitionLeave = new Transition(toilDeliver, toilLeave); transitionLeave.AddTrigger(new Trigger_TicksPassedAndNoRecentHarm(3000)); StateGraph.AddTransition(transitionLeave); return(StateGraph); }
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; } } } } } } } }
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 void DoAction(Transition trans) { Lord lord = trans.target.lord; IntVec3 targetDestination = (lord.LordJob as LordJob_MiningCoBase).targetDestination; bool needNewExitSpot = false; bool isEdgeCell = targetDestination.InBounds(lord.Map) && ((targetDestination.x == 0) || (targetDestination.x == lord.Map.Size.x - 1) || (targetDestination.z == 0) || (targetDestination.z == lord.Map.Size.z - 1)); if (isEdgeCell == false) { needNewExitSpot = true; } else { foreach (Pawn pawn in lord.ownedPawns) { if (pawn.CanReach(targetDestination, PathEndMode.OnCell, Danger.Some) == false) { needNewExitSpot = true; break; } } } IntVec3 newTargetDestination = targetDestination; if (needNewExitSpot) { if (Expedition.TryFindRandomExitSpot(lord.Map, lord.ownedPawns.RandomElement().Position, out newTargetDestination) == false) { newTargetDestination = CellFinder.RandomEdgeCell(lord.Map); } } (lord.LordJob as LordJob_MiningCoBase).targetDestination = newTargetDestination; // Refresh lord toil destination anyway as it may have been initialized with an invalid vector (case of a fallback). LordToil_Travel travelToil = trans.target as LordToil_Travel; if (travelToil != null) { travelToil.SetDestination(newTargetDestination); } LordToil_EscortDownedPawn escortToil = trans.target as LordToil_EscortDownedPawn; if (escortToil != null) { escortToil.SetDestination(newTargetDestination); } }
static bool Prefix(Transition trans) { LordToil_Travel lordToil_Travel = (LordToil_Travel)trans.target; if (!lordToil_Travel.HasDestination()) { Pawn pawn = lordToil_Travel.lord.ownedPawns.RandomElement(); if (!CellFinderExtended.TryFindRandomPawnExitCell(pawn, out IntVec3 result)) { RCellFinderExtended.TryFindRandomPawnEntryCell(out result, pawn.Map, pawn.kindDef, 0f); } lordToil_Travel.SetDestination(result); } return(false); }
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 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_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_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_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); }