public TerrainPatchMakerWidget(TerrainPatchMaker parent)
        {
            this.Parent       = parent;
            this.inputWidgets = new List <IInputWidget>(6)
            {
                //new FloatInputWidget<TerrainPatchMaker>(this.Parent, "Perlin Frequency", (TerrainPatchMaker p) => p.perlinFrequency, (TerrainPatchMaker p, float f) => p.perlinFrequency = f),
                new FloatInputWidget <TerrainPatchMaker>(this.Parent, "Perlin Lacunarity", (TerrainPatchMaker p) => p.perlinLacunarity, (TerrainPatchMaker p, float f) => p.perlinLacunarity    = f),
                new FloatInputWidget <TerrainPatchMaker>(this.Parent, "Perlin Persistence", (TerrainPatchMaker p) => p.perlinPersistence, (TerrainPatchMaker p, float f) => p.perlinPersistence = f),
                new IntInputWidget <TerrainPatchMaker>(this.Parent, "Perlin Octaves", (TerrainPatchMaker p) => p.perlinOctaves, (TerrainPatchMaker p, int i) => p.perlinOctaves  = i),
                new FloatInputWidget <TerrainPatchMaker>(this.Parent, "Min Fertility", (TerrainPatchMaker p) => p.minFertility, (TerrainPatchMaker p, float f) => p.minFertility = f),
                new FloatInputWidget <TerrainPatchMaker>(this.Parent, "Max Fertility", (TerrainPatchMaker p) => p.maxFertility, (TerrainPatchMaker p, float f) => p.maxFertility = f),
                new IntInputWidget <TerrainPatchMaker>(this.Parent, "Min Size", (TerrainPatchMaker p) => p.minSize, (TerrainPatchMaker p, int i) => p.minSize = i),
            };

            if (this.Parent.thresholds != null)
            {
                this.thresholds = new List <MinMaxInputWidget <TerrainThreshold, float> >(this.Parent.thresholds.Count);
                foreach (var v in this.Parent.thresholds)
                {
                    this.thresholds.Add(this.CreateMinMaxInputWidget(v));
                }
            }
            else
            {
                this.thresholds = new List <MinMaxInputWidget <TerrainThreshold, float> >(0);
            }

            this.thresholdsArgs = new PlusMinusArgs <TerrainDef>()
            {
                allItems  = DefDatabase <TerrainDef> .AllDefs,
                beingUsed = delegate()
                {
                    List <TerrainDef> l = new List <TerrainDef>();
                    foreach (var v in this.thresholds)
                    {
                        l.Add(v.Parent.terrain);
                    }
                    return(l);
                },
                onAdd = delegate(TerrainDef d)
                {
                    TerrainThreshold tt = new TerrainThreshold()
                    {
                        terrain = d
                    };
                    this.Parent.thresholds.Add(tt);
                    this.thresholds.Add(this.CreateMinMaxInputWidget(tt));
                },
                onRemove = delegate(TerrainDef d)
                {
                    this.Parent.thresholds.RemoveAll((TerrainThreshold tt) => tt.terrain == d);
                    this.thresholds.RemoveAll((MinMaxInputWidget <TerrainThreshold, float> mmw) => mmw.Parent.terrain == d);
                },
                getDisplayName = (TerrainDef def) => def.label
            };
        }
