public override void LordToilTick() { base.LordToilTick(); // Check if everything is setup if (this.lord.ticksInToil % 919 == 0) { if (!(from frame in this.Frames where !frame.DestroyedOrNull() select frame).Any()) { LordToilData_SetupCarnival data = (LordToilData_SetupCarnival)this.data; if (!(from blue in data.blueprints where !blue.DestroyedOrNull() select blue).Any()) { bool anyBuildings = false; foreach (Building building in from b in base.Map.listerThings.ThingsInGroup(ThingRequestGroup.BuildingArtificial) where b.Faction == this.lord.faction select b) { anyBuildings = true; // Add buildings to CarnivalInfo if (building is Building_Carn) { Info.AddBuilding(building); } } if (anyBuildings) { Info.guardPositions.Add(Info.AverageLodgeTentPos); // Buildings are there. Next toil. if (Info.CanEntertainNow) { lord.ReceiveMemo("SetupDoneEntertain"); } else { // rest the carnival lord.ReceiveMemo("SetupDoneRest"); } return; } else { // No frames, blueprints, OR buildings // Nothing is buildable. Was the carnival attacked? lord.ReceiveMemo("NoBuildings"); Log.Error("[Carnivale] LordToil_SetupCarnival found no frames, blueprints, or buildings after " + lord.ticksInToil + " ticks."); return; } } } } // End check }
public override void Cleanup() { // Do more cleanup here? LordToilData_SetupCarnival data = (LordToilData_SetupCarnival)this.data; if (!lord.ownedPawns.Any(p => p.Spawned)) { foreach (var thing in data.availableCrates.Concat(data.blueprints.Select(b => b as Thing))) { thing.Destroy(); } } data.availableCrates.RemoveAll(c => c.DestroyedOrNull() || !c.Spawned); data.blueprints.RemoveAll(c => c.DestroyedOrNull() || !c.Spawned); Info.RecalculateCheckForCells(); ForbidWoodInArea(); }
// OVERRIDE METHODS // public override void Init() { base.Init(); LordToilData_SetupCarnival data = (LordToilData_SetupCarnival)this.data; // Give em a wood for trash sign var log = ThingMaker.MakeThing(ThingDefOf.WoodLog); log.stackCount = 1; GenPlace.TryPlaceThing(log, Info.setupCentre, Map, ThingPlaceMode.Near); // Give chapiteau if (data.TryHaveWorkerCarry(_DefOf.Carn_Crate_TentHuge, 1, CarnUtils.RandomFabricByCheapness()) != 1) { Log.Error("[Carnivale] Could not give " + _DefOf.Carn_Crate_TentHuge + " to carnies of faction " + lord.faction + ". It will not be built."); } // Give lodging tents (currently 8 carnies per lodging tent) int numCarnies = this.lord.ownedPawns.Count - Info.pawnsWithRole[CarnivalRole.Carrier].Count; int numBedTents = numCarnies > 9 ? Mathf.CeilToInt(numCarnies / 8f) : 1; if (data.TryHaveWorkerCarry(_DefOf.Carn_Crate_TentLodge, numBedTents, CarnUtils.RandomFabricByCheapness()) != numBedTents) { Log.Error("[Carnivale] Could not give enough " + _DefOf.Carn_Crate_TentLodge + " to carnies of faction " + lord.faction + ". Some will not be built."); } if (Info.pawnsWithRole[CarnivalRole.Manager].Any()) { if (data.TryHaveWorkerCarry(_DefOf.Carn_Crate_TentMan, 1, CarnUtils.RandomFabricByExpensiveness()) != 1) { Log.Error("[Carnivale] Could not give " + _DefOf.Carn_Crate_TentMan + " to carnies of faction " + lord.faction + ". It will not be built."); } } // Give vendor stalls + entry sign int numStallCrates = Info.pawnsWithRole[CarnivalRole.Vendor].Count + _DefOf.Carn_SignEntry.costList.First().count; data.TryHaveWorkerCarry(_DefOf.Carn_Crate_Stall, numStallCrates, ThingDefOf.WoodLog); // Give game stalls data.TryHaveWorkerCarry(_DefOf.Carn_Crate_GameHighStriker, 1, ThingDefOf.WoodLog); // Place blueprints foreach (Blueprint bp in AIBlueprintsUtility.PlaceCarnivalBlueprints(Info)) { data.blueprints.Add(bp); } // Find spots for carriers to chill + a guard spot var guardSpot = GetCarrierSpots().Average(); // Assign guard spot at carriers Pawn guard = Info.GetBestGuard(); if (guard != null) { //Info.rememberedPositions.Add(guard, guardSpot); Info.guardPositions.Add(guardSpot); // if can feed animals, give em kibble if (!guard.story.WorkTypeIsDisabled(WorkTypeDefOf.Handling)) { Thing kib = ThingMaker.MakeThing(ThingDefOf.Kibble); kib.stackCount = 75; guard.inventory.TryAddItemNotForSale(kib); } } }