Esempio n. 1
0
        public override void GenerateRect(Stencil s)
        {
            if (!Config_Cities.Instance.enableTurrets)
            {
                return;
            }
            var stuff = GenCity.RandomStuff(ThingDefOf.Sandbags, s.map);

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);
                for (var x = sDir.MinX; x <= sDir.MaxX; x++)
                {
                    if (x <= sDir.MinX / 2 || x >= sDir.MaxX / 2)
                    {
                        sDir.Spawn(x, sDir.MaxZ, ThingDefOf.Sandbags, stuff);
                    }
                }
            }

            var emplacementOption = options
                                    .Where(opt => {
                if (opt.selfDestructive)
                {
                    return(Config_Cities.Instance.enableMortars && (s.map.ParentFaction.def.permanentEnemy || s.map.Parent is Citadel));
                }
                return(Config_Cities.Instance.enableTurrets);
            })
                                    .RandomElementByWeight(opt => opt.weight);

            emplacementOption?.Generate(s);
        }
        public override void Decorate(Stencil s)
        {
            var floorStuff  = GenCity.RandomFloor(s.map);
            var columnStuff = GenCity.RandomStuff(ThingDefOf.Column, s.map);
            var distance    = distanceRange.RandomInRange;

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);
                sDir = sDir.Bound(sDir.MinX, sDir.MaxZ + 1, sDir.MaxX, sDir.MaxZ + distance);
                if (dir % 2 == 0)
                {
                    sDir = sDir.Expand(distance, 0, distance, 0);
                }

                var spacing = columnSpacingRange.RandomInRange;
                for (var x = sDir.MinX + Rand.Range(0, spacing); x <= sDir.MaxX; x += spacing)
                {
                    var sCol = sDir.Move(x, sDir.MaxZ);
                    if (sCol.IsInMap() && IsValidTile(s.map, sCol.pos))
                    {
                        sCol.Spawn(ThingDefOf.Column, columnStuff);
                    }
                }

                sDir.FillRoof(RoofDefOf.RoofConstructed)
                .FillTerrain(floorStuff, IsValidTile);
            }
        }
Esempio n. 3
0
        protected override void ScatterAt(IntVec3 pos, Map map, GenStepParams parms, int count)
        {
            var s = new Stencil(map);

            s = s.BoundTo(CellRect.FromLimits(pos, s.bounds.RandomCell));
            var stuff = GenCity.RandomWallStuff(map);

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);
                sDir.Fill(sDir.MinX, sDir.MaxZ, sDir.MaxX, sDir.MaxZ, ThingDefOf.Wall, stuff, IsValidTile);
            }
        }
Esempio n. 4
0
        public override void Decorate(Stencil s)
        {
            Stencil.Mask mask = p => TerrainUtility.IsNatural(p.GetTerrain(s.map));

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);
                sDir.Bound(sDir.MinX - distance, sDir.MaxZ + distance, sDir.MinX / 2, sDir.MaxZ + distance)
                .Fill(ThingDefOf.Sandbags, mask: mask);
                sDir.Bound(sDir.MaxX / 2, sDir.MaxZ + distance, sDir.MaxX + distance, sDir.MaxZ + distance)
                .Fill(ThingDefOf.Sandbags, mask: mask);
            }
        }
Esempio n. 5
0
        public override void GenerateRect(Stencil s)
        {
            s.FillTerrain(GenCity.RandomFloor(s.map));
            var pawn = (Pawn)null;

            if (!s.map.ParentFaction.HostileTo(Faction.OfPlayer))
            {
                pawn = GenCity.SpawnInhabitant(s.Coords(s.RandX / 2, s.RandZ / 2), s.map);
                var traderKind = DefDatabase <TraderKindDef> .AllDefs.RandomElement();

                pawn.mindState.wantsToTradeWithColony = true;
                PawnComponentsUtility.AddAndRemoveDynamicComponents(pawn, true);
                pawn.trader.traderKind = traderKind;
                pawn.inventory.DestroyAll();
                var parms = new ThingSetMakerParams {
                    traderDef     = traderKind,
                    tile          = s.map.Tile,
                    makingFaction = s.map.ParentFaction,
                };
                foreach (var item in ThingSetMakerDefOf.TraderStock.root.Generate(parms))
                {
                    if (!(item is Pawn) && !pawn.inventory.innerContainer.TryAdd(item))
                    {
                        item.Destroy();
                    }
                }

                PawnInventoryGenerator.GiveRandomFood(pawn);
            }

            for (var dir = 0; dir < 4; dir++)
            {
                if (s.Chance(standChance))
                {
                    var sStand = s.Rotate(dir).Move(Mathf.RoundToInt(s.RandX / 2F), s.MaxZ - s.RandInclusive(0, 2)).Bound(-1, 0, 1, 0);
                    sStand.FillTerrain(GenCity.RandomFloor(s.map, true));
                    var wallStuff = GenCity.RandomWallStuff(s.map);
                    sStand.Spawn(sStand.MinX - 1, 0, ThingDefOf.Wall, wallStuff);
                    sStand.Spawn(sStand.MaxX + 1, 0, ThingDefOf.Wall, wallStuff);
                    sStand.Expand(1).FillRoof(RoofDefOf.RoofConstructed);
                    // if (pawn != null) {
                    //     var itemPos = sStand.Coords(sStand.RandX, sStand.RandZ);
                    //     var item = pawn.inventory.innerContainer.FirstOrDefault();
                    //     if (item != null) {
                    //         pawn.inventory.innerContainer.TryDrop(item, itemPos, s.map, ThingPlaceMode.Direct, out var result);
                    //         item.SetOwnedByCity(true, s.map);
                    //     }
                    // }
                }
            }
        }
