コード例 #1
0
        public static void Postfix(ref Zone_Growing __instance, ref string __result)
        {
            var   plantDef = __instance.GetPlantDefToGrow();
            var   thePlant = plantDef.plant;
            int   totalYield = 0, maxYield = 0, num = 0, numGrowing = 0;
            float totalGrowthRemaining = 0f;


            foreach (Thing thing in __instance.AllContainedThings)
            {
                if (thing.def == plantDef && thing is Plant plant)
                {
                    ++num;
                    totalYield += plant.YieldNow();
                    if (plant.Growth < 0.95f && !plant.YIResting() && plant.GrowthRateFactor_Light > .001f)
                    {
                        ++numGrowing;
                        totalGrowthRemaining += plant.YIActualGrowthTime();
                    }
                }
            }

            maxYield = (int)thePlant.harvestYield;
            float efficiency = maxYield / thePlant.growDays;

            __result += "\n" + "YI.InspectYields".Translate(new object[] { totalYield.ToString(), (maxYield * num).ToString() });
            __result += "\n" + "YI.Efficiency".Translate(efficiency.ToString("0.##"));

            // If is resting period, we dont show the line.
            if (GenLocalDate.DayPercent(__instance.Map) < 0.25f || GenLocalDate.DayPercent(__instance.Map) > 0.8f)
            {
                __result += "\n" + "YI.GrowthRemaining".Translate((totalGrowthRemaining / numGrowing).ToString("0.##"));
            }
        }
コード例 #2
0
        private static IEnumerable <Gizmo> AddGizmos(Zone_Growing __instance, IEnumerable <Gizmo> __result)
        {
            foreach (var gizmo in __result)
            {
                yield return(gizmo);
            }
            if (tw_YAAM.ConvertSoilAfterHarvest)
            {
                yield return new Command_Toggle
                       {
                           defaultLabel = "twYAAM_PlaceBlueprint_Title".Translate(),
                           defaultDesc  = "twYAAM_PlaceBlueprint_Description".Translate(),
                           icon         = ContentFinder <Texture2D> .Get("PlaceBlueprintUI"),
                           isActive     = () => tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Contains(__instance.label),
                           toggleAction = delegate  {
                               if (tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Contains(__instance.label))
                               {
                                   tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Remove(__instance.label);
                               }
                               else
                               {
                                   tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Add(__instance.label);
                               }
                           }
                       }
            }
            ;
            yield return(new Terrain_Action(__instance, TerrainDefOf.twSoilTilled));

            yield return(new Terrain_Action(__instance, TerrainDefOf.twSoilEnriched));

            yield return(new Terrain_Action(__instance, TerrainDefOf.twSoilFertilized));
        }
    }
コード例 #3
0
        private static void Postfix(Zone_Growing __instance, ref string __result)
        {
            var data = __instance.GetFarmingHysteresisData();

            var(harvestedThingDef, harvestedThingCount) = __instance.PlantHarvestInfo();
            if (data.Enabled)
            {
                if (harvestedThingDef == null)
                {
                    data.DisableDueToMissingHarvestedThingDef(__instance);
                    return;
                }

                var plant = __instance.GetPlantDefToGrow();
                __result += "\n" + "FarmingHysteresis.UseGlobalBounds".Translate(harvestedThingDef.label, data.useGlobalValues ? "Yes".Translate() : "No".Translate());
                __result += "\n" + "FarmingHysteresis.LowerBound".Translate(plant.label, data.LowerBound, harvestedThingDef.label);
                __result += "\n" + "FarmingHysteresis.UpperBound".Translate(plant.label, data.UpperBound, harvestedThingDef.label);
                __result += "\n" + "FarmingHysteresis.InStorage".Translate(harvestedThingDef.label, harvestedThingCount);
                __result += "\n" + "FarmingHysteresis.LatchModeDesc".Translate(("FarmingHysteresis.LatchModeDesc." + data.latchMode.ToString()).Translate());
            }
            else if (harvestedThingDef == null)
            {
                __result += "\n" + "FarmingHysteresis.DisabledDueToMissingHarvestedThingDef".Translate();
            }
        }
コード例 #4
0
        protected override Option <Thing> TargetThing()
        {
            Zone_Growing z = (this.Position + this.Rotation.Opposite.FacingCell)
                             .GetZone(this.Map) as Zone_Growing;

            if (z == null)
            {
                return(Nothing <Thing>());
            }
            if (this.takeForbiddenItems)
            {
                return(z.AllContainedThings
                       .Where(t => t.def.category == ThingCategory.Item)
                       .Where(t => this.settings.AllowedToAccept(t))
                       .Where(t => !this.IsLimit(t))
                       .FirstOption());
            }
            else
            {
                return(z.AllContainedThings
                       .Where(t => t.def.category == ThingCategory.Item)
                       .Where(t => !t.IsForbidden(Faction.OfPlayer))
                       .Where(t => this.settings.AllowedToAccept(t))
                       .Where(t => !this.IsLimit(t))
                       .FirstOption());
            }
        }