Пример #2
0
        public IngestiblePropertiesWidget(IngestibleProperties props)
        {
            this.Parent       = props;
            this.inputWidgets = new List <IInputWidget>()
            {
                new IntInputWidget <IngestibleProperties>(this.Parent, "Max Number Ingest At Once", p => p.maxNumToIngestAtOnce, (p, v) => p.maxNumToIngestAtOnce = v),
                new IntInputWidget <IngestibleProperties>(this.Parent, "Base Ingest Ticks", p => p.baseIngestTicks, (p, v) => p.baseIngestTicks               = v),
                new FloatInputWidget <IngestibleProperties>(this.Parent, "Chair Search Radius", p => p.chairSearchRadius, (p, v) => p.chairSearchRadius       = v),
                new BoolInputWidget <IngestibleProperties>(this.Parent, "Use Eating Speed Stat", p => p.useEatingSpeedStat, (p, v) => p.useEatingSpeedStat    = v),
                new BoolInputWidget <IngestibleProperties>(this.Parent, "Ingest Hold Uses Table", p => p.ingestHoldUsesTable, (p, v) => p.ingestHoldUsesTable = v),
                new FloatInputWidget <IngestibleProperties>(this.Parent, "Joy", p => p.joy, (p, v) => p.joy = v),
                new EnumInputWidget <IngestibleProperties, FoodPreferability>(this.Parent, "Preferability", 200, p => p.preferability, (p, v) => p.preferability = v),
                new BoolInputWidget <IngestibleProperties>(this.Parent, "Nurseable", p => p.nurseable, (p, v) => p.nurseable = v),
                new FloatInputWidget <IngestibleProperties>(this.Parent, "Optimality Offset Humanlikes", p => p.optimalityOffsetHumanlikes, (p, v) => p.optimalityOffsetHumanlikes = v),
                new FloatInputWidget <IngestibleProperties>(this.Parent, "Optimality Offset Feeding Animals", p => p.optimalityOffsetFeedingAnimals, (p, v) => p.optimalityOffsetFeedingAnimals = v),
                new EnumInputWidget <IngestibleProperties, DrugCategory>(this.Parent, "DrugCategory", 200, p => p.drugCategory, (p, v) => p.drugCategory = v),
                //new DefInputWidget<IngestibleProperties, ThingDef>(this.Parent, "Parent", 200, p => p.parent, (p, v) => { p.parent = v; IngestiblePropertiesStats.ResetCache(p); }, true),
                new DefInputWidget <IngestibleProperties, JoyKindDef>(this.Parent, "Joy Kind", 200, p => p.joyKind, (p, v) => p.joyKind                = v, true),
                new DefInputWidget <IngestibleProperties, ThingDef>(this.Parent, "Source Def", 200, p => p.sourceDef, (p, v) => p.sourceDef            = v, true),
                new DefInputWidget <IngestibleProperties, ThoughtDef>(this.Parent, "Taste Thought", 200, p => p.tasteThought, (p, v) => p.tasteThought = v, true),
                new DefInputWidget <IngestibleProperties, ThoughtDef>(this.Parent, "Special Thought Direct", 200, p => p.specialThoughtDirect, (p, v) => p.specialThoughtDirect = v, true),
                new DefInputWidget <IngestibleProperties, ThoughtDef>(this.Parent, "Special Thought As Ingredient", 200, p => p.specialThoughtAsIngredient, (p, v) => p.specialThoughtAsIngredient = v, true),
                new DefInputWidget <IngestibleProperties, EffecterDef>(this.Parent, "Ingest Effect", 200, p => p.ingestEffect, (p, v) => p.ingestEffect           = v, true),
                new DefInputWidget <IngestibleProperties, EffecterDef>(this.Parent, "Ingest Effect Eat", 200, p => p.ingestEffectEat, (p, v) => p.ingestEffectEat = v, true),
                new DefInputWidget <IngestibleProperties, SoundDef>(this.Parent, "Sound Def", 200, p => p.ingestSound, (p, v) => p.ingestSound = v, true),
            };

            var dic = new SortedDictionary <string, FoodTypeFlags>();

            foreach (var v in Enum.GetValues(typeof(FoodTypeFlags)).Cast <FoodTypeFlags>())
            {
                dic.Add(v.ToString(), v);
            }
            this.foodTypeSortedFlags = new List <FoodTypeFlags>(dic.Values);
            dic.Clear();
            dic = null;

            this.foodTypePlusMinus = new PlusMinusArgs <FoodTypeFlags>()
            {
                allItems       = this.foodTypeSortedFlags,
                isBeingUsed    = v => (this.Parent.foodType & v) == v,
                onAdd          = v => this.Parent.foodType |= v,
                onRemove       = v => this.Parent.foodType &= ~v,
                getDisplayName = v => v.ToString()
            };
        }
        public BackstoryWidget(Backstory backstory, DefType type) : base(backstory, type)
        {
            if (backstory.skillGainsResolved == null)
            {
                backstory.skillGainsResolved = new Dictionary <SkillDef, int>();
            }
            if (backstory.forcedTraits == null)
            {
                backstory.forcedTraits = new List <TraitEntry>();
            }
            if (backstory.disallowedTraits == null)
            {
                backstory.disallowedTraits = new List <TraitEntry>();
            }

            this.Backstory    = backstory;
            this.type         = type;
            this.inputWidgets = new List <IInputWidget>()
            {
                new BoolInputWidget <Backstory>(this.Backstory, "Shuffleable", b => b.shuffleable, (b, v) => b.shuffleable = v),
                new EnumInputWidget <Backstory, BackstorySlot>(this.Backstory, "Slot", 200, b => b.slot, (b, v) => b.slot  = v),
                new DefInputWidget <Backstory, BodyTypeDef>(this.Backstory, "Body Type Global", 200, b => BackstoryStats.GetBodyTypeGlobal(b), (b, v) => BackstoryStats.SetBodyTypeGlobal(b, v), true),
                new DefInputWidget <Backstory, BodyTypeDef>(this.Backstory, "Body Type Male", 200, b => BackstoryStats.GetBodyTypeMale(b), (b, v) => BackstoryStats.SetBodyTypeMale(b, v), true, d => d == BodyTypeDefOf.Female),
                new DefInputWidget <Backstory, BodyTypeDef>(this.Backstory, "Body Type Female", 200, b => BackstoryStats.GetBodyTypeFemale(b), (b, v) => BackstoryStats.SetBodyTypeFemale(b, v), true, d => d == BodyTypeDefOf.Male),
            };

            var dic = new SortedDictionary <string, WorkTags>();

            foreach (var v in Enum.GetValues(typeof(WorkTags)).Cast <WorkTags>())
            {
                dic.Add(v.ToString(), v);
            }
            this.workTags = new List <WorkTags>(dic.Values);
            dic.Clear();
            dic = null;

            this.workDisables = new PlusMinusArgs <WorkTags>()
            {
                allItems       = this.workTags,
                isBeingUsed    = v => (this.Backstory.workDisables & v) == v,
                onAdd          = v => this.Backstory.workDisables |= v,
                onRemove       = v => this.Backstory.workDisables &= ~v,
                getDisplayName = v => v.ToString()
            };

            this.requiredWorkTags = new PlusMinusArgs <WorkTags>()
            {
                allItems       = this.workTags,
                isBeingUsed    = v => (this.Backstory.requiredWorkTags & v) == v,
                onAdd          = v => this.Backstory.requiredWorkTags |= v,
                onRemove       = v => this.Backstory.requiredWorkTags &= ~v,
                getDisplayName = v => v.ToString()
            };

            this.skillGainsPlusMinus = new PlusMinusArgs <SkillDef>()
            {
                allItems  = Util.SortedDefList <SkillDef>(),
                beingUsed = () => this.Backstory.skillGainsResolved.Keys,
                onAdd     = v =>
                {
                    this.Backstory.skillGainsResolved[v] = 0;
                    this.skillGains.Add(this.CreateSkillGainsInput(v));
                },
                onRemove = v =>
                {
                    this.Backstory.skillGainsResolved.Remove(v);
                    for (int i = 0; i < this.skillGains.Count; ++i)
                    {
                        if (this.skillGains[i].DisplayLabel == Util.GetLabel(v))
                        {
                            this.skillGains.RemoveAt(i);
                            break;
                        }
                    }
                },
                getDisplayName = v => Util.GetLabel(v),
            };

            this.forcedTraitsPlusMinus = new PlusMinusArgs <TraitDef>()
            {
                allItems  = Util.SortedDefList <TraitDef>(),
                beingUsed = () => Util.ConvertItems(this.Backstory.forcedTraits, v => v.def),
                onAdd     = v =>
                {
                    TraitEntry te = new TraitEntry(v, 0);
                    this.Backstory.forcedTraits.Add(te);
                    this.forcedTraits.Add(this.CreateTraitEntryInput(te));
                    this.RemoveDisallowedTraits(v);
                },
                onRemove = v =>
                {
                    this.RemoveForcedTraits(v);
                },
                getDisplayName = v => Util.GetLabel(v),
            };

            this.disallowedTraitsPlusMinus = new PlusMinusArgs <TraitDef>()
            {
                allItems  = Util.SortedDefList <TraitDef>(),
                beingUsed = () => Util.ConvertItems(this.Backstory.disallowedTraits, v => v.def),
                onAdd     = v =>
                {
                    TraitEntry te = new TraitEntry(v, 0);
                    this.Backstory.disallowedTraits.Add(te);
                    this.disallowedTraits.Add(this.CreateTraitEntryInput(te));
                    this.RemoveForcedTraits(v);
                },
                onRemove = v =>
                {
                    this.RemoveDisallowedTraits(v);
                },
                getDisplayName = v => Util.GetLabel(v),
            };

            this.Rebuild();
        }
        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();
        }
