void GenMainRoad(Stencil s, TerrainDef roadTerrain, TerrainDef divTerrain, TerrainDef sidewalkTerrain)
        {
            s.Bound(-3, 0, 3, s.MaxZ)
            .BorderTerrain(sidewalkTerrain, (m, p) => IsValidSidewalkTerrain(p.GetTerrain(m)));
            s.Bound(-2, 0, 2, s.MaxZ)
            .ClearThingsInBounds()
            .FillTerrain(roadTerrain);
            var s1 = s;

            s.Bound(-4, 0, 4, s.MaxZ)
            .BorderTerrain(TerrainUtility.Bridge, (m, p) => p.GetTerrain(m).IsWater);
            s.FillTerrain(0, 0, 0, s.MaxZ, divTerrain);
            s = s.Move(0, roadSpacing.RandomInRange);
            while (s.Expand(-2).IsInBounds())
            {
                if (s.Chance(roadChance))
                {
                    GenSideRoad(s.Left().Move(0, 3), roadTerrain, sidewalkTerrain);
                }

                if (s.Chance(roadChance))
                {
                    GenSideRoad(s.Right().Move(0, 3), roadTerrain, sidewalkTerrain);
                }

                s = s.Move(0, roadSpacing.RandomInRange);
            }
        }
        public override void Decorate(Stencil s)
        {
            var sBed  = s.Expand(-1);
            var thing = bedOptions.RandomElement();
            var stuff = GenCity.RandomStuff(thing, s.map);
            var bed   = (Building_Bed)sBed.Spawn(sBed.RandX, sBed.RandZ, thing, stuff);

            bed.SetFactionDirect(s.map.ParentFaction);
            bed.ForPrisoners = true;
            if (s.Chance(prisonerChance))
            {
                var pawn = GenCity.SpawnInhabitant(s.pos, s.map, kind: PawnKindDefOf.Slave);
                if (pawn.guest == null)
                {
                    pawn.guest = new Pawn_GuestTracker(pawn);
                }
                if (pawn.skills == null)
                {
                    pawn.skills = new Pawn_SkillTracker(pawn);
                }
                if (pawn.Faction.HostileTo(s.map.ParentFaction))
                {
                    pawn.equipment.DestroyAllEquipment();
                    pawn.guest.SetGuestStatus(s.map.ParentFaction, GuestStatus.Prisoner);
                }
            }
        }
Exemple #3
0
        public override void Decorate(Stencil s)
        {
            s.Bound(s.RandInclusive(s.MinX, s.MinX / 2) - 1, s.RandInclusive(s.MinZ, s.MinZ / 2) - 1, s.RandInclusive(s.MaxX / 2, s.MaxX) + 1, s.RandInclusive(s.MaxZ / 2, s.MaxZ) + 1)
            .FillTerrain(GenCity.RandomFloor(s.map, true));

            var def   = options.RandomElement();
            var thing = s.Spawn(def, GenCity.RandomStuff(def, s.map));

            if (chairDensity > 0)
            {
                var chairDef   = chairOptions.RandomElement();
                var chairStuff = GenCity.RandomStuff(chairDef, s.map);
                var sThing     = s.BoundTo(thing.OccupiedRect());
                for (var dir = 0; dir < 4; dir++)
                {
                    var sDir = sThing.Rotate(dir);
                    for (var x = sDir.MinX; x <= sDir.MaxX; x++)
                    {
                        if (s.Chance(chairDensity))
                        {
                            SpawnChair(sDir.Move(x, sDir.MinZ - 1), chairDef, chairStuff);
                        }
                    }
                }
            }
            else if (thing.def.hasInteractionCell && chairOptions.Count > 0)
            {
                var chairDef   = chairOptions.RandomElement();
                var chairStuff = GenCity.RandomStuff(chairDef, s.map);
                SpawnChair(s.MoveTo(thing.InteractionCell), chairDef, chairStuff);
            }
        }