コード例 #5
0
        public override string GetInspectString()
        {
            string text = string.Empty;

            if (!base.Cells.NullOrEmpty <IntVec3>())
            {
                IntVec3 c = base.Cells.First <IntVec3>();
                if (c.UsesOutdoorTemperature(base.Map))
                {
                    string text2 = text;
                    text = string.Concat(new string[]
                    {
                        text2,
                        "OutdoorGrowingPeriod".Translate(),
                        ": ",
                        Zone_Growing.GrowingQuadrumsDescription(base.Map.Tile),
                        "\n"
                    });
                }
                if (PlantUtility.GrowthSeasonNow(c, base.Map, true))
                {
                    text += "GrowSeasonHereNow".Translate();
                }
                else
                {
                    text += "CannotGrowBadSeasonTemperature".Translate();
                }
            }
            return(text);
        }
コード例 #6
0
        private static void Postfix(ref Zone_Growing __instance)
        {
            var allowTill = TillToggle.IsAllowed(__instance);

            Scribe_Values.Look(ref allowTill, "allowTill", true);
            TillToggle.SetAllowed(__instance, allowTill);
        }
コード例 #7
0
 static void Prefix(Zone_Growing __instance)
 {
     if (tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Contains(__instance.label))
     {
         tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Remove(__instance.label);
     }
 }
コード例 #8
0
        private static void Postfix(ref Zone_Growing __instance)
        {
            var allowHarvest = Mod.IsAllowed(__instance);

            Scribe_Values.Look(ref allowHarvest, "allowHarvest", true);
            Mod.SetAllowed(__instance, allowHarvest);
        }
コード例 #9
0
        protected override void GetAffectedThings()
        {
            int curTick = Find.TickManager.TicksGame;

            if (lastTick + 10 > curTick)
            {
                return;
            }
            else
            {
                this.numAffectedZones = 0;
                foreach (Map map in Find.Maps)
                {
                    foreach (Zone z in map.zoneManager.AllZones)
                    {
                        if (z is Zone_Growing)
                        {
                            Zone_Growing zg = (Zone_Growing)z;
                            if (!zg.allowSow)
                            {
                                this.numAffectedZones++;
                            }
                        }
                    }
                }
                lastTick = curTick;
            }
        }
コード例 #10
0
        public static void Postfix(ref IEnumerable <Gizmo> __result, Zone_Growing __instance)
        {
            var list = __result.ToList();

            Priority priority = PriorityTracker.growingZonePriorities.TryGetValue(__instance, out PriorityIntHolder intp) ? (Priority)intp.Int : Priority.Normal;

            list.Add(new Command_GrowingPriority((int)priority)
            {
                defaultLabel = $"Priority {priority}",
                defaultDesc  = $"Set this growing zone's priority. Current priority = {priority}",
                icon         = TexCommand.ForbidOff,
                onChanged    = (x) => {
                    var p = PriorityTracker.growingZonePriorities;
                    if (p.ContainsKey(__instance))
                    {
                        p[__instance].Int = x;
                    }
                    else
                    {
                        p[__instance] = new PriorityIntHolder(x);
                    }
                }
            });

            __result = list;
        }
コード例 #11
0
        //public override IEnumerable<Gizmo> GetGizmos()
        static void Postfix(Zone_Growing __instance, ref IEnumerable <Gizmo> __result)
        {
            if (!Mod.settings.zoneHarvestableToggle)
            {
                return;
            }

            List <Gizmo> result = new List <Gizmo>(__result);

            Gizmo harvestGizmo = new Command_Toggle
            {
                defaultLabel = "TD.AllowHarvesting".Translate(),
                defaultDesc  = "TD.AllowHarvestingDesc".Translate(),
                icon         = ContentFinder <UnityEngine.Texture2D> .Get("UI/Designators/Harvest", true),
                isActive     = (() => __instance.CanHarvest()),
                toggleAction = delegate
                {
                    __instance.ToggleHarvest();
                }
            };

            result.Add(harvestGizmo);

            // make caller use the list
            __result = result.AsEnumerable();
        }