Esempio n. 6
0
        public override void Decorate(Stencil s)
        {
            var thing = Rand.Chance(barricadeChance) ? ThingDefOf.Barricade : ThingDefOf.Sandbags;
            var stuff = GenCity.RandomStuff(thing, s.map);

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);
                sDir.Bound(sDir.MinX - distance, sDir.MaxZ + distance, sDir.MinX / 2, sDir.MaxZ + distance)
                .Fill(thing, stuff, mask: IsValidTile);
                sDir.Bound(sDir.MaxX / 2, sDir.MaxZ + distance, sDir.MaxX + distance, sDir.MaxZ + distance)
                .Fill(thing, stuff, mask: IsValidTile);
            }
        }
Esempio n. 7
0
        public override void Decorate(Stencil s)
        {
            var stuff    = GenCity.RandomStuff(ThingDefOf.Bed, s.map);
            var sDresser = s.Rotate(s.RandInclusive(0, 1) * 2);

            sDresser.Spawn(s.RandInclusive(sDresser.MinX + 1, sDresser.MaxX - 1), sDresser.MinZ + 1, DefDatabase <ThingDef> .GetNamed("Dresser"), stuff);
            var bedX = s.RandX;

            s.Spawn(bedX, s.MinZ, DefDatabase <ThingDef> .GetNamed("EndTable"), stuff);
            var bed = (Building_Bed)s.Spawn(bedX, s.MinZ + 1, ThingDefOf.Bed, stuff);

            bed.SetFactionDirect(s.map.ParentFaction);
            var pawn = GenCity.SpawnInhabitant(s.Chance(pawnInBedroomChance) ? s.pos : s.MapBounds.RandomCell, s.map, null, randomWorkSpot: true);

            bed.CompAssignableToPawn.TryAssignPawn(pawn);
        }
        public override void GenerateRect(Stencil s)
        {
            GenRooms(s, true);

            var wallStuff = RandomWallStuff(s.map);
            var doorStuff = RandomWallStuff(s.map);
            var hasDoor   = false;

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);

                var doorHere = !hasDoor || s.Chance(doorChance);
                if (doorHere)
                {
                    hasDoor = true;
                    var offset = sDir.RandInclusive(0, 2) + 2;
                    var doorZ  = sDir.Chance(.5F) ? sDir.MinZ + offset : sDir.MaxZ - offset;
                    for (var z = sDir.MinZ; z < sDir.MaxZ; z++)
                    {
                        if (z != doorZ)
                        {
                            sDir.Spawn(sDir.MaxX, z, ThingDefOf.Wall, doorStuff);
                        }
                        else
                        {
                            sDir.Move(sDir.MaxX + 1, z).ClearBuildingsAtPos();
                            sDir.Spawn(sDir.MaxX, z, ThingDefOf.Door, wallStuff);
                        }
                    }
                }
                else
                {
                    sDir.Fill(sDir.MaxX, sDir.MinZ, sDir.MaxX, sDir.MaxZ - 1, ThingDefOf.Wall, wallStuff);
                }
            }

            if (buildingDecorators.Count > 0)
            {
                buildingDecorators.RandomElement().Decorate(s);
            }

            // s.FillFog();
            s.Expand(1).BorderTerrain(GenCity.RandomFloor(s.map), IsValidTile);
        }
        public override void GenerateRect(Stencil s)
        {
            var stuff = GenCity.RandomStuff(ThingDefOf.Sandbags, s.map);

            for (var dir = 0; dir < 4; dir++)
            {
                var sDir = s.Rotate(dir);
                for (var x = sDir.MinX; x <= sDir.MaxX; x++)
                {
                    if (x <= sDir.MinX / 2 || x >= sDir.MaxX / 2)
                    {
                        sDir.Spawn(x, sDir.MaxZ, ThingDefOf.Sandbags, stuff);
                    }
                }
            }

            options.Where(opt => !opt.selfDestructive || s.map.ParentFaction.def.permanentEnemy || s.map.Parent is Citadel)
            .RandomElementByWeight(opt => opt.weight).Generate(s);
        }
Esempio n. 10
0
        public override void Generate(Map map, GenStepParams parms)
        {
            var roadTerrain     = roadTerrains.RandomElement();
            var divTerrain      = divTerrains.RandomElement();
            var sidewalkTerrain = sidewalkTerrains.RandomElement();

            var radius = centerRadius.RandomInRange;

            var s = new Stencil(map);

            s = s.MoveTo(s.Expand(-radius - 2).bounds.RandomCell);

            s.Bound(-radius, -radius, radius, radius)
            .ClearThingsInBounds()
            .FillTerrain(sidewalkTerrains.RandomElement());

            s.FillTerrain(-2, -2, 2, 2, roadTerrain);

            for (var dir = 0; dir < 4; dir++)
            {
                GenMainRoad(s.Rotate(dir).Move(0, 3), roadTerrain, divTerrain, sidewalkTerrain);
            }
        }
Esempio n. 11
0
        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;
                }
            }
        }