Пример #1
0
        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
        }
Пример #2
0
        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();
        }
Пример #3
0
        // 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);
                }
            }
        }