コード例 #12
0
        protected override Thing TargetThing()
        {
            Zone_Growing z = (this.Position + this.Rotation.Opposite.FacingCell)
                             .GetZone(this.Map) as Zone_Growing;
            Thing target;

            if (z == null)
            {
                return(null);
            }
            target = z.AllContainedThings
                     .Where(t => t.def.category == ThingCategory.Item)
                     .Where(t => !t.IsForbidden(Faction.OfPlayer) || this.takeForbiddenItems)
                     .Where(t => this.settings.AllowedToAccept(t))
                     .Where(t => !this.IsLimit(t)).FirstOrDefault <Thing>();

            if (target == null)
            {
                return(target);
            }
            if (this.takeSingleItems)
            {
                return(target.SplitOff(1));
            }
            // SplitOff ensures any item-removal effects happen:
            return(target.SplitOff(target.stackCount));
        }
コード例 #13
0
        public static void Postfix(ref IEnumerable <Gizmo> __result, Zone_Growing __instance)
        {
            var priority = PriorityTracker.growingZonePriorities.TryGetValue(__instance, out var intp)
                ? (Priority)intp.Int
                : Priority.Normal;

            __result = __result.Append(new Command_GrowingPriority(priority));
        }
コード例 #14
0
        static void Postfix(ref IEnumerable <Gizmo> __result, Zone_Growing __instance)
        {
            HarvestManager_MapComponent manager = __instance.Map.GetComponent <HarvestManager_MapComponent>();
            Gizmo setMode       = new Command_SetHarvestMode(__instance, manager);
            Gizmo setProportion = new Command_SetHarvestProportion(__instance, manager);

            __result = AppendGizmoToEnumerable(__result, setMode);
            __result = AppendGizmoToEnumerable(__result, setProportion);
        }
コード例 #15
0
        public static void Postfix(Zone_Growing __instance)
        {
            if (!PriorityTracker.growingZonePriorities.ContainsKey(__instance))
            {
                PriorityTracker.growingZonePriorities[__instance] = new PriorityIntHolder((int)Priority.Normal);
            }


            Scribe_Values.Look <int>(ref PriorityTracker.growingZonePriorities[__instance].Int, "growingPriority", (int)Priority.Normal, false);
        }
コード例 #16
0
 public static void SetPlantDefToGrow(Zone_Growing __instance, ThingDef plantDef)
 {
     if (Current.ProgramState == ProgramState.Playing)
     {
         foreach (IntVec3 c in __instance.cells)
         {
             PlantSowing_Cache.ReregisterObject(__instance.Map, c, WorkGiver_Grower_Patch.awaitingPlantCellsMapDict);
         }
     }
 }
コード例 #17
0
 public static void ToggleHarvest(this Zone_Growing zone)
 {
     if (zone.Map.GetComponent <MapComponent_ZoneForbidHarvest>().harvestForbidden.Contains(zone))
     {
         zone.Map.GetComponent <MapComponent_ZoneForbidHarvest>().harvestForbidden.Remove(zone);
     }
     else
     {
         zone.Map.GetComponent <MapComponent_ZoneForbidHarvest>().harvestForbidden.Add(zone);
     }
 }
コード例 #18
0
 public static void SetAllowed(Zone_Growing zone, bool allowed)
 {
     if (!allowed && IsAllowed(zone))
     {
         AllowedZones.Remove(zone);
     }
     else if (allowed && !IsAllowed(zone))
     {
         AllowedZones.Add(zone);
     }
 }
コード例 #19
0
 public void Clear()
 {
     zone = null;
     totalPlantedCount = 0;
     harvestablePlants.Clear();
     fullyGrownPlants.Clear();
     for (int i = 0; i < 101; i++)
     {
         growRatesAbsolute[i] = 0;
     }
 }
コード例 #20
0
 public static bool prefix(ThingDef plantDef, Zone_Growing __instance)
 {
     if (use_native)
     {
         return(true);
     }
     else
     {
         parrot(plantDef, __instance);
         return(false);
     }
 }
コード例 #21
0
 public static void parrot(ThingDef plantDef, Zone_Growing inst)
 {
     use_native = true;
     try
     {
         inst.SetPlantDefToGrow(plantDef);
     }
     finally
     {
         use_native = false;
     }
 }
コード例 #22
0
        internal static (ThingDef, int) PlantHarvestInfo(this Zone_Growing zone)
        {
            var harvestedThingDef = zone.GetPlantDefToGrow().plant.harvestedThingDef;

            if (harvestedThingDef != null)
            {
                return(harvestedThingDef, zone.Map.resourceCounter.GetCount(harvestedThingDef));
            }
            else
            {
                return(null, 0);
            }
        }
