public void DropTeam() { // Find exit spot. IntVec3 exitSpot = IntVec3.Invalid; bool exitSpotIsValid = Expedition.TryFindRandomExitSpot(this.Map, this.Position, out exitSpot); if (exitSpotIsValid) { // Spawn expedition pawns. List <Pawn> stayingAboardPawns = new List <Pawn>(); List <Pawn> droppedPawns = new List <Pawn>(); foreach (Pawn pawn in this.pawnsAboard) { if (pawn.kindDef == Util_PawnKindDefOf.Pilot) { stayingAboardPawns.Add(pawn); } else { droppedPawns.Add(pawn); GenSpawn.Spawn(pawn, this.Position + IntVec3Utility.RandomHorizontalOffset(3f), this.Map); } } this.pawnsAboard = stayingAboardPawns; // Make lord. LordMaker.MakeNewLord(Util_Faction.MiningCoFaction, new LordJob_ExitMap(exitSpot), this.Map, droppedPawns); // Spawn payment. SpawnPayment(droppedPawns.Count); Util_Faction.AffectGoodwillWith(Util_Faction.MiningCoFaction, Faction.OfPlayer, droppedPawns.Count); } }
private void MakeTradeCaravan(Faction faction, IntVec3 spot, Map map) { IncidentParms incidentParms = Find.Storyteller.storytellerComps[0].GenerateParms(IncidentCategoryDefOf.OrbitalVisitor, map); incidentParms.points = Mathf.Min(800f, incidentParms.points); incidentParms.spawnCenter = spot; incidentParms.faction = faction; List <Pawn> list = this.SpawnPawns(incidentParms); if (list.Count != 0) { for (int i = 0; i < list.Count; i++) { if (list[i].needs != null && list[i].needs.food != null) { list[i].needs.food.CurLevel = list[i].needs.food.MaxLevel; } } for (int j = 0; j < list.Count; j++) { Pawn pawn = list[j]; if (pawn.TraderKind != null) { TraderKindDef traderKind = pawn.TraderKind; break; } } LordJob_TradeWithColony lordJob = new LordJob_TradeWithColony(incidentParms.faction, spot); LordMaker.MakeNewLord(incidentParms.faction, lordJob, map, list); } }
public override void Generate(Map map, GenStepParams parms) { IntVec3 intVec; if (RCellFinder.TryFindRandomCellNearTheCenterOfTheMapWith((IntVec3 x) => GenGrid.Standable(x, map) && !GridsUtility.Fogged(x, map) && GridsUtility.GetRoom(x, map, (RegionType)6).CellCount >= 4, map, out intVec)) { float num = this.pointsRange.RandomInRange; List <Pawn> list = new List <Pawn>(); for (int i = 0; i < 50; i++) { PawnKindDef pawnKindDef = GenCollection.RandomElementByWeight <PawnKindDef>(from kind in DefDatabase <PawnKindDef> .AllDefsListForReading where kind.RaceProps.IsMechanoid select kind, (PawnKindDef kind) => 1f / kind.combatPower); list.Add(PawnGenerator.GeneratePawn(pawnKindDef, Faction.OfMechanoids)); num -= pawnKindDef.combatPower; if (num <= 0f) { break; } } IntVec3 intVec2 = default(IntVec3); for (int j = 0; j < list.Count; j++) { IntVec3 intVec3 = CellFinder.RandomSpawnCellForPawnNear(intVec, map, 10); intVec2 = intVec3; GenSpawn.Spawn(list[j], intVec3, map, Rot4.Random, WipeMode.Vanish, false); } LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_DefendPoint(intVec2), map, list); } }
private void AssaultColony() { faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, canSendLetter: false); for (int i = 0; i < pawns.Count; i++) { pawns[i].GetLord()?.Notify_PawnLost(pawns[i], PawnLostCondition.ForcedByQuest); } for (int j = 0; j < pawns.Count; j++) { pawns[j].SetFaction(faction); if (!pawns[j].Awake()) { RestUtility.WakeUp(pawns[j]); } } Lord lord = LordMaker.MakeNewLord(faction, new LordJob_AssaultColony(faction), mapParent.Map); for (int k = 0; k < pawns.Count; k++) { if (!pawns[k].Dead) { lord.AddPawn(pawns[k]); } } Complete(); }
private bool TryAccept() { List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(this.transferables); if (!this.CheckForErrors(pawnsFromTransferables)) { return(false); } this.AssignTransferablesToShip(); IEnumerable <Pawn> enumerable = from x in pawnsFromTransferables where x.IsColonist && !x.Downed select x; if (enumerable.Any <Pawn>()) { foreach (Pawn current in enumerable) { Lord lord = current.GetLord(); if (lord != null) { lord.Notify_PawnLost(current, PawnLostCondition.ForcedToJoinOtherLord, null); } } LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_LoadShipCargo(this.ship), this.map, enumerable); foreach (Pawn current2 in enumerable) { if (current2.Spawned) { current2.jobs.EndCurrentJob(JobCondition.InterruptForced, true); } } } Messages.Message("MessageShipCargoLoadStarted".Translate(new object[] { ship.ShipNick }), this.ship, MessageTypeDefOf.TaskCompletion, false); return(true); }
public PawnSummoned SpawnPawn(SpawnThings spawnables, Faction faction) { var newPawn = (PawnSummoned)PawnGenerator.GeneratePawn(spawnables.kindDef, faction); newPawn.Spawner = Caster; newPawn.Temporary = spawnables.temporary; if (newPawn.Faction != Faction.OfPlayerSilentFail && this?.Caster?.Faction is Faction f) { newPawn.SetFaction(f); } GenSpawn.Spawn(newPawn, PositionHeld, Find.CurrentMap); if (faction != null && faction != Faction.OfPlayer) { Lord lord = null; if (newPawn.Map.mapPawns.SpawnedPawnsInFaction(faction).Any(p => p != newPawn)) { Predicate <Thing> validator = p => p != newPawn && ((Pawn)p).GetLord() != null; var p2 = (Pawn)GenClosest.ClosestThing_Global(newPawn.Position, newPawn.Map.mapPawns.SpawnedPawnsInFaction(faction), 99999f, validator); lord = p2.GetLord(); } if (lord == null) { var lordJob = new LordJob_DefendPoint(newPawn.Position); lord = LordMaker.MakeNewLord(faction, lordJob, Find.CurrentMap, null); } lord.AddPawn(newPawn); } return(newPawn); }
public override void Generate(Map map) { CellRect around; IntVec3 near; if (!SiteGenStepUtility.TryFindRootToSpawnAroundRectOfInterest(out around, out near, map)) { return; } List <Pawn> list = new List <Pawn>(); foreach (Pawn current in this.GeneratePawns(map)) { IntVec3 loc; if (!SiteGenStepUtility.TryFindSpawnCellAroundOrNear(around, near, map, out loc)) { Find.WorldPawns.PassToWorld(current, PawnDiscardDecideMode.Discard); break; } GenSpawn.Spawn(current, loc, map); list.Add(current); } if (!list.Any <Pawn>()) { return; } LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_SleepThenAssaultColony(Faction.OfMechanoids, Rand.Bool), map, list); for (int i = 0; i < list.Count; i++) { list[i].jobs.EndCurrentJob(JobCondition.InterruptForced, true); } }
private bool TryAccept() { List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(transferables); if (!CheckForErrors(pawnsFromTransferables)) { return(false); } int transportersGroup = CreateAndAssignNewTransportersGroup(); AssignTransferablesToRandomTransporters(); IEnumerable <Pawn> enumerable = from x in pawnsFromTransferables where x.IsColonist && !x.Downed select x; if (enumerable.Any()) { foreach (Pawn item in enumerable) { item.GetLord()?.Notify_PawnLost(item, PawnLostCondition.ForcedToJoinOtherLord); } LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_LoadAndEnterTransporters(transportersGroup), map, enumerable); foreach (Pawn item2 in enumerable) { if (item2.Spawned) { item2.jobs.EndCurrentJob(JobCondition.InterruptForced); } } } Messages.Message("MessageTransportersLoadingProcessStarted".Translate(), transporters[0].parent, MessageTypeDefOf.TaskCompletion, historical: false); return(true); }
private static void CreateLord(Faction faction, IntVec3 chillSpot, List <Pawn> pawns, Map map) { var mapComp = Hospitality_MapComponent.Instance(map); int stayDuration = (int)(Rand.Range(1f, 2.4f) * GenDate.TicksPerDay); var lordJob = new LordJob_VisitColony(faction, chillSpot, stayDuration); LordMaker.MakeNewLord(faction, lordJob, map, pawns); // Set default interaction pawns.ForEach(delegate(Pawn p) { var compGuest = p.GetComp <CompGuest>(); if (compGuest != null) { compGuest.mayBuy = mapComp.defaultMayBuy; compGuest.chat = mapComp.defaultInteractionMode == PrisonerInteractionModeDefOf.Chat; compGuest.GuestArea = mapComp.defaultAreaRestriction; } }); bool gotTrader = false; if (Rand.Value < 0.75f) { gotTrader = TryConvertOnePawnToSmallTrader(pawns, faction, map); } string label; string description; Pawn pawn = pawns.Find(x => faction.leader == x); if (pawns.Count == 1) { string traderDesc = (!gotTrader) ? string.Empty : "SingleVisitorArrivesTraderInfo".Translate(); string leaderDesc = (pawn == null) ? string.Empty : "SingleVisitorArrivesLeaderInfo".Translate(); label = "LetterLabelSingleVisitorArrives".Translate(); description = "SingleVisitorArrives".Translate(new object[] { pawns[0].GetTitle().ToLower(), faction.Name, pawns[0].Name, traderDesc, leaderDesc }); description = description.AdjustedFor(pawns[0]); } else { string traderDesc = (!gotTrader) ? string.Empty : "GroupVisitorsArriveTraderInfo".Translate(); string leaderDesc = (pawn == null) ? string.Empty : "GroupVisitorsArriveLeaderInfo".Translate(new object[] { pawn.LabelShort }); label = "LetterLabelGroupVisitorsArrive".Translate(); description = "GroupVisitorsArrive".Translate(new object[] { faction.Name, traderDesc, leaderDesc }); } Find.LetterStack.ReceiveLetter(label, description, LetterDefOf.Good, pawns[0]); }
public void TransferColonists(bool toPlayer) { if (toPlayer) { foreach (var p in friendlyPawns) { if (p != null && !p.Dead) { p.SetFaction(Faction.OfPlayer); p.playerSettings.hostilityResponse = HostilityResponseMode.Attack; } } } else { Lord lord = LordMaker.MakeNewLord(settlement.Faction, new LordJob_DefendBase(settlement.Faction, settlement.Map.Center), settlement.Map); foreach (var p in friendlyPawns) { if (p != null) { p.SetFaction(settlement.Faction); if (!p.Dead && !p.Downed) { lord.AddPawn(p); } } } } }
public override void Resolve(ResolveParams rp) { int? mechanoidsCount = rp.mechanoidsCount; int num = (!mechanoidsCount.HasValue) ? SymbolResolver_RandomMechanoidGroup.DefaultMechanoidCountRange.RandomInRange : mechanoidsCount.Value; Lord lord = rp.singlePawnLord; if (lord == null && num > 0) { Map map = BaseGen.globalSettings.map; IntVec3 point = default(IntVec3); LordJob lordJob = (!Rand.Bool || !(from x in rp.rect.Cells where !x.Impassable(map) select x).TryRandomElement <IntVec3>(out point)) ? ((LordJob) new LordJob_AssaultColony(Faction.OfMechanoids, false, false, false, false, false)) : ((LordJob) new LordJob_DefendPoint(point)); lord = LordMaker.MakeNewLord(Faction.OfMechanoids, lordJob, map, null); } for (int i = 0; i < num; i++) { PawnKindDef pawnKindDef = rp.singlePawnKindDef; if (pawnKindDef == null) { pawnKindDef = (from kind in DefDatabase <PawnKindDef> .AllDefsListForReading where kind.RaceProps.IsMechanoid select kind).RandomElementByWeight((PawnKindDef kind) => (float)(1.0 / kind.combatPower)); } ResolveParams resolveParams = rp; resolveParams.singlePawnKindDef = pawnKindDef; resolveParams.singlePawnLord = lord; resolveParams.faction = Faction.OfMechanoids; BaseGen.symbolStack.Push("pawn", resolveParams); } }
public void SetPlace(CaravanAI caravanAI, Caravan playerCaravan, IntVec3 mapSize) { MapSize = mapSize; this.caravanAI = caravanAI; aiFaction = caravanAI.Faction; aiTarget = caravanAI.pather.Destination; aiAction = caravanAI.pather.ArrivalAction; this.playerCaravan = playerCaravan; List <Pawn> aiPawns = new List <Pawn>(caravanAI.pawns); caravanAI.Tile = Tile; playerCaravan.Tile = Tile; Map map = GetOrGenerateMap(Tile, MapSize, null); Find.TickManager.Notify_GeneratedPotentiallyHostileMap(); MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 first, out IntVec3 second); CaravanEnterMapUtility.Enter(caravanAI, map, x => CellFinder.RandomSpawnCellForPawnNear(first, map), CaravanDropInventoryMode.DoNotDrop); CaravanEnterMapUtility.Enter(playerCaravan, map, x => CellFinder.RandomSpawnCellForPawnNear(second, map), CaravanDropInventoryMode.DoNotDrop); LordJob lordJob = new LordJob_AssaultColony(caravanAI.Faction, canKidnap: true, canTimeoutOrFlee: false); LordMaker.MakeNewLord(caravanAI.Faction, lordJob, map, aiPawns); winner = CaravanBattleWinner.None; Find.LetterStack.ReceiveLetter("CaravanBattlePlacePlace_BattleStarted".Translate(), "CaravanBattlePlacePlace_BattleDescription".Translate(playerCaravan.Name, caravanAI.Name), LetterDefOf.ThreatBig); }
internal void <> m__3() { Pawn t = this.caravan.PawnsListForReading[0]; Faction faction = this.faction; Faction ofPlayer = Faction.OfPlayer; FactionRelationKind kind = FactionRelationKind.Hostile; string reason = "GoodwillChangedReason_AttackedCaravan".Translate(); faction.TrySetRelationKind(ofPlayer, kind, true, reason, new GlobalTargetInfo?(t)); Map map = CaravanIncidentUtility.GetOrGenerateMapForIncident(this.caravan, new IntVec3(100, 1, 100), WorldObjectDefOf.AttackedNonPlayerCaravan); IntVec3 playerSpot; IntVec3 enemySpot; MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out playerSpot, out enemySpot); CaravanEnterMapUtility.Enter(this.caravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(playerSpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, true); List <Pawn> list = this.metCaravan.PawnsListForReading.ToList <Pawn>(); CaravanEnterMapUtility.Enter(this.metCaravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(enemySpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, false); LordMaker.MakeNewLord(this.faction, new LordJob_DefendAttackedTraderCaravan(list[0].Position), map, list); Find.TickManager.CurTimeSpeed = TimeSpeed.Paused; CameraJumper.TryJumpAndSelect(t); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(list, "LetterRelatedPawnsGroupGeneric".Translate(new object[] { Faction.OfPlayer.def.pawnsPlural }), LetterDefOf.NeutralEvent, true, true); }
private static Gizmo CreateGizmo_SearchAndDestroy(Pawn __instance, ExtendedPawnData pawnData) { string disabledReason = ""; bool disabled = false; if (__instance.Downed) { disabled = true; disabledReason = "WTH_Reason_MechanoidDowned".Translate(); } else if (__instance.ShouldRecharge()) { disabled = true; disabledReason = "WTH_Reason_PowerLow".Translate(); } else if (__instance.ShouldBeMaintained()) { disabled = true; disabledReason = "WTH_Reason_MaintenanceLow".Translate(); } Gizmo gizmo = new Command_Toggle { defaultLabel = "WTH_Gizmo_SearchAndDestroy_Label".Translate(), defaultDesc = "WTH_Gizmo_SearchAndDestroy_Description".Translate(), disabled = disabled, disabledReason = disabledReason, icon = ContentFinder <Texture2D> .Get(("UI/" + "Enable_SD"), true), isActive = () => pawnData.isActive, toggleAction = () => { pawnData.isActive = !pawnData.isActive; if (pawnData.isActive) { if (__instance.GetLord() == null || __instance.GetLord().LordJob == null) { LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_SearchAndDestroy(), __instance.Map, new List <Pawn> { __instance }); } __instance.jobs.EndCurrentJob(JobCondition.InterruptForced); if (__instance.relations == null) //Added here to fix existing saves. { __instance.relations = new Pawn_RelationsTracker(__instance); } } else { __instance.jobs.EndCurrentJob(JobCondition.InterruptForced); Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(__instance, __instance); if (closestAvailablePlatform != null) { Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform); __instance.jobs.TryTakeOrderedJob(job); } } } }; return(gizmo); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; PawnKindDef pawnKindDef; if (!this.TryFindAnimalKind(map.Tile, out pawnKindDef)) { return(false); } IntVec3 intVec; IntVec3 near; if (!this.TryFindStartAndEndCells(map, out intVec, out near)) { return(false); } Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat); List <Pawn> list = this.GenerateAnimals(pawnKindDef, map.Tile); for (int i = 0; i < list.Count; i++) { Pawn newThing = list[i]; IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null); GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false); } LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, list); string text = string.Format(this.def.letterText, pawnKindDef.GetLabelPlural(-1)).CapitalizeFirst(); string label = string.Format(this.def.letterLabel, pawnKindDef.GetLabelPlural(-1).CapitalizeFirst()); Find.LetterStack.ReceiveLetter(label, text, this.def.letterDef, list[0], null, null); return(true); }
public static bool TryStartGathering(Map map) { Pawn organizer = GatheringsUtility.FindRandomGatheringOrganizer(Faction.OfPlayer, map, GatheringDefOf.Party); //Pawn pawn = PartyUtility.FindRandomPartyOrganizer(Faction.OfPlayer, map); if (organizer == null) { Messages.Message("ElectionFail_ColonistsNotFound", MessageTypeDefOf.RejectInput); return(false); } IntVec3 intVec; //RCellFinder.TryFindGatheringSpot(pawn, GatheringDef.Named(""), intVec) if (!RCellFinder.TryFindGatheringSpot(organizer, GatheringDefOf.Party, out intVec)) { Messages.Message("Couldn't find a suitable safe spot for the election.", MessageTypeDefOf.RejectInput); return(false); } LordMaker.MakeNewLord(organizer.Faction, new LordJob_Joinable_SetLeadership(intVec), map, null); Find.LetterStack.ReceiveLetter("Election", "ElectionGathering", LetterDefOf.PositiveEvent, new TargetInfo(intVec, map, false), null); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; if (!base.TryResolveParms(parms)) { return(false); } if (parms.faction.HostileTo(Faction.OfPlayer)) { return(false); } List <Pawn> list = base.SpawnPawns(parms); if (list.Count == 0) { return(false); } for (int i = 0; i < list.Count; i++) { if (list[i].needs != null && list[i].needs.food != null) { list[i].needs.food.CurLevel = list[i].needs.food.MaxLevel; } } TraderKindDef traderKindDef = null; for (int j = 0; j < list.Count; j++) { Pawn pawn = list[j]; if (pawn.TraderKind != null) { traderKindDef = pawn.TraderKind; break; } } string label = "LetterLabelTraderCaravanArrival".Translate(new object[] { parms.faction.Name, traderKindDef.label }).CapitalizeFirst(); string text = "LetterTraderCaravanArrival".Translate(new object[] { parms.faction.Name, traderKindDef.label }).CapitalizeFirst(); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref label, ref text, "LetterRelatedPawnsNeutralGroup".Translate(new object[] { Faction.OfPlayer.def.pawnsPlural }), true, true); Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.PositiveEvent, list[0], parms.faction, null); IntVec3 chillSpot; RCellFinder.TryFindRandomSpotJustOutsideColony(list[0], out chillSpot); LordJob_TradeWithColony lordJob = new LordJob_TradeWithColony(parms.faction, chillSpot); LordMaker.MakeNewLord(parms.faction, lordJob, map, list); return(true); }
public static void StartFormingCaravan(List <Pawn> pawns, List <Pawn> downedPawns, Faction faction, List <TransferableOneWay> transferables, IntVec3 meetingPoint, IntVec3 exitSpot, int startingTile, int destinationTile) { if (startingTile < 0) { Log.Error("Can't start forming caravan because startingTile is invalid."); } else if (!pawns.Any()) { Log.Error("Can't start forming caravan with 0 pawns."); } else { if (pawns.Any((Pawn x) => x.Downed)) { Log.Warning("Forming a caravan with a downed pawn. This shouldn't happen because we have to create a Lord."); } List <TransferableOneWay> list = transferables.ToList(); list.RemoveAll((TransferableOneWay x) => x.CountToTransfer <= 0 || !x.HasAnyThing || x.AnyThing is Pawn); for (int i = 0; i < pawns.Count; i++) { pawns[i].GetLord()?.Notify_PawnLost(pawns[i], PawnLostCondition.ForcedToJoinOtherLord); } LordJob_FormAndSendCaravan lordJob = new LordJob_FormAndSendCaravan(list, downedPawns, meetingPoint, exitSpot, startingTile, destinationTile); LordMaker.MakeNewLord(Faction.OfPlayer, lordJob, pawns[0].MapHeld, pawns); for (int j = 0; j < pawns.Count; j++) { Pawn pawn = pawns[j]; if (pawn.Spawned) { pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); } } } }
private void Outcome_Disaster(Caravan caravan) { LongEventHandler.QueueLongEvent(delegate() { FactionRelationKind playerRelationKind = this.Faction.PlayerRelationKind; int randomInRange = DiplomacyTuning.Goodwill_PeaceTalksDisasterRange.RandomInRange; this.Faction.TryAffectGoodwillWith(Faction.OfPlayer, randomInRange, false, false, null, null); this.Faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, false, null, null); IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan); incidentParms.faction = this.Faction; PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, true); defaultPawnGroupMakerParms.generateFightersOnly = true; List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); Map map = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, list, false); if (list.Any <Pawn>()) { LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(this.Faction, true, true, false, false, true), map, list); } Find.TickManager.Notify_GeneratedPotentiallyHostileMap(); GlobalTargetInfo target = (!list.Any <Pawn>()) ? GlobalTargetInfo.Invalid : new GlobalTargetInfo(list[0].Position, map, false); string label = "LetterLabelPeaceTalks_Disaster".Translate(); string letterText = this.GetLetterText("LetterPeaceTalks_Disaster".Translate(new object[] { this.Faction.def.pawnsPlural.CapitalizeFirst(), this.Faction.Name, Mathf.RoundToInt((float)randomInRange) }), caravan, playerRelationKind); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref label, ref letterText, "LetterRelatedPawnsGroupGeneric".Translate(new object[] { Faction.OfPlayer.def.pawnsPlural }), true, true); Find.LetterStack.ReceiveLetter(label, letterText, LetterDefOf.ThreatBig, target, this.Faction, null); }, "GeneratingMapForNewEncounter", false, null); }
public virtual void MakeLords(IncidentParms parms, List <Pawn> pawns) { Map map = (Map)parms.target; List <List <Pawn> > list = IncidentParmsUtility.SplitIntoGroups(pawns, parms.pawnGroups); int @int = Rand.Int; for (int i = 0; i < list.Count; i++) { List <Pawn> list2 = list[i]; Lord lord = LordMaker.MakeNewLord(parms.faction, this.MakeLordJob(parms, map, list2, @int), map, list2); if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer)) { Log.Message(string.Concat(new object[] { "Market value threshold to start stealing (raiders=", lord.ownedPawns.Count, "): ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth=", map.wealthWatcher.WealthTotal, ")" }), false); } } }
public override void EjectContents() { bool contentsKnown = base.contentsKnown; List <Thing> list = null; if (!contentsKnown) { list = new List <Thing>(); list.AddRange(innerContainer); list.AddRange(UnopenedCasketsInGroup().SelectMany((Building_AncientCryptosleepCasket c) => c.innerContainer)); list.RemoveDuplicates(); } base.EjectContents(); if (!contentsKnown) { ThingDef filth_Slime = ThingDefOf.Filth_Slime; FilthMaker.TryMakeFilth(base.Position, base.Map, filth_Slime, Rand.Range(8, 12)); SetFaction(null); foreach (Building_AncientCryptosleepCasket item in UnopenedCasketsInGroup()) { item.contentsKnown = true; item.EjectContents(); } IEnumerable <Pawn> enumerable = from p in list.OfType <Pawn>().ToList() where p.RaceProps.Humanlike && p.GetLord() == null && p.Faction == Faction.OfAncientsHostile select p; if (enumerable.Any()) { LordMaker.MakeNewLord(Faction.OfAncientsHostile, new LordJob_AssaultColony(Faction.OfAncientsHostile, canKidnap: false, canTimeoutOrFlee: true, sappers: false, useAvoidGridSmart: false, canSteal: false), base.Map, enumerable); } } }
private void SpawnCaravan() { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms { faction = faction, groupKind = PawnGroupKindDefOf.Combat, points = Rand.Range(200, 500), }; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); if (CellFinder.TryFindRandomEdgeCellWith((IntVec3 c) => !c.Roofed(map) && c.Walkable(map) && c.Standable(map), map, 0f, out IntVec3 pos)) { foreach (var pawn in pawns) { GenSpawn.Spawn(pawn, pos, map); } } Pawn p = pawns.RandomElement(); foreach (var item in ContainedItems) { p.inventory.innerContainer.TryAdd(item); } Find.LetterStack.ReceiveLetter("AssistCaravan_GifterArrivedTitle".Translate(), "AssistCaravan_GifterArrived".Translate(), LetterDefOf.PositiveEvent, new LookTargets(pawns[0])); RCellFinder.TryFindRandomSpotJustOutsideColony(pawns[0], out IntVec3 result); LordJob_CaravanBringItems lordJob = new LordJob_CaravanBringItems(result, p); Lord lord = LordMaker.MakeNewLord(faction, lordJob, map, pawns); QuestsManager.Communications.RemoveComponent(this); }
public bool TryStartParty() { Pawn pawn = PartyUtility.FindRandomPartyOrganizer(Faction.OfPlayer, this.map); bool result; IntVec3 intVec; if (pawn == null) { result = false; } else if (!RCellFinder.TryFindPartySpot(pawn, out intVec)) { result = false; } else { LordMaker.MakeNewLord(pawn.Faction, new LordJob_Joinable_Party(intVec, pawn), this.map, null); Find.LetterStack.ReceiveLetter("LetterLabelNewParty".Translate(), "LetterNewParty".Translate(new object[] { pawn.LabelShort }), LetterDefOf.PositiveEvent, new TargetInfo(intVec, this.map, false), null, null); this.lastLordStartTick = Find.TickManager.TicksGame; this.startPartyASAP = false; result = true; } return(result); }
public static void StartFormingCaravan(List <Pawn> pawns, List <Pawn> downedPawns, Faction faction, List <TransferableOneWay> transferables, IntVec3 meetingPoint, IntVec3 exitSpot, int startingTile, int destinationTile) { if (startingTile < 0) { Log.Error("Can't start forming caravan because startingTile is invalid."); return; } if (!pawns.NotNullAndAny()) { Log.Error("Can't start forming caravan with 0 pawns."); return; } if (!pawns.NotNullAndAny(x => x is VehiclePawn)) { Log.Error("Can't start forming vehicle caravan without any vehicles"); return; } if (pawns.NotNullAndAny(x => x is VehiclePawn vehicle && vehicle.IsBoat() && (vehicle.movementStatus is VehicleMovementStatus.Online))) { List <TransferableOneWay> list = transferables; list.RemoveAll((TransferableOneWay x) => x.CountToTransfer <= 0 || !x.HasAnyThing || x.AnyThing is Pawn); foreach (Pawn p in pawns) { Lord pLord = p.GetLord(); if (pLord != null) { pLord.Notify_PawnLost(p, PawnLostCondition.ForcedToJoinOtherLord, null); } } List <VehiclePawn> vehicles = pawns.Where(p => p.IsBoat()).Cast <VehiclePawn>().ToList(); List <Pawn> capablePawns = pawns.Where(x => !(x is VehiclePawn) && x.IsColonist && !x.Downed && !x.Dead).ToList(); List <Pawn> prisoners = pawns.Where(x => !(x is VehiclePawn) && !x.IsColonist && !x.RaceProps.Animal).ToList(); int seats = 0; foreach (VehiclePawn vehicle in vehicles) { seats += vehicle.SeatsAvailable; } if ((pawns.Where(p => !p.IsBoat()).ToList().Count + downedPawns.Count) > seats) { Log.Error("Can't start forming caravan with vehicles(s) selected and not enough seats to house all pawns. Seats: " + seats + " Pawns boarding: " + (pawns.Where(x => !(x is VehiclePawn)).ToList().Count + downedPawns.Count)); return; } LordJob_FormAndSendVehicles lordJob = new LordJob_FormAndSendVehicles(list, vehicles, capablePawns, downedPawns, prisoners, meetingPoint, exitSpot, startingTile, destinationTile, true); LordMaker.MakeNewLord(Faction.OfPlayer, lordJob, pawns[0].MapHeld, pawns); vehicles.ForEach(v => v.DisembarkAll()); foreach (Pawn p in pawns) { if (p.Spawned) { p.jobs.EndCurrentJob(JobCondition.InterruptForced, true); } } }
private bool TryAccept() { List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(this.transferables); if (!this.CheckForErrors(pawnsFromTransferables)) { Cthulhu.Utility.DebugReport("TryAccept Failed"); return(false); } Cthulhu.Utility.DebugReport("TryAccept Succeeded"); int transportersGroup = this.CreateAndAssignNewTransportersGroup(); this.AssignTransferablesToRandomTransporters(); IEnumerable <Pawn> enumerable = from x in pawnsFromTransferables where x.IsColonist && !x.Downed select x; if (enumerable.Any <Pawn>()) { Cthulhu.Utility.DebugReport("Pawn List Succeeded"); LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_LoadAndEnterTransportersPawn(transportersGroup), this.map, enumerable); foreach (Pawn current in enumerable) { if (current.Spawned) { current.jobs.EndCurrentJob(JobCondition.InterruptForced, true); } } } Messages.Message("MessageTransportersLoadingProcessStarted".Translate(), this.transporters[0].parent, MessageTypeDefOf.PositiveEvent); return(true); }
private static void UnHackMechanoid(Pawn pawn) { if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly)) { pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_TargetingHackedPoorly)); } if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHacked)) { pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_TargetingHacked)); } if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_BackupBattery)) { pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_BackupBattery)); } if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_VeryLowPower)) { pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_VeryLowPower)); } if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_NoPower)) { pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_NoPower)); } pawn.SetFaction(Faction.OfMechanoids); pawn.story = null; if (pawn.GetLord() == null || pawn.GetLord().LordJob == null) { LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_AssaultColony(Faction.OfMechanoids, true, true, false, false, true), pawn.Map, new List <Pawn> { pawn }); } Find.LetterStack.ReceiveLetter("WTH_Letter_Mech_Reverted_Label".Translate(), "WTH_Letter_Mech_Reverted_Description".Translate(), LetterDefOf.ThreatBig, pawn); }
private void GeneratePawns(Map map, float points) { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms { faction = Faction, points = points, generateFightersOnly = true, groupKind = PawnGroupKindDefOf.Combat, raidStrategy = RaidStrategyDefOf.ImmediateAttack, forceOneIncap = true }; var pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); foreach (var pawn in pawns) { if (CellFinder.TryFindRandomCellNear(map.Center, map, 15, (IntVec3 x) => x.Standable(map) && !x.Fogged(map), out IntVec3 loc)) { GenSpawn.Spawn(pawn, loc, map, Rot4.Random); } } LordJob_AssaultColony lordJob_AssaultColony = new LordJob_AssaultColony(Faction); Lord lord = LordMaker.MakeNewLord(Faction, lordJob_AssaultColony, map, pawns); }
private static void HealToStanding(Pawn pawn, BodyPartRecord part) { bool shouldStop = false; float extraHealth = 100f; //TODO: no magic number; extraHealth *= pawn.HealthScale; float healPerIteration = 10f; float totalExtraHealed = 0f; int guard = 0; while (totalExtraHealed <= extraHealth && guard < 1000) { Hediff_Injury hediff_Injury = pawn.health.hediffSet.GetHediffs <Hediff_Injury>().Where(new Func <Hediff_Injury, bool>(HediffUtility.CanHealNaturally)).RandomElement <Hediff_Injury>(); if (hediff_Injury == null || !pawn.Downed) { shouldStop = true; } hediff_Injury.Heal(healPerIteration); if (shouldStop) { totalExtraHealed += healPerIteration; } guard++; } pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); if (pawn.GetLord() == null || pawn.GetLord().LordJob == null) { LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_SearchAndDestroy(), pawn.Map, new List <Pawn> { pawn }); } Find.LetterStack.ReceiveLetter("WTH_Letter_HealedToStanding_Label".Translate(), "WTH_Letter_HealedToStanding_Description".Translate(), LetterDefOf.ThreatBig, pawn); }
private static void SendCaravan(FCEvent evt) { Map playerHomeMap = Find.World.GetComponent <FactionFC>().TaxMap; if (DoDelayCaravanDueToDanger(evt)) { return; } MakeDeliveryLetterAndMessage(evt); List <Pawn> pawns = new List <Pawn>(); while (evt.goods.Count() > 0) { Pawn pawn = PawnGenerator.GeneratePawn(FCPawnGenerator.WorkerOrMilitaryRequest()); Thing next = evt.goods.First(); if (pawn.carryTracker.innerContainer.TryAdd(next)) { evt.goods.Remove(next); } pawns.Add(pawn); } PawnsArrivalModeWorker_EdgeWalkIn pawnsArrivalModeWorker = new PawnsArrivalModeWorker_EdgeWalkIn(); IncidentParms parms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.FactionArrival, playerHomeMap); parms.spawnRotation = Rot4.FromAngleFlat((((Map)parms.target).Center - parms.spawnCenter).AngleFlat); RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, playerHomeMap, CellFinder.EdgeRoadChance_Friendly); pawnsArrivalModeWorker.Arrive(pawns, parms); LordMaker.MakeNewLord(FCPawnGenerator.WorkerOrMilitaryRequest().Faction, new LordJob_DeliverSupplies(parms.spawnCenter), playerHomeMap, pawns); }
public override void Resolve(ResolveParams rp) { var kindStr = "RE_GKind"; BaseGen.symbolStack.Push("indoorLighting", rp); if (Rand.Value < 0.05f) { BaseGen.symbolStack.Push("randomlyPlaceMealsOnTables", rp); BaseGen.symbolStack.Push("placeChairsNearTables", rp); int num = Mathf.Max(GenMath.RoundRandom((float)rp.rect.Area / 20f), 1); for (int i = 0; i < num; i++) { ResolveParams resolveParams = rp; resolveParams.singleThingDef = ThingDefOf.Table2x2c; BaseGen.symbolStack.Push("thing", resolveParams); } } else { var map = BaseGen.globalSettings.map; MiscUtility.SpawnHerbsAtRect(rp.rect, map, 4, 6); } var monsterParams = rp; monsterParams.rect = rp.rect; monsterParams.pawnGroupMakerParams = null; monsterParams.singlePawnKindDef = PawnKindDef.Named(kindStr); Lord singlePawnLord = LordMaker.MakeNewLord(monsterParams.faction, new LordJob_DefendPoint(monsterParams.rect.CenterCell), BaseGen.globalSettings.map); monsterParams.singlePawnLord = singlePawnLord; BaseGen.symbolStack.Push("pawn", monsterParams); }