Ejemplo n.º 1
0
        public static List <Pawn> GenerateRaidPawns(IncidentParms parms)
        {
            if (PES_Settings.DebugModeOn)
            {
                Log.Message("-=PS=- GenerateRaidPawns Start", false);
            }
            if (parms != null && parms.questTag != null)             //Lt. Bob - "Temporary" bypass fix? for Quest handling
            {
                Log.Message("-=PS=- GenerateRaidPawns - questTag!=Null == " + parms.questTag);
            }

            IsIntercepting_PawnGeneration = GeneratorPatchFlag.Generate;

            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms, false);
            }
            return(list);
        }
Ejemplo n.º 2
0
        protected override void RunInt()
        {
            Slate slate = QuestGen.slate;
            Map   map   = slate.Get <Map>("map");
            QuestPart_ThreatsGenerator questPart_ThreatsGenerator = new QuestPart_ThreatsGenerator();

            questPart_ThreatsGenerator.threatStartTicks = threatStartTicks.GetValue(slate);
            questPart_ThreatsGenerator.inSignalEnable   = (QuestGenUtility.HardcodedSignalWithQuestID(inSignalEnable.GetValue(slate)) ?? slate.Get <string>("inSignal"));
            questPart_ThreatsGenerator.inSignalDisable  = QuestGenUtility.HardcodedSignalWithQuestID(inSignalDisable.GetValue(slate));
            ThreatsGeneratorParams value = parms.GetValue(slate);

            value.faction = (faction.GetValue(slate) ?? value.faction);
            questPart_ThreatsGenerator.parms     = value;
            questPart_ThreatsGenerator.mapParent = map.Parent;
            QuestGen.quest.AddPart(questPart_ThreatsGenerator);
            if (!storeThreatExampleAs.GetValue(slate).NullOrEmpty())
            {
                PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms();
                pawnGroupMakerParms.groupKind    = PawnGroupKindDefOf.Combat;
                pawnGroupMakerParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack;
                pawnGroupMakerParms.faction      = (value.faction ?? (from x in Find.FactionManager.GetFactions(allowHidden: false, allowDefeated: false, allowNonHumanlike: true, TechLevel.Industrial)
                                                                      where x.HostileTo(Faction.OfPlayer)
                                                                      select x).RandomElement());
                float num = value.threatPoints ?? (StorytellerUtility.DefaultThreatPointsNow(map) * value.currentThreatPointsFactor);
                if (value.minThreatPoints.HasValue)
                {
                    num = Mathf.Max(num, value.minThreatPoints.Value);
                }
                pawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(num, PawnsArrivalModeDefOf.EdgeWalkIn, RaidStrategyDefOf.ImmediateAttack, pawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
                IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(pawnGroupMakerParms);
                slate.Set(storeThreatExampleAs.GetValue(slate), PawnUtility.PawnKindsToLineList(pawnKinds, "  - "));
            }
        }
        public static bool Prefix(IncidentWorker_Raid __instance, IncidentParms parms)
        {
            var options = Find.Storyteller.def.GetModExtension <StorytellerDefExtension>();

            if (options != null && options.storytellerThreat != null && options.storytellerThreat.raidWarningRange.HasValue &&
                __instance is IncidentWorker_RaidEnemy && parms.target is Map mapTarget)
            {
                var result = (bool)AccessTools.Method(typeof(IncidentWorker_RaidEnemy), "TryResolveRaidFaction", null, null).Invoke(__instance, new object[]
                {
                    parms
                });
                if (result)
                {
                    if (parms.faction != null && parms.faction.HostileTo(Faction.OfPlayer))
                    {
                        var comp = Current.Game.GetComponent <StorytellerWatcher>();
                        if (comp != null && !comp.raidQueues.Any(x => x.parms == parms))
                        {
                            var tickToFire = Find.TickManager.TicksAbs + options.storytellerThreat.raidWarningRange.Value.RandomInRange;
                            __instance.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat);
                            __instance.ResolveRaidArriveMode(parms);
                            var raidQueue = new RaidQueue(__instance.def, parms, tickToFire);
                            comp.raidQueues.Add(raidQueue);
                            TaggedString letterLabel = "VFEMech.RaidWarningTitle".Translate(parms.faction.Named("FACTION"));
                            TaggedString letterText  = "VFEMech.RaidWarningText".Translate(parms.faction.Named("FACTION"), parms.raidStrategy.arrivalTextEnemy);
                            Find.LetterStack.ReceiveLetter(letterLabel, letterText, LetterDefOf.ThreatBig);
                            return(false);
                        }
                    }
                }
            }

            return(true);
        }
