protected override bool TryExecuteWorker(IncidentParms parms) { parms.raidArrivalMode = ForcedArriveMode; ResolveRaidPoints(parms: parms); if (!TryResolveRaidFaction(parms: parms)) { Log.Message(text: "Failed solar raid: no faction found."); return(false); } PawnGroupKindDef combat = Defs_Rimworld.CombatGroup; ResolveRaidStrategy(parms: parms, groupKind: combat); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms: parms)) { return(false); } parms.points = AdjustedRaidPoints( points: parms.points, raidArrivalMode: parms.raidArrivalMode, raidStrategy: parms.raidStrategy, faction: parms.faction, groupKind: combat ); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms( groupKind: combat, parms: parms, ensureCanGenerateAtLeastOnePawn: false ); SolarRaidGroupMaker.TryGetRandomPawnGroupMaker(parms: defaultPawnGroupMakerParms, pawnGroupMaker: out PawnGroupMaker pawnGroupMaker); List <Pawn> list = SolarRaid_PawnGenerator.GeneratePawns(parms: defaultPawnGroupMakerParms, groupMaker: pawnGroupMaker).ToList(); if (list.Count == 0) { return(false); } parms.raidArrivalMode.Worker.Arrive(pawns: list, parms: parms); var stringBuilder = new StringBuilder(); stringBuilder.AppendLine(value: "Points = " + parms.points.ToString(format: "F0")); foreach (Pawn pawn in list) { string str = pawn.equipment?.Primary == null ? "unarmed" : pawn.equipment.Primary.LabelCap; stringBuilder.AppendLine(value: pawn.KindLabel + " - " + str); } #if RW10 string letterLabel = GetLetterLabel(parms: parms); string letterText = GetLetterText(parms: parms, pawns: list); #else TaggedString letterLabel = GetLetterLabel(parms: parms); TaggedString letterText = GetLetterText(parms: parms, pawns: list); #endif PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter( seenPawns: list, letterLabel: ref letterLabel, letterText: ref letterText, relationsInfoHeader: GetRelatedPawnsInfoLetterText(parms: parms), informEvenIfSeenBefore: true, writeSeenPawnsNames: true ); var list2 = new List <TargetInfo>(); if (parms.pawnGroups != null) { List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(pawns: list, groups: parms.pawnGroups); List <Pawn> list4 = list3.MaxBy(selector: x => x.Count); if (list4.Any()) { list2.Add(item: list4[index: 0]); } for (var i = 0; i < list3.Count; i++) { if (list3[index: i] != list4) { if (list3[index: i].Any()) { list2.Add(item: list3[index: i][index: 0]); } } } } else if (list.Any()) { list2.Add(item: list[index: 0]); } Find.LetterStack.ReceiveLetter( label: letterLabel, text: letterText, textLetterDef: GetLetterDef(), lookTargets: list2, relatedFaction: parms.faction, debugInfo: stringBuilder.ToString() ); parms.raidStrategy.Worker.MakeLords(parms: parms, pawns: list); LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.EquippingWeapons, opp: OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(conc: ConceptDefOf.ShieldBelts)) { for (var j = 0; j < list.Count; j++) { Pawn pawn2 = list[index : j]; if (pawn2.apparel.WornApparel.Any(predicate: ap => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.ShieldBelts, opp: OpportunityType.Critical); break; } } } Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; 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); 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 void Notify_CaravanArrived(Caravan caravan) { var participants = new List <Pawn>(); var nonParticipants = new List <Pawn>(); MedievalTournamentUtility.GroupParticipants(caravan.PlayerPawnsForStoryteller.Where(p => p.RaceProps.Humanlike).ToList(), category, participants, nonParticipants); // Create dialogue tree var leader = Faction.leader; var tourneyNode = new DiaNode("VanillaFactionsExpanded.MedievalTournamentInitial".Translate(leader.LabelShort, Faction.Name, category.label, competitorCount, GenLabel.ThingsLabel(rewards), leader.Named("PAWN"))); // Option 1: Participate var participateNode = new DiaNode("VanillaFactionsExpanded.ParticipateInitial".Translate()); var participateOption = new DiaOption("VanillaFactionsExpanded.Participate".Translate()) { link = participateNode }; tourneyNode.options.Add(participateOption); for (int i = 0; i < participants.Count; i++) { var pawn = participants[i]; var pawnOption = new DiaOption(MedievalTournamentUtility.ParticipantOptionText(pawn, category)) { action = () => DoTournament(caravan, pawn), resolveTree = true }; participateNode.options.Add(pawnOption); } for (int i = 0; i < nonParticipants.Count; i++) { var pawn = nonParticipants[i]; var pawnOption = new DiaOption(MedievalTournamentUtility.ParticipantOptionText(pawn, category)) { disabled = true }; participateNode.options.Add(pawnOption); } var participateGoBack = new DiaOption("GoBack".Translate()) { link = tourneyNode }; participateNode.options.Add(participateGoBack); // Option 2: Attack (angers faction) var attackOption = new DiaOption($"{"CommandAttackSettlement".Translate()} ({"AngersFaction".Translate()})") { action = () => { LongEventHandler.QueueLongEvent(() => { Faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, false); var competitorPool = PossibleCompetitors.ToList(); var extraPawnParams = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan); extraPawnParams.faction = Faction; var pawnGroupMakerParams = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, extraPawnParams, true); pawnGroupMakerParams.generateFightersOnly = true; var hostilePawns = MedievalTournamentUtility.GenerateCompetitors(competitorCount, category, Faction, PossibleCompetitors).Concat(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParams)).ToList(); var map = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, hostilePawns, true); if (hostilePawns.Any()) { LordMaker.MakeNewLord(Faction, new LordJob_AssaultColony(Faction), map, hostilePawns); } Find.TickManager.Notify_GeneratedPotentiallyHostileMap(); for (int i = 0; i < rewards.Count; i++) { GenPlace.TryPlaceThing(rewards[i], map.Center, map, ThingPlaceMode.Near); } }, "GeneratingMapForNewEncounter", false, null); Find.WorldObjects.Remove(this); }, resolveTree = true }; tourneyNode.options.Add(attackOption); // Option 3: Leave var leaveOption = new DiaOption("VanillaFactionsExpanded.Leave".Translate()) { resolveTree = true }; tourneyNode.options.Add(leaveOption); // Add dialogue menu Find.WindowStack.Add(new Dialog_NodeTree(tourneyNode, title: LabelCap)); }
protected override bool TryExecuteWorker(IncidentParms parms) { ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } if (!parms.faction.HostileTo(Faction.OfPlayer)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; ResolveRaidStrategy(parms, combat); ResolveRaidArriveMode(parms); parms.raidStrategy.Worker.TryGenerateThreats(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } float points = parms.points; parms.points = 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)).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } parms.raidArrivalMode.Worker.Arrive(list, parms); } GenerateRaidLoot(parms, points, list); TaggedString letterLabel = GetLetterLabel(parms); TaggedString letterText = GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: 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()) { list2.Add(list4[0]); } for (int i = 0; i < list3.Count; i++) { if (list3[i] != list4 && list3[i].Any()) { list2.Add(list3[i][0]); } } } else if (list.Any()) { foreach (Pawn item in list) { list2.Add(item); } } SendStandardLetter(letterLabel, letterText, GetLetterDef(), parms, list2); var ignitors = new List <Pawn>(); foreach (var p in list) { if (p.apparel != null && Rand.Chance(0.5f)) { var throwableTorches = ThingMaker.MakeThing(VFEV_DefOf.VFEV_Apparel_TorchBelt) as Apparel; p.apparel.Wear(throwableTorches, false); ignitors.Add(p); } } foreach (var pawn in list) { //Log.Message("Checking2 : " + pawn, true); if (pawn.RaceProps.Humanlike) { if (Rand.Chance(0.3f) && !ignitors.Contains(pawn)) { //Log.Message(pawn + " got duty: " + DutyDefOf.AssaultColony, true); pawn.mindState.duty = new PawnDuty(DutyDefOf.AssaultColony); } else { //Log.Message(pawn + " got duty: " + VFEV_DefOf.VFEV_BurnAndStealColony, true); pawn.mindState.duty = new PawnDuty(VFEV_DefOf.VFEV_BurnAndStealColony); } } else { //Log.Message(pawn + " got duty: " + DutyDefOf.AssaultColony, true); pawn.mindState.duty = new PawnDuty(DutyDefOf.AssaultColony); } } var lord = new LordJob_BurnAndStealColony(parms.faction, false, true, true, true, true); LordMaker.MakeNewLord(parms.faction, lord, (Map)parms.target, list); 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); }
protected override bool TryExecuteWorker(IncidentParms parms) { this.ResolveRaidPoints(parms); if (this.disableEvent) { return(false); } if (!this.TryResolveRaidFaction(parms)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; this.ResolveRaidStrategy(parms, combat); this.ResolveRaidArriveMode(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } 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>(); List <string> viewernames = Viewers.ParseViewersFromJsonAndFindActiveViewers(); if (list.Count > 0 && viewernames != null) { int count = 0; int totalviewers = viewernames.Count(); foreach (Pawn pawn in list) { if (count == list.Count() || viewernames.NullOrEmpty() || pawn.RaceProps.IsMechanoid) { continue; } int thisviewer = Verse.Rand.Range(0, viewernames.Count()); NameTriple name = pawn.Name as NameTriple; NameTriple newname = new NameTriple(name.First, viewernames[thisviewer], name.Last); if (!newname.UsedThisGame || ToolkitSettings.RepeatViewerNames) { pawn.Name = newname; } viewernames.RemoveAt(thisviewer); count++; } } 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 current in list) { string str = (current.equipment == null || current.equipment.Primary == null) ? "unarmed" : current.equipment.Primary.LabelCap; stringBuilder.AppendLine(current.KindLabel + " - " + str); } string letterLabel = this.GetLetterLabel(parms); string letterText = this.GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, 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, stringBuilder.ToString()); parms.raidStrategy.Worker.MakeLords(parms, list); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; ResolveRaidStrategy(parms, combat); ResolveRaidArriveMode(parms); parms.raidStrategy.Worker.TryGenerateThreats(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } float points = parms.points; parms.points = 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)).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } parms.raidArrivalMode.Worker.Arrive(list, parms); } foreach (var pawn in list) { pawn.needs.food.CurLevel = Rand.Range(0.01f, 0.1f); // we make them hungry, so they will consume pawns during raid } GenerateRaidLoot(parms, points, list); TaggedString letterLabel = GetLetterLabel(parms); TaggedString letterText = GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: 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()) { list2.Add(list4[0]); } for (int i = 0; i < list3.Count; i++) { if (list3[i] != list4 && list3[i].Any()) { list2.Add(list3[i][0]); } } } else if (list.Any()) { foreach (Pawn item in list) { list2.Add(item); } } SendStandardLetter(letterLabel, letterText, GetLetterDef(), parms, list2); MakeLords(parms, list); 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; } } } Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; 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) { 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(temp); 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); }
public static List <Pawn> GeneratePawnsForBoats(IncidentParms parms, PawnGroupKindDef group) { PawnGroupMakerParms pawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(group, parms, true); return(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, false).ToList <Pawn>()); }
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); }
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); } 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"); if (Quote != null) { text += "\n\n"; text += Quote; } 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 virtual bool TryExecuteVehicleRaid(IncidentParms parms) { ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; ResolveRaidStrategy(parms, combat); ResolveRaidArriveMode(parms); parms.raidStrategy.Worker.TryGenerateThreats(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } float points = parms.points; parms.points = AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat); List <Pawn> vehicleList = new List <Pawn>(); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false), true).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } vehicleList = ReplaceWithVehicles(parms, list); parms.raidArrivalMode.Worker.Arrive(vehicleList, parms); GenerateRaidLoot(parms, points, vehicleList); TaggedString baseLetterLabel = GetLetterLabel(parms); TaggedString baseLetterText = GetLetterText(parms, vehicleList); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(vehicleList, ref baseLetterLabel, ref baseLetterText, GetRelatedPawnsInfoLetterText(parms), true, true); List <TargetInfo> list2 = new List <TargetInfo>(); if (parms.pawnGroups != null) { List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(vehicleList, parms.pawnGroups); List <Pawn> list4 = list3.MaxBy((List <Pawn> x) => x.Count); if (list4.Any()) { list2.Add(list4[0]); } for (int i = 0; i < list3.Count; i++) { if (list3[i] != list4 && list3[i].Any()) { list2.Add(list3[i][0]); } } } else if (vehicleList.Any()) { foreach (Pawn t in vehicleList) { list2.Add(t); } } SendStandardLetter(baseLetterLabel, baseLetterText, GetLetterDef(), parms, list2, Array.Empty <NamedArgument>()); parms.raidStrategy.Worker.MakeLords(parms, vehicleList); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts)) { for (int j = 0; j < vehicleList.Count; j++) { if (vehicleList[j].apparel?.WornApparel.Any((Apparel ap) => ap is ShieldBelt) ?? false) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } return(true); }
// Token: 0x06000D17 RID: 3351 RVA: 0x00061114 File Offset: 0x0005F514 protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } IntVec3 intVec; if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (list.Count < 1) { Log.Error("Got no pawns spawning raid from parms " + parms, false); return(false); } else { for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; list[i] = ZombiefiedMod.GenerateZombieFromSource(list[i]); pawn.Destroy(DestroyMode.Vanish); } } Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); Faction zFaction = Faction.OfInsects; foreach (Faction faction in Find.FactionManager.AllFactionsListForReading) { if (faction.def.defName == "Zombie") { zFaction = faction; } } for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); pawn.SetFactionDirect(zFaction); pawn.apparel.DestroyAll(); Pawn_Zombiefied zomb = (Pawn_Zombiefied)GenSpawn.Spawn(pawn, loc, map, rot); if (zomb != null) { zomb.FixZombie(); } } if (ZombiefiedMod.zombieRaidNotifications) { Find.LetterStack.ReceiveLetter("Zombies", "Some zombies walked into your territory. You might want to deal with them before they deal with you." , LetterDefOf.NeutralEvent, list[0], null); Find.TickManager.slower.SignalForceNormalSpeedShort(); } LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical); LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important); return(true); }
public override bool TryExecute(IncidentParms parms) { Map map = (Map)parms.target; this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } IntVec3 dropCenter; dropCenter = DropCellFinder.FindRaidDropCenterDistant(map); this.ResolveRaidStrategy(parms); this.ResolveRaidArriveMode(parms); this.ResolveRaidSpawnCenter(parms); IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo target = new TargetInfo(dropCenter, map); List <ShipBase> ships = DropShipUtility.CreateDropShips(list, parms.faction); DropShipUtility.DropShipGroups(dropCenter, map, ships, TravelingShipArrivalAction.EnterMapAssault); 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); PawnRelationUtility.Notify_PawnsSeenByPlayer(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString()); if (this.GetLetterDef() == LetterDefOf.BadUrgent) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]); } this.ResolveRaidParmOptions(parms); Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AerialAssault(ships, parms.faction, this.Kidnappers(parms.faction), true, this.UseSappers, this.SmartGrid, this.Stealers(parms.faction)), map, list); //Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, true, true, true), map, list); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts)) { for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer)) { Log.Message(string.Concat(new object[] { "Market value threshold to start stealing: ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth = ", map.wealthWatcher.WealthTotal, ")" })); } return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Trying execution"); this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction"); return(false); } this.ResolveRaidStrategy(parms); this.ResolveRaidArriveMode(parms); this.ResolveRaidSpawnCenter(parms); IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms).ToList <Pawn>(); if (list.Count == 0) { Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo target = TargetInfo.Invalid; if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { DropPodUtility.DropThingsNear(parms.spawnCenter, map, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true); target = new TargetInfo(parms.spawnCenter, map); } else { foreach (Pawn arg_B3_0 in list) { IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8); GenSpawn.Spawn(arg_B3_0, intVec, map); target = arg_B3_0; } } 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); string lalalal = this.GetRelatedPawnsInfoLetterText(parms); PawnRelationUtility.Notify_PawnsSeenByPlayer(list, out lalalal, true); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString()); if (this.GetLetterDef() == LetterDefOf.ThreatSmall) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]); } Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(parms, map), map, list); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); //if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.PersonalShields)) //{ // for (int i = 0; i < list.Count; i++) // { // Pawn pawn = list[i]; // if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is PersonalShield)) // { // LessonAutoActivator.TeachOpportunity(ConceptDefOf.PersonalShields, OpportunityType.Critical); // break; // } // } //} if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer)) { Log.Message(string.Concat(new object[] { "Market value threshold to start stealing: ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth = ", map.wealthWatcher.WealthTotal, ")" })); } return(true); }