Пример #5
0
        public ThoughtDefWidget(ThoughtDef def, DefType type) : base(def, type)
        {
            if (def.requiredTraits == null)
            {
                def.requiredTraits = new List <TraitDef>();
            }
            if (def.nullifyingTraits == null)
            {
                def.nullifyingTraits = new List <TraitDef>();
            }
            if (def.nullifyingOwnTales == null)
            {
                def.nullifyingOwnTales = new List <TaleDef>();
            }
            if (def.stages == null)
            {
                def.stages = new List <ThoughtStage>();
            }
            this.stages = new List <ThoughtStageWidget>(def.stages.Count);

            this.inputWidgets = new List <IInputWidget>()
            {
                new IntInputWidget <ThoughtDef>(base.Def, "Stack Limit", d => d.stackLimit, (d, v) => d.stackLimit = v),
                new FloatInputWidget <ThoughtDef>(base.Def, "Stacked Effect Multiplier", d => d.stackedEffectMultiplier, (d, v) => d.stackedEffectMultiplier = v),
                new FloatInputWidget <ThoughtDef>(base.Def, "Duration (Days)", d => d.durationDays, (d, v) => d.durationDays = v),
                new BoolInputWidget <ThoughtDef>(base.Def, "Invert", d => d.invert, (d, v) => d.invert = v),
                new BoolInputWidget <ThoughtDef>(base.Def, "Valid While Despawned", d => d.validWhileDespawned, (d, v) => d.validWhileDespawned = v),
                new BoolInputWidget <ThoughtDef>(base.Def, "Require Trait Degree", d => d.requiredTraitsDegree != TRAIT_DEGREE_MIN, (d, v) =>
                {
                    if (d.requiredTraitsDegree != TRAIT_DEGREE_MIN)
                    {
                        d.requiredTraitsDegree = TRAIT_DEGREE_MIN;
                    }
                    else
                    {
                        d.requiredTraitsDegree = 0;
                    }
                    this.inputWidgets[6].ResetBuffers();
                }),
                new IntInputWidget <ThoughtDef>(base.Def, "Degree", d => d.requiredTraitsDegree, (d, v) => d.requiredTraitsDegree = v, d => new AInputWidget <ThoughtDef, int> .ShouldDrawInputResult(d.requiredTraitsDegree != TRAIT_DEGREE_MIN)),
                new BoolInputWidget <ThoughtDef>(base.Def, "Colonists Only", d => d.nullifiedIfNotColonist, (d, v) => d.nullifiedIfNotColonist = v),
                new BoolInputWidget <ThoughtDef>(base.Def, "Show Bubble", d => d.showBubble, (d, v) => d.showBubble = v),
                new IntInputWidget <ThoughtDef>(base.Def, "Stack Limit For Other Pawns", d => d.stackLimitForSameOtherPawn, (d, v) => d.stackLimitForSameOtherPawn = v),
                new FloatInputWidget <ThoughtDef>(base.Def, "Lerp Opinion To Zero Pct", d => d.lerpOpinionToZeroAfterDurationPct, (d, v) => d.lerpOpinionToZeroAfterDurationPct = v),
                new FloatInputWidget <ThoughtDef>(base.Def, "Max Cumulated Opinion Offset", d => d.maxCumulatedOpinionOffset, (d, v) => d.maxCumulatedOpinionOffset             = v),
                new DefInputWidget <ThoughtDef, ThoughtDef>(base.Def, "Next Thought", 150, d => d.nextThought, (d, v) => d.nextThought             = v, true),
                new DefInputWidget <ThoughtDef, GameConditionDef>(base.Def, "Game Condition", 150, d => d.gameCondition, (d, v) => d.gameCondition = v, true),
                new DefInputWidget <ThoughtDef, TaleDef>(base.Def, "Tale Def", 150, d => d.taleDef, (d, v) => d.taleDef = v, true),
                new DefInputWidget <ThoughtDef, HediffDef>(base.Def, "Hediff", 150, d => d.hediff, (d, v) => d.hediff   = v, true),
                new DefInputWidget <ThoughtDef, StatDef>(base.Def, "Effect Multiply Ing Stat", 200, d => d.effectMultiplyingStat, (d, v) => d.effectMultiplyingStat = v, true),
                new DefInputWidget <ThoughtDef, ThoughtDef>(base.Def, "Thought To Make", 200, d => d.thoughtToMake, (d, v) => d.thoughtToMake = v, true),
            };

            this.nullifyingOwnTales = new PlusMinusArgs <TaleDef>()
            {
                allItems       = DefDatabase <TaleDef> .AllDefs,
                beingUsed      = () => base.Def.nullifyingOwnTales,
                onAdd          = v => base.Def.nullifyingOwnTales = Util.AddTo(base.Def.nullifyingOwnTales, v),
                onRemove       = v => base.Def.nullifyingOwnTales = Util.RemoveFrom(base.Def.nullifyingOwnTales, v),
                getDisplayName = v => Util.GetLabel(v)
            };

            this.requiredTraits = new PlusMinusArgs <TraitDef>()
            {
                allItems  = DefDatabase <TraitDef> .AllDefs,
                beingUsed = () => base.Def?.requiredTraits,
                onAdd     = v =>
                {
                    base.Def.requiredTraits   = Util.AddTo(base.Def.requiredTraits, v);
                    base.Def.nullifyingTraits = Util.RemoveFrom(base.Def.nullifyingTraits, v);
                },
                onRemove       = v => base.Def.requiredTraits = Util.RemoveFrom(base.Def.requiredTraits, v),
                getDisplayName = v => Util.GetLabel(v)
            };

            this.nullifyingTraits = new PlusMinusArgs <TraitDef>()
            {
                allItems  = DefDatabase <TraitDef> .AllDefs,
                beingUsed = () => base.Def.nullifyingTraits,
                onAdd     = v =>
                {
                    base.Def.nullifyingTraits = Util.AddTo(base.Def.nullifyingTraits, v);
                    base.Def.requiredTraits   = Util.RemoveFrom(base.Def.requiredTraits, v);
                },
                onRemove       = v => base.Def.nullifyingTraits = Util.RemoveFrom(base.Def.nullifyingTraits, v),
                getDisplayName = v => Util.GetLabel(v)
            };

            this.Rebuild();
        }
