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."); } } }
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)); } } }