Ejemplo n.º 4
0
        protected override void RunInt()
        {
            Slate              slate              = QuestGen.slate;
            Map                target             = QuestGen.slate.Get <Map>("map");
            float              a                  = QuestGen.slate.Get("points", 0f);
            Faction            faction            = QuestGen.slate.Get <Faction>("enemyFaction");
            QuestPart_Incident questPart_Incident = new QuestPart_Incident();

            questPart_Incident.debugLabel = "raid";
            questPart_Incident.incident   = IncidentDefOf.RaidEnemy;
            IncidentParms incidentParms = new IncidentParms();

            incidentParms.forced             = true;
            incidentParms.target             = target;
            incidentParms.points             = Mathf.Max(a, faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            incidentParms.faction            = faction;
            incidentParms.pawnGroupMakerSeed = Rand.Int;
            incidentParms.inSignalEnd        = QuestGenUtility.HardcodedSignalWithQuestID(inSignalLeave.GetValue(slate));
            incidentParms.questTag           = QuestGenUtility.HardcodedTargetQuestTagWithQuestID(tag.GetValue(slate));
            if (!customLetterLabel.GetValue(slate).NullOrEmpty() || customLetterLabelRules.GetValue(slate) != null)
            {
                QuestGen.AddTextRequest("root", delegate(string x)
                {
                    incidentParms.customLetterLabel = x;
                }, QuestGenUtility.MergeRules(customLetterLabelRules.GetValue(slate), customLetterLabel.GetValue(slate), "root"));
            }
            if (!customLetterText.GetValue(slate).NullOrEmpty() || customLetterTextRules.GetValue(slate) != null)
            {
                QuestGen.AddTextRequest("root", delegate(string x)
                {
                    incidentParms.customLetterText = x;
                }, QuestGenUtility.MergeRules(customLetterTextRules.GetValue(slate), customLetterText.GetValue(slate), "root"));
            }
            IncidentWorker_Raid obj = (IncidentWorker_Raid)questPart_Incident.incident.Worker;

            obj.ResolveRaidStrategy(incidentParms, PawnGroupKindDefOf.Combat);
            obj.ResolveRaidArriveMode(incidentParms);
            if (incidentParms.raidArrivalMode.walkIn)
            {
                incidentParms.spawnCenter = walkInSpot.GetValue(slate) ?? QuestGen.slate.Get <IntVec3?>("walkInSpot") ?? IntVec3.Invalid;
            }
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, incidentParms.raidArrivalMode, incidentParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);

            questPart_Incident.SetIncidentParmsAndRemoveTarget(incidentParms);
            questPart_Incident.inSignal = QuestGenUtility.HardcodedSignalWithQuestID(inSignal.GetValue(slate)) ?? QuestGen.slate.Get <string>("inSignal");
            QuestGen.quest.AddPart(questPart_Incident);
            QuestGen.AddQuestDescriptionRules(new List <Rule>
            {
                new Rule_String("raidPawnKinds", PawnUtility.PawnKindsToLineList(pawnKinds, "  - ", ColoredText.ThreatColor)),
                new Rule_String("raidArrivalModeInfo", incidentParms.raidArrivalMode.textWillArrive.Formatted(faction))
            });
        }
Ejemplo n.º 5
0
        public static void Raid(this Quest quest, Map map, float points, Faction faction, string inSignalLeave = null, string customLetterLabel = null, string customLetterText = null, RulePack customLetterLabelRules = null, RulePack customLetterTextRules = null, IntVec3?walkInSpot = null, string tag = null, string inSignal = null, string rootSymbol = "root", PawnsArrivalModeDef raidArrivalMode = null)
        {
            QuestPart_Incident questPart_Incident = new QuestPart_Incident();

            questPart_Incident.debugLabel = "raid";
            questPart_Incident.incident   = IncidentDefOf.RaidEnemy;
            IncidentParms incidentParms = new IncidentParms();

            incidentParms.forced             = true;
            incidentParms.target             = map;
            incidentParms.points             = Mathf.Max(points, faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            incidentParms.faction            = faction;
            incidentParms.pawnGroupMakerSeed = Rand.Int;
            incidentParms.inSignalEnd        = inSignalLeave;
            incidentParms.questTag           = QuestGenUtility.HardcodedTargetQuestTagWithQuestID(tag);
            incidentParms.raidArrivalMode    = raidArrivalMode;
            if (!customLetterLabel.NullOrEmpty() || customLetterLabelRules != null)
            {
                QuestGen.AddTextRequest(rootSymbol, delegate(string x)
                {
                    incidentParms.customLetterLabel = x;
                }, QuestGenUtility.MergeRules(customLetterLabelRules, customLetterLabel, rootSymbol));
            }
            if (!customLetterText.NullOrEmpty() || customLetterTextRules != null)
            {
                QuestGen.AddTextRequest(rootSymbol, delegate(string x)
                {
                    incidentParms.customLetterText = x;
                }, QuestGenUtility.MergeRules(customLetterTextRules, customLetterText, rootSymbol));
            }
            IncidentWorker_Raid obj = (IncidentWorker_Raid)questPart_Incident.incident.Worker;

            obj.ResolveRaidStrategy(incidentParms, PawnGroupKindDefOf.Combat);
            obj.ResolveRaidArriveMode(incidentParms);
            if (incidentParms.raidArrivalMode.walkIn)
            {
                incidentParms.spawnCenter = walkInSpot ?? QuestGen.slate.Get <IntVec3?>("walkInSpot") ?? IntVec3.Invalid;
            }
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, incidentParms.raidArrivalMode, incidentParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);

            questPart_Incident.SetIncidentParmsAndRemoveTarget(incidentParms);
            questPart_Incident.inSignal = inSignal ?? QuestGen.slate.Get <string>("inSignal");
            QuestGen.quest.AddPart(questPart_Incident);
            QuestGen.AddQuestDescriptionRules(new List <Rule>
            {
                new Rule_String("raidPawnKinds", PawnUtility.PawnKindsToLineList(pawnKinds, "  - ", ColoredText.ThreatColor)),
                new Rule_String("raidArrivalModeInfo", incidentParms.raidArrivalMode.textWillArrive.Formatted(faction))
            });
        }
Ejemplo n.º 6
0
        public static List <Pawn> GenerateRaidPawns(IncidentParms parms)
        {
            IsIntercepting_PawnGeneration = GeneratorPatchFlag.Generate;

            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms, false);
            }
            return(list);
        }
