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(); GenerateItems(); foreach (var carrier in GenerateCarriers()) { pawns.Add(carrier); } IncidentParms parms = new IncidentParms { target = map, spawnCenter = CellFinder.RandomClosewalkCellNear(map.Center, map, 15, x => x.Walkable(map) && !x.Fogged(map)) }; foreach (var pawn in pawns) { IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8); GenSpawn.Spawn(pawn, loc, map, parms.spawnRotation); } LordJob_DefendBase lordJob = new LordJob_DefendBase(Faction, parms.spawnCenter); Lord lord = LordMaker.MakeNewLord(Faction, lordJob, map, pawns); }
public override void PostMapGenerate(Map map) { base.PostMapGenerate(map); Faction faction = Find.FactionManager.RandomNonHostileFaction(false, false, true, TechLevel.Spacer); int maxPawns = Find.World.worldObjects.MapParentAt(map.Tile).GetComponent <QuestComp_MedicalEmergency>().maxPawns; List <Pawn> list = new List <Pawn>(); IntVec3 baseCenter; if (RCellFinder.TryFindRandomCellNearTheCenterOfTheMapWith((IntVec3 x) => x.Standable(map) && x.Fogged(map) && GridsUtility.GetRoom(x, map, RegionType.Set_Passable).CellCount >= 2, map, out baseCenter)) { for (int i = 0; i < maxPawns; i++) { IntVec3 intVec; if (RCellFinder.TryFindRandomCellNearTheCenterOfTheMapWith((IntVec3 x) => x.Standable(map) && x.Fogged(map) && GridsUtility.GetRoom(x, map, RegionType.Set_Passable).CellCount >= 2, map, out intVec)) { PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 20f, false, true, true, false, false); Pawn pawn = PawnGenerator.GeneratePawn(request); list.Add(pawn); HealthUtility.DamageUntilDowned(pawn); IntVec3 intVec2 = CellFinder.RandomSpawnCellForPawnNear(intVec, map, 18); GenSpawn.Spawn(pawn, intVec2, map, Rot4.Random, WipeMode.Vanish, false); } } LordJob_DefendBase lordJob = new LordJob_DefendBase(faction, baseCenter); LordMaker.MakeNewLord(faction, lordJob, map, list); } }
private void SpawnAndGiveLord(List <Pawn> pawns, Faction faction, Map map, IntVec3 spot) { foreach (var firstFactionPawn in pawns) { if (CellFinder.TryFindRandomCellNear(spot, map, 6, (IntVec3 x) => x.Standable(map) && !x.Fogged(map), out IntVec3 loc)) { GenSpawn.Spawn(firstFactionPawn, loc, map, Rot4.Random); } } LordJob_DefendBase lordJob_DefendBase = new LordJob_DefendBase(faction, map.Center); Lord lord = LordMaker.MakeNewLord(faction, lordJob_DefendBase, map, pawns); }
public override void PostMapGenerate() { base.PostMapGenerate(); LordJob_DefendBase lordJob_DefendBase = new LordJob_DefendBase(Faction, new IntVec3(56, 0, 55)); Lord lord = LordMaker.MakeNewLord(Faction, lordJob_DefendBase, Map); MapGeneratorHandler.GenerateMap(MapDefOfLocal.ConcantrationCamp, Map, out List <Pawn> pawns, true, true, true, false, true, true, true, Faction, lord); GeneratePrisoners(); Find.LetterStack.ReceiveLetter("ConcantrationCampTitle".Translate(), "ConcantrationCamp".Translate(), LetterDefOf.NeutralEvent); }
private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map) { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.groupKind = PawnGroupKindDefOf.Combat; pawnGroupMakerParms.tile = map.Tile; pawnGroupMakerParms.points = points; pawnGroupMakerParms.faction = faction; pawnGroupMakerParms.generateFightersOnly = false; pawnGroupMakerParms.forceOneIncap = false; pawnGroupMakerParms.seed = Rand.Int; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); CellRect rect = locationRect; if (pawns == null) { Debug.Warning("Pawns list is null"); } else { Debug.Log("Pawns list contains {0} records", pawns.Count); } foreach (Pawn p in pawns) { bool result = CellFinder.TryFindRandomCellInsideWith(locationRect, (IntVec3 x) => x.Standable(map), out IntVec3 location); if (result) { GenSpawn.Spawn(p, location, map, Rot4.Random); } else { Debug.Warning("Can't find location!"); } } LordJob lordJob = null; lordJob = new LordJob_DefendBase(faction, rect.CenterCell); if (lordJob != null) { LordMaker.MakeNewLord(faction, lordJob, map, pawns); } }
public override void PostMapGenerate(Map map) { base.PostMapGenerate(map); MapParent mapParent = Find.World.worldObjects.MapParentAt(map.Tile); Faction faction = mapParent.Faction; //TODO: check if it works IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.FactionArrival, map); incidentParms.points = Mathf.Max(incidentParms.points, 250f); incidentParms.points *= 2f; PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.groupKind = PawnGroupKindDefOf.Settlement; pawnGroupMakerParms.tile = map.Tile; pawnGroupMakerParms.faction = faction; pawnGroupMakerParms.points = incidentParms.points; pawnGroupMakerParms.inhabitants = true; List <Pawn> list = new List <Pawn>(); foreach (Pawn pawn in PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, true)) { IntVec3 loc; CellFinder.TryFindRandomCellInsideWith(new CellRect(40, 40, map.Size.x - 80, map.Size.z - 80), (IntVec3 c) => c.Standable(map), out loc); GenSpawn.Spawn(pawn, loc, map); list.Add(pawn); } IntVec3 intVec; CellFinder.TryFindRandomCellInsideWith(new CellRect(50, 50, map.Size.x - 100, map.Size.z - 100), (IntVec3 c) => c.Standable(map), out intVec); if (faction.leader != null) { GenSpawn.Spawn(faction.leader, intVec, map); mapParent.GetComponent <QuestComp_PeaceTalks>().Negotiator = faction.leader; list.Add(faction.leader); } LordJob lordJob = new LordJob_DefendBase(faction, intVec); LordMaker.MakeNewLord(faction, lordJob, map, list); }
public override void CompTick() { base.CompTick(); if (this.active) { MapParent mapParent = this.parent as MapParent; if (mapParent != null && mapParent.Map != null) { if (this.injured.NullOrEmpty <Pawn>()) { this.injured = (from p in mapParent.Map.mapPawns.AllPawns where p.Faction == QuestComp_MedicalEmergency.fac && p.RaceProps.Humanlike select p).ToList <Pawn>(); Log.Message(string.Format("Found {0} injured pawns", this.injured.Count)); } else { Log.Message(string.Format("Active with {0} in list and max of {1}.", this.injured.Count, this.maxPawns)); foreach (Pawn pawn in this.injured) { if (!pawn.Dead && !pawn.Downed && pawn.GetLord() == null) { LordJob_DefendBase lordJob = new LordJob_DefendBase(QuestComp_MedicalEmergency.fac, pawn.Position); List <Pawn> list = new List <Pawn>(); list.Add(pawn); LordMaker.MakeNewLord(QuestComp_MedicalEmergency.fac, lordJob, mapParent.Map, list); } } if (this.CheckAllStanding()) { this.CalculateQuestOutcome(); } } } } }
private void GeneratePrisoners(Map map) { int prisonersCount = Rand.Range(2, 6); for (int i = 0; i < prisonersCount; i++) { Faction faction = Faction.OfAncientsHostile; Pawn pawn = PawnGenerator.GeneratePawn(PawnKindDefOf.Colonist, faction); Find.WorldPawns.PassToWorld(pawn); DropedPawns.Add(pawn); IntVec3 spawnPos = CellFinder.RandomClosewalkCellNear(map.Center, map, 99999); GenSpawn.Spawn(pawn, spawnPos, map); LordJob_DefendBase lordJob_DefendBase = new LordJob_DefendBase(faction, spawnPos); Lord lord = LordMaker.MakeNewLord(faction, lordJob_DefendBase, map); lord.AddPawn(pawn); } }
private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map, int countCap) { PawnGroupKindDef groupKind; if (faction.def.pawnGroupMakers.Where((PawnGroupMaker gm) => gm.kindDef == PawnGroupKindDefOf.Settlement).Count() > 0) { groupKind = PawnGroupKindDefOf.Settlement; } else { groupKind = faction.def.pawnGroupMakers.RandomElement().kindDef; } PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.groupKind = groupKind; pawnGroupMakerParms.tile = map.Tile; pawnGroupMakerParms.points = points; pawnGroupMakerParms.faction = faction; pawnGroupMakerParms.generateFightersOnly = false; pawnGroupMakerParms.forceOneIncap = false; pawnGroupMakerParms.seed = Rand.Int; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); CellRect rect = locationRect; if (pawns == null) { Debug.Warning(Debug.ForceGen, "Generating starting party: Pawns list is null"); } else { Debug.Log(Debug.ForceGen, "Pawns list contains {0} records", pawns.Count); } while (pawns.Count > countCap) { pawns.Remove(pawns.RandomElement()); } foreach (Pawn p in pawns) { bool result = CellFinder.TryFindRandomCellInsideWith(locationRect, (IntVec3 x) => x.Standable(map), out IntVec3 location); if (result) { GenSpawn.Spawn(p, location, map, Rot4.Random); } else { Debug.Warning(Debug.ForceGen, "Can't find spawning location for defender pawn!"); } } LordJob lordJob = null; lordJob = new LordJob_DefendBase(faction, rect.CenterCell); if (lordJob != null) { LordMaker.MakeNewLord(faction, lordJob, map, pawns); } }
public override Lord GetLord(Faction faction, Map map) { LordJob_DefendBase lordJob_DefendBase = new LordJob_DefendBase(faction, BaseCenter); return(LordMaker.MakeNewLord(faction, lordJob_DefendBase, map)); }
public static HashSet <IntVec3> DoSettlementGeneration(Map map, string path, LocationDef locationDef, Faction faction, bool disableFog) { Log.Message("DoSettlementGeneration: GetOrGenerateMapPatch.locationData: " + GetOrGenerateMapPatch.locationData?.locationDef); Log.Message("DoSettlementGeneration: path: " + path); Log.Message("DoSettlementGeneration: locationDef: " + locationDef); GetOrGenerateMapPatch.locationData = null; GetOrGenerateMapPatch.caravanArrival = false; var mapComp = map.GetComponent <MapComponentGeneration>(); try { if (locationDef != null && locationDef.destroyEverythingOnTheMapBeforeGeneration) { var thingsToDespawn = map.listerThings.AllThings; if (thingsToDespawn != null && thingsToDespawn.Count > 0) { for (int i = thingsToDespawn.Count - 1; i >= 0; i--) { try { if (thingsToDespawn[i].Spawned) { thingsToDespawn[i].DeSpawn(DestroyMode.WillReplace); } } catch (Exception ex) { Log.Error("4 Cant despawn: " + thingsToDespawn[i] + " - " + thingsToDespawn[i].Position + "error: " + ex); } } } } if (locationDef != null && locationDef.factionDefForNPCsAndTurrets != null) { faction = Find.FactionManager.FirstFactionOfDef(locationDef.factionDefForNPCsAndTurrets); } else if (faction == Faction.OfPlayer || faction == null) { faction = Faction.OfAncients; } List <Thing> thingsToDestroy = new List <Thing>(); HashSet <IntVec3> tilesToProcess = new HashSet <IntVec3>(); int radiusToClear = 0; // //foreach (var building in map.listerThings.AllThings // .Where(x => x is Building && x.Faction == faction && !(x is Mineable))) //{ // foreach (var pos in GenRadial.RadialCellsAround(building.Position, radiusToClear, true)) // { // if (GenGrid.InBounds(pos, map)) // { // tilesToProcess.Add(pos); // } // } // thingsToDestroy.Add(building); //} List <Corpse> corpses = new List <Corpse>(); List <Pawn> pawnCorpses = new List <Pawn>(); List <Pawn> pawns = new List <Pawn>(); List <Building> buildings = new List <Building>(); List <Thing> things = new List <Thing>(); List <Filth> filths = new List <Filth>(); List <Plant> plants = new List <Plant>(); Dictionary <IntVec3, TerrainDef> terrains = new Dictionary <IntVec3, TerrainDef>(); Dictionary <IntVec3, RoofDef> roofs = new Dictionary <IntVec3, RoofDef>(); HashSet <IntVec3> tilesToSpawnPawnsOnThem = new HashSet <IntVec3>(); Scribe.loader.InitLoading(path); Scribe_Collections.Look <Pawn>(ref pawnCorpses, "PawnCorpses", LookMode.Deep, new object[0]); Scribe_Collections.Look <Corpse>(ref corpses, "Corpses", LookMode.Deep, new object[0]); Scribe_Collections.Look <Pawn>(ref pawns, "Pawns", LookMode.Deep, new object[0]); Scribe_Collections.Look <Building>(ref buildings, "Buildings", LookMode.Deep, new object[0]); Scribe_Collections.Look <Filth>(ref filths, "Filths", LookMode.Deep, new object[0]); Scribe_Collections.Look <Thing>(ref things, "Things", LookMode.Deep, new object[0]); Scribe_Collections.Look <Plant>(ref plants, "Plants", LookMode.Deep, new object[0]); Scribe_Collections.Look <IntVec3, TerrainDef>(ref terrains, "Terrains", LookMode.Value, LookMode.Def, ref terrainKeys, ref terrainValues); Scribe_Collections.Look <IntVec3, RoofDef>(ref roofs, "Roofs", LookMode.Value, LookMode.Def, ref roofsKeys, ref roofsValues); Scribe_Collections.Look <IntVec3>(ref tilesToSpawnPawnsOnThem, "tilesToSpawnPawnsOnThem", LookMode.Value); Scribe.loader.FinalizeLoading(); if (corpses is null) { corpses = new List <Corpse>(); } else { corpses.RemoveAll(x => x is null); } if (pawnCorpses is null) { pawnCorpses = new List <Pawn>(); } else { pawnCorpses.RemoveAll(x => x is null); } if (pawns is null) { pawns = new List <Pawn>(); } else { pawns.RemoveAll(x => x is null); } if (buildings is null) { buildings = new List <Building>(); } else { buildings.RemoveAll(x => x is null); } if (things is null) { things = new List <Thing>(); } else { things.RemoveAll(x => x is null); } if (filths is null) { filths = new List <Filth>(); } else { filths.RemoveAll(x => x is null); } if (plants is null) { plants = new List <Plant>(); } else { plants.RemoveAll(x => x is null); } var cells = new List <IntVec3>(tilesToSpawnPawnsOnThem); cells.AddRange(buildings.Select(x => x.Position).ToList()); var centerCell = GetCellCenterFor(cells); var offset = map.Center - centerCell; if (corpses != null && corpses.Count > 0) { foreach (var corpse in corpses) { try { var position = GetOffsetPosition(locationDef, corpse.Position, offset); if (GenGrid.InBounds(position, map)) { GenSpawn.Spawn(corpse, position, map, WipeMode.Vanish); } } catch (Exception ex) { Log.Error("1 Error in map generating, cant spawn " + corpse + " - " + ex); } } } if (pawns != null && pawns.Count > 0) { foreach (var pawn in pawns) { try { var position = GetOffsetPosition(locationDef, pawn.Position, offset); if (GenGrid.InBounds(position, map)) { pawn.pather = new Pawn_PathFollower(pawn); GenSpawn.Spawn(pawn, position, map, WipeMode.Vanish); if (pawn.Faction != faction) { pawn.SetFaction(faction); } } } catch (Exception ex) { Log.Error("2 Error in map generating, cant spawn " + pawn + " - " + ex); } } } if (tilesToSpawnPawnsOnThem != null && tilesToSpawnPawnsOnThem.Count > 0) { foreach (var tile in tilesToSpawnPawnsOnThem) { var position = GetOffsetPosition(locationDef, tile, offset); try { if (GenGrid.InBounds(position, map)) { var things2 = map.thingGrid.ThingsListAt(position); foreach (var thing in things2) { if (thing is Building || (thing is Plant plant && plant.def != ThingDefOf.Plant_Grass) || IsChunk(thing)) { thingsToDestroy.Add(thing); } } } } catch (Exception ex) { Log.Error("3 Error in map generating, cant spawn " + position + " - " + ex); } } } if (buildings != null && buildings.Count > 0) { foreach (var building in buildings) { var position = GetOffsetPosition(locationDef, building.Position, offset); foreach (var pos in GenRadial.RadialCellsAround(position, radiusToClear, true)) { if (GenGrid.InBounds(pos, map)) { tilesToProcess.Add(pos); } } } if (tilesToProcess != null && tilesToProcess.Count > 0) { foreach (var pos in tilesToProcess) { if (pos.InBounds(map)) { var things2 = map.thingGrid.ThingsListAt(pos); foreach (var thing in things2) { if (thing is Building || (thing is Plant plant && plant.def != ThingDefOf.Plant_Grass) || IsChunk(thing)) { thingsToDestroy.Add(thing); } } var terrain = pos.GetTerrain(map); if (terrain != null) { if (terrain.IsWater) { map.terrainGrid.SetTerrain(pos, TerrainDefOf.Soil); } if (map.terrainGrid.CanRemoveTopLayerAt(pos)) { map.terrainGrid.RemoveTopLayer(pos, false); } } var roof = pos.GetRoof(map); if (roof != null && (!map.roofGrid.RoofAt(pos).isNatural || map.roofGrid.RoofAt(pos) == RoofDefOf.RoofRockThin)) { map.roofGrid.SetRoof(pos, null); } } } } if (thingsToDestroy != null && thingsToDestroy.Count > 0) { for (int i = thingsToDestroy.Count - 1; i >= 0; i--) { try { if (thingsToDestroy[i].Spawned) { thingsToDestroy[i].DeSpawn(DestroyMode.WillReplace); } } catch (Exception ex) { Log.Error("4 Cant despawn: " + thingsToDestroy[i] + " - " + thingsToDestroy[i].Position + "error: " + ex); } } } foreach (var building in buildings) { var position = GetOffsetPosition(locationDef, building.Position, offset); try { if (GenGrid.InBounds(position, map)) { GenSpawn.Spawn(building, position, map, building.Rotation, WipeMode.Vanish); if (building.def.CanHaveFaction && building.Faction != faction) { building.SetFaction(faction); } } } catch (Exception ex) { Log.Error("5 Error in map generating, cant spawn " + building + " - " + position + " - " + ex); } } } if (filths != null && filths.Count > 0) { foreach (var filth in filths) { try { var position = GetOffsetPosition(locationDef, filth.Position, offset); if (position.InBounds(map)) { GenSpawn.Spawn(filth, position, map, WipeMode.Vanish); } } catch (Exception ex) { Log.Error("6.5 Error in map generating, cant spawn " + filth + " - " + ex); } } } if (plants != null && plants.Count > 0) { foreach (var plant in plants) { try { var position = GetOffsetPosition(locationDef, plant.Position, offset); if (position.InBounds(map) && map.fertilityGrid.FertilityAt(position) >= plant.def.plant.fertilityMin) { GenSpawn.Spawn(plant, position, map, WipeMode.Vanish); } } catch (Exception ex) { Log.Error("6 Error in map generating, cant spawn " + plant + " - " + ex); } } } var containers = map.listerThings.AllThings.Where(x => x is Building_Storage).ToList(); if (things != null && things.Count > 0) { foreach (var thing in things) { try { var position = GetOffsetPosition(locationDef, thing.Position, offset); if (position.InBounds(map)) { GenSpawn.Spawn(thing, position, map, WipeMode.Vanish); if (locationDef != null && locationDef.moveThingsToShelves) { TryDistributeTo(thing, map, containers, faction != Faction.OfPlayer); } } } catch (Exception ex) { Log.Error("7 Error in map generating, cant spawn " + thing + " - " + ex); } } } if (locationDef != null && locationDef.moveThingsToShelves) { foreach (var item in map.listerThings.AllThings) { if (item.IsForbidden(Faction.OfPlayer)) { TryDistributeTo(item, map, containers, faction != Faction.OfPlayer); } } } if (terrains != null && terrains.Count > 0) { foreach (var terrain in terrains) { try { var position = GetOffsetPosition(locationDef, terrain.Key, offset); if (GenGrid.InBounds(position, map)) { map.terrainGrid.SetTerrain(position, terrain.Value); } } catch (Exception ex) { Log.Error("8 Error in map generating, cant spawn " + terrain.Key + " - " + ex); } } } if (roofs != null && roofs.Count > 0) { foreach (var roof in roofs) { try { var position = GetOffsetPosition(locationDef, roof.Key, offset); if (GenGrid.InBounds(position, map)) { map.roofGrid.SetRoof(position, roof.Value); } } catch (Exception ex) { Log.Error("9 Error in map generating, cant spawn " + roof.Key + " - " + ex); } } } if (locationDef != null && (locationDef.percentOfDamagedWalls.HasValue || locationDef.percentOfDestroyedWalls.HasValue) || locationDef.percentOfDamagedFurnitures.HasValue) { var walls = map.listerThings.AllThings.Where(x => x.def.IsEdifice() && x.def.defName.ToLower().Contains("wall")).ToList(); if (locationDef.percentOfDestroyedWalls.HasValue) { var percent = locationDef.percentOfDestroyedWalls.Value.RandomInRange * 100f; var countToTake = (int)((percent * walls.Count()) / 100f); var wallsToDestroy = walls.InRandomOrder().Take(countToTake).ToList(); for (int num = wallsToDestroy.Count - 1; num >= 0; num--) { walls.Remove(wallsToDestroy[num]); wallsToDestroy[num].DeSpawn(); } } if (locationDef.percentOfDamagedWalls.HasValue) { var percent = locationDef.percentOfDamagedWalls.Value.RandomInRange * 100f; var countToTake = (int)((percent * walls.Count()) / 100f); var wallsToDamage = walls.InRandomOrder().Take(countToTake).ToList(); for (int num = wallsToDamage.Count - 1; num >= 0; num--) { var damagePercent = Rand.Range(0.3f, 0.6f); var hitpointsToTake = (int)(wallsToDamage[num].MaxHitPoints * damagePercent); wallsToDamage[num].HitPoints = hitpointsToTake; } } if (locationDef.percentOfDamagedFurnitures.HasValue) { var furnitures = map.listerThings.AllThings.Where(x => !walls.Contains(x) && x.def.IsBuildingArtificial).ToList(); var percent = locationDef.percentOfDamagedFurnitures.Value.RandomInRange * 100f; var countToTake = (int)((percent * furnitures.Count()) / 100f); var furnituresToDamage = furnitures.InRandomOrder().Take(countToTake).ToList(); for (int num = furnituresToDamage.Count - 1; num >= 0; num--) { var damagePercent = Rand.Range(0.3f, 0.6f); var hitpointsToTake = (int)(furnituresToDamage[num].MaxHitPoints * damagePercent); furnituresToDamage[num].HitPoints = hitpointsToTake; } } } if (faction.def.HasModExtension <SettlementOptionModExtension>()) { var options = faction.def.GetModExtension <SettlementOptionModExtension>(); if (options.removeVanillaGeneratedPawns) { for (int i = map.mapPawns.PawnsInFaction(faction).Count - 1; i >= 0; i--) { map.mapPawns.PawnsInFaction(faction)[i].DeSpawn(DestroyMode.Vanish); } } if (options.pawnsToGenerate != null && options.pawnsToGenerate.Count > 0 && tilesToSpawnPawnsOnThem != null && tilesToSpawnPawnsOnThem.Count > 0) { foreach (var pawn in options.pawnsToGenerate) { foreach (var i in Enumerable.Range(1, (int)pawn.selectionWeight)) { var settler = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawn.kind, faction)); try { var pos = tilesToSpawnPawnsOnThem.Where(x => map.thingGrid.ThingsListAt(x) .Where(y => y is Building).Count() == 0).RandomElement(); GenSpawn.Spawn(settler, pos, map); } catch (Exception ex) { Log.Error("10 Error in map generating, cant spawn " + settler + " - " + ex); } } } } } foreach (var pawn in map.mapPawns.PawnsInFaction(faction)) { var lord = pawn.GetLord(); if (lord != null) { map.lordManager.RemoveLord(lord); } var lordJob = new LordJob_DefendBase(); if (tilesToSpawnPawnsOnThem != null && tilesToSpawnPawnsOnThem.Count > 0) { lordJob = new LordJob_DefendBase(faction, tilesToSpawnPawnsOnThem.RandomElement()); } else { lordJob = new LordJob_DefendBase(faction, pawn.Position); } LordMaker.MakeNewLord(faction, lordJob, map, null).AddPawn(pawn); } if (disableFog != true) { try { FloodFillerFog.DebugRefogMap(map); } catch { foreach (var cell in map.AllCells) { if (!tilesToProcess.Contains(cell) && !(cell.GetFirstBuilding(map) is Mineable)) { var item = cell.GetFirstItem(map); if (item != null) { var room = item.GetRoom(); if (room != null) { if (room.PsychologicallyOutdoors) { FloodFillerFog.FloodUnfog(cell, map); } } } } } } mapComp.reFog = true; } mapComp.doGeneration = false; mapComp.path = null; GetOrGenerateMapPatch.caravanArrival = false; return(tilesToSpawnPawnsOnThem.Select(x => GetOffsetPosition(locationDef, x, offset)).ToHashSet()); } catch (Exception ex) { Log.Error("Error in DoSettlementGeneration: " + ex); } mapComp.doGeneration = false; mapComp.path = null; return(null); }