Пример #6
0
        public StorytellerCompPropertiesWidget(StorytellerCompProperties p) : base(true, true)
        {
            if (p.allowedTargetTags == null)
            {
                p.allowedTargetTags = new List <IncidentTargetTagDef>();
            }
            if (p.disallowedTargetTags == null)
            {
                p.disallowedTargetTags = new List <IncidentTargetTagDef>();
            }

            this.Props = p;
            this.label = StorytellerCompPropertiesStats.GetLabel(p);

            this.inputWidgets = new List <IInputWidget>()
            {
                new FloatInputWidget <StorytellerCompProperties>(p, "Min Days Passed", c => c.minDaysPassed, (c, v) => c.minDaysPassed = v),
                new FloatInputWidget <StorytellerCompProperties>(p, "Min Inc Chance Pop Intent Factor", c => c.minIncChancePopulationIntentFactor, (c, v) => c.minIncChancePopulationIntentFactor = v),
            };

            this.allowedTargetTags = new PlusMinusArgs <IncidentTargetTagDef>()
            {
                allItems       = DefDatabase <IncidentTargetTagDef> .AllDefs,
                getDisplayName = v => Util.GetLabel(v),
                beingUsed      = () => this.Props.allowedTargetTags,
                onAdd          = v =>
                {
                    Util.AddTo(this.Props.allowedTargetTags, v);
                    Util.RemoveFrom(this.Props.disallowedTargetTags, v);
                },
                onRemove = v => Util.RemoveFrom(this.Props.allowedTargetTags, v)
            };

            this.disallowedTargetTags = new PlusMinusArgs <IncidentTargetTagDef>()
            {
                allItems       = DefDatabase <IncidentTargetTagDef> .AllDefs,
                getDisplayName = v => Util.GetLabel(v),
                beingUsed      = () => this.Props.disallowedTargetTags,
                onAdd          = v =>
                {
                    Util.AddTo(this.Props.disallowedTargetTags, v);
                    Util.RemoveFrom(this.Props.allowedTargetTags, v);
                },
                onRemove = v => Util.RemoveFrom(this.Props.disallowedTargetTags, v)
            };

            switch (p.compClass.FullName)
            {
            case "RimWorld.StorytellerComp_CategoryIndividualMTBByBiome":
                if (p is StorytellerCompProperties_CategoryIndividualMTBByBiome cb)
                {
                    this.inputWidgets.Add(new BoolInputWidget <StorytellerCompProperties_CategoryIndividualMTBByBiome>(
                                              cb, "Apply Caravan Visibility", c => c.applyCaravanVisibility, (c, v) => c.applyCaravanVisibility = v));
                }
                break;

            case "RimWorld.StorytellerComp_CategoryMTB":
                if (p is StorytellerCompProperties_CategoryMTB cm)
                {
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_CategoryMTB>(
                                              cm, "Mean Time Between (Days)", c => c.mtbDays, (c, v) => c.mtbDays = v));
                }
                break;

            case "RimWorld.StorytellerComp_DeepDrillInfestation":
                if (p is StorytellerCompProperties_DeepDrillInfestation cd)
                {
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_DeepDrillInfestation>(
                                              cd, "Drill Base Mean Time Between (Days)", c => c.baseMtbDaysPerDrill, (c, v) => c.baseMtbDaysPerDrill = v));
                }
                break;

            case "RimWorld.StorytellerComp_FactionInteraction":
                if (p is StorytellerCompProperties_FactionInteraction fi)
                {
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_FactionInteraction>(
                                              fi, "Base Incidents Per Year", c => c.baseIncidentsPerYear, (c, v) => c.baseIncidentsPerYear = v));
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_FactionInteraction>(
                                              fi, "Min Spacing Days", c => c.minSpacingDays, (c, v) => c.minSpacingDays = v));
                    this.inputWidgets.Add(new EnumInputWidget <StorytellerCompProperties_FactionInteraction, StoryDanger>(
                                              fi, "Min Danger", 200, c => c.minDanger, (c, v) => c.minDanger = v));
                    this.inputWidgets.Add(new BoolInputWidget <StorytellerCompProperties_FactionInteraction>(
                                              fi, "Full Allies Only", c => c.fullAlliesOnly, (c, v) => c.fullAlliesOnly = v));
                }
                break;

            case "RimWorld.StorytellerComp_OnOffCycle":
                if (p is StorytellerCompProperties_OnOffCycle ooc)
                {
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_OnOffCycle>(
                                              ooc, "On Days", c => c.onDays, (c, v) => c.onDays = v));
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_OnOffCycle>(
                                              ooc, "Off Days", c => c.offDays, (c, v) => c.offDays = v));
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_OnOffCycle>(
                                              ooc, "Min Spacing Days", c => c.minSpacingDays, (c, v) => c.minSpacingDays = v));
                    // TODO this.inputWidgets.Add(new BoolInputWidget<StorytellerCompProperties_OnOffCycle>(
                    //ooc, "Apply Raid Beacon Thread Mean Time Between Factor", c => c.applyRaidBeaconThreatMtbFactor, (c, v) => c.applyRaidBeaconThreatMtbFactor = v));
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_OnOffCycle>(
                                              ooc, "Force Raid Enemy Before Days Passed", c => c.forceRaidEnemyBeforeDaysPassed, (c, v) => c.forceRaidEnemyBeforeDaysPassed = v));
                    this.inputWidgets.Add(new MinMaxInputWidget <StorytellerCompProperties_OnOffCycle, float>(
                                              "Num Incidents range",
                                              new FloatInputWidget <StorytellerCompProperties_OnOffCycle>(
                                                  ooc, "Min", c => c.numIncidentsRange.min, (c, v) => c.numIncidentsRange.min = v),
                                              new FloatInputWidget <StorytellerCompProperties_OnOffCycle>(
                                                  ooc, "Max", c => c.numIncidentsRange.max, (c, v) => c.numIncidentsRange.max = v)));
                }
                break;

            case "RimWorld.StorytellerComp_RandomMain":
                if (p is StorytellerCompProperties_RandomMain rm)
                {
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_RandomMain>(
                                              rm, "Mean Time Between (Days)", c => c.mtbDays, (c, v) => c.mtbDays = v));
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_RandomMain>(
                                              rm, "Max Threat Big Interval Days", c => c.maxThreatBigIntervalDays, (c, v) => c.maxThreatBigIntervalDays = v));
                    this.inputWidgets.Add(new BoolInputWidget <StorytellerCompProperties_RandomMain>(
                                              rm, "Skip Threat Big If Raid Beacon", c => c.skipThreatBigIfRaidBeacon, (c, v) => c.skipThreatBigIfRaidBeacon = v));
                    this.inputWidgets.Add(new MinMaxInputWidget <StorytellerCompProperties_RandomMain, float>(
                                              "Random Points Factor Range",
                                              new FloatInputWidget <StorytellerCompProperties_RandomMain>(
                                                  rm, "Min", c => c.randomPointsFactorRange.min, (c, v) => c.randomPointsFactorRange.min = v),
                                              new FloatInputWidget <StorytellerCompProperties_RandomMain>(
                                                  rm, "Max", c => c.randomPointsFactorRange.max, (c, v) => c.randomPointsFactorRange.max = v)));

                    this.categoryWeightArgs = new PlusMinusArgs <IncidentCategoryDef>()
                    {
                        allItems    = DefDatabase <IncidentCategoryDef> .AllDefs,
                        isBeingUsed = d =>
                        {
                            foreach (var input in this.categoryWeights)
                            {
                                if (input.Parent.category == d)
                                {
                                    return(true);
                                }
                            }
                            return(false);
                        },
                        getDisplayName = d => Util.GetLabel(d),
                        onAdd          = d =>
                        {
                            IncidentCategoryEntry ice = new IncidentCategoryEntry()
                            {
                                category = d,
                                weight   = 0
                            };
                            this.categoryWeights.Add(this.CreateCategoryWeightInput(ice));
                            ((StorytellerCompProperties_RandomMain)this.Props).categoryWeights.Add(ice);
                        },
                        onRemove = d =>
                        {
                            this.categoryWeights.RemoveAll(v => v.Parent.category == d);
                            ((StorytellerCompProperties_RandomMain)this.Props).categoryWeights.RemoveAll(v => v.category == d);
                        }
                    };
                }
                break;

            case "RimWorld.StorytellerComp_SingleMTB":
                if (p is StorytellerCompProperties_SingleMTB smtb)
                {
                    this.inputWidgets.Add(new FloatInputWidget <StorytellerCompProperties_SingleMTB>(
                                              smtb, "Mean Time Between (Days)", c => c.mtbDays, (c, v) => c.mtbDays = v));
                }
                break;

            case "RimWorld.StorytellerComp_Triggered":
                if (p is StorytellerCompProperties_Triggered t)
                {
                    this.inputWidgets.Add(new IntInputWidget <StorytellerCompProperties_Triggered>(
                                              t, "Delay Ticks", c => c.delayTicks, (c, v) => c.delayTicks = v));
                }
                break;
            }
            this.Rebuild();
        }
        public RecipeWidget(RecipeDef d, DefType type) : base(d, type)
        {
            if (base.Def.skillRequirements == null)
            {
                base.Def.skillRequirements = new List <SkillRequirement>();
            }
            if (base.Def.forceHiddenSpecialFilters == null)
            {
                base.Def.forceHiddenSpecialFilters = new List <SpecialThingFilterDef>();
            }
            if (base.Def.recipeUsers == null)
            {
                base.Def.recipeUsers = new List <ThingDef>();
            }
            if (base.Def.appliedOnFixedBodyParts == null)
            {
                base.Def.appliedOnFixedBodyParts = new List <BodyPartDef>();
            }

            this.inputWidgets = new List <IInputWidget>()
            {
                new FloatInputWidget <RecipeDef>(base.Def, "Work Amount", (RecipeDef def) => d.workAmount, (RecipeDef def, float f) => d.workAmount = f),
                new BoolInputWidget <RecipeDef>(base.Def, "Allow Mixing Ingredients", (RecipeDef def) => d.allowMixingIngredients, (RecipeDef def, bool b) => d.allowMixingIngredients = b),
                new BoolInputWidget <RecipeDef>(base.Def, "Auto Strip Corpses", (RecipeDef def) => d.autoStripCorpses, (RecipeDef def, bool b) => d.autoStripCorpses = b),
                new BoolInputWidget <RecipeDef>(base.Def, "Product Has Ingredient Stuff", (RecipeDef def) => d.productHasIngredientStuff, (RecipeDef def, bool b) => d.productHasIngredientStuff = b),
                new IntInputWidget <RecipeDef>(base.Def, "Target Count Adjustment", (RecipeDef def) => d.targetCountAdjustment, (RecipeDef def, int i) => d.targetCountAdjustment   = i),
                new FloatInputWidget <RecipeDef>(base.Def, "Work Skill Learn Factor", (RecipeDef def) => d.workSkillLearnFactor, (RecipeDef def, float f) => d.workSkillLearnFactor = f),
                new BoolInputWidget <RecipeDef>(base.Def, "Hide Body Part Names", (RecipeDef def) => d.hideBodyPartNames, (RecipeDef def, bool b) => d.hideBodyPartNames            = b),
                new BoolInputWidget <RecipeDef>(base.Def, "Is Violation", (RecipeDef def) => d.isViolation, (RecipeDef def, bool b) => d.isViolation = b),
                new FloatInputWidget <RecipeDef>(base.Def, "Surgery Success Chance Factor", (RecipeDef def) => d.surgerySuccessChanceFactor, (RecipeDef def, float f) => d.surgerySuccessChanceFactor  = f),
                new FloatInputWidget <RecipeDef>(base.Def, "Death On Failed Surgery Chance", (RecipeDef def) => d.deathOnFailedSurgeryChance, (RecipeDef def, float f) => d.deathOnFailedSurgeryChance = f),
                new BoolInputWidget <RecipeDef>(base.Def, "Targets Body Part", (RecipeDef def) => d.targetsBodyPart, (RecipeDef def, bool b) => d.targetsBodyPart = b),
                new BoolInputWidget <RecipeDef>(base.Def, "Anesthetize", (RecipeDef def) => d.anesthetize, (RecipeDef def, bool b) => d.anesthetize = b),
                new BoolInputWidget <RecipeDef>(base.Def, "Dont Show If Any Ingredient Missing", (RecipeDef def) => d.dontShowIfAnyIngredientMissing, (RecipeDef def, bool b) => d.dontShowIfAnyIngredientMissing = b),
                new DefInputWidget <RecipeDef, ResearchProjectDef>(base.Def, "Research Prerequisite", 200, def => def.researchPrerequisite, (def, v) => def.researchPrerequisite = v, true),
                new DefInputWidget <RecipeDef, WorkTypeDef>(base.Def, "Required Giver Work Type", 200, def => def.requiredGiverWorkType, (def, v) => def.requiredGiverWorkType   = v, true),
                new DefInputWidget <RecipeDef, ThingDef>(base.Def, "Unfinished Thing Def", 200, def => def.unfinishedThingDef, (def, v) => def.unfinishedThingDef = v, true),
                new DefInputWidget <RecipeDef, SoundDef>(base.Def, "Sound Working", 200, def => def.soundWorking, (def, v) => def.soundWorking      = v, true),
                new DefInputWidget <RecipeDef, StatDef>(base.Def, "Work Speed Stat", 200, def => def.workSpeedStat, (def, v) => def.workSpeedStat   = v, true),
                new DefInputWidget <RecipeDef, StatDef>(base.Def, "Efficiency Stat", 200, def => def.efficiencyStat, (def, v) => def.efficiencyStat = v, true),
                new DefInputWidget <RecipeDef, StatDef>(base.Def, "Work Table Efficiency Stat", 200, def => def.workTableEfficiencyStat, (def, v) => def.workTableEfficiencyStat = v, true),
                new DefInputWidget <RecipeDef, StatDef>(base.Def, "Work Table Speed Stat", 200, def => def.workTableSpeedStat, (def, v) => def.workTableSpeedStat = v, true),
                //new DefInputWidget<RecipeDef, HediffDef>(base.Def, "Adds Hediff", 200, def => def.addsHediff, (def, v) => def.addsHediff = v, true),
                //new DefInputWidget<RecipeDef, HediffDef>(base.Def, "Removes Hediff", 200, def => def.removesHediff, (def, v) => def.removesHediff = v, true),
                new DefInputWidget <RecipeDef, SkillDef>(base.Def, "Work Skill", 200, def => def.workSkill, (def, v) => def.workSkill = v, true),
                new DefInputWidget <RecipeDef, EffecterDef>(base.Def, "Effect Working", 200, def => def.effectWorking, (def, v) => def.effectWorking = v, true),
            };

            this.specialProducts = new PlusMinusArgs <SpecialProductType>()
            {
                allItems       = Enum.GetValues(typeof(SpecialProductType)).OfType <SpecialProductType>().ToList(),
                beingUsed      = () => base.Def.specialProducts,
                onAdd          = (spt) => base.Def.specialProducts = Util.AddTo(base.Def.specialProducts, spt),
                onRemove       = (spt) => base.Def.specialProducts = Util.RemoveFrom(base.Def.specialProducts, spt, true),
                getDisplayName = (spt) => spt.ToString()
            };

            this.forceHiddenSpecialFilters = new PlusMinusArgs <SpecialThingFilterDef>()
            {
                allItems       = DefDatabase <SpecialThingFilterDef> .AllDefs,
                beingUsed      = () => base.Def.forceHiddenSpecialFilters,
                onAdd          = (def) => base.Def.forceHiddenSpecialFilters = Util.AddTo(base.Def.forceHiddenSpecialFilters, def),
                onRemove       = (def) => base.Def.forceHiddenSpecialFilters = Util.RemoveFrom(base.Def.forceHiddenSpecialFilters, def, false),
                getDisplayName = (def) => def.label
            };

            this.recipeUsers = new PlusMinusArgs <ThingDef>()
            {
                allItems       = DefDatabase <ThingDef> .AllDefs,
                beingUsed      = () => base.Def.recipeUsers,
                onAdd          = (def) => base.Def.recipeUsers.Add(def),
                onRemove       = (def) => base.Def.recipeUsers.Remove(def),
                getDisplayName = (def) => def.label
            };

            this.appliedOnFixedBodyParts = new PlusMinusArgs <BodyPartDef>()
            {
                allItems       = DefDatabase <BodyPartDef> .AllDefs,
                beingUsed      = () => base.Def.appliedOnFixedBodyParts,
                onAdd          = (def) => base.Def.appliedOnFixedBodyParts = Util.AddTo(base.Def.appliedOnFixedBodyParts, def),
                onRemove       = (def) => base.Def.appliedOnFixedBodyParts = Util.RemoveFrom(base.Def.appliedOnFixedBodyParts, def, false),
                getDisplayName = (def) => def.label
            };

            this.skillRequirementsPlusMinusArgs = new PlusMinusArgs <SkillDef>()
            {
                allItems    = DefDatabase <SkillDef> .AllDefs,
                isBeingUsed = delegate(SkillDef sd)
                {
                    foreach (var v in base.Def.skillRequirements)
                    {
                        if (v.skill == sd)
                        {
                            return(true);
                        }
                    }
                    return(false);
                },
                onAdd = delegate(SkillDef sd)
                {
                    SkillRequirement sr = new SkillRequirement()
                    {
                        skill = sd, minLevel = 0
                    };
                    base.Def.skillRequirements = Util.AddTo(base.Def.skillRequirements, sr);
                    this.skillRequirements.Add(this.CreateSkillRequirements(sr));
                },
                onRemove = delegate(SkillDef sd)
                {
                    base.Def.skillRequirements.RemoveAll((sr) => sr.skill == sd);
                    this.skillRequirements.RemoveAll((sr) => sr.Parent.skill == sd);
                },
                getDisplayName = (en) => en.ToString()
            };


            /*this.productsPlusMinusArgs = new PlusMinusArgs<ThingDef>()
             * {
             *      allItems = DefDatabase<ThingDef>.AllDefs,
             *      isBeingUsed = delegate (ThingDef td)
             *      {
             *              foreach (var v in base.Def.products)
             *                      if (v.thingDef == td)
             *                              return true;
             *              return false;
             *      },
             *      onAdd = delegate (ThingDef td)
             *      {
             *              ThingDefCountClass tdc = new ThingDefCountClass(td, 0);
             *              base.Def.products = Util.AddAndCreateIfNeeded(base.Def.products, tdc);
             *              this.products.Add(this.CreateThingDefCountClass(tdc));
             *      },
             *      onRemove = delegate (ThingDef def)
             *      {
             *              base.Def.products.RemoveAll((tdc) => tdc.thingDef == def);
             *              base.Def.products = Util.NullIfNeeded(base.Def.products);
             *              this.products.RemoveAll((input) => input.Parent.thingDef == def);
             *      },
             *      getDisplayName = (en) => en.ToString()
             * };*/

            this.Rebuild();
        }
        public TraitWidget(TraitDef def, DefType type) : base(def, type)
        {
            this.inputWidgets = new List <IInputWidget>()
            {
                new FloatInputWidget <TraitDef>(base.Def, "Commonality Male", d => TraitDefStat.GetCommonality(d), (d, v) => TraitDefStat.SetCommonality(d, v)),
                new FloatInputWidget <TraitDef>(base.Def, "Commonality Female", d => TraitDefStat.GetCommonalityFemale(d), (d, v) => TraitDefStat.SetCommonalityFemale(d, v)),
                new BoolInputWidget <TraitDef>(base.Def, "Allow On Hostile", d => d.allowOnHostileSpawn, (d, v) => d.allowOnHostileSpawn = v),
            };

            var dic = new SortedDictionary <string, WorkTags>();

            foreach (var v in Enum.GetValues(typeof(WorkTags)).Cast <WorkTags>())
            {
                if (v != WorkTags.None)
                {
                    dic.Add(v.ToString(), v);
                }
            }
            this.workTags = new List <WorkTags>(dic.Values);
            dic.Clear();
            dic = null;

            this.requiredWorkTags = new PlusMinusArgs <WorkTags>()
            {
                allItems    = this.workTags,
                isBeingUsed = v => (base.Def.requiredWorkTags & v) == v,
                onAdd       = v =>
                {
                    base.Def.requiredWorkTags |= v;
                    base.Def.disabledWorkTags &= ~v;
                },
                onRemove       = v => base.Def.requiredWorkTags &= ~v,
                getDisplayName = v => v.ToString()
            };

            this.disabledWorkTags = new PlusMinusArgs <WorkTags>()
            {
                allItems    = this.workTags,
                isBeingUsed = v => (base.Def.disabledWorkTags & v) == v,
                onAdd       = v =>
                {
                    base.Def.disabledWorkTags |= v;
                    base.Def.requiredWorkTags &= ~v;
                },
                onRemove       = v => base.Def.disabledWorkTags &= ~v,
                getDisplayName = v => v.ToString()
            };

            this.disabledWorkTypes = new PlusMinusArgs <WorkTypeDef>()
            {
                allItems  = DefDatabase <WorkTypeDef> .AllDefs,
                beingUsed = () => base.Def.disabledWorkTypes,
                onAdd     = v =>
                {
                    base.Def.disabledWorkTypes = Util.AddTo(base.Def.disabledWorkTypes, v);
                    base.Def.requiredWorkTypes = Util.RemoveFrom(base.Def.requiredWorkTypes, v);
                },
                onRemove       = v => base.Def.disabledWorkTypes = Util.RemoveFrom(base.Def.disabledWorkTypes, v),
                getDisplayName = v => Util.GetLabel(v)
            };

            this.requiredWorkTypes = new PlusMinusArgs <WorkTypeDef>()
            {
                allItems  = DefDatabase <WorkTypeDef> .AllDefs,
                beingUsed = () => base.Def.requiredWorkTypes,
                onAdd     = v =>
                {
                    base.Def.requiredWorkTypes = Util.AddTo(base.Def.requiredWorkTypes, v);
                    base.Def.disabledWorkTypes = Util.RemoveFrom(base.Def.disabledWorkTypes, v);
                },
                onRemove       = v => base.Def.requiredWorkTypes = Util.RemoveFrom(base.Def.requiredWorkTypes, v),
                getDisplayName = v => Util.GetLabel(v)
            };

            this.conflictingTraits = new PlusMinusArgs <TraitDef>()
            {
                allItems       = DefDatabase <TraitDef> .AllDefs,
                beingUsed      = () => base.Def.conflictingTraits,
                onAdd          = v => base.Def.conflictingTraits = Util.AddTo(base.Def.conflictingTraits, v),
                onRemove       = v => base.Def.conflictingTraits = Util.RemoveFrom(base.Def.conflictingTraits, v),
                getDisplayName = v => Util.GetLabel(v)
            };

            this.Rebuild();
        }