Esempio n. 1
0
        public override void LordToilTick()
        {
            base.LordToilTick();

            if (Find.TickManager.TicksGame % 223 == 0)
            {
                var hostiles    = Map.attackTargetsCache.TargetsHostileToFaction(lord.faction);
                var anyHostiles = false;

                foreach (var hostile in hostiles)
                {
                    var pawn = hostile as Pawn;
                    if ((pawn != null && !pawn.Downed) || GenHostility.IsActiveThreat(hostile))
                    {
                        anyHostiles = true;
                        break;
                    }
                }

                if (!anyHostiles)
                {
                    if (pawnsKilled > lord.ownedPawns.Count / 4)
                    {
                        lord.ReceiveMemo("BattleDonePawnsLost");
                    }
                    else
                    {
                        lord.ReceiveMemo("BattleDone");
                    }
                }
            }
        }
Esempio n. 2
0
        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);
        }