Ejemplo n.º 7
0
        protected override void RunInt()
        {
            Slate slate = QuestGen.slate;

            slate.Get <Map>("map");
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms();

            pawnGroupMakerParms.groupKind    = PawnGroupKindDefOf.Combat;
            pawnGroupMakerParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack;
            pawnGroupMakerParms.faction      = faction.GetValue(slate) ?? (from x in Find.FactionManager.GetFactions_NewTemp(allowHidden: false, allowDefeated: false, allowNonHumanlike: true, TechLevel.Industrial)
                                                                           where x.HostileTo(Faction.OfPlayer)
                                                                           select x).RandomElement();
            pawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(points.GetValue(slate), PawnsArrivalModeDefOf.EdgeWalkIn, RaidStrategyDefOf.ImmediateAttack, pawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(pawnGroupMakerParms);

            slate.Set(storeAs.GetValue(slate), PawnUtility.PawnKindsToLineList(pawnKinds, "  - ", ColoredText.ThreatColor));
        }
        public static void Postfix(IncidentWorker_RaidEnemy __instance, ref IncidentParms parms, bool __result)
        {
            if (__result)
            {
                if (parms.faction.def == XenomorphDefOf.RRY_Xenomorph && parms.raidStrategy != XenomorphDefOf.RRY_PowerCut)
                {
                    Map map = (Map)parms.target;
                    if (map.listerBuildings.allBuildingsColonist.Any(x => x.TryGetComp <CompPowerPlant>() != null))
                    {
                        Rand.PushState();
                        int  @int   = Rand.Int;
                        bool chance = Rand.ChanceSeeded(0.1f, @int);
                        Rand.PopState();
                        if (AvP_IncidentWorker_RaidEnemy_TryExecute_PowerCut_Patch.TryFindSpawnSpot(map, out IntVec3 intVec) && chance)
                        {
                            IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);
                            raidParms.forced               = true;
                            raidParms.faction              = parms.faction;
                            raidParms.raidStrategy         = XenomorphDefOf.RRY_PowerCut;
                            raidParms.raidArrivalMode      = XenomorphDefOf.RRY_DropThroughRoofNearPower;
                            raidParms.spawnCenter          = intVec;
                            raidParms.generateFightersOnly = true;
                            Rand.PushState();
                            raidParms.points = Mathf.Max((raidParms.points / 5) * AvP_IncidentWorker_RaidEnemy_TryExecute_PowerCut_Patch.RaidPointsFactorRange.RandomInRange, 500f);
                            Rand.PopState();
                            raidParms.pawnGroupMakerSeed = new int?(@int);
                            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms, true);
                            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, XenomorphDefOf.RRY_DropThroughRoofNearPower, XenomorphDefOf.RRY_PowerCut, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
                            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);

                            QueuedIncident qi = new QueuedIncident(new FiringIncident(XenomorphDefOf.RRY_PowerCut_Xenomorph, null, raidParms), Find.TickManager.TicksGame + AvP_IncidentWorker_RaidEnemy_TryExecute_PowerCut_Patch.RaidDelay.RandomInRange, 0);
                            Find.Storyteller.incidentQueue.Add(qi);
                        }
                    }
                }
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Trying execution");
            this.ResolveRaidPoints(parms);
            bool result = false;

            if (!this.TryResolveRaidFaction(parms))
            {
                Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction");
                result = false;
            }
            else
            {
                PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;
                this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat);
                this.ResolveRaidArriveMode(parms);
                if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
                {
                    result = false;
                }
                else
                {
                    parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode,
                                                                          parms.raidStrategy, parms.faction, combat);

                    PawnGroupMakerParms defaultPawnGroupMakerParms =
                        IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms);

                    List <Pawn> list = PawnGroupMakerUtility
                                       .GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
                    if (list.Count == 0)
                    {
                        Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms);
                        result = false;
                    }
                    parms.raidArrivalMode.Worker.Arrive(list, parms);

                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
                    foreach (Pawn current2 in list)
                    {
                        string str = (current2.equipment == null || current2.equipment.Primary == null)
                            ? "unarmed"
                            : current2.equipment.Primary.LabelCap;
                        stringBuilder.AppendLine(current2.KindLabel + " - " + str);
                    }
                    string       letterLabel  = this.GetLetterLabel(parms);
                    string       letterText   = this.GetLetterText(parms, list);
                    TaggedString letterLabelS = letterLabel;
                    TaggedString letterTextS  = letterText;
                    //string lalalal = this.GetRelatedPawnsInfoLetterText(parms);
                    PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabelS, ref letterTextS,
                                                                        this.GetRelatedPawnsInfoLetterText(parms), true, true);
                    List <TargetInfo> list2 = new List <TargetInfo>();
                    if (parms.pawnGroups != null)
                    {
                        List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups);
                        List <Pawn>         list4 = list3.MaxBy((List <Pawn> x) => x.Count);
                        if (list4.Any <Pawn>())
                        {
                            list2.Add(list4[0]);
                        }
                        for (int i = 0; i < list3.Count; i++)
                        {
                            if (list3[i] != list4)
                            {
                                if (list3[i].Any <Pawn>())
                                {
                                    list2.Add(list3[i][0]);
                                }
                            }
                        }
                    }
                    else if (list.Any <Pawn>())
                    {
                        list2.Add(list[0]);
                    }
                    Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), list2, parms.faction);
                    if (this.GetLetterDef() == LetterDefOf.ThreatBig)
                    {
                        //TaleRecorder.RecordTale(TaleDefOf. RaidArrived, new object[0]);
                    }
                    parms.raidStrategy.Worker.MakeLords(parms, list);
                    LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
                    if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
                    {
                        for (int j = 0; j < list.Count; j++)
                        {
                            Pawn pawn2 = list[j];
                            if (pawn2.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                            {
                                LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts,
                                                                     OpportunityType.Critical);
                                break;
                            }
                        }
                    }
                    result = true;
                }
            }
            return(result);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!TryFindSpawnSpot(map, out IntVec3 spawnSpot))
            {
                return(false);
            }
            if (!TryFindEnemyFaction(out Faction enemyFac))
            {
                return(false);
            }
            int           @int      = Rand.Int;
            IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);

            raidParms.forced             = true;
            raidParms.faction            = enemyFac;
            raidParms.raidStrategy       = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode    = PawnsArrivalModeDefOf.EdgeWalkIn;
            raidParms.spawnCenter        = spawnSpot;
            raidParms.points             = Mathf.Max(raidParms.points * RaidPointsFactorRange.RandomInRange, enemyFac.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            raidParms.pawnGroupMakerSeed = @int;
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);
            PawnGenerationRequest     request   = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, null, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: false, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, mustBeCapableOfViolence: false, colonistRelationChanceFactor: 20f);
            Pawn refugee = PawnGenerator.GeneratePawn(request);

            refugee.relations.everSeenByPlayer = true;
            string text = "RefugeeChasedInitial".Translate(refugee.Name.ToStringFull, refugee.story.Title, enemyFac.def.pawnsPlural, enemyFac.Name, refugee.ageTracker.AgeBiologicalYears, PawnUtility.PawnKindsToCommaList(pawnKinds, useAnd: true), refugee.Named("PAWN"));

            text = text.AdjustedFor(refugee);
            TaggedString temp = new TaggedString(text);

            PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref temp, refugee);
            DiaNode   diaNode   = new DiaNode(text);
            DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate());

            diaOption.action = delegate
            {
                GenSpawn.Spawn(refugee, spawnSpot, map);
                refugee.SetFaction(Faction.OfPlayer);
                CameraJumper.TryJump(refugee);
                QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, raidParms), Find.TickManager.TicksGame + RaidDelay.RandomInRange);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string    text2      = "RefugeeChasedRejected".Translate(refugee.LabelShort, refugee);
            DiaNode   diaNode2   = new DiaNode(text2);
            DiaOption diaOption2 = new DiaOption("OK".Translate());

            diaOption2.resolveTree = true;
            diaNode2.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate());

            diaOption3.action = delegate
            {
                Find.WorldPawns.PassToWorld(refugee);
            };
            diaOption3.link = diaNode2;
            diaNode.options.Add(diaOption3);
            string title = "RefugeeChasedTitle".Translate(map.Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, enemyFac, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, enemyFac));
            return(true);
        }