コード例 #23
0
ファイル: Mod.cs プロジェクト: Jaxe-Dev/ToggleHarvest
        public static void SetAllowed(Zone_Growing zone, bool allowed)
        {
            var isDisallowed = DisallowedZones.Contains(zone);

            if (allowed && isDisallowed)
            {
                DisallowedZones.Remove(zone);
            }
            else if (!allowed && !isDisallowed)
            {
                DisallowedZones.Add(zone);
            }
        }
コード例 #24
0
 static void Postfix(JobDriver_PlantHarvest __instance, Toil __result)
 {
     __result.initAction = delegate
     {
         Thing thing = __result.actor.jobs.curJob.GetTarget(TargetIndex.A).Thing;
         Map   map   = __result.actor.Map;
         map.designationManager.RemoveAllDesignationsOn(thing, false);
         if (!tw_YAAM.ConvertSoilAfterHarvest)
         {
             return;
         }
         IntVec3    pos        = thing.Position;
         TerrainDef terrainDef = map.terrainGrid.TerrainAt(pos);
         if (!terrainDef.defName.StartsWith("twSoil"))
         {
             return;
         }
         map.terrainGrid.SetTerrain(__result.actor.jobs.curJob.targetA.Cell, RimWorld.TerrainDefOf.Soil);
         if (map.terrainGrid.TerrainAt(pos).defName != RimWorld.TerrainDefOf.Soil.defName)
         {
             Verse.Log.Warning("tw_YAMM.ConvertSoilAfterHarvest failed at " + pos.ToString());
         }
         List <Zone> zonesList = map.zoneManager.AllZones;
         for (int j = 0; j < zonesList.Count; j++)
         {
             Zone_Growing growingZone = zonesList[j] as Zone_Growing;
             if (growingZone == null)
             {
                 continue;
             }
             if (growingZone.cells.Count == 0)
             {
                 continue;
             }
             if (!growingZone.Cells.Contains(pos))
             {
                 continue;
             }
             if (tw_YAAM.WorldObject.GrowingZonesPlaceBlueprint.Contains(growingZone.label))
             {
                 Blueprint_Build blueprint_Build = GenConstruct.PlaceBlueprintForBuild(terrainDef, pos, map, Rot4.North, Faction.OfPlayer, null);
                 if (blueprint_Build == null)
                 {
                     Verse.Log.Warning("tw_YAMM.PlaceBlueprint failed for " + terrainDef.defName + " in " + growingZone.label);
                 }
                 return;
             }
         }
     };
 }
コード例 #25
0
        public override Job TryGiveJob(Pawn pawn)
        {
            int plantSkill = pawn.skills.GetSkill(SkillDefOf.Plants).Level;

            Zone growZone = null;

            if (!pawn.Map.zoneManager.AllZones.Where((Zone x) =>
            {
                Zone_Growing zone = x as Zone_Growing;
                if (zone == null)
                {
                    return(false);
                }

                if (zone.cells.Count == 0)
                {
                    return(false);
                }

                if (zone.GetPlantDefToGrow() == null || zone.GetPlantDefToGrow().plant == null)
                {
                    return(false);
                }

                if (plantSkill < Mathf.RoundToInt(zone.GetPlantDefToGrow().plant.sowMinSkill * 0.75f))
                {
                    return(false);
                }

                return(true);
            }).TryRandomElement(out growZone))
            {
                return(null);
            }

            IntVec3 position = AIUtility.FindRandomSpotInZone(pawn, growZone, true, true);

            if (position != IntVec3.Invalid)
            {
                return(new Job(IdleJobDefOf.IdleJob_Gardening, position)
                {
                    locomotionUrgency = modSettings.wanderMovePolicy
                });
            }
            else
            {
                return(null);
            }
        }
コード例 #26
0
        public static void Postfix(Zone_Growing __instance, ref string __result)
        {
            if (!Settings.Get().showZoneSize)
            {
                return;
            }

            int count = __instance.cells.Count;

            __result += "\n" +
                        String.Format("TD.SizeAndFertile".Translate(), count, count + FertilityCount(__instance))
                        + "\n" +
                        String.Format("TD.CountToSow".Translate(), ToDoCount(__instance))
                        + "   " +
                        String.Format("TD.CountFullyGrown".Translate(), GrownCount(__instance));
        }
コード例 #27
0
        public static int GrownCount(Zone_Growing zone)
        {
            Map      map      = zone.Map;
            int      ret      = 0;
            ThingDef plantDef = zone.GetPlantDefToGrow();

            foreach (IntVec3 cell in zone.cells)
            {
                if (map.thingGrid.ThingsAt(cell).FirstOrDefault(t => t is Plant) is Plant p &&
                    p.def == plantDef && p.Growth == 1)
                {
                    ret++;
                }
            }
            return(ret);
        }
