public override void Generate(Map map, GenStepParams parms) { var s = new Stencil(map); s = s.Bound(s.MinX, s.MaxZ - Mathf.RoundToInt(map.Size.x * HeightRatio), s.MaxX, s.MaxZ) .Center(); // Clear area s.Expand(0, 3, 0, 0).ClearThingsInBounds(); // Courtyard floor s.FillTerrain(BaseGenUtility.RandomHightechFloorDef()); // Outer floor s.Bound(0, s.MinZ - 1, 0, s.MinZ - 8).SetTerrain(GenCity.RandomFloor(map)); // Outer barricade s.Fill(s.MinX, s.MinZ - 7, s.MaxX, s.MinZ - 7, ThingDefOf.Barricade, GenCity.RandomStuff(ThingDefOf.Barricade, map), IsValidBarricadeTile); // Outer wall var wallStuff = BaseGenUtility.RandomHightechWallStuff(); var doorX = s.MinX + map.Size.x / 2; s.Fill(s.MinX, s.MinZ - 3, doorX - 1, s.MinZ, ThingDefOf.Wall, wallStuff); s.Fill(doorX + 1, s.MinZ - 3, s.MaxX, s.MinZ, ThingDefOf.Wall, wallStuff); s.Bound(doorX, s.MinZ - 3, doorX, s.MinZ) .Fill(ThingDefOf.Door, wallStuff); // Inner keep s = s.Expand(-marginRange.RandomInRange, -marginRange.RandomInRange, -marginRange.RandomInRange, -marginRange.RandomInRange); var genStep = (GenStep_Buildings)buildingGenStepDef.genStep; genStep.GenerateRect(s); // Mechanoids var mechs = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms { groupKind = PawnGroupKindDefOf.Combat, tile = map.Tile, faction = Faction.OfMechanoids, points = 5000, }).ToList(); foreach (var mech in mechs) { var pos = s.Expand(-10).MoveRand().pos; GenSpawn.Spawn(mech, GenCity.FindPawnSpot(pos, map), map); mech.SetFactionDirect(map.ParentFaction); mech.Name = new NameSingle(mechanoidNames[Rand.Range(0, mechanoidNames.Count)] + " #" + Rand.RangeInclusive(10, 40)); var lord = LordMaker.MakeNewLord(map.ParentFaction, new LordJob_LiveInCitadel(pos), map); lord.AddPawn(mech); } //TODO throne room }
void GenRooms(Stencil s, bool parentWall) { s = s.Center(); var room = roomDecorators.RandomElementByWeight(r => r.weight / r.maxArea); if (s.Area > room.maxArea) { if (s.Width < s.Height) { s = s.Rotate(1 + s.RandInclusive(0, 1) * 2); } var wallX = Mathf.RoundToInt(s.RandX * .3F); var hasWall = s.Chance(wallChance); var doorZ = 0; // default unused if (hasWall) { var wallStuff = RandomWallStuff(s.map); if (parentWall) { var offset = s.RandInclusive(0, 2) + 1; doorZ = s.Chance(.5F) ? s.MinZ + offset : s.MaxZ - offset; var minZ = s.MinZ + 1; var maxZ = s.MaxZ - 1; for (var z = minZ; z <= maxZ; z++) { if (z != doorZ) { s.Spawn(wallX, z, ThingDefOf.Wall, wallStuff); } } // TODO dry } else { s.Fill(wallX, s.MinZ + 1, wallX, s.MaxZ - 1, ThingDefOf.Wall, RandomWallStuff(s.map)); } } var left = s.Bound(s.MinX, s.MinZ, wallX, s.MaxZ); var right = s.Bound(wallX, s.MinZ, s.MaxX, s.MaxZ); GenRooms(left, hasWall); GenRooms(right, hasWall); if (hasWall && parentWall) { s.Spawn(wallX, doorZ, ThingDefOf.Door, RandomWallStuff(s.map)); } } else { var sInterior = s.Expand(-1); sInterior.ClearThingsInBounds(); s.FillTerrain(RandomFloor(s.map)); if (room.roofed) { s.FillRoof(RoofDefOf.RoofConstructed); } if (s.Chance(room.lightChance)) { var sLamp = s.Expand(-1).MoveRand(); sLamp.Spawn(ThingDefOf.StandingLamp); } try { room.Decorate(sInterior); } catch { Log.Error("Error occurred in room decorator type: " + room.GetType().Name); throw; } } }