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); }
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); }
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)) }); }
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)) }); }
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); }
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); }
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); }
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); }