示例#1
0
        private static IEnumerable <Blueprint> PlaceGameBlueprints()
        {
            var gameMasters = stallUsers.Where(p => p.TraderKind == null).ToList();
            var gameCrates  = availableCrates.ListFullCopy().Where(c => c.def.entityDefToBuild != null);

            var points = new IntVec3[]
            {
                info.setupCentre,
                info.bannerCell
            };

            var gameSpot = CellRect.CenteredOn(points.Average(), 7).FurthestCellFrom(info.carnivalArea.EdgeCells.RandomElement());

            ThingDef gameDef;
            int      i = 0;

            foreach (var crate in gameCrates)
            {
                gameDef = (ThingDef)crate.def.entityDefToBuild;

                gameSpot = FindRadialPlacementFor(gameDef, default(Rot4), gameSpot, 20);

                if (gameSpot.IsValid)
                {
                    RemoveFirstCrateOf(crate.def);
                    CarnUtils.ClearThingsFor(info.map, gameSpot, gameDef.size, default(Rot4), 2);

                    if (i < gameMasters.Count)
                    {
                        IntVec3 gameMasterSpot = gameSpot + gameDef.interactionCellOffset + new IntVec3(-1, 0, 1);
                        info.rememberedPositions.Add(gameMasters[i++], gameMasterSpot);
                    }

                    yield return(PlaceBlueprint(gameDef, gameSpot));
                }
                else
                {
                    Log.Error("Found no place for " + gameDef + ". It will not be built.");
                }
            }
        }
示例#2
0
        private static IEnumerable <Blueprint> PlaceStallBlueprints()
        {
            ThingDef stallDef  = _DefOf.Carn_StallFood;
            IntVec3  stallSpot = IntVec3.Invalid;
            Rot4     rot       = default(Rot4);

            foreach (Pawn stallUser in stallUsers.Where(p => p.TraderKind != null))
            {
                // Handle different kinds of vendor stalls

                if (stallUser.TraderKind == _DefOf.Carn_Trader_Food)
                {
                    stallDef = _DefOf.Carn_StallFood;
                }
                else if (stallUser.TraderKind == _DefOf.Carn_Trader_Surplus)
                {
                    stallDef = _DefOf.Carn_StallSurplus;
                }
                else if (stallUser.TraderKind == _DefOf.Carn_Trader_Curios)
                {
                    stallDef = _DefOf.Carn_StallCurios;
                }
                else
                {
                    Log.Error("Trader " + stallUser.NameStringShort + " is not a carnival vendor and will get no stall.");
                    continue;
                }



                if (stallSpot.IsValid)
                {
                    if (Rand.Chance(0.8f))
                    {
                        // Next spot should be close to last spot
                        stallSpot = FindRadialCardinalPlacementFor(stallDef, rot, stallSpot, 10);
                    }
                    else
                    {
                        // Next spot should be random
                        IntVec3[] points = new IntVec3[]
                        {
                            stallSpot,
                            stallSpot,
                            info.carnivalArea.EdgeCells.RandomElement()
                        };

                        stallSpot = FindRadialPlacementFor(stallDef, rot, points.Average(), 10);
                    }
                }
                else
                {
                    IntVec3[] points = new IntVec3[]
                    {
                        info.setupCentre,
                        info.bannerCell
                    };

                    stallSpot = FindRadialPlacementFor(stallDef, rot, points.Average(), 10);
                }


                // Finally, spawn the f*cker
                if (stallSpot.IsValid)
                {
                    RemoveFirstCrateOf(_DefOf.Carn_Crate_Stall);
                    CarnUtils.ClearThingsFor(info.map, stallSpot, stallDef.size, rot, 2);
                    // Add spot to stall user's spot
                    info.rememberedPositions.Add(stallUser, stallSpot);
                    yield return(PlaceBlueprint(stallDef, stallSpot, rot));
                }
            }
        }