コード例 #28
0
        private static void Postfix(Zone_Growing __instance, ref IEnumerable <Gizmo> __result)
        {
            var allowHarvestCommand = new Command_Toggle
            {
                defaultLabel = "ToggleHarvest.CommandAllowHarvest".Translate(),
                defaultDesc  = "ToggleHarvest.CommandAllowHarvestDesc".Translate(),
                icon         = TexCommand.ForbidOff,
                isActive     = () => Mod.IsAllowed(__instance),
                toggleAction = () => Mod.SetAllowed(__instance, !Mod.IsAllowed(__instance))
            };

            __result = new List <Gizmo>(__result)
            {
                allowHarvestCommand
            };
        }
コード例 #29
0
        public override IEnumerable <IntVec3> PotentialWorkCellsGlobal(Pawn pawn)
        {
            if (!ResearchProjectDefOf.AC_Tilling.IsFinished)
            {
                yield break;
            }
            Danger              maxDanger = pawn.NormalMaxDanger();
            List <Zone>         zonesList = pawn.Map.zoneManager.AllZones;
            ReservationLayerDef layer     = ReservationLayerDefOf.Floor;

            for (int j = 0; j < zonesList.Count; j++)
            {
                Zone_Growing growZone = zonesList[j] as Zone_Growing;
                if (growZone != null && TillToggle.IsAllowed(growZone))
                {
                    if (growZone.cells.Count == 0)
                    {
                        Log.ErrorOnce("Grow zone has 0 cells: " + growZone, -563487, false);
                    }
                    else if (!growZone.ContainsStaticFire && pawn.CanReach(growZone.Cells[0], PathEndMode.OnCell, maxDanger))
                    {
                        for (int k = 0; k < growZone.cells.Count; k++)
                        {
                            IntVec3 c = growZone.cells[k];
                            if (pawn.Map.terrainGrid.TerrainAt(c).GetModExtension <TerrainExtension>() != null &&
                                pawn.Map.terrainGrid.TerrainAt(c).GetModExtension <TerrainExtension>().tillsTo != null &&
                                pawn.CanReach(growZone.Cells[0], PathEndMode.OnCell, maxDanger) &&
                                pawn.CanReserve(c, 1, -1, layer, false))
                            {
                                if (c.GetPlant(pawn.Map) != null)
                                {
                                    if (!c.GetPlant(pawn.Map).sown)
                                    {
                                        yield return(growZone.cells[k]);
                                    }
                                }
                                else
                                {
                                    yield return(growZone.cells[k]);
                                }
                            }
                        }
                    }
                }
            }
            yield break;
        }
コード例 #30
0
        private static IEnumerable <IntVec3> PotentialWorkCellsGlobalIE(WorkGiver_Grower __instance, Pawn pawn)
        {
            Danger          maxDanger = pawn.NormalMaxDanger();
            List <Building> bList     = pawn.Map.listerBuildings.allBuildingsColonist;

            for (int j = 0; j < bList.Count; j++)
            {
                Building_PlantGrower building_PlantGrower = bList[j] as Building_PlantGrower;
                if (building_PlantGrower == null || !__instance.ExtraRequirements(building_PlantGrower, pawn) || building_PlantGrower.IsForbidden(pawn) ||
                    //!pawn.CanReach(building_PlantGrower, PathEndMode.OnCell, maxDanger) ||
                    building_PlantGrower.IsBurning())
                {
                    continue;
                }
                foreach (IntVec3 item in building_PlantGrower.OccupiedRect())
                {
                    yield return(item);
                }
                wantedPlantDef = null;
            }
            wantedPlantDef = null;
            List <Zone> zonesList = pawn.Map.zoneManager.AllZones;

            for (int j = 0; j < zonesList.Count; j++)
            {
                Zone_Growing growZone = zonesList[j] as Zone_Growing;
                if (growZone == null)
                {
                    continue;
                }
                if (growZone.cells.Count == 0)
                {
                    Log.ErrorOnce("Grow zone has 0 cells: " + growZone, -563487);
                }
                else if (__instance.ExtraRequirements(growZone, pawn) && !growZone.ContainsStaticFire &&
                         pawn.CanReach(growZone.Cells.First(), PathEndMode.OnCell, maxDanger))
                {
                    for (int k = 0; k < growZone.cells.Count; k++)
                    {
                        yield return(growZone.cells[k]);
                    }
                    wantedPlantDef = null;
                    growZone       = null;
                }
            }
            wantedPlantDef = null;
        }