Exemplo n.º 1
0
        public static bool CachePlantCommonalitiesIfShould(BiomeDef __instance)
        {
            if (__instance.cachedPlantCommonalities != null)
            {
                return(false);
            }
            if (__instance.cachedPlantCommonalities != null)
            {
                return(false);
            }
            lock (__instance) //TODO more efficient lock
            {
                Dictionary <ThingDef, float> localCachedPlantCommonalities = new Dictionary <ThingDef, float>();
                for (int i = 0; i < __instance.wildPlants.Count; i++)
                {
                    BiomePlantRecord wildPlant = __instance.wildPlants[i];
                    ThingDef         plant     = wildPlant.plant;
                    if (plant != null)
                    {
                        localCachedPlantCommonalities[plant] = wildPlant.commonality;
                    }
                }

                foreach (ThingDef allDef in DefDatabase <ThingDef> .AllDefs)
                {
                    if (allDef.plant == null || allDef.plant.wildBiomes == null)
                    {
                        continue;
                    }
                    for (int j = 0; j < allDef.plant.wildBiomes.Count; j++)
                    {
                        if (allDef.plant.wildBiomes[j].biome == __instance)
                        {
                            localCachedPlantCommonalities.Add(allDef, allDef.plant.wildBiomes[j].commonality);
                        }
                    }
                }
                __instance.cachedPlantCommonalitiesSum = localCachedPlantCommonalities.Sum(x => x.Value);
                __instance.cachedPlantCommonalities    = localCachedPlantCommonalities;
            }
            return(false);
        }