Ejemplo n.º 11
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!DropCellFinder.TryFindRaidDropCenterClose(spot: out IntVec3 dropSpot, map: (Map)parms.target))
            {
                return(false);
            }
            if (!FindAlliedWarringFaction(faction: out Faction faction))
            {
                return(false);
            }
            if (faction == null)
            {
                return(false);
            }

            bool   bamboozle           = false;
            string arrivalText         = string.Empty;
            int    factionGoodWillLoss = FactionInteractionDiplomacyTuningsBlatantlyCopiedFromPeaceTalks
                                         .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2;

            IncidentParms raidParms =
                StorytellerUtility.DefaultParmsNow(incCat: IncidentCategoryDefOf.ThreatBig, target: (Map)parms.target);

            raidParms.forced          = true;
            raidParms.faction         = faction.EnemyInFactionWar();
            raidParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            raidParms.spawnCenter     = dropSpot;

            if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial &&
                faction.EnemyInFactionWar().RelationKindWith(other: Faction.OfPlayer) == FactionRelationKind.Hostile)
            {
                bamboozle = Rand.Chance(chance: 0.25f);
            }

            if (bamboozle)
            {
                arrivalText = string.Format(format: raidParms.raidArrivalMode.textEnemy, arg0: raidParms.faction.def.pawnsPlural, arg1: raidParms.faction.Name);
            }

            //get combat-pawns to spawn.
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(groupKind: PawnGroupKindDefOf.Combat, parms: raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(points: defaultPawnGroupMakerParms.points, raidArrivalMode: raidParms.raidArrivalMode, raidStrategy: raidParms.raidStrategy, faction: defaultPawnGroupMakerParms.faction, groupKind: PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(parms: defaultPawnGroupMakerParms).ToList();
            List <Thing> pawnlist = new List <Thing>();

            for (int i = 0; i < this.pawnstoSpawn.RandomInRange; i++)
            {
                PawnGenerationRequest request = new PawnGenerationRequest(kind: pawnKinds.RandomElement(), faction: faction, allowDowned: true, allowDead: true, mustBeCapableOfViolence: true);
                Pawn woundedCombatant         = PawnGenerator.GeneratePawn(request: request);
                woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true;
                ThingDef weapon = Rand.Bool ? DefDatabase <ThingDef> .AllDefsListForReading.Where(predicate : x => x.IsWeaponUsingProjectiles).RandomElement() : null;

                ThingDef  usedWeaponDef = weapon;
                DamageDef damageDef     = usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile?.damageDef; //null? check? All? THE? THINGS!!!!?
                if (usedWeaponDef != null && damageDef == null)
                {
                    usedWeaponDef = null;
                }
                CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(p: woundedCombatant, allowBleedingWounds: true, damageDef: damageDef, weapon: usedWeaponDef);
                //todo: maybe add some storylogging.
                pawnlist.Add(item: woundedCombatant);
            }

            string  initialMessage = "MFI_WoundedCombatant".Translate(faction.Name);
            DiaNode diaNode        = new DiaNode(text: initialMessage);

            DiaOption diaOptionOk = new DiaOption(text: "OK".Translate())
            {
                resolveTree = true
            };

            DiaOption diaOptionAccept = new DiaOption(text: "RansomDemand_Accept".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.TickManager.slower.SignalForceNormalSpeedShort();
                        IncidentDefOf.RaidEnemy.Worker.TryExecute(parms: raidParms);
                    }
                    else
                    {
                        IntVec3 intVec = IntVec3.Invalid;

                        List <Building> allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist.Where(predicate: x => x.def.thingClass == typeof(Building_Bed)).ToList();
                        for (int i = 0; i < allBuildingsColonist.Count; i++)
                        {
                            if (DropCellFinder.TryFindDropSpotNear(center: allBuildingsColonist[index: i].Position, map: (Map)parms.target, result: out intVec, allowFogged: false, canRoofPunch: false))
                            {
                                break;
                            }
                        }
                        if (intVec == IntVec3.Invalid)
                        {
                            intVec = DropCellFinder.RandomDropSpot(map: (Map)parms.target);
                        }
                        DropPodUtility.DropThingsNear(dropCenter: intVec, map: (Map)parms.target, things: pawnlist, openDelay: 180, leaveSlag: true, canRoofPunch: false);
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                }
            };
            string  bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText);
            string  commanderGreatful     = "MFI_WoundedCombatantGratitude".Translate();
            DiaNode acceptDiaNode         = new DiaNode(text: bamboozle ? bamboozledAndAmbushed : commanderGreatful);

            diaOptionAccept.link = acceptDiaNode;
            diaNode.options.Add(item: diaOptionAccept);
            acceptDiaNode.options.Add(item: diaOptionOk);

            DiaOption diaOptionRejection = new DiaOption(text: "RansomDemand_Reject".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                    else
                    {
                        faction.TryAffectGoodwillWith(other: Faction.OfPlayer, goodwillChange: factionGoodWillLoss, canSendMessage: false);
                    }
                }
            };
            string  rejectionResponse        = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss);
            string  bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate();
            DiaNode rejectionDiaNode         = new DiaNode(text: bamboozle ? bamboozlingTheBamboozler : rejectionResponse);

            diaOptionRejection.link = rejectionDiaNode;
            diaNode.options.Add(item: diaOptionRejection);
            rejectionDiaNode.options.Add(item: diaOptionOk);

            string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label);

            Find.WindowStack.Add(window: new Dialog_NodeTreeWithFactionInfo(nodeRoot: diaNode, faction: faction, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(archivable: new ArchivedDialog(text: diaNode.text, title: title, relatedFaction: faction));
            return(true);
        }
Ejemplo n.º 12
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!DropCellFinder.TryFindRaidDropCenterClose(out var dropSpot, (Map)parms.target))
            {
                return(false);
            }

            if (!FindAlliedWarringFaction(out var faction))
            {
                return(false);
            }

            if (faction == null)
            {
                return(false);
            }

            var bamboozle           = false;
            var arrivalText         = string.Empty;
            var factionGoodWillLoss = MFI_DiplomacyTunings
                                      .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2;

            var raidParms =
                StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, (Map)parms.target);

            raidParms.forced          = true;
            raidParms.faction         = faction.EnemyInFactionWar();
            raidParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            raidParms.spawnCenter     = dropSpot;

            if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial &&
                faction.EnemyInFactionWar().RelationKindWith(Faction.OfPlayer) == FactionRelationKind.Hostile)
            {
                bamboozle = Rand.Chance(0.25f);
            }

            if (bamboozle)
            {
                arrivalText = string.Format(raidParms.raidArrivalMode.textEnemy, raidParms.faction.def.pawnsPlural,
                                            raidParms.faction.Name);
            }

            //get combat-pawns to spawn.
            var defaultPawnGroupMakerParms =
                IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(
                defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy,
                defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds =
                PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms).ToList();
            var pawnlist = new List <Thing>();

            for (var i = 0; i < pawnstoSpawn.RandomInRange; i++)
            {
                var request = new PawnGenerationRequest(pawnKinds.RandomElement(), faction, allowDowned: true,
                                                        allowDead: true, mustBeCapableOfViolence: true);
                var woundedCombatant = PawnGenerator.GeneratePawn(request);
                woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true;
                var weapon = Rand.Bool
                    ? DefDatabase <ThingDef> .AllDefsListForReading.Where(x => x.IsWeaponUsingProjectiles).RandomElement()
                    : null;

                var usedWeaponDef = weapon;
                var damageDef     =
                    usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile
                    ?.damageDef;     //null? check? All? THE? THINGS!!!!?
                if (usedWeaponDef != null && damageDef == null)
                {
                    usedWeaponDef = null;
                }

                CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(woundedCombatant,
                                                                                true, damageDef, usedWeaponDef);
                //todo: maybe add some story logging.
                pawnlist.Add(woundedCombatant);
            }

            string initialMessage = "MFI_WoundedCombatant".Translate(faction.Name);
            var    diaNode        = new DiaNode(initialMessage);

            var diaOptionOk = new DiaOption("OK".Translate())
            {
                resolveTree = true
            };

            var diaOptionAccept = new DiaOption("RansomDemand_Accept".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.TickManager.slower.SignalForceNormalSpeedShort();
                        IncidentDefOf.RaidEnemy.Worker.TryExecute(raidParms);
                    }
                    else
                    {
                        var intVec = IntVec3.Invalid;

                        var allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist
                                                   .Where(x => x.def.thingClass == typeof(Building_Bed)).ToList();
                        foreach (var building in allBuildingsColonist)
                        {
                            if (DropCellFinder.TryFindDropSpotNear(building.Position, (Map)parms.target,
                                                                   out intVec, false, false))
                            {
                                break;
                            }
                        }

                        if (intVec == IntVec3.Invalid)
                        {
                            intVec = DropCellFinder.RandomDropSpot((Map)parms.target);
                        }

                        DropPodUtility.DropThingsNear(intVec, (Map)parms.target, pawnlist, 180, leaveSlag: true,
                                                      canRoofPunch: false);
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction);
                    }
                }
            };
            string bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText);
            string commanderGreatful     = "MFI_WoundedCombatantGratitude".Translate();
            var    acceptDiaNode         = new DiaNode(bamboozle ? bamboozledAndAmbushed : commanderGreatful);

            diaOptionAccept.link = acceptDiaNode;
            diaNode.options.Add(diaOptionAccept);
            acceptDiaNode.options.Add(diaOptionOk);

            var diaOptionRejection = new DiaOption("RansomDemand_Reject".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction);
                    }
                    else
                    {
                        faction.TryAffectGoodwillWith(Faction.OfPlayer, factionGoodWillLoss, false);
                    }
                }
            };
            string rejectionResponse        = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss);
            string bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate();
            var    rejectionDiaNode         = new DiaNode(bamboozle ? bamboozlingTheBamboozler : rejectionResponse);

            diaOptionRejection.link = rejectionDiaNode;
            diaNode.options.Add(diaOptionRejection);
            rejectionDiaNode.options.Add(diaOptionOk);

            string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, faction, true, true, title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, faction));
            return(true);
        }
        public static void FlareRaidPawnGroupsMade()
        {
            Dialog_DebugOptionListLister.ShowSimpleDebugMenu(
                elements : from fac in Find.FactionManager.AllFactions
                where !fac.def.pawnGroupMakers.NullOrEmpty() && fac.def.humanlikeFaction && fac.def.techLevel >= TechLevel.Industrial
                select fac,
                label : fac => fac.Name + " (" + fac.def.defName + ")",
                chosen : delegate(Faction fac)
            {
                var sb = new StringBuilder();
                sb.AppendLine($"Point multiplier = ;{SolarRaidGroupMaker.PointMultiplier};;Max pawn cost multiplier = ;{SolarRaidGroupMaker.MaxPawnCostMultiplier};;");
                float minPointsToGen = fac.def.MinPointsToGeneratePawnGroup(groupKind: PawnGroupKindDefOf.Combat);
                sb.AppendLine($"Faction =;{fac.def.defName};;Min pts to gen CombatGroup = ;{minPointsToGen};;");

                Action <float> action = delegate(float points)
                {
                    if (points < fac.def.MinPointsToGeneratePawnGroup(groupKind: PawnGroupKindDefOf.Combat))
                    {
                        return;
                    }

                    float originalPoints = points;
                    points = IncidentWorker_Raid.AdjustedRaidPoints(
                        points,
                        PawnsArrivalModeDefOf.CenterDrop,
                        RaidStrategyDefOf.ImmediateAttack,
                        fac,
                        PawnGroupKindDefOf.Combat
                        );
                    var pawnGroupMakerParms = new PawnGroupMakerParms
                    {
                        groupKind    = PawnGroupKindDefOf.Combat,
                        tile         = Find.CurrentMap.Tile,
                        points       = points,
                        faction      = fac,
                        raidStrategy = RaidStrategyDefOf.ImmediateAttack
                    };
                    pawnGroupMakerParms.groupKind = PawnGroupKindDefOf.Combat;



                    float maxPawnCost = PawnGroupMakerUtility.MaxPawnCost(
                        faction: fac,
                        totalPoints: points,
                        raidStrategy: RaidStrategyDefOf.ImmediateAttack,
                        groupKind: PawnGroupKindDefOf.Combat
                        );
                    sb.AppendLine(
                        value:
                        $"Adjusted Points =;{pawnGroupMakerParms.points};Original points;{originalPoints};Max pawn cost;{maxPawnCost};");

                    //Points: X; MaxPawnCost:
                    //$"{};{};{};{};{};{}"
                    //150;   Mercenary_Slasher; Gladius;  Y; Apparel_FlakJacket; NV_tinted_goggles
                    var num2 = 0f;
                    SolarRaidGroupMaker.TryGetRandomPawnGroupMaker(parms: pawnGroupMakerParms, out var groupMaker);
                    Log.Message(new string('-', 20));
                    Log.Message($"Random group maker result:");
                    Log.Message($"points = {points}");

                    Log.Message($"groupMaker. = {groupMaker.options.ConvertAll(opt => opt.kind.LabelCap).ToStringSafeEnumerable()}");
                    Log.Message(new string('-', 20));


                    foreach (Pawn pawn in SolarRaid_PawnGenerator.GeneratePawns(parms: pawnGroupMakerParms, groupMaker, false)
                             .OrderBy(keySelector: pa => pa.kindDef.combatPower))
                    {
                        sb.Append($"  {pawn.kindDef.combatPower.ToString(format: "F0").PadRight(totalWidth: 6)};{pawn.kindDef.LabelCap};");

                        if (pawn.equipment.Primary != null)
                        {
                            pawn.equipment.AllEquipmentListForReading.Aggregate(sb, (builder, comps) => builder.Append(comps.def.LabelCap + ","));
                        }
                        else
                        {
                            sb.Append("no equipment");
                        }

                        sb.Append(";");

                        var wornApparel  = pawn.apparel.WornApparel;
                        string torsoGear = "";
                        string eyeWear   = "";
                        string shield    = "";
                        for (int i = 0; i < wornApparel.Count; i++)
                        {
                            Apparel apparel = wornApparel[i];
                            for (int j = 0; j < apparel.def.apparel.bodyPartGroups.Count; j++)
                            {
                                if (apparel.def.apparel.bodyPartGroups[j] == BodyPartGroupDefOf.Torso)
                                {
                                    torsoGear += $"{apparel.def.LabelCap}, ";
                                }
                                else if (apparel.def.apparel.bodyPartGroups[j] == BodyPartGroupDefOf.Eyes)
                                {
                                    eyeWear += $"{apparel.def.LabelCap}, ";
                                }

                                if (apparel is ShieldBelt && shield.NullOrEmpty())
                                {
                                    shield = $"Y;";
                                }
                            }
                        }

                        torsoGear = torsoGear.NullOrEmpty() ? "shirtless" : torsoGear.TrimEnd(' ', ',');

                        eyeWear = eyeWear.NullOrEmpty() ? "not bespectacled" : eyeWear.TrimEnd(' ', ',');

                        shield = shield.NullOrEmpty() ? "N" : shield;


                        sb.Append($"{shield};{torsoGear};{eyeWear};");

                        if (pawn.health.hediffSet.hediffs.Count > 0)
                        {
                            pawn.health.hediffSet.hediffs.Aggregate(sb, (builder, comps) => builder.Append(comps.def.LabelCap + ","));
                        }
                        else
                        {
                            sb.Append("no hediffs");
                        }

                        sb.AppendLine();
                        num2 += pawn.kindDef.combatPower;
                    }

                    sb.AppendLine($";;;;Final point cost;{num2};");
                    sb.AppendLine();
                };

                foreach (float num in /*Dialog_DebugActionsMenu*/ DebugActionsUtility.PointsOptions(extended: false))
                {
                    float obj = num;
                    action(obj: obj);
                }

                Log.Message(text: sb.ToString());
#if DEBUG
                GUIUtility.systemCopyBuffer = sb.ToString();
#endif
            }
                );
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            IntVec3 spawnSpot;

            if (!this.TryFindSpawnSpot(map, out spawnSpot))
            {
                return(false);
            }
            Faction faction;

            if (!this.TryFindEnemyFaction(out faction))
            {
                return(false);
            }

            if (!GenCollection.Any(map.listerBuildings.allBuildingsColonist, (Building b) => b.def.IsCommsConsole && b.GetComp <CompPowerTrader>().PowerOn))
            {
                if (Prefs.DevMode)
                {
                    Log.Message("NeedsComms: No powered on comms-console found, ignoring chased refugee request.");
                }
                return(false);
            }

            int           @int      = Rand.Int;
            IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);

            raidParms.forced             = true;
            raidParms.faction            = faction;
            raidParms.raidStrategy       = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode    = PawnsArrivalModeDefOf.EdgeWalkIn;
            raidParms.spawnCenter        = spawnSpot;
            raidParms.points             = Mathf.Max(raidParms.points * IncidentWorker_RefugeeChased.RaidPointsFactorRange.RandomInRange, faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            raidParms.pawnGroupMakerSeed = new int?(@int);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms, false);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);
            PawnGenerationRequest     request   = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, null, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 20f, false, true, true, false, false, false, false, null, null, null, null, null, null, null, null);
            Pawn refugee = PawnGenerator.GeneratePawn(request);

            refugee.relations.everSeenByPlayer = true;
            string text = "RefugeeChasedInitial".Translate(refugee.Name.ToStringFull, refugee.story.Title, faction.def.pawnsPlural, faction.Name, refugee.ageTracker.AgeBiologicalYears, PawnUtility.PawnKindsToCommaList(pawnKinds, true), refugee.Named("PAWN"));

            text = text.AdjustedFor(refugee, "PAWN");
            PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, refugee);
            DiaNode   diaNode   = new DiaNode(text);
            DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate());

            diaOption.action = delegate
            {
                GenSpawn.Spawn(refugee, spawnSpot, map, WipeMode.Vanish);
                refugee.SetFaction(Faction.OfPlayer, null);
                CameraJumper.TryJump(refugee);
                QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, raidParms), Find.TickManager.TicksGame + IncidentWorker_RefugeeChased.RaidDelay.RandomInRange, 0);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string    text2      = "RefugeeChasedRejected".Translate(refugee.LabelShort, refugee);
            DiaNode   diaNode2   = new DiaNode(text2);
            DiaOption diaOption2 = new DiaOption("OK".Translate());

            diaOption2.resolveTree = true;
            diaNode2.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate());

            diaOption3.action = delegate
            {
                Find.WorldPawns.PassToWorld(refugee, PawnDiscardDecideMode.Decide);
            };
            diaOption3.link = diaNode2;
            diaNode.options.Add(diaOption3);
            string title = "RefugeeChasedTitle".Translate(map.Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, faction, true, true, title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, faction));
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            this.ResolveRaidStrategy(parms, combat);
            this.ResolveRaidArriveMode(parms);
            parms.raidStrategy.Worker.TryGenerateThreats(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            List <Pawn> list = parms.raidStrategy.Worker.SpawnThreats(parms);

            if (list == null)
            {
                list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false), true).ToList <Pawn>();
                if (list.Count == 0)
                {
                    Log.Error("Got no pawns spawning raid from parms " + parms, false);
                    return(false);
                }
                parms.raidArrivalMode.Worker.Arrive(list, parms);
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn pawn in list)
            {
                string str = (pawn.equipment != null && pawn.equipment.Primary != null) ? pawn.equipment.Primary.LabelCap : "unarmed";
                stringBuilder.AppendLine(pawn.KindLabel + " - " + str);
            }
            TaggedString baseLetterLabel = this.GetLetterLabel(parms);
            TaggedString baseLetterText  = this.GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref baseLetterLabel, ref baseLetterText, this.GetRelatedPawnsInfoLetterText(parms), true, true);
            List <TargetInfo> list2 = new List <TargetInfo>();

            if (parms.pawnGroups != null)
            {
                List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups);
                List <Pawn>         list4 = list3.MaxBy((List <Pawn> x) => x.Count);
                if (list4.Any <Pawn>())
                {
                    list2.Add(list4[0]);
                }
                for (int i = 0; i < list3.Count; i++)
                {
                    if (list3[i] != list4 && list3[i].Any <Pawn>())
                    {
                        list2.Add(list3[i][0]);
                    }
                }
            }
            else if (list.Any <Pawn>())
            {
                foreach (Pawn t in list)
                {
                    list2.Add(t);
                }
            }
            base.SendStandardLetter(baseLetterLabel, baseLetterText, this.GetLetterDef(), parms, list2, Array.Empty <NamedArgument>());
            parms.raidStrategy.Worker.MakeLords(parms, list);
            foreach (var pawn in list)
            {
                var hediff = (AlienMutationHediff)HediffMaker.MakeHediff(PurpleIvyDefOf.PI_AlienMutation, pawn, null);
                hediff.Mutate();
                pawn.health.AddHediff(hediff, null, null, null);
            }
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[j].apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            return(true);
        }
        public static pawnGenTrialTrialGroupGenerated groupGenerated(Faction fac, float points)
        {
            if (points < fac.def.MinPointsToGeneratePawnGroup(groupKind: PawnGroupKindDefOf.Combat))
            {
                return(null);
            }

            pawnGenTrialTrialGroupGenerated groupGen = new pawnGenTrialTrialGroupGenerated {
                originalPoints = points
            };

            points = IncidentWorker_Raid.AdjustedRaidPoints(
                points: points,
                raidArrivalMode: PawnsArrivalModeDefOf.CenterDrop,
                raidStrategy: GetSmart(),
                faction: fac,
                groupKind: PawnGroupKindDefOf.Combat
                );

            groupGen.modifiedPoints = points;

            var pawnGroupMakerParms = new PawnGroupMakerParms
            {
                groupKind    = PawnGroupKindDefOf.Combat,
                tile         = Find.CurrentMap.Tile,
                points       = points,
                faction      = fac,
                raidStrategy = GetSmart()
            };

            pawnGroupMakerParms.groupKind = PawnGroupKindDefOf.Combat;
            Log.Message($"raid strat. = {pawnGroupMakerParms.raidStrategy}");


            float maxPawnCost = SolarRaidGroupMaker.MaxPawnCostMultiplier * PawnGroupMakerUtility.MaxPawnCost(
                faction: fac,
                totalPoints: points,
                raidStrategy: GetSmart(),
                groupKind: PawnGroupKindDefOf.Combat
                );

            groupGen.maxPawnCost = maxPawnCost;


            SolarRaidGroupMaker.TryGetRandomPawnGroupMaker(parms: pawnGroupMakerParms, pawnGroupMaker: out PawnGroupMaker groupMaker);
            var pawns = SolarRaid_PawnGenerator.GeneratePawns(parms: pawnGroupMakerParms, groupMaker: groupMaker, errorOnZeroResults: false)
                        .OrderBy(keySelector: pa => pa.kindDef.combatPower).ToList();

            int pawnCount = pawns.Count;

            groupGen.pawn = new pawnGenTrialTrialGroupGeneratedPawn[pawnCount];
            var pointsSpent = 0f;

            for (var index = 0; index < pawnCount; index++)
            {
                Pawn pawn = pawns[index];
                pawnGenTrialTrialGroupGeneratedPawn pawnData = new pawnGenTrialTrialGroupGeneratedPawn
                {
                    label       = pawn.KindLabel,
                    combatPower = (int)pawn.kindDef.combatPower,
                    primaryEq   = pawn.equipment.Primary != null
                        ? pawn.equipment.Primary.LabelCapNoCount
                        : "no weapon"
                };


                List <Apparel> wornApparel = pawn.apparel.WornApparel;
                var            torsoGear   = "";
                var            eyeWear     = "";

                foreach (Apparel apparel in wornApparel)
                {
                    foreach (BodyPartGroupDef bpgd in apparel.def.apparel.bodyPartGroups)
                    {
                        if (bpgd == BodyPartGroupDefOf.Torso)
                        {
                            torsoGear += $"{apparel.def.LabelCap}, ";
                        }
                        else if (bpgd == BodyPartGroupDefOf.Eyes)
                        {
                            eyeWear += $"{apparel.def.LabelCap}, ";
                        }

                        if (apparel is ShieldBelt)
                        {
                            pawnData.hasShield = true;
                        }
                    }
                }

                pawnData.apparelChest = torsoGear.NullOrEmpty() ? "shirtless" : torsoGear.TrimEnd(' ', ',');

                pawnData.apparelHead = eyeWear.NullOrEmpty() ? "not bespectacled" : eyeWear.TrimEnd(' ', ',');



                pawnData.hediffs = pawn.health.hediffSet.hediffs.Where(hd => !(hd is Hediff_MissingPart)).Select(hdf => hdf.LabelCap).ToCommaList();
                pointsSpent     += pawn.kindDef.combatPower;

                groupGen.pawn[index] = pawnData;
            }

            groupGen.pointsSpent = pointsSpent;
            return(groupGen);
        }