Exemple #4
0
 private void SpawnChair(Stencil s, ThingDef thing, ThingDef stuff)
 {
     s.Spawn(thing, stuff);
     if (s.Chance(chairPawnChance))
     {
         GenCity.SpawnInhabitant(s.pos, s.map);
     }
 }
 void SpawnChair(Stencil s, ThingDef thing, ThingDef stuff)
 {
     if (s.Check(IsValidChairTile))
     {
         s.Spawn(thing, stuff);
     }
     if (s.Chance(chairPawnChance) && s.IsInMap())
     {
         GenCity.SpawnInhabitant(s.pos, s.map);
     }
 }
        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);
                    //     }
                    // }
                }
            }
        }
        public override void GenerateRect(Stencil s)
        {
            var plant = DefDatabase <ThingDef> .AllDefs
                        .Where(t => t.category == ThingCategory.Plant && t.altitudeLayer == altitudeLayer && !t.plant.cavePlant && t != ThingDefOf.Plant_TreeAnima)
                        .RandomElement();

            foreach (var pos in s.bounds.Cells)
            {
                if (s.Chance(density) && pos.GetFirstThing <Thing>(s.map) == null)
                {
                    GenSpawn.Spawn(plant, pos, s.map);
                }
            }
        }
Exemple #8
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);
        }
Exemple #9
0
        public override void Decorate(Stencil s)
        {
            var sBed  = s.Expand(-1);
            var thing = bedOptions.RandomElement();
            var stuff = GenCity.RandomStuff(thing, s.map);
            var bed   = (Building_Bed)sBed.Spawn(sBed.RandX, sBed.RandZ, thing, stuff);

            bed.SetFactionDirect(s.map.ParentFaction);
            bed.ForPrisoners = true;
            if (s.Chance(prisonerChance))
            {
                var pawn = GenCity.SpawnInhabitant(s.pos, s.map);
                pawn.guest.SetGuestStatus(s.map.ParentFaction, true);
                bed.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 Decorate(Stencil s)
        {
            var generators = stockGenerators.Count > 0
                ? stockGenerators
                : (traderKinds.RandomElementWithFallback()
                   ?? DefDatabase <TraderKindDef> .AllDefs.Where(t => t.stockGenerators.Count > 0).RandomElement()).stockGenerators;

            // var friendly = !s.map.ParentFaction.HostileTo(Faction.OfPlayer);
            foreach (var pos in s.bounds.Cells)
            {
                if (s.Chance(density * Config_Cities.Instance.lootScale))
                {
                    var thing = generators.RandomElement().GenerateThings(s.map.Tile).FirstOrDefault();
                    if (thing != null)
                    {
                        if (thing.stackCount > thing.def.stackLimit)
                        {
                            thing.stackCount = s.RandInclusive(1, thing.def.stackLimit);
                        }
                        thing = thing.TryMakeMinified();
                        GenSpawn.Spawn(thing, pos, s.map);
                        if (thing is Pawn pawn && pawn.Faction != null)
                        {
                            if (pawn.guest == null)
                            {
                                pawn.guest = new Pawn_GuestTracker(pawn);
                            }
                            if (pawn.skills == null)
                            {
                                pawn.skills = new Pawn_SkillTracker(pawn);
                            }
                            if (pawn.Faction.HostileTo(s.map.ParentFaction))
                            {
                                pawn.guest.SetGuestStatus(s.map.ParentFaction, GuestStatus.Prisoner);
                            }
                        }
                        else
                        {
                            thing.SetOwnedByCity(true, s.map);
                        }
                    }
                }
            }
Exemple #12
0
        public override void Decorate(Stencil s)
        {
            var generators = stockGenerators.Count > 0 ? stockGenerators :
                             (traderKinds.RandomElementWithFallback()
                              ?? DefDatabase <TraderKindDef> .AllDefs.Where(t => t.stockGenerators.Count > 0).RandomElement()).stockGenerators;

            var friendly = !s.map.ParentFaction.HostileTo(Faction.OfPlayer);

            foreach (IntVec3 pos in s.bounds.Cells)
            {
                if (s.Chance(density))
                {
                    var thing = generators.RandomElement().GenerateThings(s.map.Tile).FirstOrDefault();
                    if (thing != null)
                    {
                        if (thing.stackCount > thing.def.stackLimit)
                        {
                            thing.stackCount = s.RandInclusive(1, thing.def.stackLimit);
                        }
                        GenSpawn.Spawn(thing, pos, s.map);
                        if (thing is Pawn pawn)
                        {
                            if (pawn.guest == null)
                            {
                                pawn.guest = new Pawn_GuestTracker(pawn);
                            }
                            pawn.guest.SetGuestStatus(s.map.ParentFaction, true);
                        }
                        else
                        {
                            thing.SetOwnedByCity(true);
                        }
                    }
                }
            }
        }
        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;
                }
            }
        }