Exemplo n.º 2
0
        public static bool CachePlantCommonalitiesIfShould(BiomeDef __instance)
        {
            if (cachedPlantCommonalities(__instance) != null)
            {
                return(false);
            }
            lock (__instance)
            {
                if (cachedPlantCommonalities(__instance) != null)
                {
                    return(false);
                }
                Dictionary <ThingDef, float> localCachedPlantCommonalities = new Dictionary <ThingDef, float>();
                for (int i = 0; i < wildPlants(__instance).Count; i++)
                {
                    BiomePlantRecord wildPlant = wildPlants(__instance)[i];
                    ThingDef         plant     = wildPlant.plant;
                    if (plant != null)
                    {
                        localCachedPlantCommonalities[plant] = wildPlant.commonality;
                    }
                }

                foreach (ThingDef allDef in DefDatabase <ThingDef> .AllDefs)
                {
                    if (allDef.plant != null && allDef.plant.wildBiomes != null)
                    {
                        for (int j = 0; j < allDef.plant.wildBiomes.Count; j++)
                        {
                            if (allDef.plant.wildBiomes[j].biome == __instance)
                            {
                                localCachedPlantCommonalities.Add(allDef, allDef.plant.wildBiomes[j].commonality);
                            }
                        }
                    }
                }
                cachedPlantCommonalitiesSum(__instance) = localCachedPlantCommonalities.Sum((KeyValuePair <ThingDef, float> x) => x.Value);
                cachedPlantCommonalities(__instance)    = localCachedPlantCommonalities;
            }
            return(false);
        }
        public BiomeWidget(BiomeDef d, DefType type) : base(d, type)
        {
            if (base.Def.baseWeatherCommonalities == null)
            {
                base.Def.baseWeatherCommonalities = new List <WeatherCommonalityRecord>();
            }
            if (base.Def.terrainsByFertility == null)
            {
                base.Def.terrainsByFertility = new List <TerrainThreshold>();
            }
            if (base.Def.soundsAmbient == null)
            {
                base.Def.soundsAmbient = new List <SoundDef>();
            }
            if (base.Def.terrainPatchMakers == null)
            {
                base.Def.terrainPatchMakers = new List <TerrainPatchMaker>();
            }
            if (BiomeDefStats.GetWildAnimals(base.Def) == null)
            {
                BiomeDefStats.SetWildAnimals(base.Def, new List <BiomeAnimalRecord>());
            }
            if (BiomeDefStats.GetWildPlants(base.Def) == null)
            {
                BiomeDefStats.SetWildPlants(base.Def, new List <BiomePlantRecord>());
            }
            if (BiomeDefStats.GetDiseases(base.Def) == null)
            {
                BiomeDefStats.SetDiseases(base.Def, new List <BiomeDiseaseRecord>());
            }
            if (BiomeDefStats.GetAllowedPackAnimals(base.Def) == null)
            {
                BiomeDefStats.SetAllowedPackAnimals(base.Def, new List <ThingDef>());
            }

            this.inputWidgets = new List <IInputWidget>()
            {
                new BoolInputWidget <BiomeDef>(base.Def, "Can Build Base", (BiomeDef def) => def.canBuildBase, (BiomeDef def, bool b) => def.canBuildBase         = b),
                new BoolInputWidget <BiomeDef>(base.Def, "Can Auto Choose", (BiomeDef def) => def.canAutoChoose, (BiomeDef def, bool b) => def.canAutoChoose      = b),
                new BoolInputWidget <BiomeDef>(base.Def, "Allow Roads", (BiomeDef def) => def.allowRoads, (BiomeDef def, bool b) => def.allowRoads                = b),
                new BoolInputWidget <BiomeDef>(base.Def, "Allow Rivers", (BiomeDef def) => def.allowRivers, (BiomeDef def, bool b) => def.allowRivers             = b),
                new FloatInputWidget <BiomeDef>(base.Def, "Animal Density", (BiomeDef def) => def.animalDensity, (BiomeDef def, float f) => def.animalDensity     = f),
                new FloatInputWidget <BiomeDef>(base.Def, "Plant Density", (BiomeDef def) => def.plantDensity, (BiomeDef def, float f) => def.plantDensity        = f),
                new FloatInputWidget <BiomeDef>(base.Def, "Disease Mtb Days", (BiomeDef def) => def.diseaseMtbDays, (BiomeDef def, float f) => def.diseaseMtbDays = f),
                new FloatInputWidget <BiomeDef>(base.Def, "Settlement Selection Weight", (BiomeDef def) => def.settlementSelectionWeight, (BiomeDef def, float f) => def.settlementSelectionWeight = f),
                new BoolInputWidget <BiomeDef>(base.Def, "Impassable", (BiomeDef def) => def.impassable, (BiomeDef def, bool b) => def.impassable = b),
                new BoolInputWidget <BiomeDef>(base.Def, "Has Virtual Plants", (BiomeDef def) => def.hasVirtualPlants, (BiomeDef def, bool b) => def.hasVirtualPlants = b),
                new FloatInputWidget <BiomeDef>(base.Def, "Forageability", (BiomeDef def) => def.forageability, (BiomeDef def, float f) => def.forageability          = f),
                new BoolInputWidget <BiomeDef>(base.Def, "Local Plants Care Fertability", (BiomeDef def) => def.wildPlantsCareAboutLocalFertility, (BiomeDef def, bool b) => def.wildPlantsCareAboutLocalFertility = b),
                new FloatInputWidget <BiomeDef>(base.Def, "Wild Plant Regrow Days", (BiomeDef def) => def.wildPlantRegrowDays, (BiomeDef def, float f) => def.wildPlantRegrowDays = f),
                new FloatInputWidget <BiomeDef>(base.Def, "Movement Difficulty", (BiomeDef def) => def.movementDifficulty, (BiomeDef def, float f) => def.movementDifficulty      = f),
                new BoolInputWidget <BiomeDef>(base.Def, "Has Bedrock", (BiomeDef def) => def.hasBedrock, (BiomeDef def, bool b) => def.hasBedrock = b)
            };

            this.weatherPlusMinusArgs = new PlusMinusArgs <WeatherDef>()
            {
                allItems  = DefDatabase <WeatherDef> .AllDefs,
                beingUsed = () => Util.ConvertItems(this.weatherCommonalityRecords, (FloatInputWidget <WeatherCommonalityRecord> w) => w.Parent.weather),
                onAdd     = delegate(WeatherDef wd)
                {
                    WeatherCommonalityRecord rec = new WeatherCommonalityRecord()
                    {
                        weather = wd
                    };
                    this.weatherCommonalityRecords.Add(this.CreateWeatherWidget(rec));
                    base.Def.baseWeatherCommonalities.Add(rec);
                },
                onRemove = delegate(WeatherDef wd)
                {
                    this.weatherCommonalityRecords.RemoveAll((FloatInputWidget <WeatherCommonalityRecord> w) => w.Parent.weather == wd);
                    base.Def.baseWeatherCommonalities.RemoveAll((WeatherCommonalityRecord rec) => rec.weather == wd);
                },
                getDisplayName = (WeatherDef def) => def.label,
            };

            this.terrainFertilityPlusMinusArgs = new PlusMinusArgs <TerrainDef>()
            {
                allItems  = DefDatabase <TerrainDef> .AllDefs,
                beingUsed = () => Util.ConvertItems(this.terrainsByFertility, (MinMaxInputWidget <TerrainThreshold, float> w) => w.Parent.terrain),
                onAdd     = delegate(TerrainDef td)
                {
                    TerrainThreshold tt = new TerrainThreshold()
                    {
                        terrain = td
                    };
                    this.terrainsByFertility.Add(this.CreateThresholdWidget(tt));
                    this.Def.terrainsByFertility.Add(tt);
                },
                onRemove = delegate(TerrainDef td)
                {
                    this.terrainsByFertility.RemoveAll((MinMaxInputWidget <TerrainThreshold, float> w) => w.Parent.terrain == td);
                    base.Def.terrainsByFertility.RemoveAll((TerrainThreshold tt) => tt.terrain == td);
                },
                getDisplayName = (TerrainDef def) => def.label,
            };

            this.ambientSoundPlusMinusArgs = new PlusMinusArgs <SoundDef>()
            {
                allItems  = DefDatabase <SoundDef> .AllDefs,
                beingUsed = () => this.soundsAmbient,
                onAdd     = delegate(SoundDef sd)
                {
                    this.soundsAmbient.Add(sd);
                    this.Def.soundsAmbient.Add(sd);
                },
                onRemove = delegate(SoundDef sd)
                {
                    this.soundsAmbient.Remove(sd);
                    this.Def.soundsAmbient.Remove(sd);
                },
                getDisplayName = (SoundDef sd) => sd.defName
            };

            this.diseasesPlusMinusArgs = new PlusMinusArgs <IncidentDef>()
            {
                allItems  = Util.FindAll(DefDatabase <IncidentDef> .AllDefs, id => id.defName.StartsWith("Disease_")),
                beingUsed = () => Util.ConvertItems(this.diseases, (FloatInputWidget <BiomeDiseaseRecord> w) => w.Parent.diseaseInc),
                onAdd     = delegate(IncidentDef id)
                {
                    BiomeDiseaseRecord r = new BiomeDiseaseRecord()
                    {
                        diseaseInc = id, commonality = 0
                    };
                    this.diseases.Add(this.CreateDiseaseWidget(r));
                    BiomeDefStats.GetDiseases(this.Def).Add(r);
                },
                onRemove = delegate(IncidentDef id)
                {
                    this.diseases.RemoveAll((FloatInputWidget <BiomeDiseaseRecord> w) => w.Parent.diseaseInc == id);
                    BiomeDefStats.GetDiseases(this.Def).RemoveAll((BiomeDiseaseRecord rec) => rec.diseaseInc == id);
                },
                getDisplayName = (IncidentDef def) => def.label,
            };

            this.wildPlantPlusMinusArgs = new PlusMinusArgs <ThingDef>()
            {
                allItems  = Util.FindAll(DefDatabase <ThingDef> .AllDefs, td => td.plant != null),
                beingUsed = () => Util.ConvertItems(this.wildPlants, (FloatInputWidget <BiomePlantRecord> w) => w.Parent.plant),
                onAdd     = delegate(ThingDef td)
                {
                    BiomePlantRecord r = new BiomePlantRecord()
                    {
                        plant = td, commonality = 0
                    };
                    this.wildPlants.Add(this.CreateWildPlantWidget(r));
                    BiomeDefStats.GetWildPlants(this.Def).Add(r);
                },
                onRemove = delegate(ThingDef td)
                {
                    this.wildPlants.RemoveAll((FloatInputWidget <BiomePlantRecord> w) => w.Parent.plant == td);
                    BiomeDefStats.GetWildPlants(this.Def).RemoveAll((BiomePlantRecord rec) => rec.plant == td);
                },
                getDisplayName = (ThingDef def) => def.label,
            };

            this.wildAnimalPlusMinusArgs = new PlusMinusArgs <PawnKindDef>()
            {
                allItems  = Util.FindAll(DefDatabase <PawnKindDef> .AllDefs, pdk => pdk.race.race.thinkTreeMain.defName.Equals("Animal")),
                beingUsed = () => Util.ConvertItems(this.wildAnimals, (FloatInputWidget <BiomeAnimalRecord> w) => w.Parent.animal),
                onAdd     = delegate(PawnKindDef td)
                {
                    BiomeAnimalRecord r = new BiomeAnimalRecord()
                    {
                        animal = td, commonality = 0
                    };
                    this.wildAnimals.Add(this.CreateWildAnimalWidget(r));
                    BiomeDefStats.GetWildAnimals(this.Def).Add(r);
                },
                onRemove = delegate(PawnKindDef td)
                {
                    this.wildAnimals.RemoveAll((FloatInputWidget <BiomeAnimalRecord> w) => w.Parent.animal == td);
                    BiomeDefStats.GetWildAnimals(this.Def).RemoveAll((BiomeAnimalRecord rec) => rec.animal == td);
                },
                getDisplayName = (PawnKindDef def) => def.label,
            };

            this.allowedPackAnimalsPlusMinusArgs = new PlusMinusArgs <ThingDef>()
            {
                allItems  = Util.FindAll(DefDatabase <ThingDef> .AllDefs, td => td.race != null && td.race.herdAnimal),
                beingUsed = () => this.allowedPackAnimals,
                onAdd     = delegate(ThingDef td)
                {
                    this.allowedPackAnimals.Add(td);
                    BiomeDefStats.GetAllowedPackAnimals(base.Def).Add(td);
                },
                onRemove = delegate(ThingDef td)
                {
                    this.allowedPackAnimals.Remove(td);
                    BiomeDefStats.GetAllowedPackAnimals(base.Def).Remove(td);
                },
                getDisplayName = (ThingDef def) => def.label,
            };

            this.Rebuild();
        }