diff --git a/Languages/English/Keyed/TM_English.xml b/Languages/English/Keyed/TM_English.xml index 77604287..798e2604 100644 --- a/Languages/English/Keyed/TM_English.xml +++ b/Languages/English/Keyed/TM_English.xml @@ -309,7 +309,7 @@ Supporting Trait Commonality -**Change class settings only when starting a new game** +**Class settings only affect pawns created after changes** **Any change requires a game restart** Enabled Classes Mages diff --git a/Languages/Spanish/Keyed/TM_Spanish_Caferino.xml b/Languages/Spanish/Keyed/TM_Spanish_Caferino.xml index 67d6fc5d..7109560c 100644 --- a/Languages/Spanish/Keyed/TM_Spanish_Caferino.xml +++ b/Languages/Spanish/Keyed/TM_Spanish_Caferino.xml @@ -176,7 +176,7 @@ -**Cambia la configuración de las clases solo al empezar un nuevo juego** +**La configuración de clase solo afecta a los peones creados después del cambio** **Cualquier cambio requiere un reinicio de juego** Clases Habilitadas Magos diff --git a/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift.cs b/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift.cs index 4d01a29f..013235b2 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift.cs @@ -8,7 +8,7 @@ using UnityEngine; using RimWorld; using AbilityUser; - +using TorannMagic.ModOptions; namespace TorannMagic @@ -81,16 +81,15 @@ public override void Tick() DetermineElementalType(); BeginAssaultCondition(); SpawnCycle(); - ModOptions.SettingsRef settings = new ModOptions.SettingsRef(); if (Find.Storyteller.difficulty.threatScale != 0) { this.STDMultiplier = (float)(Find.Storyteller.difficulty.threatScale / 20f); } - if(settings.riftChallenge < 2f) + if(Settings.Instance.riftChallenge < 2f) { this.difficultyMultiplier = 1f; } - else if(settings.riftChallenge < 3f) + else if(Settings.Instance.riftChallenge < 3f) { this.difficultyMultiplier = .85f; } diff --git a/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift_Defenders.cs b/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift_Defenders.cs index 7d27a432..ad31ff9f 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift_Defenders.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/Building_TMElementalRift_Defenders.cs @@ -8,7 +8,7 @@ using UnityEngine; using RimWorld; using AbilityUser; - +using TorannMagic.ModOptions; namespace TorannMagic @@ -85,16 +85,15 @@ public override void Tick() DetermineElementalType(); BeginAssaultCondition(); SpawnCycle(); - ModOptions.SettingsRef settings = new ModOptions.SettingsRef(); if (Find.Storyteller.difficulty.threatScale != 0) { this.STDMultiplier = (float)(Find.Storyteller.difficulty.threatScale / 20f); } - if(settings.riftChallenge <= 3f) + if(Settings.Instance.riftChallenge <= 3f) { this.difficultyMultiplier = 1f; } - else if(settings.riftChallenge < 3f) + else if(Settings.Instance.riftChallenge < 3f) { this.difficultyMultiplier = .85f; } diff --git a/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMagic.cs b/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMagic.cs index ca8b2a5e..ec336a03 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMagic.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMagic.cs @@ -17,7 +17,6 @@ namespace TorannMagic { [CompilerGenerated] [Serializable] - [StaticConstructorOnStartup] public class CompAbilityUserMagic : CompAbilityUserTMBase { public string LabelKey = "TM_Magic"; @@ -3561,29 +3560,6 @@ private void LoadPowers() } } - public void RemoveTraits() - { - List traits = this.Pawn.story.traits.allTraits; - for (int i = 0; i < traits.Count; i++) - { - if (traits[i].def == TorannMagicDefOf.InnerFire || traits[i].def == TorannMagicDefOf.HeartOfFrost || traits[i].def == TorannMagicDefOf.StormBorn || traits[i].def == TorannMagicDefOf.Arcanist || traits[i].def == TorannMagicDefOf.Paladin || - traits[i].def == TorannMagicDefOf.Druid || traits[i].def == TorannMagicDefOf.Priest || traits[i].def == TorannMagicDefOf.Necromancer || traits[i].def == TorannMagicDefOf.Warlock || traits[i].def == TorannMagicDefOf.Succubus || - traits[i].def == TorannMagicDefOf.TM_Bard || traits[i].def == TorannMagicDefOf.Geomancer || traits[i].def == TorannMagicDefOf.Technomancer || traits[i].def == TorannMagicDefOf.BloodMage || traits[i].def == TorannMagicDefOf.Enchanter || - traits[i].def == TorannMagicDefOf.Chronomancer || traits[i].def == TorannMagicDefOf.ChaosMage || traits[i].def == TorannMagicDefOf.TM_Wanderer) - { - Log.Message("Removing trait " + traits[i].Label); - traits.Remove(traits[i]); - i--; - } - if (this.customClass != null) - { - traits.Remove(this.Pawn.story.traits.GetTrait(this.customClass.classTrait)); - this.customClass = null; - this.customIndex = -2; - } - } - } - public void RemoveTMagicHediffs() { List allHediffs = this.Pawn.health.hediffSet.hediffs; diff --git a/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMight.cs b/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMight.cs index 554e4997..0b0ff828 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMight.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserMight.cs @@ -17,7 +17,6 @@ namespace TorannMagic { [CompilerGenerated] [Serializable] - [StaticConstructorOnStartup] public class CompAbilityUserMight : CompAbilityUserTMBase { public string LabelKey = "TM_Might"; @@ -1668,22 +1667,6 @@ private void ClearPower(MightPower current) base.UpdateAbilities(); } - public void RemoveTraits() - { - List traits = this.Pawn.story.traits.allTraits; - for (int i = 0; i < traits.Count; i++) - { - if (traits[i].def == TorannMagicDefOf.Gladiator || traits[i].def == TorannMagicDefOf.Bladedancer || traits[i].def == TorannMagicDefOf.Ranger || traits[i].def == TorannMagicDefOf.Faceless || - traits[i].def == TorannMagicDefOf.DeathKnight || traits[i].def == TorannMagicDefOf.TM_Psionic || traits[i].def == TorannMagicDefOf.TM_Sniper || traits[i].def == TorannMagicDefOf.TM_Monk || - traits[i].def == TorannMagicDefOf.TM_Wayfarer || traits[i].def == TorannMagicDefOf.TM_Commander || traits[i].def == TorannMagicDefOf.TM_SuperSoldier) - { - Log.Message("Removing trait " + traits[i].Label); - traits.Remove(traits[i]); - i--; - } - } - } - private void LoadPowers(Pawn pawn) { if (pawn.story.traits.HasTrait(TorannMagicDefOf.Gladiator)) diff --git a/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserTMBase.cs b/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserTMBase.cs index 9d7d61f8..4c188564 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserTMBase.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/CompAbilityUserTMBase.cs @@ -110,5 +110,18 @@ protected void DrawMark() DrawMark(material, new Vector3(.28f, 1f, .28f)); } } + + public void RemoveTraits() + { + List traits = Pawn.story.traits.allTraits; + for (int i = traits.Count - 1; i >= 0; i--) + { + if (TM_ClassUtility.AllClassTraits.Contains(traits[i].def)) + { + Log.Message("Removing trait " + traits[i].Label); + Pawn.story.traits.RemoveTrait(traits[i]); + } + } + } } } diff --git a/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMagic.cs b/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMagic.cs index 0dc1839f..697827b8 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMagic.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMagic.cs @@ -1,6 +1,7 @@ using RimWorld; using Verse; using System.Collections.Generic; +using TorannMagic.ModOptions; using UnityEngine; @@ -17,7 +18,7 @@ public override void DoEffect(Pawn user) bool advancedClass = false; string failMessage = ""; CompAbilityUserMagic comp = user.GetCompAbilityUserMagic(); - for (int i = 0; i < TM_ClassUtility.CustomClasses.Count; i++) + for (int i = 0; i < TM_ClassUtility.CustomClasses.Length; i++) { TMDefs.TM_CustomClass cc = TM_ClassUtility.CustomClasses[i]; if (cc.isMage && cc.isAdvancedClass && comp != null) @@ -286,12 +287,12 @@ public override void DoEffect(Pawn user) if (attempts < 50) { int baseClassCount = 17; - int customClassCount = TM_ClassUtility.CustomMageClasses.Count; + int customClassCount = TM_ClassUtility.CustomMageClasses.Length; int rnd = Mathf.RoundToInt(Rand.RangeInclusive(0, baseClassCount + customClassCount)); switch (rnd) { case 0: - if (ModOptions.Settings.Instance.Demonkin) + if (Settings.Demonkin.isEnabled) { if (user.gender == Gender.Male) { @@ -313,7 +314,7 @@ public override void DoEffect(Pawn user) } break; case 15: - if (ModOptions.Settings.Instance.Demonkin) + if (Settings.Demonkin.isEnabled) { if (user.gender == Gender.Male) { @@ -335,7 +336,7 @@ public override void DoEffect(Pawn user) } break; case 1: - if (ModOptions.Settings.Instance.Necromancer) + if (Settings.Necromancer.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Necromancer, 0, false)); } @@ -346,7 +347,7 @@ public override void DoEffect(Pawn user) } break; case 2: - if (ModOptions.Settings.Instance.Druid) + if (Settings.Druid.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Druid, 0, false)); } @@ -357,7 +358,7 @@ public override void DoEffect(Pawn user) } break; case 3: - if (ModOptions.Settings.Instance.Summoner) + if (Settings.Summoner.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Summoner, 0, false)); } @@ -368,7 +369,7 @@ public override void DoEffect(Pawn user) } break; case 4: - if (ModOptions.Settings.Instance.FireMage) + if (Settings.FireMage.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.InnerFire, 0, false)); } @@ -379,7 +380,7 @@ public override void DoEffect(Pawn user) } break; case 5: - if (ModOptions.Settings.Instance.IceMage) + if (Settings.IceMage.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.HeartOfFrost, 0, false)); } @@ -390,7 +391,7 @@ public override void DoEffect(Pawn user) } break; case 6: - if (ModOptions.Settings.Instance.LitMage) + if (Settings.LitMage.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.StormBorn, 0, false)); } @@ -401,7 +402,7 @@ public override void DoEffect(Pawn user) } break; case 7: - if (ModOptions.Settings.Instance.Arcanist) + if (Settings.Arcanist.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Arcanist, 0, false)); } @@ -412,7 +413,7 @@ public override void DoEffect(Pawn user) } break; case 8: - if (ModOptions.Settings.Instance.Priest) + if (Settings.Priest.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Priest, 0, false)); } @@ -423,7 +424,7 @@ public override void DoEffect(Pawn user) } break; case 9: - if (ModOptions.Settings.Instance.Bard) + if (Settings.Bard.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Bard, 0, false)); } @@ -434,7 +435,7 @@ public override void DoEffect(Pawn user) } break; case 10: - if (ModOptions.Settings.Instance.Paladin) + if (Settings.Paladin.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Paladin, 0, false)); } @@ -445,7 +446,7 @@ public override void DoEffect(Pawn user) } break; case 11: - if (ModOptions.Settings.Instance.Geomancer) + if (Settings.Geomancer.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Geomancer, 0, false)); } @@ -456,7 +457,7 @@ public override void DoEffect(Pawn user) } break; case 12: - if (ModOptions.Settings.Instance.Technomancer) + if (Settings.Technomancer.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Technomancer, 0, false)); } @@ -467,7 +468,7 @@ public override void DoEffect(Pawn user) } break; case 13: - if (ModOptions.Settings.Instance.BloodMage) + if (Settings.BloodMage.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.BloodMage, 0, false)); } @@ -478,7 +479,7 @@ public override void DoEffect(Pawn user) } break; case 14: - if (ModOptions.Settings.Instance.Technomancer) + if (Settings.Technomancer.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Enchanter, 0, false)); } @@ -489,7 +490,7 @@ public override void DoEffect(Pawn user) } break; case 16: - if (ModOptions.Settings.Instance.Chronomancer) + if (Settings.Chronomancer.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.Chronomancer, 0, false)); } @@ -500,7 +501,7 @@ public override void DoEffect(Pawn user) } break; case 17: - if (ModOptions.Settings.Instance.ChaosMage) + if (Settings.ChaosMage.isEnabled) { user.story.traits.GainTrait(new Trait(TorannMagicDefOf.ChaosMage, 0, false)); } diff --git a/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMight.cs b/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMight.cs index 5311782a..2ac00337 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMight.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/CompUseEffect_LearnMight.cs @@ -18,7 +18,7 @@ public override void DoEffect(Pawn user) TMDefs.TM_CustomClass cc = null; CompAbilityUserMight comp = user.GetCompAbilityUserMight(); - for (int i = 0; i < TM_ClassUtility.CustomClasses.Count; i++) + for (int i = 0; i < TM_ClassUtility.CustomClasses.Length; i++) { cc = TM_ClassUtility.CustomClasses[i]; if (cc.isFighter && cc.isAdvancedClass && comp != null) diff --git a/RimWorldOfMagic/RimWorldOfMagic/Enchantment/CompEnchantmentMod.cs b/RimWorldOfMagic/RimWorldOfMagic/Enchantment/CompEnchantmentMod.cs index 1d44bd9a..fe970614 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/Enchantment/CompEnchantmentMod.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/Enchantment/CompEnchantmentMod.cs @@ -6,16 +6,9 @@ namespace TorannMagic.Enchantment { - internal class CompEnchantmentMod : Mod + internal class CompEnchantmentMod { - public CompEnchantmentMod(ModContentPack mcp) : base(mcp) - { - LongEventHandler.ExecuteWhenFinished(new Action(CompEnchantmentMod.AddComp)); - LongEventHandler.ExecuteWhenFinished(new Action(CompEnchantmentMod.AddUniversalBodyparts)); - LongEventHandler.ExecuteWhenFinished(new Action(CompEnchantmentMod.FillCloakPool)); - } - - private static void AddComp() + public static void AddComp() { //unrelated, single time load mod check //foreach (ModContentPack p in LoadedModManager.RunningMods) @@ -60,30 +53,26 @@ private static void AddComp() } } - private static void AddUniversalBodyparts() + public static void InitializeUniversalBodyParts() { - IEnumerable universalBodyParts = from def in DefDatabase.AllDefs - where (def.destroyableByDamage) - select def; - foreach (BodyPartDef current1 in universalBodyParts) + // Add all destroyable body parts to Regrowth + foreach (BodyPartDef bodyPartDef in DefDatabase.AllDefs) { - TorannMagicDefOf.UniversalRegrowth.appliedOnFixedBodyParts.AddDistinct(current1); - } + if (!bodyPartDef.destroyableByDamage) continue; - IEnumerable universalPawnTypes = from def in DefDatabase.AllDefs - where (def.category == ThingCategory.Pawn && !def.defName.Contains("TM_") && def.race.IsFlesh) - select def; - foreach (ThingDef current2 in universalPawnTypes) - { - TorannMagicDefOf.UniversalRegrowth.recipeUsers.AddDistinct(current2); - TorannMagicDefOf.AdministerOrbOfTheEternal.recipeUsers.AddDistinct(current2); + TorannMagicDefOf.UniversalRegrowth.appliedOnFixedBodyParts.AddDistinct(bodyPartDef); } - } + // Add all pawn flesh things outside of this mod + foreach (ThingDef thingDef in DefDatabase.AllDefs) + { + if (thingDef.category != ThingCategory.Pawn + || thingDef.defName.StartsWith("TM_") + || !thingDef.race.IsFlesh) continue; - private static void FillCloakPool() - { - ModOptions.Constants.InitializeCloaks(); - } + TorannMagicDefOf.UniversalRegrowth.recipeUsers.AddDistinct(thingDef); + TorannMagicDefOf.AdministerOrbOfTheEternal.recipeUsers.AddDistinct(thingDef); + } + } } } diff --git a/RimWorldOfMagic/RimWorldOfMagic/HarmonyPatches.cs b/RimWorldOfMagic/RimWorldOfMagic/HarmonyPatches.cs index 04f5d779..356f9073 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/HarmonyPatches.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/HarmonyPatches.cs @@ -16,6 +16,7 @@ using TorannMagic.TMDefs; using TorannMagic.Golems; using System.Diagnostics; +using TorannMagic.ModOptions; using TorannMagic.Utils; namespace TorannMagic @@ -472,18 +473,18 @@ private static bool Prefix(TraitSet __instance, Trait trait, Pawn ___pawn) } private static void Postfix(TraitSet __instance, Trait trait, Pawn ___pawn) { - List acList = TM_ClassUtility.CustomAdvancedClasses; - for (int i = 0; i < acList.Count; i++) + TMDefs.TM_CustomClass[] advancedClasses = TM_ClassUtility.CustomAdvancedClasses; + for (int i = 0; i < advancedClasses.Length; i++) { - if (trait.def == acList[i].classTrait) + if (trait.def == advancedClasses[i].classTrait) { - if (acList[i].isMage) + if (advancedClasses[i].isMage) { CompAbilityUserMagic targetComp = ___pawn.GetCompAbilityUserMagic(); targetComp.CompTick(); targetComp.AddAdvancedClass(TM_ClassUtility.GetCustomClassOfTrait(trait.def)); } - if (acList[i].isFighter) + if (advancedClasses[i].isFighter) { CompAbilityUserMight targetComp = ___pawn.GetCompAbilityUserMight(); targetComp.CompTick(); @@ -2993,7 +2994,7 @@ public static void TM_Children_TrySpawnHatchedOrBornPawn_Tweak(ref Pawn pawn, Th i--; hasFighterTrait = true; } - for (int j = 0; j < TM_ClassUtility.CustomClasses.Count; j++) + for (int j = 0; j < TM_ClassUtility.CustomClasses.Length; j++) { if (TM_ClassUtility.CustomClasses[j].classTrait == pawnTraits[i].def) { @@ -3195,7 +3196,7 @@ public static void Pawn_Gizmo_ActionPatch(ref IEnumerable __result, Pawn } } } - if (ModOptions.Settings.Instance.Wanderer && __instance.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) + if (Settings.Wanderer.isEnabled && __instance.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) { //Pawn p = __instance; //Command_Action itemWanderer = new Command_Action @@ -3216,7 +3217,7 @@ public static void Pawn_Gizmo_ActionPatch(ref IEnumerable __result, Pawn } } - if (ModOptions.Settings.Instance.Wayfarer && __instance.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy)) + if (Settings.Wayfarer.isEnabled && __instance.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy)) { //Pawn p = __instance; //Command_Action itemWayfarer = new Command_Action @@ -3262,7 +3263,7 @@ public static void Pawn_Gizmo_TogglePatch(ref IEnumerable __result, ref P CompAbilityUserMight compMight = __instance.GetCompAbilityUserMight(); var gizmoList = __result.ToList(); bool canBecomeClassless = false; - if (ModOptions.Settings.Instance.Wanderer && __instance.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) + if (Settings.Wanderer.isEnabled && __instance.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) { //Pawn p = __instance; //Command_Action itemWanderer = new Command_Action @@ -3284,7 +3285,7 @@ public static void Pawn_Gizmo_TogglePatch(ref IEnumerable __result, ref P } } - if (ModOptions.Settings.Instance.Wayfarer && __instance.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy)) + if (Settings.Wayfarer.isEnabled && __instance.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy)) { //Pawn p = __instance; //Command_Action itemWayfarer = new Command_Action @@ -5162,935 +5163,157 @@ private static bool Prefix(AbilityAIDef __instance, Pawn caster, LocalTargetInfo } } - [HarmonyPatch(typeof(PawnGenerator), "GenerateTraits", null)] - public static class PawnGenerator_Patch + private static void GetValidTraits( + Pawn pawn, + HashSet validMagicTraits, + HashSet validMightTraits, + HashSet validMagicSupportTraits, + HashSet validMightSupportTraits, + ref bool isMagicallyGiftedValid, + ref bool isPhysicalProdigyValid) { - private static void Postfix(Pawn pawn) + // Inner function to set variables as needed + void handleTraitDef(TraitDef traitDef, ref bool gifted, ref bool prodigy) { - List allTraits = DefDatabase.AllDefsListForReading; - List pawnTraits = pawn.story.traits.allTraits; - - bool flag = pawnTraits != null; - bool anyFightersEnabled = false; - bool anyMagesEnabled = false; - int baseCount = 6; - int mageCount = 18; - int fighterCount = 11; - int supportingFighterCount = 2; - int supportingMageCount = 5; - float fighterFactor = 1f; - float mageFactor = 1f; - if (pawn.Faction != null) + if (traitDef == TorannMagicDefOf.TM_Gifted) gifted = false; + else if (traitDef == TorannMagicDefOf.PhysicalProdigy) prodigy = false; + else { - if (ModOptions.Settings.Instance.FactionFighterSettings.ContainsKey(pawn.Faction.def.defName)) - { - fighterFactor = ModOptions.Settings.Instance.FactionFighterSettings[pawn.Faction.def.defName]; - } - if (ModOptions.Settings.Instance.FactionMageSettings.ContainsKey(pawn.Faction.def.defName)) - { - mageFactor = ModOptions.Settings.Instance.FactionMageSettings[pawn.Faction.def.defName]; - } + if (validMagicSupportTraits.Remove(traitDef)) return; + if (validMightSupportTraits.Remove(traitDef)) return; + // must do both of these as there are some classes in both + validMagicTraits.Remove(traitDef); + validMightTraits.Remove(traitDef); } - if (TM_ClassUtility.CustomFighterClasses == null) + } + // Handle Backstories + for (int bsIndex = pawn.story.AllBackstories.Count - 1; bsIndex >= 0; bsIndex--) + { + List conflictingTraits = pawn.story.AllBackstories[bsIndex].disallowedTraits; + if (conflictingTraits == null) continue; + for (int conflictIndex = conflictingTraits.Count - 1; conflictIndex >= 0; conflictIndex--) { - TM_ClassUtility.LoadCustomClasses(); + TraitDef conflictTrait = conflictingTraits[conflictIndex].def; + handleTraitDef(conflictTrait, ref isMagicallyGiftedValid, ref isPhysicalProdigyValid); } - if (TM_ClassUtility.CustomMageClasses == null) + } + // Handle conflicting traits + for (int traitIndex = pawn.story.traits.allTraits.Count - 1; traitIndex >= 0; traitIndex--) + { + List conflictingTraits = pawn.story.traits.allTraits[traitIndex].def.conflictingTraits; + for (int conflictIndex = conflictingTraits.Count - 1; conflictIndex >= 0; conflictIndex--) { - TM_ClassUtility.LoadCustomClasses(); + TraitDef conflictTrait = conflictingTraits[conflictIndex]; + handleTraitDef(conflictTrait, ref isMagicallyGiftedValid, ref isPhysicalProdigyValid); } + } - List customFighters = TM_ClassUtility.CustomFighterClasses; - List customMages = TM_ClassUtility.CustomMageClasses; + // Run the validators for traits with special rules. Remove if they break the rule. + foreach (KeyValuePair> pair in TM_ClassUtility.ClassSpawnValidators) + { + if (pair.Value(pawn)) continue; - mageCount += customMages.Count; - fighterCount += customFighters.Count; - if (customFighters.Count > 0 || ModOptions.Settings.Instance.Gladiator || ModOptions.Settings.Instance.Bladedancer || ModOptions.Settings.Instance.Ranger || ModOptions.Settings.Instance.Sniper || ModOptions.Settings.Instance.Faceless || ModOptions.Settings.Instance.DeathKnight || ModOptions.Settings.Instance.Psionic || ModOptions.Settings.Instance.Monk || ModOptions.Settings.Instance.Wayfarer || ModOptions.Settings.Instance.Commander || ModOptions.Settings.Instance.SuperSoldier) + validMagicTraits.Remove(pair.Key); + validMightTraits.Remove(pair.Key); + } + } + + [HarmonyPatch(typeof(PawnGenerator), "GenerateTraits", null)] + public static class PawnGenerator_Patch + { + private static void Postfix(Pawn pawn) + { + List pawnTraits = pawn.story.traits.allTraits; + if (pawnTraits == null) return; + + HashSet validMagicTraits = + new HashSet(TM_ClassUtility.EnabledMageClasses); + HashSet validMightTraits = + new HashSet(TM_ClassUtility.EnabledFighterClasses); + HashSet validMagicSupportTraits = + new HashSet(TM_ClassUtility.EnabledMageSupportClasses); + HashSet validMightSupportTraits = + new HashSet(TM_ClassUtility.EnabledFighterSupportClasses); + bool isMagicallyGiftedValid = true; + bool isPhysicalProdigyValid = true; + GetValidTraits( + pawn, validMagicTraits, validMightTraits, validMagicSupportTraits, validMightSupportTraits, + ref isMagicallyGiftedValid, ref isPhysicalProdigyValid); + + + var inst = Settings.Instance; + + float fighterFactor = 1; + float mageFactor = 1; + if (pawn.Faction?.def?.defName != null) { - anyFightersEnabled = true; + fighterFactor = inst.FactionFighterSettings.TryGetValue(pawn.Faction?.def?.defName, 1f); + mageFactor = inst.FactionMageSettings.TryGetValue(pawn.Faction?.def?.defName, 1f); } - if (customMages.Count > 0 || ModOptions.Settings.Instance.Arcanist || ModOptions.Settings.Instance.FireMage || ModOptions.Settings.Instance.IceMage || ModOptions.Settings.Instance.LitMage || ModOptions.Settings.Instance.Druid || ModOptions.Settings.Instance.Paladin || ModOptions.Settings.Instance.Summoner || ModOptions.Settings.Instance.Priest || ModOptions.Settings.Instance.Necromancer || ModOptions.Settings.Instance.Bard || ModOptions.Settings.Instance.Demonkin || ModOptions.Settings.Instance.Geomancer || ModOptions.Settings.Instance.Technomancer || ModOptions.Settings.Instance.BloodMage || ModOptions.Settings.Instance.Enchanter || ModOptions.Settings.Instance.Chronomancer || ModOptions.Settings.Instance.Wanderer || ModOptions.Settings.Instance.ChaosMage) + + + float baseMageChance = mageFactor * inst.baseMageChance * (isMagicallyGiftedValid ? 1 : 0); + float baseFighterChance = fighterFactor * inst.baseFighterChance * (isPhysicalProdigyValid ? 1 : 0); + float advMageChance = mageFactor * inst.advMageChance * (validMagicTraits.Count > 0 ? 1 : 0); + float advFighterChance = fighterFactor * inst.advFighterChance * (validMightTraits.Count > 0 ? 1 : 0); + + float sum = baseMageChance + baseFighterChance + advMageChance + advFighterChance; + if (sum >= 1f) // If over 100% total, make each chance proportional to the total { - anyMagesEnabled = true; + baseMageChance /= sum; + baseFighterChance /= sum; + advFighterChance /= sum; + // advMageChance is not needed to be calculated } - if (flag) + + float diceRoll = Rand.Range(0, 1f); + + // These log messages will tell you the classes available to spawn and the percentage of each group + // + // Log.Warning($"mage pre: {baseMageChance}"); + // Log.Warning($"fight pre: {baseFighterChance}"); + // Log.Warning($"{string.Join(", ", validMightTraits)} {advFighterChance:F3}"); + // Log.Warning($"{string.Join(", ", validMagicTraits)} {advMageChance:F3} ({advMageChance/sum:F3})"); + // Log.Warning($"diceRoll: {diceRoll}"); + + if (diceRoll < sum) { - float baseMageChance = mageFactor * ModOptions.Settings.Instance.baseMageChance * baseCount; - float baseFighterChance = fighterFactor * ModOptions.Settings.Instance.baseFighterChance * baseCount; - float advMageChance = mageCount * ModOptions.Settings.Instance.advMageChance * mageFactor; - float advFighterChance = fighterCount * ModOptions.Settings.Instance.advFighterChance * fighterFactor; + if (pawnTraits.Count > 0) pawnTraits.RemoveAt(0); // Make sure there is room - if (false) //ModCheck.Validate.AlienHumanoidRaces.IsInitialized()) + // Gifted + if (diceRoll < baseMageChance) + pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Gifted)); + // Prodigy + else if (diceRoll >= baseMageChance && diceRoll < baseMageChance + baseFighterChance) + pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.PhysicalProdigy)); + // Fighter + else if (diceRoll >= baseMageChance + baseFighterChance && + diceRoll < baseMageChance + baseFighterChance + advFighterChance) { - if (Rand.Chance(((baseFighterChance) + (baseMageChance) + (advFighterChance) + (advMageChance)) / (allTraits.Count))) - { - if (pawnTraits.Count > 0) - { - pawnTraits.Remove(pawnTraits[pawnTraits.Count - 1]); - } - float rnd = Rand.Range(0, baseMageChance + baseFighterChance + advMageChance + advFighterChance); - if (rnd < (baseMageChance) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Gifted, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Gifted) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Gifted))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Gifted, 0, false)); - } - else if (rnd >= baseMageChance && rnd < (baseMageChance + baseFighterChance) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.PhysicalProdigy, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.PhysicalProdigy) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.PhysicalProdigy))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.PhysicalProdigy, 0, false)); - } - else if (rnd >= (baseMageChance + baseFighterChance) && rnd < (baseMageChance + baseFighterChance + advFighterChance)) - { - if (anyFightersEnabled) - { - int rndF = Rand.RangeInclusive(1, fighterCount); - switch (rndF) - { - case 1: - //Gladiator:; - if (ModOptions.Settings.Instance.Gladiator && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Gladiator, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Gladiator) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Gladiator))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Gladiator, 0, false)); - } - //else - //{ - // goto Sniper; - //} - break; - case 2: - //Sniper:; - if (ModOptions.Settings.Instance.Sniper && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Sniper, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Sniper) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Sniper))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Sniper, 0, false)); - } - //else - //{ - // goto Bladedancer; - //} - break; - case 3: - Bladedancer:; - if (ModOptions.Settings.Instance.Bladedancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Bladedancer, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Bladedancer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Bladedancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Bladedancer, 0, false)); - } - //else - //{ - // goto Ranger; - //} - break; - case 4: - Ranger:; - if (ModOptions.Settings.Instance.Ranger && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Ranger, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Ranger) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Ranger))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Ranger, 0, false)); - } - //else - //{ - // goto Faceless; - //} - break; - case 5: - Faceless:; - if (ModOptions.Settings.Instance.Faceless && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Faceless, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Faceless) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Faceless))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Faceless, 0, false)); - } - //else - //{ - // goto Psionic; - //} - break; - case 6: - Psionic:; - if (ModOptions.Settings.Instance.Psionic && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Psionic, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Psionic) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Psionic))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Psionic, 0, false)); - } - //else - //{ - // goto DeathKnight; - //} - break; - case 7: - DeathKnight:; - if (ModOptions.Settings.Instance.DeathKnight && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.DeathKnight, 0)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.DeathKnight) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.DeathKnight))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.DeathKnight, 0, false)); - } - //else - //{ - // goto Monk; - //} - break; - case 8: - Monk:; - if (ModOptions.Settings.Instance.Monk && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Monk, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Monk) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Monk))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Monk, 4, false)); - } - //else - //{ - // goto Wayfarer; - //} - break; - case 9: - Wayfarer:; - if (ModOptions.Settings.Instance.Wayfarer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Wayfarer, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Wayfarer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Wayfarer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Wayfarer, 4, false)); - } - //else - //{ - // goto Commander; - //} - break; - case 10: - Commander:; - if (ModOptions.Settings.Instance.Commander && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Commander, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Commander) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Commander))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Commander, 4, false)); - } - //else - //{ - // goto SuperSoldier; - //} - break; - case 11: - SuperSoldier:; - if (ModOptions.Settings.Instance.SuperSoldier && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_SuperSoldier, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_SuperSoldier) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_SuperSoldier))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_SuperSoldier, 4, false)); - } - //else - //{ - // goto Gladiator; - //} - break; - case int val when rndF > 11: - TMDefs.TM_CustomClass cFighter = TM_ClassUtility.GetRandomCustomFighter(); - if (!pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(cFighter.classTrait, cFighter.traitDegree)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, cFighter.classTrait) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(cFighter.classTrait))) - { - pawn.story.traits.GainTrait(new Trait(cFighter.classTrait, cFighter.traitDegree, false)); - } - break; - } - } - else - { - goto TraitEnd; - } - } - else - { - if (anyMagesEnabled) - { - int rndM = Rand.RangeInclusive(1, (mageCount + 1)); - switch (rndM) - { - case 1: - FireMage:; - if (ModOptions.Settings.Instance.FireMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.InnerFire, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.InnerFire) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.InnerFire))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.InnerFire, 4, false)); - } - //else - //{ - // goto IceMage; - //} - break; - case 2: - IceMage:; - if (ModOptions.Settings.Instance.IceMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.HeartOfFrost, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.HeartOfFrost) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.HeartOfFrost))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.HeartOfFrost, 4, false)); - } - //else - //{ - // goto LitMage; - //} - break; - case 3: - LitMage:; - if (ModOptions.Settings.Instance.LitMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.StormBorn, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.StormBorn) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.StormBorn))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.StormBorn, 4, false)); - } - //else - //{ - // goto Arcanist; - //} - break; - case 4: - Arcanist:; - if (ModOptions.Settings.Instance.Arcanist && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Arcanist, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Arcanist) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Arcanist))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Arcanist, 4, false)); - } - //else - //{ - // goto Druid; - //} - break; - case 5: - Druid:; - if (ModOptions.Settings.Instance.Druid && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Druid, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Druid) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Druid))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Druid, 4, false)); - } - //else - //{ - // goto Paladin; - //} - break; - case 6: - Paladin:; - if (ModOptions.Settings.Instance.Paladin && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Paladin, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Paladin) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Paladin))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Paladin, 4, false)); - } - //else - //{ - // goto Summoner; - //} - break; - case 7: - Summoner:; - if (ModOptions.Settings.Instance.Summoner && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Summoner, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Summoner) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Summoner))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Summoner, 4, false)); - } - //else - //{ - // goto Necromancer; - //} - break; - case 8: - Necromancer:; - if (ModOptions.Settings.Instance.Necromancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Necromancer, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Necromancer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Necromancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Necromancer, 4, false)); - } - //else - //{ - // goto Priest; - //} - break; - case 9: - Priest:; - if (ModOptions.Settings.Instance.Priest && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Priest, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Priest) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Priest))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Priest, 4, false)); - } - //else - //{ - // goto Demonkin; - //} - break; - case 10: - Demonkin:; - if (ModOptions.Settings.Instance.Demonkin && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Warlock, 4)) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Succubus, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Succubus) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Warlock) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Succubus))) - { - if (pawn.gender != Gender.Female) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 4, false)); - } - else - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 4, false)); - } - } - //else - //{ - // goto Bard; - //} - break; - case 11: - if (ModOptions.Settings.Instance.Demonkin && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Warlock, 4)) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Succubus, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Succubus) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Warlock) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Warlock))) - { - if (pawn.gender != Gender.Male) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 4, false)); - } - else - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 4, false)); - } - } - //else - //{ - // goto Bard; - //} - break; - case 12: - Bard:; - if (ModOptions.Settings.Instance.Bard && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Bard, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Bard) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Bard))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Bard, 0, false)); - } - //else - //{ - // goto Geomancer; - //} - break; - case 13: - Geomancer:; - if (ModOptions.Settings.Instance.Geomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Geomancer, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Geomancer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Geomancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Geomancer, 4, false)); - } - //else - //{ - // goto Technomancer; - //} - break; - case 14: - Technomancer:; - if (ModOptions.Settings.Instance.Technomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Technomancer, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Technomancer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Technomancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Technomancer, 4, false)); - } - //else - //{ - // goto BloodMage; - //} - break; - case 15: - BloodMage:; - if (ModOptions.Settings.Instance.Technomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.BloodMage, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.BloodMage) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.BloodMage))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.BloodMage, 4, false)); - } - //else - //{ - // goto Enchanter; - //} - break; - case 16: - Enchanter:; - if (ModOptions.Settings.Instance.Technomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Enchanter, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Enchanter) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Enchanter))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Enchanter, 4, false)); - } - //else - //{ - // goto Chronomancer; - //} - break; - case 17: - Chronomancer:; - if (ModOptions.Settings.Instance.Chronomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Chronomancer, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.Chronomancer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Chronomancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Chronomancer, 4, false)); - } - //else - //{ - // goto Wanderer; - //} - break; - case 18: - Wanderer:; - if (ModOptions.Settings.Instance.Wanderer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Wanderer, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.TM_Wanderer) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Wanderer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Wanderer, 4, false)); - } - //else - //{ - // goto ChaosMage; - //} - break; - case 19: - ChaosMage:; - if (ModOptions.Settings.Instance.ChaosMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.ChaosMage, 4)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, TorannMagicDefOf.ChaosMage) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.ChaosMage))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.ChaosMage, 4, false)); - } - //else - //{ - // goto FireMage; - //} - break; - case int val when rndM > 19: - TMDefs.TM_CustomClass cMage = customMages.RandomElement(); - if (!pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(cMage.classTrait, cMage.traitDegree)) && ModCheck.AlienHumanoidRaces.TryGetBackstory_DisallowedTrait(pawn.def, pawn, cMage.classTrait) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(cMage.classTrait))) - { - pawn.story.traits.GainTrait(new Trait(cMage.classTrait, cMage.traitDegree, false)); - } - break; - } - } - else - { - goto TraitEnd; - } - } - } + TraitDef traitDef = validMightTraits.RandomElement(); + pawn.story.traits.GainTrait(new Trait( + traitDef, TM_ClassUtility.CustomClassTraitMap.TryGetValue(traitDef.index)?.traitDegree ?? 0)); } + // Mage else { - if (Rand.Chance((baseMageChance + baseFighterChance + advMageChance + advFighterChance) / (allTraits.Count))) - { - - if (pawnTraits.Count > 0) - { - pawnTraits.Remove(pawnTraits[pawnTraits.Count - 1]); - } - float rnd = Rand.Range(0, baseMageChance + baseFighterChance + advFighterChance + advMageChance); - if (rnd < (baseMageChance) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Gifted, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Gifted))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Gifted, 0, false)); - } - else if (rnd >= baseMageChance && rnd < (baseMageChance + baseFighterChance) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.PhysicalProdigy, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.PhysicalProdigy))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.PhysicalProdigy, 0, false)); - } - else if (rnd >= (baseMageChance + baseFighterChance) && rnd < (baseMageChance + baseFighterChance + advFighterChance)) - { - if (anyFightersEnabled) - { - int rndF = Rand.RangeInclusive(1, fighterCount); - switch (rndF) - { - case 1: - //Gladiator:; - if (ModOptions.Settings.Instance.Gladiator && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Gladiator, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Gladiator))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Gladiator, 0, false)); - } - //else - //{ - // goto Sniper; - //} - break; - case 2: - //Sniper:; - if (ModOptions.Settings.Instance.Sniper && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Sniper, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Sniper))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Sniper, 0, false)); - } - //else - //{ - // goto Bladedancer; - //} - break; - case 3: - Bladedancer:; - if (ModOptions.Settings.Instance.Bladedancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Bladedancer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Bladedancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Bladedancer, 0, false)); - } - //else - //{ - // goto Ranger; - //} - break; - case 4: - Ranger:; - if (ModOptions.Settings.Instance.Ranger && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Ranger, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Ranger))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Ranger, 0, false)); - } - //else - //{ - // goto Faceless; - //} - break; - case 5: - Faceless:; - if (ModOptions.Settings.Instance.Faceless && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Faceless, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Faceless))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Faceless, 0, false)); - } - //else - //{ - // goto Psionic; - //} - break; - case 6: - Psionic:; - if (ModOptions.Settings.Instance.Psionic && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Psionic, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Psionic))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Psionic, 0, false)); - } - //else - //{ - // goto DeathKnight; - //} - break; - case 7: - DeathKnight:; - if (ModOptions.Settings.Instance.DeathKnight && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.DeathKnight, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.DeathKnight))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.DeathKnight, 0, false)); - } - //else - //{ - // goto Monk; - //} - break; - case 8: - Monk:; - if (ModOptions.Settings.Instance.Monk && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Monk, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Monk))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Monk, 0, false)); - } - //else - //{ - // goto Wayfarer; - //} - break; - case 9: - Wayfarer:; - if (ModOptions.Settings.Instance.Wayfarer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Wayfarer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Wayfarer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Wayfarer, 0, false)); - } - //else - //{ - // goto Commander; - //} - break; - case 10: - Commander:; - if (ModOptions.Settings.Instance.Commander && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Commander, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Commander))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Commander, 0, false)); - } - //else - //{ - // goto SuperSoldier; - //} - break; - case 11: - SuperSoldier:; - if (ModOptions.Settings.Instance.SuperSoldier && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_SuperSoldier, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_SuperSoldier))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_SuperSoldier, 0, false)); - } - //else - //{ - // goto Gladiator; - //} - break; - case int val when rndF > 11: - TMDefs.TM_CustomClass cFighter = customFighters.RandomElement(); - if (!pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(cFighter.classTrait, cFighter.traitDegree)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(cFighter.classTrait))) - { - pawn.story.traits.GainTrait(new Trait(cFighter.classTrait, cFighter.traitDegree, false)); - } - break; - } - } - else - { - goto TraitEnd; - } - } - else - { - if (anyMagesEnabled) - { - int rndM = Rand.RangeInclusive(1, (mageCount + 1)); - switch (rndM) - { - case 1: - FireMage:; - if (ModOptions.Settings.Instance.FireMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.InnerFire, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.InnerFire))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.InnerFire, 0, false)); - } - //else - //{ - // goto IceMage; - //} - break; - case 2: - IceMage:; - if (ModOptions.Settings.Instance.IceMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.HeartOfFrost, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.HeartOfFrost))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.HeartOfFrost, 0, false)); - } - //else - //{ - // goto LitMage; - //} - break; - case 3: - LitMage:; - if (ModOptions.Settings.Instance.LitMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.StormBorn, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.StormBorn))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.StormBorn, 0, false)); - } - //else - //{ - // goto Arcanist; - //} - break; - case 4: - Arcanist:; - if (ModOptions.Settings.Instance.Arcanist && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Arcanist, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Arcanist))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Arcanist, 0, false)); - } - //else - //{ - // goto Druid; - //} - break; - case 5: - Druid:; - if (ModOptions.Settings.Instance.Druid && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Druid, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Druid))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Druid, 0, false)); - } - //else - //{ - // goto Paladin; - //} - break; - case 6: - Paladin:; - if (ModOptions.Settings.Instance.Paladin && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Paladin, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Paladin))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Paladin, 0, false)); - } - //else - //{ - // goto Summoner; - //} - break; - case 7: - Summoner:; - if (ModOptions.Settings.Instance.Summoner && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Summoner, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Summoner))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Summoner, 0, false)); - } - //else - //{ - // goto Necromancer; - //} - break; - case 8: - Necromancer:; - if (ModOptions.Settings.Instance.Necromancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Necromancer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Necromancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Necromancer, 0, false)); - } - //else - //{ - // goto Priest; - //} - break; - case 9: - Priest:; - if (ModOptions.Settings.Instance.Priest && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Priest, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Priest))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Priest, 0, false)); - } - //else - //{ - // goto Demonkin; - //} - break; - case 10: - Demonkin:; - if (ModOptions.Settings.Instance.Demonkin && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Warlock, 0)) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Succubus, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Succubus)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Warlock))) - { - if (pawn.gender != Gender.Female) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 0, false)); - } - else - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 0, false)); - } - } - //else - //{ - // goto Bard; - //} - break; - case 11: - if (ModOptions.Settings.Instance.Demonkin && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Warlock, 0)) && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Succubus, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Succubus)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Warlock))) - { - if (pawn.gender != Gender.Male) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Succubus, 0, false)); - } - else - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Warlock, 0, false)); - } - } - //else - //{ - // goto Bard; - //} - break; - case 12: - Bard:; - if (ModOptions.Settings.Instance.Bard && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Bard, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Bard))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Bard, 0, false)); - } - //else - //{ - // goto Geomancer; - //} - break; - case 13: - Geomancer:; - if (ModOptions.Settings.Instance.Geomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Geomancer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Geomancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Geomancer, 0, false)); - } - //else - //{ - // goto Technomancer; - //} - break; - case 14: - Technomancer:; - if (ModOptions.Settings.Instance.Technomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Technomancer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Technomancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Technomancer, 0, false)); - } - //else - //{ - // goto BloodMage; - //} - break; - case 15: - BloodMage:; - if (ModOptions.Settings.Instance.Technomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.BloodMage, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.BloodMage))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.BloodMage, 0, false)); - } - //else - //{ - // goto Enchanter; - //} - break; - case 16: - Enchanter:; - if (ModOptions.Settings.Instance.Technomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Enchanter, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Enchanter))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Enchanter, 0, false)); - } - //else - //{ - // goto Chronomancer; - //} - break; - case 17: - Chronomancer:; - if (ModOptions.Settings.Instance.Chronomancer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.Chronomancer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.Chronomancer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.Chronomancer, 0, false)); - } - //else - //{ - // goto Wanderer; - //} - break; - case 18: - Wanderer:; - if (ModOptions.Settings.Instance.Wanderer && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_Wanderer, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_Wanderer))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_Wanderer, 0, false)); - } - //else - //{ - // goto ChaosMage; - //} - break; - case 19: - ChaosMage:; - if (ModOptions.Settings.Instance.ChaosMage && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.ChaosMage, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.ChaosMage))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.ChaosMage, 0, false)); - } - //else - //{ - // goto FireMage; - //} - break; - case int val when rndM > 19: - TMDefs.TM_CustomClass cMage = customMages.RandomElement(); - if (!pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(cMage.classTrait, cMage.traitDegree)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(cMage.classTrait))) - { - pawn.story.traits.GainTrait(new Trait(cMage.classTrait, cMage.traitDegree, false)); - } - break; - } - } - else - { - goto TraitEnd; - } - } - } + TraitDef traitDef = validMagicTraits.RandomElement(); + pawn.story.traits.GainTrait(new Trait( + traitDef, TM_ClassUtility.CustomClassTraitMap.TryGetValue(traitDef.index)?.traitDegree ?? 0)); } + } - if (Rand.Chance(ModOptions.Settings.Instance.supportTraitChance)) + if (Rand.Chance(inst.supportTraitChance)) + { + if (TM_Calc.IsMagicUser(pawn) || pawn.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) { - if (TM_Calc.IsMagicUser(pawn) || pawn.story.traits.HasTrait(TorannMagicDefOf.TM_Gifted)) - { - int rndS = Rand.RangeInclusive(1, supportingMageCount); - switch (rndS) - { - case 1: - if (ModOptions.Settings.Instance.ArcaneConduit && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_ArcaneConduitTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_ArcaneConduitTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_ArcaneConduitTD, 0, false)); - } - break; - case 2: - if (ModOptions.Settings.Instance.ManaWell && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_ManaWellTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_ManaWellTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_ManaWellTD, 0, false)); - } - break; - case 3: - if(ModOptions.Settings.Instance.FaeBlood && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_FaeBloodTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_FaeBloodTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_FaeBloodTD, 0, false)); - } - break; - case 4: - if (ModOptions.Settings.Instance.Enlightened && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_EnlightenedTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_EnlightenedTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_EnlightenedTD, 0, false)); - } - break; - case 5: - if (ModOptions.Settings.Instance.Cursed && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_CursedTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_CursedTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_CursedTD, 0, false)); - } - break; - } - } - else if (TM_Calc.IsMightUser(pawn) || pawn.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy)) - { - int rndS = Rand.RangeInclusive(1, supportingFighterCount); - switch (rndS) - { - case 1: - if (ModOptions.Settings.Instance.Boundless && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_BoundlessTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_BoundlessTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_BoundlessTD, 0, false)); - } - break; - case 2: - if (ModOptions.Settings.Instance.GiantsBlood && !pawn.story.AllBackstories.Any(bs => bs.DisallowsTrait(TorannMagicDefOf.TM_GiantsBloodTD, 0)) && !pawn.story.traits.allTraits.Any(td => td.def.conflictingTraits.Contains(TorannMagicDefOf.TM_GiantsBloodTD))) - { - pawn.story.traits.GainTrait(new Trait(TorannMagicDefOf.TM_GiantsBloodTD, 0, false)); - } - break; - } - } + pawn.story.traits.GainTrait(new Trait(validMagicSupportTraits.RandomElement())); + } + else if (TM_Calc.IsMightUser(pawn) || pawn.story.traits.HasTrait(TorannMagicDefOf.PhysicalProdigy)) + { + pawn.story.traits.GainTrait(new Trait(validMightSupportTraits.RandomElement())); } } - TraitEnd:; } } diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ClassOptionsWindow.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ClassOptionsWindow.cs index 4ae901e3..d5a924de 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ClassOptionsWindow.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ClassOptionsWindow.cs @@ -26,225 +26,148 @@ public ClassOptionsWindow() public override void DoWindowContents(Rect inRect) { - int num = 0; + var inst = Settings.Instance; + int row = 0; float rowHeight = 28f; - Rect sRect = new Rect(inRect.x, inRect.y, inRect.width - 36f, inRect.height + 296f + TM_ClassUtility.CustomClasses.Count * 40); + Rect sRect = new Rect(inRect.x, inRect.y, inRect.width - 36f, inRect.height + 296f + TM_ClassUtility.CustomClasses.Length * 40); scrollPosition = GUI.BeginScrollView(inRect, scrollPosition, sRect, false, true); //GUI.BeginGroup(inRect); - + Text.Font = GameFont.Medium; float x = Text.CalcSize("TM_ClassOptions".Translate()).x; - Rect headerRect = new Rect(inRect.width / 2f - (x / 2), inRect.y, inRect.width, ClassOptionsWindow.HeaderSize); + Rect headerRect = new Rect(inRect.width / 2f - (x / 2), inRect.y, inRect.width, HeaderSize); Widgets.Label(headerRect, "TM_ClassOptions".Translate()); Text.Font = GameFont.Small; GUI.color = Color.yellow; x = Text.CalcSize("TM_ClassWarning".Translate()).x; - Rect warningRect = new Rect(inRect.width / 2f - (x / 2), inRect.y + ClassOptionsWindow.HeaderSize + 4f, inRect.width, ClassOptionsWindow.TextSize); + Rect warningRect = new Rect(inRect.width / 2f - (x / 2), inRect.y + HeaderSize + 4f, inRect.width, TextSize); Widgets.Label(warningRect, "TM_ClassWarning".Translate()); - x = Text.CalcSize("TM_RequiresRestart".Translate()).x; - Rect restartRect = new Rect(inRect.width / 2f - (x / 2), inRect.y + ClassOptionsWindow.HeaderSize + ClassOptionsWindow.TextSize + 4f, inRect.width, ClassOptionsWindow.TextSize); - Widgets.Label(restartRect, "TM_RequiresRestart".Translate()); + // x = Text.CalcSize("TM_RequiresRestart".Translate()).x; + // Rect restartRect = new Rect(inRect.width / 2f - (x / 2), inRect.y + HeaderSize + TextSize + 4f, inRect.width, TextSize); + // Widgets.Label(restartRect, "TM_RequiresRestart".Translate()); GUI.color = Color.white; Rect rect1 = new Rect(inRect); rect1.width /= 3f; - num+=3; + row+=2; GUI.color = Color.magenta; - Rect classRect = Controller.UIHelper.GetRowRect(rect1, rowHeight, num); + Rect classRect = Controller.UIHelper.GetRowRect(rect1, rowHeight, row); Widgets.Label(classRect, "TM_EnabledMages".Translate()); - Rect classRectShiftRight = Controller.UIHelper.GetRowRect(classRect, rowHeight, num); + Rect classRectShiftRight = Controller.UIHelper.GetRowRect(classRect, rowHeight, row); classRectShiftRight.x += classRect.width + 98f; GUI.color = Color.green; Widgets.Label(classRectShiftRight, "TM_EnabledFighters".Translate()); - num++; + row++; GUI.color = Color.white; - Rect slRect0 = Controller.UIHelper.GetRowRect(classRect, rowHeight, num); + Rect slRect0 = Controller.UIHelper.GetRowRect(classRect, rowHeight, row); slRect0.width = inRect.width / 2.2f; - Settings.Instance.baseMageChance = Widgets.HorizontalSlider(slRect0, Settings.Instance.baseMageChance, 0f, 5f, false, "baseMageChance".Translate() + " " + Rarity(Settings.Instance.baseMageChance) + " " + TM_Calc.GetMagePrecurserChance().ToString("P1"), "0", "5", .01f); - Rect slRect0ShiftRight = Controller.UIHelper.GetRowRect(slRect0, rowHeight, num); + inst.baseMageChance = Widgets.HorizontalSlider(slRect0, inst.baseMageChance, 0f, 1f, false, "baseMageChance".Translate() + " " + Rarity(inst.baseMageChance) + " " + TM_Calc.GetWeightedChance(inst.baseMageChance), roundTo: .002f); + Rect slRect0ShiftRight = Controller.UIHelper.GetRowRect(slRect0, rowHeight, row); slRect0ShiftRight.x += slRect0.width + 20f; - Settings.Instance.baseFighterChance = Widgets.HorizontalSlider(slRect0ShiftRight, Settings.Instance.baseFighterChance, 0f, 5f, false, "baseFighterChance".Translate() + " " + Rarity(Settings.Instance.baseFighterChance) + " " + TM_Calc.GetFighterPrecurserChance().ToString("P1"), "0", "5", .01f); - num++; - Rect slRect1 = Controller.UIHelper.GetRowRect(slRect0, rowHeight, num); - Settings.Instance.advMageChance = Widgets.HorizontalSlider(slRect1, Settings.Instance.advMageChance, 0f, 2f, false, "advMageChance".Translate() + " " + Rarity(Settings.Instance.advMageChance) + " " + TM_Calc.GetMageSpawnChance().ToString("P1"), "0", "2", .01f); - Rect slRect1ShiftRight = Controller.UIHelper.GetRowRect(slRect1, rowHeight, num); + inst.baseFighterChance = Widgets.HorizontalSlider(slRect0ShiftRight, inst.baseFighterChance, 0f, 1f, false, "baseFighterChance".Translate() + " " + Rarity(inst.baseFighterChance) + " " + TM_Calc.GetWeightedChance(inst.baseFighterChance), roundTo: .002f); + row++; + Rect slRect1 = Controller.UIHelper.GetRowRect(slRect0, rowHeight, row); + inst.advMageChance = Widgets.HorizontalSlider(slRect1, inst.advMageChance, 0f, 1f, false, "advMageChance".Translate() + " " + Rarity(inst.advMageChance) + " " + TM_Calc.GetWeightedChance(inst.advMageChance), roundTo: .002f); + Rect slRect1ShiftRight = Controller.UIHelper.GetRowRect(slRect1, rowHeight, row); slRect1ShiftRight.x += slRect0.width + 20f; - Settings.Instance.advFighterChance = Widgets.HorizontalSlider(slRect1ShiftRight, Settings.Instance.advFighterChance, 0f, 2f, false, "advFighterChance".Translate() + " " + Rarity(Settings.Instance.advFighterChance) + " " + TM_Calc.GetFighterSpawnChance().ToString("P1"), "0", "2", .01f); - num++; - Widgets.DrawLineHorizontal(inRect.x - 10f, rowHeight * num, inRect.width - 15f); - num++; - Rect rowRect0 = Controller.UIHelper.GetRowRect(classRect, rowHeight, num); - Widgets.CheckboxLabeled(rowRect0, "TM_Wanderer".Translate(), ref Settings.Instance.Wanderer, false); - Rect rowRect0ShiftRight = Controller.UIHelper.GetRowRect(rowRect0, rowHeight, num); - rowRect0ShiftRight.x += rowRect0.width + 98f; - Widgets.CheckboxLabeled(rowRect0ShiftRight, "TM_Wayfarer".Translate(), ref Settings.Instance.Wayfarer, false); - num++; - Rect rowRect = Controller.UIHelper.GetRowRect(rowRect0, rowHeight, num); - Widgets.CheckboxLabeled(rowRect, "TM_Arcanist".Translate(), ref Settings.Instance.Arcanist, false); - Rect rowRectShiftRight = Controller.UIHelper.GetRowRect(rowRect, rowHeight, num); - rowRectShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRectShiftRight, "TM_Gladiator".Translate(), ref Settings.Instance.Gladiator, false); - num++; - Rect rowRect1 = Controller.UIHelper.GetRowRect(rowRect, rowHeight, num); - Widgets.CheckboxLabeled(rowRect1, "TM_FireMage".Translate(), ref Settings.Instance.FireMage, false); - Rect rowRect1ShiftRight = Controller.UIHelper.GetRowRect(rowRect1, rowHeight, num); - rowRect1ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect1ShiftRight, "TM_Bladedancer".Translate(), ref Settings.Instance.Bladedancer, false); - num++; - Rect rowRect2 = Controller.UIHelper.GetRowRect(rowRect1, rowHeight, num); - Widgets.CheckboxLabeled(rowRect2, "TM_IceMage".Translate(), ref Settings.Instance.IceMage, false); - Rect rowRect2ShiftRight = Controller.UIHelper.GetRowRect(rowRect2, rowHeight, num); - rowRect2ShiftRight.x += rowRect1.width + 98f; - Widgets.CheckboxLabeled(rowRect2ShiftRight, "TM_Sniper".Translate(), ref Settings.Instance.Sniper, false); - num++; - Rect rowRect3 = Controller.UIHelper.GetRowRect(rowRect2, rowHeight, num); - Widgets.CheckboxLabeled(rowRect3, "TM_LitMage".Translate(), ref Settings.Instance.LitMage, false); - Rect rowRect3ShiftRight = Controller.UIHelper.GetRowRect(rowRect3, rowHeight, num); - rowRect3ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect3ShiftRight, "TM_Ranger".Translate(), ref Settings.Instance.Ranger, false); - num++; - Rect rowRect4 = Controller.UIHelper.GetRowRect(rowRect3, rowHeight, num); - Widgets.CheckboxLabeled(rowRect4, "TM_Geomancer".Translate(), ref Settings.Instance.Geomancer, false); - Rect rowRect4ShiftRight = Controller.UIHelper.GetRowRect(rowRect4, rowHeight, num); - rowRect4ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect4ShiftRight, "TM_Faceless".Translate(), ref Settings.Instance.Faceless, false); - num++; - Rect rowRect5 = Controller.UIHelper.GetRowRect(rowRect4, rowHeight, num); - Widgets.CheckboxLabeled(rowRect5, "TM_Druid".Translate(), ref Settings.Instance.Druid, false); - Rect rowRect5ShiftRight = Controller.UIHelper.GetRowRect(rowRect5, rowHeight, num); - rowRect5ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect5ShiftRight, "TM_Psionic".Translate(), ref Settings.Instance.Psionic, false); - num++; - Rect rowRect6 = Controller.UIHelper.GetRowRect(rowRect5, rowHeight, num); - Widgets.CheckboxLabeled(rowRect6, "TM_Paladin".Translate(), ref Settings.Instance.Paladin, false); - Rect rowRect6ShiftRight = Controller.UIHelper.GetRowRect(rowRect6, rowHeight, num); - rowRect6ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect6ShiftRight, "TM_DeathKnight".Translate(), ref Settings.Instance.DeathKnight, false); - num++; - Rect rowRect7 = Controller.UIHelper.GetRowRect(rowRect6, rowHeight, num); - Widgets.CheckboxLabeled(rowRect7, "TM_Priest".Translate(), ref Settings.Instance.Priest, false); - Rect rowRect7ShiftRight = Controller.UIHelper.GetRowRect(rowRect7, rowHeight, num); - rowRect7ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect7ShiftRight, "TM_Monk".Translate(), ref Settings.Instance.Monk, false); - num++; - Rect rowRect8 = Controller.UIHelper.GetRowRect(rowRect7, rowHeight, num); - Widgets.CheckboxLabeled(rowRect8, "TM_Bard".Translate(), ref Settings.Instance.Bard, false); - Rect rowRect8ShiftRight = Controller.UIHelper.GetRowRect(rowRect8, rowHeight, num); - rowRect8ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect8ShiftRight, "TM_Commander".Translate(), ref Settings.Instance.Commander, false); - num++; - Rect rowRect9 = Controller.UIHelper.GetRowRect(rowRect8, rowHeight, num); - Widgets.CheckboxLabeled(rowRect9, "TM_Summoner".Translate(), ref Settings.Instance.Summoner, false); - Rect rowRect9ShiftRight = Controller.UIHelper.GetRowRect(rowRect9, rowHeight, num); - rowRect9ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect9ShiftRight, "TM_SuperSoldier".Translate(), ref Settings.Instance.SuperSoldier, false); - num++; - Rect rowRect10 = Controller.UIHelper.GetRowRect(rowRect9, rowHeight, num); - Widgets.CheckboxLabeled(rowRect10, "TM_Necromancer".Translate(), ref Settings.Instance.Necromancer, false); - Rect rowRect10ShiftRight = Controller.UIHelper.GetRowRect(rowRect10, rowHeight, num); - rowRect10ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect10ShiftRight, "TM_Shadow".Translate(), ref Settings.Instance.Shadow); - num++; - Rect rowRect11 = Controller.UIHelper.GetRowRect(rowRect10, rowHeight, num); - Widgets.CheckboxLabeled(rowRect11, "TM_Demonkin".Translate(), ref Settings.Instance.Demonkin, false); - Rect rowRect11ShiftRight = Controller.UIHelper.GetRowRect(rowRect11, rowHeight, num); - rowRect11ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect11ShiftRight, "TM_Apothecary".Translate(), ref Settings.Instance.Apothecary); - num++; - Rect rowRect12 = Controller.UIHelper.GetRowRect(rowRect11, rowHeight, num); - Widgets.CheckboxLabeled(rowRect12, "TM_Technomancer".Translate(), ref Settings.Instance.Technomancer, false); - num++; - Rect rowRect13 = Controller.UIHelper.GetRowRect(rowRect12, rowHeight, num); - Widgets.CheckboxLabeled(rowRect13, "TM_BloodMage".Translate(), ref Settings.Instance.BloodMage, false); - num++; - Rect rowRect14 = Controller.UIHelper.GetRowRect(rowRect13, rowHeight, num); - Widgets.CheckboxLabeled(rowRect14, "TM_Enchanter".Translate(), ref Settings.Instance.Enchanter, false); - num++; - Rect rowRect15 = Controller.UIHelper.GetRowRect(rowRect14, rowHeight, num); - Widgets.CheckboxLabeled(rowRect15, "TM_Chronomancer".Translate(), ref Settings.Instance.Chronomancer, false); - num++; - Rect rowRect16 = Controller.UIHelper.GetRowRect(rowRect15, rowHeight, num); - Widgets.CheckboxLabeled(rowRect16, "TM_ChaosMage".Translate(), ref Settings.Instance.ChaosMage, false); - num++; - Rect rowRect17 = Controller.UIHelper.GetRowRect(rowRect16, rowHeight, num); - Widgets.CheckboxLabeled(rowRect17, "TM_Brightmage".Translate(), ref Settings.Instance.Brightmage, false); - num++; - Rect rowRect18 = Controller.UIHelper.GetRowRect(rowRect17, rowHeight, num); - Widgets.CheckboxLabeled(rowRect18, "TM_Shaman".Translate(), ref Settings.Instance.Shaman, false); - num++; - Rect rowRect21 = Controller.UIHelper.GetRowRect(rowRect18, rowHeight, num); - Widgets.CheckboxLabeled(rowRect21, "TM_Golemancer".Translate(), ref Settings.Instance.Golemancer, false); - num++; - Rect rowRect22 = Controller.UIHelper.GetRowRect(rowRect21, rowHeight, num); - Widgets.CheckboxLabeled(rowRect22, "TM_Empath".Translate(), ref Settings.Instance.Empath, false); - num++; - Widgets.DrawLineHorizontal(inRect.x - 10f, rowHeight * num, inRect.width - 15f); - num++; - Rect slRect2 = Controller.UIHelper.GetRowRect(slRect1, rowHeight, num); - Settings.Instance.supportTraitChance = Widgets.HorizontalSlider(slRect2, Settings.Instance.supportTraitChance, 0f, 1f, false, "supportTraitChance".Translate() + " " + (Settings.Instance.supportTraitChance).ToString("P1"), "0", "1", .01f); + inst.advFighterChance = Widgets.HorizontalSlider(slRect1ShiftRight, inst.advFighterChance, 0f, 1f, false, "advFighterChance".Translate() + " " + Rarity(inst.advFighterChance) + " " + TM_Calc.GetWeightedChance(inst.advFighterChance), roundTo: .002f); + row++; + Widgets.DrawLineHorizontal(inRect.x - 10f, rowHeight * row, inRect.width - 15f); + + // Given a matrix of ClassOptions, build the grid of checkboxes! + void buildCheckboxGrid(Rect startingRect, Settings.CheckboxOption[][] grid) + { + foreach (Settings.CheckboxOption[] gridRow in grid) + { + row++; + for (int i = 0; i < gridRow.Length; i++) + { + Rect newRect = Controller.UIHelper.GetRowRect(startingRect, rowHeight, row); + newRect.x = (startingRect.width + 98f) * i; + Widgets.CheckboxLabeled(newRect, gridRow[i].label.Translate(), ref gridRow[i].isEnabled); + } + } + } + buildCheckboxGrid(classRect, new [] + { + new []{ Settings.Wanderer, Settings.Wayfarer }, + new []{ Settings.Arcanist, Settings.Gladiator }, + new []{ Settings.FireMage, Settings.Bladedancer }, + new []{ Settings.IceMage, Settings.Sniper }, + new []{ Settings.LitMage, Settings.Ranger }, + new []{ Settings.Geomancer, Settings.Faceless }, + new []{ Settings.Druid, Settings.Psionic }, + new []{ Settings.Paladin, Settings.DeathKnight }, + new []{ Settings.Priest, Settings.Monk }, + new []{ Settings.Bard, Settings.Commander }, + new []{ Settings.Summoner, Settings.SuperSoldier }, + new []{ Settings.Necromancer, Settings.Shadow }, + new []{ Settings.Demonkin, Settings.Apothecary }, + new []{ Settings.Technomancer }, + new []{ Settings.BloodMage }, + new []{ Settings.Enchanter }, + new []{ Settings.Chronomancer }, + new []{ Settings.ChaosMage }, + new []{ Settings.Brightmage }, + new []{ Settings.Shaman }, + new []{ Settings.Golemancer }, + new []{ Settings.Empath }, + }); + row++; + Widgets.DrawLineHorizontal(inRect.x - 10f, rowHeight * row, inRect.width - 15f); + row++; + Rect slRect2 = Controller.UIHelper.GetRowRect(slRect1, rowHeight, row); + inst.supportTraitChance = Widgets.HorizontalSlider(slRect2, inst.supportTraitChance, 0f, 1f, false, "supportTraitChance".Translate() + " " + (inst.supportTraitChance).ToString("P1"), "0", "1", .01f); //Rect slRect2ShiftRight = Controller.UIHelper.GetRowRect(slRect1, rowHeight, num); - num++; - Rect rowRect19 = Controller.UIHelper.GetRowRect(rowRect21, rowHeight, num); ; - Widgets.CheckboxLabeled(rowRect19, "TM_ArcaneConduit".Translate(), ref Settings.Instance.ArcaneConduit, false); - Rect rowRect19ShiftRight = Controller.UIHelper.GetRowRect(rowRect19, rowHeight, num); - rowRect19ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect19ShiftRight, "TM_Boundless".Translate(), ref Settings.Instance.Boundless, false); - num++; - Rect rowRect20 = Controller.UIHelper.GetRowRect(rowRect19, rowHeight, num); ; - Widgets.CheckboxLabeled(rowRect20, "TM_ManaWell".Translate(), ref Settings.Instance.ManaWell, false); - Rect rowRect20ShiftRight = Controller.UIHelper.GetRowRect(rowRect20, rowHeight, num); - rowRect20ShiftRight.x += rowRect.width + 98f; - Widgets.CheckboxLabeled(rowRect20ShiftRight, "TM_GiantsBlood".Translate(), ref Settings.Instance.GiantsBlood, false); - num++; - Rect rowRect20a = Controller.UIHelper.GetRowRect(rowRect20, rowHeight, num); ; - Widgets.CheckboxLabeled(rowRect20a, "TM_FaeBlood".Translate(), ref Settings.Instance.FaeBlood, false); - num++; - Rect rowRect20b = Controller.UIHelper.GetRowRect(rowRect20, rowHeight, num); ; - Widgets.CheckboxLabeled(rowRect20b, "TM_Enlightened".Translate(), ref Settings.Instance.Enlightened, false); - num++; - Rect rowRect20c = Controller.UIHelper.GetRowRect(rowRect20, rowHeight, num); ; - Widgets.CheckboxLabeled(rowRect20c, "TM_Cursed".Translate(), ref Settings.Instance.Cursed, false); - num++; - Widgets.DrawLineHorizontal(inRect.x - 10f, rowHeight * num, inRect.width - 15f); - num++; + buildCheckboxGrid(classRect, new [] + { + new []{ Settings.ArcaneConduit, Settings.Boundless }, + new []{ Settings.ManaWell, Settings.GiantsBlood }, + new []{ Settings.FaeBlood }, + new []{ Settings.Enlightened }, + new []{ Settings.Cursed } + }); + row++; + Widgets.DrawLineHorizontal(inRect.x - 10f, rowHeight * row, inRect.width - 15f); + row++; GUI.color = Color.cyan; - Rect customRect = Controller.UIHelper.GetRowRect(rowRect20, rowHeight, num); + Rect customRect = Controller.UIHelper.GetRowRect(classRect, rowHeight, row); Widgets.Label(customRect, "TM_CustomClasses".Translate()); GUI.color = Color.white; - num++; - for(int i = 0; i < TM_ClassUtility.CustomClasses.Count; i++) + row++; + for(int i = 0; i < TM_ClassUtility.CustomClasses.Length; i++) { TMDefs.TM_CustomClass cClass = TM_ClassUtility.CustomClasses[i]; - bool classEnabled = Settings.Instance.CustomClass[cClass.classTrait.ToString()]; + bool classEnabled = inst.CustomClass[cClass.classTrait.ToString()]; if(cClass.classTrait == TorannMagicDefOf.TM_Brightmage) { - classEnabled = Settings.Instance.Brightmage; + classEnabled = Settings.Brightmage.isEnabled; } else if(cClass.classTrait == TorannMagicDefOf.TM_Shaman) { - classEnabled = Settings.Instance.Shaman; + classEnabled = Settings.Shaman.isEnabled; } else if (cClass.classTrait == TorannMagicDefOf.TM_Golemancer) { - classEnabled = Settings.Instance.Golemancer; + classEnabled = Settings.Golemancer.isEnabled; } else if (cClass.classTrait == TorannMagicDefOf.TM_Empath) { - classEnabled = Settings.Instance.Empath; + classEnabled = Settings.Empath.isEnabled; } else if (cClass.classTrait == TorannMagicDefOf.TM_TheShadow) { - classEnabled = Settings.Instance.Shadow; + classEnabled = Settings.Shadow.isEnabled; } else if (cClass.classTrait == TorannMagicDefOf.TM_Apothecary) { - classEnabled = Settings.Instance.Apothecary; + classEnabled = Settings.Apothecary.isEnabled; } else if (cClass.classTrait == TorannMagicDefOf.TM_Empath) { - classEnabled = Settings.Instance.Empath; + classEnabled = Settings.Empath.isEnabled; } if (cClass.shouldShow) - { + { //if (cClass.isMage && cClass.isFighter) //{ // GUI.color = Color.yellow; @@ -261,14 +184,14 @@ public override void DoWindowContents(Rect inRect) //{ // GUI.color = Color.gray; //} - Rect customRect1 = Controller.UIHelper.GetRowRect(customRect, rowHeight, num); - Widgets.CheckboxLabeled(customRect1, cClass.classTrait.degreeDatas.FirstOrDefault().label, ref classEnabled, false); - num++; + Rect customRect1 = Controller.UIHelper.GetRowRect(customRect, rowHeight, row); + Widgets.CheckboxLabeled(customRect1, cClass.classTrait.degreeDatas.FirstOrDefault().label, ref classEnabled); + row++; } - if (classEnabled != Settings.Instance.CustomClass[cClass.classTrait.ToString()]) + if (classEnabled != inst.CustomClass[cClass.classTrait.ToString()]) { - Settings.Instance.CustomClass.Remove(cClass.classTrait.ToString()); - Settings.Instance.CustomClass.Add(cClass.classTrait.ToString(), classEnabled); + inst.CustomClass.Remove(cClass.classTrait.ToString()); + inst.CustomClass.Add(cClass.classTrait.ToString(), classEnabled); } //GUI.color = Color.white; } @@ -284,19 +207,19 @@ private string Rarity(float val) { rarity = "None"; } - else if (val < .2f) + else if (val < .04f) { rarity = "Very Rare"; } - else if (val < .5f) + else if (val < .1f) { rarity = "Rare"; } - else if (val < 1f) + else if (val < .2f) { rarity = "Uncommon"; } - else if (val < 2f) + else if (val < .4f) { rarity = "Common"; } diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Constants.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Constants.cs index 2b781551..80b4550d 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Constants.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Constants.cs @@ -9,7 +9,8 @@ using AbilityUser; namespace TorannMagic.ModOptions -{ +{ + [StaticConstructorOnStartup] public abstract class Constants { private static bool pawnInFlight = false; diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Controller.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Controller.cs index b29f2171..d1ab5968 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Controller.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Controller.cs @@ -1,4 +1,5 @@ using System; +using TorannMagic.Enchantment; using UnityEngine; using Verse; @@ -28,15 +29,43 @@ public override string SettingsCategory() return "A RimWorld of Magic"; } + // After defs are loaded on startup + private static void AfterDefsLoadedAction() + { + CompEnchantmentMod.AddComp(); + CompEnchantmentMod.InitializeUniversalBodyParts(); + Constants.InitializeCloaks(); + TM_ClassUtility.InitializeCustomClasses(); + ModClassOptions.InitializeThingDefDictionaries(); + ModClassOptions.ReloadSettings(); // Requires InitializeCustomClasses && InitializeThingDefDictionaries + ModClassOptions.InitializeCustomClassActions(); // Requires CacheEnabledClasses + ModClassOptions.InitializeModBackstories(); + } + public Controller(ModContentPack content) : base(content) { - Controller.Instance = this; - Settings.Instance = base.GetSettings(); + Instance = this; + Settings.Instance = GetSettings(); + LongEventHandler.ExecuteWhenFinished(AfterDefsLoadedAction); + } + + // On Changing of settings + public override void WriteSettings() + { + try + { + ModClassOptions.ReloadSettings(); + } + catch + { + Log.Error("[Rimworld of Magic] Error writing settings. Skipping..."); + } + base.WriteSettings(); } public override void DoSettingsWindowContents(Rect canvas) - { - int num = 0; + { + int row = 0; float rowHeight = 28f; Rect sRect = new Rect(canvas.x, canvas.y, canvas.width - 36f, canvas.height + 360f); scrollPosition = GUI.BeginScrollView(canvas, scrollPosition, sRect, false, true); @@ -44,24 +73,23 @@ public override void DoSettingsWindowContents(Rect canvas) Rect rect1 = new Rect(canvas); rect1.width /= 2.4f; - num++; - num++; - SettingsRef settingsRef = new SettingsRef(); + row++; + row++; deathExplosionDmgMin = ModOptions.Settings.Instance.deathExplosionMin.ToString(); deathExplosionDmgMax = ModOptions.Settings.Instance.deathExplosionMax.ToString(); - Rect rowRect = UIHelper.GetRowRect(rect1, rowHeight, num); + Rect rowRect = UIHelper.GetRowRect(rect1, rowHeight, row); Settings.Instance.xpMultiplier = Widgets.HorizontalSlider(rowRect, Settings.Instance.xpMultiplier, .1f, 2f, false, "XPMultiplier".Translate() + " " + Settings.Instance.xpMultiplier, ".1", "2", .1f); - Rect rowRectShiftRight = UIHelper.GetRowRect(rowRect, rowHeight, num); + Rect rowRectShiftRight = UIHelper.GetRowRect(rowRect, rowHeight, row); rowRectShiftRight.x += rowRect.width + 56f; rowRectShiftRight.width /= 3; classOptions = Widgets.ButtonText(rowRectShiftRight, "Class Options", true, false, true); if (classOptions) { Rect rect = new Rect(64f, 64f, 480, 640); - ClassOptionsWindow newWindow = new ClassOptionsWindow(); + ClassOptionsWindow newWindow = new ClassOptionsWindow(); Find.WindowStack.Add(newWindow); } - Rect rowRectShiftRightPlus = UIHelper.GetRowRect(rowRect, rowHeight, num); + Rect rowRectShiftRightPlus = UIHelper.GetRowRect(rowRect, rowHeight, row); rowRectShiftRightPlus.x += (rowRect.width+rowRectShiftRight.width) + 56f; rowRectShiftRightPlus.width /= 3; factionOptions = Widgets.ButtonText(rowRectShiftRightPlus, "Faction Options", true, false, true); @@ -71,10 +99,10 @@ public override void DoSettingsWindowContents(Rect canvas) FactionOptionsWindow newWindow = new FactionOptionsWindow(); Find.WindowStack.Add(newWindow); } - num++; - Rect rowRect2 = UIHelper.GetRowRect(rowRect, rowHeight, num); + row++; + Rect rowRect2 = UIHelper.GetRowRect(rowRect, rowHeight, row); Settings.Instance.needMultiplier = Widgets.HorizontalSlider(rowRect2, Settings.Instance.needMultiplier, 0f, 10f, false, "NeedMultiplier".Translate() + " " + Settings.Instance.needMultiplier, "0", "10", .1f); - Rect rowRect2ShiftRight = UIHelper.GetRowRect(rowRect2, rowHeight, num); + Rect rowRect2ShiftRight = UIHelper.GetRowRect(rowRect2, rowHeight, row); rowRect2ShiftRight.x += rowRect.width + 56f; rowRect2ShiftRight.width /= 3; eventOptions = Widgets.ButtonText(rowRect2ShiftRight, "Event Options", true, false, true); @@ -84,7 +112,7 @@ public override void DoSettingsWindowContents(Rect canvas) EventOptionsWindow newWindow = new EventOptionsWindow(); Find.WindowStack.Add(newWindow); } - Rect rowRect2ShiftRightPlus = UIHelper.GetRowRect(rowRect2, rowHeight, num); + Rect rowRect2ShiftRightPlus = UIHelper.GetRowRect(rowRect2, rowHeight, row); rowRect2ShiftRightPlus.x += (rowRect2.width + rowRect2ShiftRight.width) + 56f; rowRect2ShiftRightPlus.width /= 3; factionOptions = Widgets.ButtonText(rowRect2ShiftRightPlus, "Golem Options", true, false, true); @@ -94,123 +122,123 @@ public override void DoSettingsWindowContents(Rect canvas) GolemOptionsWindow newWindow = new GolemOptionsWindow(); Find.WindowStack.Add(newWindow); } - num++; - Rect rowRect21 = UIHelper.GetRowRect(rowRect2, rowHeight, num); + row++; + Rect rowRect21 = UIHelper.GetRowRect(rowRect2, rowHeight, row); Settings.Instance.magicyteChance = Widgets.HorizontalSlider(rowRect21, Settings.Instance.magicyteChance, 0, .05f, false, "MagicyteChance".Translate() + " " + Settings.Instance.magicyteChance, "0%", "5%", .001f); - num++; - Rect rowRect3 = UIHelper.GetRowRect(rowRect21, rowHeight, num); + row++; + Rect rowRect3 = UIHelper.GetRowRect(rowRect21, rowHeight, row); Widgets.CheckboxLabeled(rowRect3, "TM_DeathRetaliationIsLethal".Translate(), ref Settings.Instance.deathRetaliationIsLethal, false); //rowRect3.width = rowRect3.width * .7f; //Settings.Instance.deathExplosionRadius = Widgets.HorizontalSlider(rowRect3, Settings.Instance.deathExplosionRadius, .1f, 6f, false, "DeathRadius".Translate() + " " + Settings.Instance.deathExplosionRadius, ".1", "6", .1f); //Rect rowRect31 = new Rect(rowRect3.xMax + 4f, rowRect3.y, rowRect2.width/2, rowRect3.height); - //Widgets.TextFieldNumericLabeled(rowRect31, "DeathExplosionMin".Translate(), ref Settings.Instance.deathExplosionMin, ref this.deathExplosionDmgMin, 0, 100); + //Widgets.TextFieldNumericLabeled(rowRect31, "DeathExplosionMin".Translate(), ref Settings.Instance.deathExplosionMin, ref this.deathExplosionDmgMin, 0, 100); //Rect rowRect32 = new Rect(rowRect31.xMax + 4f, rowRect3.y, rowRect2.width/2, rowRect3.height); //Widgets.TextFieldNumericLabeled(rowRect32, "DeathExplosionMax".Translate(), ref Settings.Instance.deathExplosionMax, ref this.deathExplosionDmgMax, 0, 200); - num++; - Rect rowRect4 = UIHelper.GetRowRect(rowRect3, rowHeight, num); + row++; + Rect rowRect4 = UIHelper.GetRowRect(rowRect3, rowHeight, row); Settings.Instance.deathRetaliationChance = Widgets.HorizontalSlider(rowRect4, Settings.Instance.deathRetaliationChance, 0f, 1f, false, "TM_DeathRetaliationChance".Translate() + " " + Settings.Instance.deathRetaliationChance.ToString("P0"), "0", "1", .01f); - Rect rowRect4ShiftRight = UIHelper.GetRowRect(rowRect4, rowHeight, num); + Rect rowRect4ShiftRight = UIHelper.GetRowRect(rowRect4, rowHeight, row); rowRect4ShiftRight.x += rowRect4.width + 56f; Widgets.CheckboxLabeled(rowRect4ShiftRight, "TM_enableAutocast".Translate(), ref Settings.Instance.autocastEnabled, false); - num++; - Rect rowRect5 = UIHelper.GetRowRect(rowRect4, rowHeight, num); + row++; + Rect rowRect5 = UIHelper.GetRowRect(rowRect4, rowHeight, row); Settings.Instance.deathRetaliationDelayFactor = Widgets.HorizontalSlider(rowRect5, Settings.Instance.deathRetaliationDelayFactor, .1f, 4f, false, "TM_DeathRetaliationDelay".Translate() + " " + Settings.Instance.deathRetaliationDelayFactor.ToString("P0"), "0", "4", .01f); - Rect rowRect5ShiftRight = UIHelper.GetRowRect(rowRect5, rowHeight, num); + Rect rowRect5ShiftRight = UIHelper.GetRowRect(rowRect5, rowHeight, row); rowRect5ShiftRight.x += rowRect5.width + 56f; Widgets.CheckboxLabeled(rowRect5ShiftRight, "TM_queueAutocast".Translate(), ref Settings.Instance.autocastQueueing, false); TooltipHandler.TipRegion(rowRect5ShiftRight, "TM_queueAutocastDesc".Translate()); - num++; - Rect rowRect6 = UIHelper.GetRowRect(rowRect5, rowHeight, num); + row++; + Rect rowRect6 = UIHelper.GetRowRect(rowRect5, rowHeight, row); //Settings.Instance.advMageChance = Widgets.HorizontalSlider(rowRect6, Settings.Instance.advMageChance, 0f, 2f, false, "advMageChance".Translate() + " " + Rarity(Settings.Instance.advMageChance) + " " + TM_Calc.GetMageSpawnChance().ToString("P1"), "0", "2", .01f); - Rect rowRect6ShiftRight = UIHelper.GetRowRect(rowRect6, rowHeight, num); + Rect rowRect6ShiftRight = UIHelper.GetRowRect(rowRect6, rowHeight, row); rowRect6ShiftRight.x += rowRect6.width + 56f; Settings.Instance.autocastMinThreshold = Widgets.HorizontalSlider(rowRect6ShiftRight, Settings.Instance.autocastMinThreshold, 0f, 1f, false, "TM_autocastUndraftedThreshold".Translate() + " " + (Settings.Instance.autocastMinThreshold * 100) + "%", "0", "1", .01f); - num++; - Rect rowRect66 = UIHelper.GetRowRect(rowRect6, rowHeight, num); + row++; + Rect rowRect66 = UIHelper.GetRowRect(rowRect6, rowHeight, row); Settings.Instance.undeadUpkeepMultiplier = Widgets.HorizontalSlider(rowRect66, Settings.Instance.undeadUpkeepMultiplier, 0f, 5f, false, "TM_UndeadUpkeepMultiplier".Translate() + " " + Settings.Instance.undeadUpkeepMultiplier.ToString("P1"), "0", "5", .01f); - Rect rowRect66ShiftRight = UIHelper.GetRowRect(rowRect66, rowHeight, num); + Rect rowRect66ShiftRight = UIHelper.GetRowRect(rowRect66, rowHeight, row); rowRect66ShiftRight.x += rowRect66.width + 56f; Settings.Instance.autocastCombatMinThreshold = Widgets.HorizontalSlider(rowRect66ShiftRight, Settings.Instance.autocastCombatMinThreshold, 0f, 1f, false, "TM_autocastDraftedThreshold".Translate() + " " + (Settings.Instance.autocastCombatMinThreshold * 100) + "%", "0", "1", .01f); - num++; - Rect rowRect67 = UIHelper.GetRowRect(rowRect66, rowHeight, num); + row++; + Rect rowRect67 = UIHelper.GetRowRect(rowRect66, rowHeight, row); Settings.Instance.paracyteSoftCap = Widgets.HorizontalSlider(rowRect67, Settings.Instance.paracyteSoftCap, 0, 500, false, "TM_ParacyteSoftCap".Translate() + " " + (Settings.Instance.paracyteSoftCap), "0", "500", 1); - Rect rowRect67ShiftRight = UIHelper.GetRowRect(rowRect67, rowHeight, num); + Rect rowRect67ShiftRight = UIHelper.GetRowRect(rowRect67, rowHeight, row); rowRect67ShiftRight.x += rowRect67.width + 56f; Settings.Instance.autocastEvaluationFrequency = Mathf.RoundToInt(Widgets.HorizontalSlider(rowRect67ShiftRight, Settings.Instance.autocastEvaluationFrequency, 60, 600, false, "TM_autocastEvaluationFrequency".Translate() + " " + (Settings.Instance.autocastEvaluationFrequency / 60) + "seconds", "1", "10", .1f)); - num++; - Rect rowRect68 = UIHelper.GetRowRect(rowRect67, rowHeight, num); + row++; + Rect rowRect68 = UIHelper.GetRowRect(rowRect67, rowHeight, row); Widgets.CheckboxLabeled(rowRect68, "TM_ParacyteMagesCount".Translate(), ref Settings.Instance.paracyteMagesCount, false); - Rect rowRect68ShiftRight = UIHelper.GetRowRect(rowRect68, rowHeight, num); + Rect rowRect68ShiftRight = UIHelper.GetRowRect(rowRect68, rowHeight, row); rowRect68ShiftRight.x += rowRect68.width + 56f; Widgets.CheckboxLabeled(rowRect68ShiftRight, "TM_autocastAnimals".Translate(), ref Settings.Instance.autocastAnimals, false); - num++; - Rect rowRect7 = UIHelper.GetRowRect(rowRect68, rowHeight, num); + row++; + Rect rowRect7 = UIHelper.GetRowRect(rowRect68, rowHeight, row); Widgets.CheckboxLabeled(rowRect7, "AICanCast".Translate(), ref Settings.Instance.AICasting, false); - Rect rowRect7ShiftRight = UIHelper.GetRowRect(rowRect7, rowHeight, num); + Rect rowRect7ShiftRight = UIHelper.GetRowRect(rowRect7, rowHeight, row); rowRect7ShiftRight.x += rowRect7.width + 56f; - Widgets.CheckboxLabeled(rowRect7ShiftRight, "AIHardMode".Translate(), ref Settings.Instance.AIHardMode, !ModOptions.Settings.Instance.AICasting); - num++; - Rect rowRect9 = UIHelper.GetRowRect(rowRect7, rowHeight, num); + Widgets.CheckboxLabeled(rowRect7ShiftRight, "AIHardMode".Translate(), ref Settings.Instance.AIHardMode, !ModOptions.Settings.Instance.AICasting); + row++; + Rect rowRect9 = UIHelper.GetRowRect(rowRect7, rowHeight, row); Widgets.CheckboxLabeled(rowRect9, "AIMarking".Translate(), ref Settings.Instance.AIMarking, false); - Rect rowRect91 = UIHelper.GetRowRect(rowRect9, rowHeight, num); + Rect rowRect91 = UIHelper.GetRowRect(rowRect9, rowHeight, row); rowRect91.x += rowRect9.width + 56f; Widgets.CheckboxLabeled(rowRect91, "AIFighterMarking".Translate(), ref Settings.Instance.AIFighterMarking, false); - num++; - Rect rowRect92 = UIHelper.GetRowRect(rowRect9, rowHeight, num); + row++; + Rect rowRect92 = UIHelper.GetRowRect(rowRect9, rowHeight, row); Widgets.CheckboxLabeled(rowRect92, "AIFriendlyMarking".Translate(), ref Settings.Instance.AIFriendlyMarking, false); - Rect rowRect92ShiftRight = UIHelper.GetRowRect(rowRect92, rowHeight, num); + Rect rowRect92ShiftRight = UIHelper.GetRowRect(rowRect92, rowHeight, row); rowRect92ShiftRight.x += rowRect92.width + 56f; Widgets.CheckboxLabeled(rowRect92ShiftRight, "showLevelUpMessage".Translate(), ref Settings.Instance.showLevelUpMessage, false); - num++; - Rect rowRect93 = UIHelper.GetRowRect(rowRect92, rowHeight, num); + row++; + Rect rowRect93 = UIHelper.GetRowRect(rowRect92, rowHeight, row); Widgets.CheckboxLabeled(rowRect93, "showMagicGizmo".Translate(), ref Settings.Instance.showGizmo, false); - Rect rowRect93ShiftRight = UIHelper.GetRowRect(rowRect93, rowHeight, num); + Rect rowRect93ShiftRight = UIHelper.GetRowRect(rowRect93, rowHeight, row); rowRect93ShiftRight.x += rowRect93.width + 56f; Widgets.CheckboxLabeled(rowRect93ShiftRight, "showUndeadPawnChange".Translate(), ref Settings.Instance.changeUndeadPawnAppearance, false); - num++; - Rect rowRect10 = UIHelper.GetRowRect(rowRect93, rowHeight, num); + row++; + Rect rowRect10 = UIHelper.GetRowRect(rowRect93, rowHeight, row); Widgets.CheckboxLabeled(rowRect10, "TM_shrinkIcons".Translate(), ref Settings.Instance.shrinkIcons, false); - Rect rowRect10ShiftRight = UIHelper.GetRowRect(rowRect10, rowHeight, num); + Rect rowRect10ShiftRight = UIHelper.GetRowRect(rowRect10, rowHeight, row); rowRect10ShiftRight.x += rowRect10.width + 56f; Widgets.CheckboxLabeled(rowRect10ShiftRight, "showUndeadAnimalChange".Translate(), ref Settings.Instance.changeUndeadAnimalAppearance, false); - num++; - Rect rowRect11 = UIHelper.GetRowRect(rowRect10, rowHeight, num); + row++; + Rect rowRect11 = UIHelper.GetRowRect(rowRect10, rowHeight, row); Widgets.CheckboxLabeled(rowRect11, "unrestrictedBloodTypesForBloodMagic".Translate(), ref Settings.Instance.unrestrictedBloodTypes, false); - Rect rowRect11ShiftRight = UIHelper.GetRowRect(rowRect11, rowHeight, num); + Rect rowRect11ShiftRight = UIHelper.GetRowRect(rowRect11, rowHeight, row); rowRect11ShiftRight.x += rowRect11.width + 56f; Widgets.CheckboxLabeled(rowRect11ShiftRight, "showClassIconOnColonistBar".Translate(), ref Settings.Instance.showClassIconOnColonistBar, false); - num++; - Rect rowRect12 = UIHelper.GetRowRect(rowRect11, rowHeight, num); + row++; + Rect rowRect12 = UIHelper.GetRowRect(rowRect11, rowHeight, row); Widgets.CheckboxLabeled(rowRect12, "TM_AggressiveAICasting".Translate(), ref Settings.Instance.AIAggressiveCasting, false); - Rect rowRect12ShiftRight = UIHelper.GetRowRect(rowRect12, rowHeight, num); + Rect rowRect12ShiftRight = UIHelper.GetRowRect(rowRect12, rowHeight, row); rowRect12ShiftRight.x += rowRect12.width + 56f; if (Settings.Instance.showClassIconOnColonistBar) { Settings.Instance.classIconSize = Widgets.HorizontalSlider(rowRect12ShiftRight, Settings.Instance.classIconSize, .5f, 2.5f, false, "classIconSize".Translate() + " " + Settings.Instance.classIconSize.ToString("P1"), "0", "2.5", .01f); } - num++; - Rect rowRect13 = UIHelper.GetRowRect(rowRect12, rowHeight, num); + row++; + Rect rowRect13 = UIHelper.GetRowRect(rowRect12, rowHeight, row); Widgets.CheckboxLabeled(rowRect13, "TM_UnrestrictedWeaponCopy".Translate(), ref Settings.Instance.unrestrictedWeaponCopy, false); - Rect rowRect13ShiftRight = UIHelper.GetRowRect(rowRect13, rowHeight, num); + Rect rowRect13ShiftRight = UIHelper.GetRowRect(rowRect13, rowHeight, row); rowRect13ShiftRight.x += rowRect13.width + 56f; Widgets.CheckboxLabeled(rowRect13ShiftRight, "TM_CameraSnap".Translate(), ref Settings.Instance.cameraSnap, false); - num++; - Rect rowRect14 = UIHelper.GetRowRect(rowRect13, rowHeight, num); + row++; + Rect rowRect14 = UIHelper.GetRowRect(rowRect13, rowHeight, row); //Widgets.CheckboxLabeled(rowRect13, "TM_UnrestrictedWeaponCopy".Translate(), ref Settings.Instance.unrestrictedWeaponCopy, false); //Rect rowRect14ShiftRight = UIHelper.GetRowRect(rowRect14, rowHeight, num); //rowRect14ShiftRight.x += rowRect13.width + 56f; //Settings.Instance.iconPosition.y = Widgets.HorizontalSlider(rowRect14ShiftRight, Settings.Instance.iconPosition.y, -UI.screenHeight/(5f), UI.screenHeight/(5f), false, "y offset " + Settings.Instance.iconPosition.y, "-", "+", 1f); //num++; - num++; - Rect rowRect20 = UIHelper.GetRowRect(rowRect10, rowHeight, num); + row++; + Rect rowRect20 = UIHelper.GetRowRect(rowRect10, rowHeight, row); rowRect20.width = 120f; - Rect rowRect20ShiftRight1 = UIHelper.GetRowRect(rowRect20, rowHeight, num); + Rect rowRect20ShiftRight1 = UIHelper.GetRowRect(rowRect20, rowHeight, row); rowRect20ShiftRight1.x = rowRect20.width + 40f; - Rect rowRect20ShiftRight2 = UIHelper.GetRowRect(rowRect20ShiftRight1, rowHeight, num); + Rect rowRect20ShiftRight2 = UIHelper.GetRowRect(rowRect20ShiftRight1, rowHeight, row); rowRect20ShiftRight2.x = rowRect20.width + rowRect20ShiftRight1.width + 40f; //GUI.color = Color.yellow; //GUI.backgroundColor = Color.yellow; - reset = Widgets.ButtonText(rowRect20, "Default", true, false, true); + reset = Widgets.ButtonText(rowRect20, "Default", true, false); if (reset) { Settings.Instance.xpMultiplier = 1f; @@ -223,10 +251,10 @@ public override void DoSettingsWindowContents(Rect canvas) Settings.Instance.AIMarking = true; Settings.Instance.AIFighterMarking = false; Settings.Instance.AIFriendlyMarking = false; - Settings.Instance.baseMageChance = 1f; - Settings.Instance.baseFighterChance = 1f; - Settings.Instance.advMageChance = 0.5f; - Settings.Instance.advFighterChance = 0.5f; + Settings.Instance.baseMageChance = 0.063f; + Settings.Instance.baseFighterChance = 0.063f; + Settings.Instance.advMageChance = 0.083f; + Settings.Instance.advFighterChance = 0.042f; Settings.Instance.magicyteChance = .005f; Settings.Instance.showIconsMultiSelect = true; Settings.Instance.showGizmo = true; @@ -250,8 +278,8 @@ public override void DoSettingsWindowContents(Rect canvas) Settings.Instance.shrinkIcons = false; Settings.Instance.cameraSnap = true; - this.deathExplosionDmgMax = "50.0"; - this.deathExplosionDmgMin = "20.0"; + deathExplosionDmgMax = "50.0"; + deathExplosionDmgMin = "20.0"; Settings.Instance.autocastEnabled = true; Settings.Instance.autocastMinThreshold = .7f; @@ -272,10 +300,10 @@ public override void DoSettingsWindowContents(Rect canvas) Settings.Instance.AIMarking = false; Settings.Instance.AIFighterMarking = false; Settings.Instance.AIFriendlyMarking = false; - Settings.Instance.baseMageChance = .8f; - Settings.Instance.baseFighterChance = .8f; - Settings.Instance.advMageChance = 1.5f; - Settings.Instance.advFighterChance = 1.5f; + Settings.Instance.baseMageChance = .05f; + Settings.Instance.baseFighterChance = .05f; + Settings.Instance.advMageChance = 0.25f; + Settings.Instance.advFighterChance = 0.125f; Settings.Instance.magicyteChance = .003f; Settings.Instance.showIconsMultiSelect = true; Settings.Instance.showGizmo = true; @@ -295,8 +323,8 @@ public override void DoSettingsWindowContents(Rect canvas) Settings.Instance.deathRetaliationIsLethal = true; Settings.Instance.deathRetaliationChance = 1f; Settings.Instance.deathRetaliationDelayFactor = .3f; - this.deathExplosionDmgMax = "60.0"; - this.deathExplosionDmgMin = "30.0"; + deathExplosionDmgMax = "60.0"; + deathExplosionDmgMin = "30.0"; Settings.Instance.autocastEnabled = true; Settings.Instance.autocastMinThreshold = .8f; @@ -317,10 +345,10 @@ public override void DoSettingsWindowContents(Rect canvas) Settings.Instance.AIMarking = false; Settings.Instance.AIFighterMarking = false; Settings.Instance.AIFriendlyMarking = false; - Settings.Instance.baseMageChance = 2f; - Settings.Instance.baseFighterChance = 2f; - Settings.Instance.advMageChance = 1f; - Settings.Instance.advFighterChance = 1f; + Settings.Instance.baseMageChance = 0.04f; + Settings.Instance.baseFighterChance = 0.04f; + Settings.Instance.advMageChance = 0.02f; + Settings.Instance.advFighterChance = 0.02f; Settings.Instance.magicyteChance = .01f; Settings.Instance.showIconsMultiSelect = true; Settings.Instance.showGizmo = true; @@ -334,8 +362,8 @@ public override void DoSettingsWindowContents(Rect canvas) Settings.Instance.riftChallenge = 1f; Settings.Instance.autocastAnimals = false; Settings.Instance.unrestrictedWeaponCopy = false; - this.deathExplosionDmgMax = "5.0"; - this.deathExplosionDmgMin = "10.0"; + deathExplosionDmgMax = "5.0"; + deathExplosionDmgMin = "10.0"; Settings.Instance.autocastEnabled = true; Settings.Instance.autocastMinThreshold = .6f; @@ -345,7 +373,6 @@ public override void DoSettingsWindowContents(Rect canvas) //Widgets.EndScrollView(); GUI.EndScrollView(); - } public static class UIHelper @@ -357,58 +384,5 @@ public static Rect GetRowRect(Rect inRect, float rowHeight, int row) return result; } } - - private string Rarity(float val) - { - string rarity = ""; - if (val == 0) - { - rarity = "None"; - } - else if (val < .2f) - { - rarity = "Very Rare"; - } - else if (val < .5f) - { - rarity = "Rare"; - } - else if (val < 1f) - { - rarity = "Uncommon"; - } - else if (val < 2f) - { - rarity = "Common"; - } - else - { - rarity = "Frequent"; - } - return rarity; - } - - private string Challenge(float val) - { - string rarity = ""; - if (val == 0) - { - rarity = "None (never happens)"; - } - else if (val <= 1) - { - rarity = "Easy"; - } - else if (val <= 2) - { - rarity = "Normal"; - } - else - { - rarity = "Hard"; - } - - return rarity; - } } } diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ExtraOptionsWindow.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ExtraOptionsWindow.cs index 3316846f..3d0d8292 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ExtraOptionsWindow.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ExtraOptionsWindow.cs @@ -50,10 +50,10 @@ public override void DoWindowContents(Rect inRect) //Options GUI.color = Color.white; Rect rowRect = Controller.UIHelper.GetRowRect(classRect, rowHeight, num); - Widgets.CheckboxLabeled(rowRect, "TM_Arcanist".Translate(), ref Settings.Instance.Arcanist, false); + Widgets.CheckboxLabeled(rowRect, "TM_Arcanist".Translate(), ref Settings.Arcanist.isEnabled); Rect rowRectShiftRight = Controller.UIHelper.GetRowRect(rowRect, rowHeight, num); rowRectShiftRight.x += rowRect.width + 140f; - Widgets.CheckboxLabeled(rowRectShiftRight, "TM_Gladiator".Translate(), ref Settings.Instance.Gladiator, false); + Widgets.CheckboxLabeled(rowRectShiftRight, "TM_Gladiator".Translate(), ref Settings.Gladiator.isEnabled); num++; diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/FactionDictionary.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/FactionDictionary.cs index c532ed66..bad4b978 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/FactionDictionary.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/FactionDictionary.cs @@ -44,8 +44,6 @@ public static void InitializeFactionSettings() { Settings.Instance.FactionFighterSettings = new Dictionary(); Settings.Instance.FactionMageSettings = new Dictionary(); - Settings.Instance.FactionFighterSettings.Clear(); - Settings.Instance.FactionMageSettings.Clear(); foreach (FactionDef current in factionDefs) { if (current.defName == "Seers") @@ -63,9 +61,7 @@ public static void InitializeFactionSettings() else { Dictionary fList = new Dictionary(); - fList.Clear(); Dictionary mList = new Dictionary(); - mList.Clear(); foreach (FactionDef current in factionDefs) { if (Settings.Instance.FactionFighterSettings.ContainsKey(current.defName)) diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ModClassOptions.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ModClassOptions.cs index 129155bf..43439bd3 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ModClassOptions.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/ModClassOptions.cs @@ -6,6 +6,7 @@ using UnityEngine; using System.Text; using HarmonyLib; +using TorannMagic.TMDefs; using TorannMagic.Utils; namespace TorannMagic.ModOptions @@ -13,23 +14,23 @@ namespace TorannMagic.ModOptions internal class ModClassOptions : Mod { // These get initialized in InitializeThingDefDictionaries since things must load first before ThingDefs can be accessed. - private static Dictionary> thingDefIndexToSettingsRefMap; - private static Dictionary> spellIndexToSettingsRefMap; - private static Dictionary settingsValueGetter, ThingDef spell)> recipeIndexMap; + private static Dictionary thingDefIndexToSettingsRefMap; + private static Dictionary spellIndexToSettingsRefMap; + private static Dictionary recipeIndexMap; - public ModClassOptions(ModContentPack mcp) : base(mcp) + public ModClassOptions(ModContentPack content) : base(content) { } + + // Requires TM_ClassUtility.InitializeCustomClasses and ModClassOptions.InitializeThingDefDictionaries to be ran before + public static void ReloadSettings() { - LongEventHandler.ExecuteWhenFinished(TM_ClassUtility.LoadCustomClasses); - //TM_ClassUtility.LoadCustomClasses(); - LongEventHandler.ExecuteWhenFinished(CheckForDisabledCustomClass); - LongEventHandler.ExecuteWhenFinished(InitializeThingDefDictionaries); - LongEventHandler.ExecuteWhenFinished(RestrictClasses); - LongEventHandler.ExecuteWhenFinished(InitializeFactionSettings); - LongEventHandler.ExecuteWhenFinished(InitializeCustomClassActions); - LongEventHandler.ExecuteWhenFinished(InitializeModBackstories); + TM_ClassUtility.LoadCustomClasses(); + TM_ClassUtility.CacheEnabledClasses(); + CheckForDisabledCustomClass(); + RestrictClasses(); + InitializeFactionSettings(); } - private static void InitializeModBackstories() + public static void InitializeModBackstories() { BackstorySlot TM_BS = (BackstorySlot)13; @@ -75,21 +76,16 @@ private static void InitializeModBackstories() //BackstoryDatabase.AddBackstory(TM_RegretSpiritBS); } - private static void InitializeFactionSettings() + public static void InitializeFactionSettings() { ModOptions.FactionDictionary.InitializeFactionSettings(); } - private static void CheckForDisabledCustomClass() + public static void CheckForDisabledCustomClass() { - if(Settings.Instance.CustomClass == null) - { - Settings.Instance.CustomClass = new Dictionary(); - Settings.Instance.CustomClass.Clear(); - } - for (int i = 0; i < TM_ClassUtility.CustomClasses.Count; i++) + for (int i = 0; i < TM_ClassUtility.CustomClasses.Length; i++) { - TMDefs.TM_CustomClass customClass = TM_ClassUtility.CustomClasses[i]; + TM_CustomClass customClass = TM_ClassUtility.CustomClasses[i]; if(!Settings.Instance.CustomClass.Keys.Contains(customClass.classTrait.ToString())) { Settings.Instance.CustomClass.Add(customClass.classTrait.ToString(), true); @@ -97,16 +93,19 @@ private static void CheckForDisabledCustomClass() } } - private static void InitializeCustomClassActions() + public static void InitializeCustomClassActions() { //Conflicting trait levelset List customTraits = new List(); - customTraits.Clear(); const string customIconType = "TM_Icon_Custom"; - - for (int i = 0; i < TM_ClassUtility.CustomClasses.Count; i++) + + TM_CustomClassDef named = TM_CustomClassDef.Named("TM_CustomClasses"); + if (named == null) return; + List customClasses = named.customClasses; + + for (int i = 0; i < customClasses.Count; i++) { - TMDefs.TM_CustomClass customClass = TM_ClassUtility.CustomClasses[i]; + TM_CustomClass customClass = customClasses[i]; //customTraits.AddDistinct(customClass.classTrait); if (customTraits.Contains(customClass.classTrait)) { @@ -134,12 +133,11 @@ private static void InitializeCustomClassActions() // Add custom trait to list for processing customTraits.Add(customClass.classTrait); } - customClass.classTrait.conflictingTraits.AddRange(TM_Data.AllClassTraits); + customClass.classTrait.conflictingTraits.AddRange(TM_ClassUtility.AllClassTraits); } - IEnumerable enumerable = from def in DefDatabase.AllDefs - where (TM_Data.AllClassTraits.Contains(def)) - select def; + IEnumerable enumerable = + DefDatabase.AllDefs.Where(static def => TM_ClassUtility.AllClassTraits.Contains(def)); foreach (TraitDef current in enumerable) { @@ -157,1008 +155,431 @@ private static void InitializeCustomClassActions() } } } - private static void InitializeThingDefDictionaries() + public static void InitializeThingDefDictionaries() { - thingDefIndexToSettingsRefMap = new Dictionary> + thingDefIndexToSettingsRefMap = new Dictionary { - { TorannMagicDefOf.BookOfSniper.index, () => new SettingsRef().Sniper }, - { TorannMagicDefOf.BookOfRanger.index, () => new SettingsRef().Ranger }, - { TorannMagicDefOf.TM_PoisonTrap.index, () => new SettingsRef().Ranger }, - { TorannMagicDefOf.BookOfGladiator.index, () => new SettingsRef().Gladiator }, - { TorannMagicDefOf.BookOfBladedancer.index, () => new SettingsRef().Bladedancer }, - { TorannMagicDefOf.BookOfFaceless.index, () => new SettingsRef().Faceless }, - { TorannMagicDefOf.BookOfPsionic.index, () => new SettingsRef().Psionic }, - { TorannMagicDefOf.BookOfDeathKnight.index, () => new SettingsRef().DeathKnight }, - { TorannMagicDefOf.BookOfMonk.index, () => new SettingsRef().Monk }, - { TorannMagicDefOf.BookOfCommander.index, () => new SettingsRef().Commander }, - { TorannMagicDefOf.BookOfSuperSoldier.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_60mmMortar_Base.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base1.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base2.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base3.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base4.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base5.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base6.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base7.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base8.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base9.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base10.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base11.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base12.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base13.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base14.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base15.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base16.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base17.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base18.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_PistolSpec_Base19.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base1.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base2.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base3.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base4.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base5.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base6.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base7.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base8.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base9.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base10.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base11.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base12.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base13.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base14.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base15.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base16.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base17.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base18.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_RifleSpec_Base19.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base1.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base2.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base3.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base4.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base5.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base6.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base7.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base8.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base9.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base10.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base11.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base12.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base13.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base14.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base15.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base16.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base17.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base18.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.TM_ShotgunSpec_Base19.index, () => new SettingsRef().SuperSoldier }, - { TorannMagicDefOf.BookOfArcanist.index, () => new SettingsRef().Arcanist }, - { TorannMagicDefOf.Torn_BookOfArcanist.index, () => new SettingsRef().Arcanist }, - { TorannMagicDefOf.Torn_BookOfInnerFire.index, () => new SettingsRef().FireMage }, - { TorannMagicDefOf.BookOfInnerFire.index, () => new SettingsRef().FireMage }, - { TorannMagicDefOf.Torn_BookOfHeartOfFrost.index, () => new SettingsRef().IceMage }, - { TorannMagicDefOf.BookOfHeartOfFrost.index, () => new SettingsRef().IceMage }, - { TorannMagicDefOf.Torn_BookOfStormBorn.index, () => new SettingsRef().LitMage }, - { TorannMagicDefOf.BookOfStormBorn.index, () => new SettingsRef().LitMage }, - { TorannMagicDefOf.Torn_BookOfNature.index, () => new SettingsRef().Druid }, - { TorannMagicDefOf.BookOfDruid.index, () => new SettingsRef().Druid }, - { TorannMagicDefOf.SeedofRegrowth.index, () => new SettingsRef().Druid }, - { TorannMagicDefOf.Torn_BookOfSummoner.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.BookOfSummoner.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.TM_ManaMine.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.TM_ManaMine_I.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.TM_ManaMine_II.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.TM_ManaMine_III.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.DefensePylon.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.DefensePylon_I.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.DefensePylon_II.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.DefensePylon_III.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.Launcher_DefensePylon.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.Launcher_DefensePylon_I.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.Launcher_DefensePylon_II.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.Launcher_DefensePylon_III.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.TM_Poppi.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.Torn_BookOfValiant.index, () => new SettingsRef().Paladin }, - { TorannMagicDefOf.BookOfValiant.index, () => new SettingsRef().Paladin }, - { TorannMagicDefOf.Torn_BookOfPriest.index, () => new SettingsRef().Priest }, - { TorannMagicDefOf.BookOfPriest.index, () => new SettingsRef().Priest }, - { TorannMagicDefOf.Torn_BookOfBard.index, () => new SettingsRef().Bard }, - { TorannMagicDefOf.BookOfBard.index, () => new SettingsRef().Bard }, - { TorannMagicDefOf.BookOfNecromancer.index, () => new SettingsRef().Necromancer }, - { TorannMagicDefOf.Torn_BookOfUndead.index, () => new SettingsRef().Necromancer }, - { TorannMagicDefOf.TM_Artifact_NecroticOrb.index, () => new SettingsRef().Necromancer }, - { TorannMagicDefOf.Torn_BookOfEarth.index, () => new SettingsRef().Geomancer }, - { TorannMagicDefOf.BookOfEarth.index, () => new SettingsRef().Geomancer }, - { TorannMagicDefOf.TM_Lesser_SentinelR.index, () => new SettingsRef().Geomancer }, - { TorannMagicDefOf.TM_SentinelR.index, () => new SettingsRef().Geomancer }, - { TorannMagicDefOf.TM_Greater_SentinelR.index, () => new SettingsRef().Geomancer }, - { TorannMagicDefOf.Torn_BookOfDemons.index, () => new SettingsRef().Demonkin }, - { TorannMagicDefOf.BookOfDemons.index, () => new SettingsRef().Demonkin }, - { TorannMagicDefOf.Torn_BookOfMagitech.index, () => new SettingsRef().Technomancer }, - { TorannMagicDefOf.BookOfMagitech.index, () => new SettingsRef().Technomancer }, - { TorannMagicDefOf.Torn_BookOfHemomancy.index, () => new SettingsRef().BloodMage }, - { TorannMagicDefOf.BookOfHemomancy.index, () => new SettingsRef().BloodMage }, - { TorannMagicDefOf.Torn_BookOfEnchanter.index, () => new SettingsRef().Enchanter }, - { TorannMagicDefOf.BookOfEnchanter.index, () => new SettingsRef().Enchanter }, - { TorannMagicDefOf.Torn_BookOfChronomancer.index, () => new SettingsRef().Chronomancer }, - { TorannMagicDefOf.BookOfChronomancer.index, () => new SettingsRef().Chronomancer }, - { TorannMagicDefOf.Torn_BookOfChaos.index, () => new SettingsRef().ChaosMage }, - { TorannMagicDefOf.BookOfChaos.index, () => new SettingsRef().ChaosMage } + { TorannMagicDefOf.BookOfSniper.index, Settings.Sniper }, + { TorannMagicDefOf.BookOfRanger.index, Settings.Ranger }, + { ThingDef.Named("TM_PoisonTrap").index, Settings.Ranger }, + { TorannMagicDefOf.BookOfGladiator.index, Settings.Gladiator }, + { TorannMagicDefOf.BookOfBladedancer.index, Settings.Bladedancer }, + { TorannMagicDefOf.BookOfFaceless.index, Settings.Faceless }, + { TorannMagicDefOf.BookOfPsionic.index, Settings.Psionic }, + { TorannMagicDefOf.BookOfDeathKnight.index, Settings.DeathKnight }, + { TorannMagicDefOf.BookOfMonk.index, Settings.Monk }, + { TorannMagicDefOf.BookOfCommander.index, Settings.Commander }, + { TorannMagicDefOf.BookOfSuperSoldier.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_60mmMortar_Base.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base1.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base2.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base3.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base4.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base5.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base6.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base7.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base8.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base9.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base10.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base11.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base12.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base13.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base14.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base15.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base16.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base17.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base18.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_PistolSpec_Base19.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base1.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base2.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base3.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base4.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base5.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base6.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base7.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base8.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base9.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base10.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base11.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base12.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base13.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base14.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base15.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base16.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base17.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base18.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_RifleSpec_Base19.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base1.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base2.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base3.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base4.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base5.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base6.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base7.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base8.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base9.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base10.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base11.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base12.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base13.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base14.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base15.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base16.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base17.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base18.index, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_ShotgunSpec_Base19.index, Settings.SuperSoldier }, + { TorannMagicDefOf.BookOfArcanist.index, Settings.Arcanist }, + { TorannMagicDefOf.Torn_BookOfArcanist.index, Settings.Arcanist }, + { TorannMagicDefOf.Torn_BookOfInnerFire.index, Settings.FireMage }, + { TorannMagicDefOf.BookOfInnerFire.index, Settings.FireMage }, + { TorannMagicDefOf.Torn_BookOfHeartOfFrost.index, Settings.IceMage }, + { TorannMagicDefOf.BookOfHeartOfFrost.index, Settings.IceMage }, + { TorannMagicDefOf.Torn_BookOfStormBorn.index, Settings.LitMage }, + { TorannMagicDefOf.BookOfStormBorn.index, Settings.LitMage }, + { TorannMagicDefOf.Torn_BookOfNature.index, Settings.Druid }, + { TorannMagicDefOf.BookOfDruid.index, Settings.Druid }, + { TorannMagicDefOf.SeedofRegrowth.index, Settings.Druid }, + { TorannMagicDefOf.Torn_BookOfSummoner.index, Settings.Summoner }, + { TorannMagicDefOf.BookOfSummoner.index, Settings.Summoner }, + { TorannMagicDefOf.TM_ManaMine.index, Settings.Summoner }, + { TorannMagicDefOf.TM_ManaMine_I.index, Settings.Summoner }, + { TorannMagicDefOf.TM_ManaMine_II.index, Settings.Summoner }, + { TorannMagicDefOf.TM_ManaMine_III.index, Settings.Summoner }, + { TorannMagicDefOf.DefensePylon.index, Settings.Summoner }, + { TorannMagicDefOf.DefensePylon_I.index, Settings.Summoner }, + { TorannMagicDefOf.DefensePylon_II.index, Settings.Summoner }, + { TorannMagicDefOf.DefensePylon_III.index, Settings.Summoner }, + { TorannMagicDefOf.Launcher_DefensePylon.index, Settings.Summoner }, + { TorannMagicDefOf.Launcher_DefensePylon_I.index, Settings.Summoner }, + { TorannMagicDefOf.Launcher_DefensePylon_II.index, Settings.Summoner }, + { TorannMagicDefOf.Launcher_DefensePylon_III.index, Settings.Summoner }, + { TorannMagicDefOf.TM_Poppi.index, Settings.Summoner }, + { TorannMagicDefOf.Torn_BookOfValiant.index, Settings.Paladin }, + { TorannMagicDefOf.BookOfValiant.index, Settings.Paladin }, + { TorannMagicDefOf.Torn_BookOfPriest.index, Settings.Priest }, + { TorannMagicDefOf.BookOfPriest.index, Settings.Priest }, + { TorannMagicDefOf.Torn_BookOfBard.index, Settings.Bard }, + { TorannMagicDefOf.BookOfBard.index, Settings.Bard }, + { TorannMagicDefOf.BookOfNecromancer.index, Settings.Necromancer }, + { TorannMagicDefOf.Torn_BookOfUndead.index, Settings.Necromancer }, + { TorannMagicDefOf.TM_Artifact_NecroticOrb.index, Settings.Necromancer }, + { TorannMagicDefOf.Torn_BookOfEarth.index, Settings.Geomancer }, + { TorannMagicDefOf.BookOfEarth.index, Settings.Geomancer }, + { TorannMagicDefOf.TM_Lesser_SentinelR.index, Settings.Geomancer }, + { TorannMagicDefOf.TM_SentinelR.index, Settings.Geomancer }, + { TorannMagicDefOf.TM_Greater_SentinelR.index, Settings.Geomancer }, + { TorannMagicDefOf.Torn_BookOfDemons.index, Settings.Demonkin }, + { TorannMagicDefOf.BookOfDemons.index, Settings.Demonkin }, + { TorannMagicDefOf.Torn_BookOfMagitech.index, Settings.Technomancer }, + { TorannMagicDefOf.BookOfMagitech.index, Settings.Technomancer }, + { TorannMagicDefOf.Torn_BookOfHemomancy.index, Settings.BloodMage }, + { TorannMagicDefOf.BookOfHemomancy.index, Settings.BloodMage }, + { TorannMagicDefOf.Torn_BookOfEnchanter.index, Settings.Enchanter }, + { TorannMagicDefOf.BookOfEnchanter.index, Settings.Enchanter }, + { TorannMagicDefOf.Torn_BookOfChronomancer.index, Settings.Chronomancer }, + { TorannMagicDefOf.BookOfChronomancer.index, Settings.Chronomancer }, + { TorannMagicDefOf.Torn_BookOfChaos.index, Settings.ChaosMage }, + { TorannMagicDefOf.BookOfChaos.index, Settings.ChaosMage } }; - spellIndexToSettingsRefMap = new Dictionary> + spellIndexToSettingsRefMap = new Dictionary { - { TorannMagicDefOf.SpellOf_FoldReality.index, () => new SettingsRef().Arcanist }, - { TorannMagicDefOf.SpellOf_Firestorm.index, () => new SettingsRef().FireMage }, - { TorannMagicDefOf.SpellOf_DryGround.index, () => new SettingsRef().FireMage }, - { TorannMagicDefOf.SpellOf_Blizzard.index, () => new SettingsRef().IceMage }, - { TorannMagicDefOf.SpellOf_WetGround.index, () => new SettingsRef().IceMage }, - { TorannMagicDefOf.SpellOf_EyeOfTheStorm.index, () => new SettingsRef().LitMage }, - { TorannMagicDefOf.SpellOf_ChargeBattery.index, () => new SettingsRef().LitMage }, - { TorannMagicDefOf.SpellOf_RegrowLimb.index, () => new SettingsRef().Druid }, - { TorannMagicDefOf.SpellOf_FertileLands.index, () => new SettingsRef().Druid }, - { TorannMagicDefOf.SpellOf_SummonPoppi.index, () => new SettingsRef().Summoner }, - { TorannMagicDefOf.SpellOf_HolyWrath.index, () => new SettingsRef().Paladin }, - { TorannMagicDefOf.SpellOf_Resurrection.index, () => new SettingsRef().Priest }, - { TorannMagicDefOf.SpellOf_BattleHymn.index, () => new SettingsRef().Bard }, - { TorannMagicDefOf.SpellOf_LichForm.index, () => new SettingsRef().Necromancer }, - { TorannMagicDefOf.SpellOf_Meteor.index, () => new SettingsRef().Geomancer }, - { TorannMagicDefOf.SpellOf_Scorn.index, () => new SettingsRef().Demonkin }, - { TorannMagicDefOf.SpellOf_PsychicShock.index, () => new SettingsRef().Demonkin }, - { TorannMagicDefOf.SpellOf_TechnoShield.index, () => new SettingsRef().Technomancer }, - { TorannMagicDefOf.SpellOf_Sabotage.index, () => new SettingsRef().Technomancer }, - { TorannMagicDefOf.SpellOf_Overdrive.index, () => new SettingsRef().Technomancer }, - { TorannMagicDefOf.SpellOf_OrbitalStrike.index, () => new SettingsRef().Technomancer }, - { TorannMagicDefOf.SpellOf_BloodMoon.index, () => new SettingsRef().BloodMage }, - { TorannMagicDefOf.SpellOf_Shapeshift.index, () => new SettingsRef().Enchanter }, - { TorannMagicDefOf.SpellOf_Recall.index, () => new SettingsRef().Chronomancer }, + { TorannMagicDefOf.SpellOf_FoldReality.index, Settings.Arcanist }, + { TorannMagicDefOf.SpellOf_Firestorm.index, Settings.FireMage }, + { TorannMagicDefOf.SpellOf_DryGround.index, Settings.FireMage }, + { TorannMagicDefOf.SpellOf_Blizzard.index, Settings.IceMage }, + { TorannMagicDefOf.SpellOf_WetGround.index, Settings.IceMage }, + { TorannMagicDefOf.SpellOf_EyeOfTheStorm.index, Settings.LitMage }, + { TorannMagicDefOf.SpellOf_ChargeBattery.index, Settings.LitMage }, + { TorannMagicDefOf.SpellOf_RegrowLimb.index, Settings.Druid }, + { TorannMagicDefOf.SpellOf_FertileLands.index, Settings.Druid }, + { TorannMagicDefOf.SpellOf_SummonPoppi.index, Settings.Summoner }, + { TorannMagicDefOf.SpellOf_HolyWrath.index, Settings.Paladin }, + { TorannMagicDefOf.SpellOf_Resurrection.index, Settings.Priest }, + { TorannMagicDefOf.SpellOf_BattleHymn.index, Settings.Bard }, + { TorannMagicDefOf.SpellOf_LichForm.index, Settings.Necromancer }, + { TorannMagicDefOf.SpellOf_Meteor.index, Settings.Geomancer }, + { TorannMagicDefOf.SpellOf_Scorn.index, Settings.Demonkin }, + { TorannMagicDefOf.SpellOf_PsychicShock.index, Settings.Demonkin }, + { TorannMagicDefOf.SpellOf_TechnoShield.index, Settings.Technomancer }, + { TorannMagicDefOf.SpellOf_Sabotage.index, Settings.Technomancer }, + { TorannMagicDefOf.SpellOf_Overdrive.index, Settings.Technomancer }, + { TorannMagicDefOf.SpellOf_OrbitalStrike.index, Settings.Technomancer }, + { TorannMagicDefOf.SpellOf_BloodMoon.index, Settings.BloodMage }, + { TorannMagicDefOf.SpellOf_Shapeshift.index, Settings.Enchanter }, + { TorannMagicDefOf.SpellOf_Recall.index, Settings.Chronomancer }, }; - recipeIndexMap = new Dictionary settingsValueGetter, ThingDef item)> + recipeIndexMap = new Dictionary { { TorannMagicDefOf.Make_SpellOf_FoldReality.index, - (() => new SettingsRef().Arcanist, TorannMagicDefOf.SpellOf_FoldReality) + (Settings.Arcanist, TorannMagicDefOf.SpellOf_FoldReality) }, { TorannMagicDefOf.Make_SpellOf_Firestorm.index, - (() => new SettingsRef().FireMage, TorannMagicDefOf.SpellOf_Firestorm) + (Settings.FireMage, TorannMagicDefOf.SpellOf_Firestorm) }, { TorannMagicDefOf.Make_SpellOf_DryGround.index, - (() => new SettingsRef().FireMage, TorannMagicDefOf.SpellOf_DryGround) + (Settings.FireMage, TorannMagicDefOf.SpellOf_DryGround) }, { TorannMagicDefOf.Make_SpellOf_Blizzard.index, - (() => new SettingsRef().IceMage, TorannMagicDefOf.SpellOf_Blizzard) + (Settings.IceMage, TorannMagicDefOf.SpellOf_Blizzard) }, { TorannMagicDefOf.Make_SpellOf_WetGround.index, - (() => new SettingsRef().IceMage, TorannMagicDefOf.SpellOf_WetGround) + (Settings.IceMage, TorannMagicDefOf.SpellOf_WetGround) }, { TorannMagicDefOf.Make_SpellOf_EyeOfTheStorm.index, - (() => new SettingsRef().LitMage, TorannMagicDefOf.SpellOf_EyeOfTheStorm) + (Settings.LitMage, TorannMagicDefOf.SpellOf_EyeOfTheStorm) }, { TorannMagicDefOf.Make_SpellOf_ChargeBattery.index, - (() => new SettingsRef().LitMage, TorannMagicDefOf.SpellOf_ChargeBattery) + (Settings.LitMage, TorannMagicDefOf.SpellOf_ChargeBattery) }, { TorannMagicDefOf.Make_SpellOf_RegrowLimb.index, - (() => new SettingsRef().Druid, TorannMagicDefOf.SpellOf_RegrowLimb) + (Settings.Druid, TorannMagicDefOf.SpellOf_RegrowLimb) }, { TorannMagicDefOf.Make_SpellOf_FertileLands.index, - (() => new SettingsRef().Druid, TorannMagicDefOf.SpellOf_FertileLands) + (Settings.Druid, TorannMagicDefOf.SpellOf_FertileLands) }, { TorannMagicDefOf.Make_SpellOf_SummonPoppi.index, - (() => new SettingsRef().Summoner, TorannMagicDefOf.SpellOf_SummonPoppi) + (Settings.Summoner, TorannMagicDefOf.SpellOf_SummonPoppi) }, { TorannMagicDefOf.Make_SpellOf_HolyWrath.index, - (() => new SettingsRef().Paladin, TorannMagicDefOf.SpellOf_HolyWrath) + (Settings.Paladin, TorannMagicDefOf.SpellOf_HolyWrath) }, { TorannMagicDefOf.Make_SpellOf_Resurrection.index, - (() => new SettingsRef().Priest, TorannMagicDefOf.SpellOf_Resurrection) + (Settings.Priest, TorannMagicDefOf.SpellOf_Resurrection) }, { TorannMagicDefOf.Make_SpellOf_BattleHymn.index, - (() => new SettingsRef().Bard, TorannMagicDefOf.SpellOf_BattleHymn) + (Settings.Bard, TorannMagicDefOf.SpellOf_BattleHymn) }, { TorannMagicDefOf.Make_SpellOf_LichForm.index, - (() => new SettingsRef().Necromancer, TorannMagicDefOf.SpellOf_LichForm) + (Settings.Necromancer, TorannMagicDefOf.SpellOf_LichForm) }, { TorannMagicDefOf.Make_SpellOf_Meteor.index, - (() => new SettingsRef().Geomancer, TorannMagicDefOf.SpellOf_Meteor) + (Settings.Geomancer, TorannMagicDefOf.SpellOf_Meteor) }, { TorannMagicDefOf.Make_SpellOf_Scorn.index, - (() => new SettingsRef().Demonkin, TorannMagicDefOf.SpellOf_Scorn) + (Settings.Demonkin, TorannMagicDefOf.SpellOf_Scorn) }, { TorannMagicDefOf.Make_SpellOf_PsychicShock.index, - (() => new SettingsRef().Demonkin, TorannMagicDefOf.SpellOf_PsychicShock) + (Settings.Demonkin, TorannMagicDefOf.SpellOf_PsychicShock) }, { TorannMagicDefOf.Make_SpellOf_TechnoShield.index, - (() => new SettingsRef().Technomancer, TorannMagicDefOf.SpellOf_TechnoShield) + (Settings.Technomancer, TorannMagicDefOf.SpellOf_TechnoShield) }, { TorannMagicDefOf.Make_SpellOf_Sabotage.index, - (() => new SettingsRef().Technomancer, TorannMagicDefOf.SpellOf_Sabotage) + (Settings.Technomancer, TorannMagicDefOf.SpellOf_Sabotage) }, { TorannMagicDefOf.Make_SpellOf_Overdrive.index, - (() => new SettingsRef().Technomancer, TorannMagicDefOf.SpellOf_Overdrive) + (Settings.Technomancer, TorannMagicDefOf.SpellOf_Overdrive) }, { TorannMagicDefOf.Make_SpellOf_OrbitalStrike.index, - (() => new SettingsRef().Technomancer, TorannMagicDefOf.SpellOf_OrbitalStrike) + (Settings.Technomancer, TorannMagicDefOf.SpellOf_OrbitalStrike) }, { TorannMagicDefOf.Make_SpellOf_BloodMoon.index, - (() => new SettingsRef().BloodMage, TorannMagicDefOf.SpellOf_BloodMoon) + (Settings.BloodMage, TorannMagicDefOf.SpellOf_BloodMoon) }, { TorannMagicDefOf.Make_SpellOf_Shapeshift.index, - (() => new SettingsRef().Enchanter, TorannMagicDefOf.SpellOf_Shapeshift) + (Settings.Enchanter, TorannMagicDefOf.SpellOf_Shapeshift) }, { TorannMagicDefOf.Make_SpellOf_Recall.index, - (() => new SettingsRef().Chronomancer, TorannMagicDefOf.SpellOf_Recall) + (Settings.Chronomancer, TorannMagicDefOf.SpellOf_Recall) }, { TorannMagicDefOf.Make_BookOfSuperSoldier.index, - (() => new SettingsRef().SuperSoldier, TorannMagicDefOf.BookOfSuperSoldier) + (Settings.SuperSoldier, TorannMagicDefOf.BookOfSuperSoldier) } }; } - private static void RestrictClasses() + public static Dictionary GetLinkedCustomFighterSkillThings() { - + return new Dictionary + { + { TorannMagicDefOf.TM_PoisonTrap, new[] { ThingDef.Named("TM_PoisonTrap") } }, + { TorannMagicDefOf.TM_60mmMortar, new[] { TorannMagicDefOf.TM_60mmMortar_Base } }, + { TorannMagicDefOf.TM_PistolSpec, new[] { TorannMagicDefOf.TM_PistolSpec_Base0 } }, + { TorannMagicDefOf.TM_RifleSpec, new[] { TorannMagicDefOf.TM_RifleSpec_Base0 } }, + { TorannMagicDefOf.TM_ShotgunSpec, new[] { TorannMagicDefOf.TM_ShotgunSpec_Base0 } } + }; + } - IEnumerable enumerable = (from def in DefDatabase.AllDefs - select def); - List removedThings = new List(); - List customThings = new List(); - List removedCustomThings = new List(); + public static Dictionary GetLinkedCustomMageSkillThings() + { + return new Dictionary + { + { TorannMagicDefOf.TM_RegrowLimb, new[] { TorannMagicDefOf.SeedofRegrowth } }, + { TorannMagicDefOf.TM_SummonExplosive, new[] + { + TorannMagicDefOf.TM_ManaMine, + TorannMagicDefOf.TM_ManaMine_I, + TorannMagicDefOf.TM_ManaMine_II, + TorannMagicDefOf.TM_ManaMine_III + }}, + { TorannMagicDefOf.TM_SummonPylon, new[] + { + TorannMagicDefOf.DefensePylon, + TorannMagicDefOf.DefensePylon_I, + TorannMagicDefOf.DefensePylon_II, + TorannMagicDefOf.DefensePylon_III, + TorannMagicDefOf.Bullet_DefensePylon, + TorannMagicDefOf.Launcher_DefensePylon, + TorannMagicDefOf.Launcher_DefensePylon_I, + TorannMagicDefOf.Launcher_DefensePylon_II, + TorannMagicDefOf.Launcher_DefensePylon_III + }}, + { TorannMagicDefOf.TM_SummonPoppi, new[] { TorannMagicDefOf.TM_Poppi }}, + { TorannMagicDefOf.TM_RaiseUndead, new[] { TorannMagicDefOf.TM_Artifact_NecroticOrb }} + }; + } + + public static void RestrictClasses() + { + HashSet removedThings = new HashSet(); + HashSet customThings = new HashSet(); + HashSet removedCustomThings = new HashSet(); List classSpells = new List(); List removedSpells = new List(); - TM_CustomClassDef ccDef = TM_CustomClassDef.Named("TM_CustomClasses"); - if (ccDef != null) + TM_CustomClassDef customClassDef = TM_CustomClassDef.Named("TM_CustomClasses"); + if (customClassDef == null) { - for (int i = 0; i < ccDef.customClasses.Count; i++) - { - TMDefs.TM_CustomClass cc = ccDef.customClasses[i]; - if (Settings.Instance.CustomClass[cc.classTrait.ToString()]) + Log.Error("[Rimworld of Magic] Could not load Custom Classes. Something went wrong."); + return; + } + + for (int ccIndex = 0; ccIndex < customClassDef.customClasses.Count; ccIndex++) + { + TM_CustomClass cc = customClassDef.customClasses[ccIndex]; + if (Settings.Instance.CustomClass[cc.classTrait.ToString()]) + { + if (cc.tornScript != null) customThings.Add(cc.tornScript); + if (cc.fullScript != null) customThings.Add(cc.fullScript); + if (cc.learnableSkills != null) customThings.AddRange(cc.learnableSkills); + if (cc.learnableSpells != null) customThings.AddRange(cc.learnableSpells); + if (cc.classFighterAbilities != null) { - if (cc.tornScript != null) - { - customThings.AddDistinct(cc.tornScript); - } - if (cc.fullScript != null) - { - customThings.AddDistinct(cc.fullScript); - } - if (cc.learnableSkills != null && cc.learnableSkills.Count > 0) - { - for (int j = 0; j < cc.learnableSkills.Count; j++) - { - customThings.AddDistinct(cc.learnableSkills[j]); - } - } - if (cc.learnableSpells != null && cc.learnableSpells.Count > 0) - { - for (int j = 0; j < cc.learnableSpells.Count; j++) - { - customThings.AddDistinct(cc.learnableSpells[j]); - } - } - if (cc.classFighterAbilities != null && cc.classFighterAbilities.Count > 0) + for (int i = 0; i < cc.classFighterAbilities.Count; i++) { - if (cc.classFighterAbilities.Contains(TorannMagicDefOf.TM_PoisonTrap)) - { - customThings.AddDistinct(ThingDef.Named("TM_PoisonTrap")); - } - if (cc.classFighterAbilities.Contains(TorannMagicDefOf.TM_60mmMortar)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_60mmMortar_Base); - } - if (cc.classFighterAbilities.Contains(TorannMagicDefOf.TM_PistolSpec)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_PistolSpec_Base0); - } - if (cc.classFighterAbilities.Contains(TorannMagicDefOf.TM_RifleSpec)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_RifleSpec_Base0); - } - if (cc.classFighterAbilities.Contains(TorannMagicDefOf.TM_ShotgunSpec)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_ShotgunSpec_Base0); - } - } - if (cc.classMageAbilities != null && cc.classMageAbilities.Count > 0) - { - if (cc.classMageAbilities.Contains(TorannMagicDefOf.TM_RegrowLimb)) - { - customThings.AddDistinct(TorannMagicDefOf.SeedofRegrowth); - } - if (cc.classMageAbilities.Contains(TorannMagicDefOf.TM_SummonExplosive)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_ManaMine); - customThings.AddDistinct(TorannMagicDefOf.TM_ManaMine_I); - customThings.AddDistinct(TorannMagicDefOf.TM_ManaMine_II); - customThings.AddDistinct(TorannMagicDefOf.TM_ManaMine_III); - } - if (cc.classMageAbilities.Contains(TorannMagicDefOf.TM_SummonPylon)) - { - customThings.AddDistinct(TorannMagicDefOf.DefensePylon); - customThings.AddDistinct(TorannMagicDefOf.DefensePylon_I); - customThings.AddDistinct(TorannMagicDefOf.DefensePylon_II); - customThings.AddDistinct(TorannMagicDefOf.DefensePylon_III); - customThings.AddDistinct(TorannMagicDefOf.Bullet_DefensePylon); - customThings.AddDistinct(TorannMagicDefOf.Launcher_DefensePylon); - customThings.AddDistinct(TorannMagicDefOf.Launcher_DefensePylon_I); - customThings.AddDistinct(TorannMagicDefOf.Launcher_DefensePylon_II); - customThings.AddDistinct(TorannMagicDefOf.Launcher_DefensePylon_III); - customThings.AddDistinct(TorannMagicDefOf.TM_Poppi); - } - if (cc.classMageAbilities.Contains(TorannMagicDefOf.TM_SummonPoppi)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_Poppi); - } - if (cc.classMageAbilities.Contains(TorannMagicDefOf.TM_RaiseUndead)) - { - customThings.AddDistinct(TorannMagicDefOf.TM_Artifact_NecroticOrb); - } + customThings.AddRange(GetLinkedCustomFighterSkillThings().TryGetValue( + cc.classFighterAbilities[i], Array.Empty())); } } - else + if (cc.classMageAbilities != null) { - if (cc.tornScript != null) + for (int i = 0; i < cc.classMageAbilities.Count; i++) { - removedCustomThings.Add(cc.tornScript); + customThings.AddRange(GetLinkedCustomMageSkillThings().TryGetValue( + cc.classMageAbilities[i], Array.Empty())); } - //for (int k = 0; k < cc.learnableSpells.Count; k++) - //{ - // removedSpells.Add(cc.learnableSpells[k]); - //} - //for (int k = 0; k < cc.learnableSkills.Count; k++) - //{ - // removedSpells.Add(cc.learnableSkills[k]); - //} - removedSpells.AddRange(cc.learnableSpells); - removedSpells.AddRange(cc.learnableSkills); - removedCustomThings.Add(cc.fullScript); } } - - void removeIfNotCustom(ThingDef thingDef) - { - if (!customThings.Contains(thingDef)) - removedThings.Add(thingDef); - } - - foreach (ThingDef current in enumerable) + else { - // First check if this is a normal ThingDef we have a setting for - Func settingsValueGetter = thingDefIndexToSettingsRefMap.TryGetValue(current.index); - if (settingsValueGetter != null) + if (cc.tornScript != null) { - if (!settingsValueGetter()) - removeIfNotCustom(current); - } - // If that fails, next we check for spells - else - { - settingsValueGetter = spellIndexToSettingsRefMap.TryGetValue(current.index); - if (settingsValueGetter == null) continue; - - if (settingsValueGetter()) - classSpells.Add(current); - else - removeIfNotCustom(current); + removedCustomThings.Add(cc.tornScript); } + removedSpells.AddRange(cc.learnableSpells); + removedSpells.AddRange(cc.learnableSkills); + removedCustomThings.Add(cc.fullScript); } + } - //foreach (ThingDef current in enumerable) - //{ - // if (!ModOptions.Settings.Instance.Sniper) - // { - // if (current.defName == "BookOfSniper") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Ranger) - // { - // if (current.defName == "BookOfRanger" || current.defName == "TM_PoisonTrap") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Gladiator) - // { - // if (current.defName == "BookOfGladiator") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Bladedancer) - // { - // if (current.defName == "BookOfBladedancer") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Faceless) - // { - // if (current.defName == "BookOfFaceless") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Psionic) - // { - // if (current.defName == "BookOfPsionic") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.DeathKnight) - // { - // if (current.defName == "BookOfDeathKnight") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Monk) - // { - // if (current.defName == "BookOfMonk") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.Commander) - // { - // if (current == TorannMagicDefOf.BookOfCommander) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // if (!ModOptions.Settings.Instance.SuperSoldier) - // { - // if (current == TorannMagicDefOf.BookOfSuperSoldier || current == TorannMagicDefOf.TM_60mmMortar_Base) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // if (current.defName.Contains("TM_PistolSpec_Base") && !customThings.Contains(ThingDef.Named("TM_PistolSpec_Base0"))) - // { - // removedThings.Add(current); - // } - // if (current.defName.Contains("TM_RifleSpec_Base") && !customThings.Contains(ThingDef.Named("TM_RifleSpec_Base0"))) - // { - // removedThings.Add(current); - // } - // if (current.defName.Contains("TM_ShotgunSpec_Base") && !customThings.Contains(ThingDef.Named("TM_ShotgunSpec_Base0"))) - // { - // removedThings.Add(current); - // } - // } - - // if (!ModOptions.Settings.Instance.Arcanist) - // { - // if (current.defName == "Torn_BookOfArcanist" || current.defName == "BookOfArcanist" || current.defName == "SpellOf_FoldReality") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_FoldReality") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.FireMage) - // { - // if (current.defName == "Torn_BookOfInnerFire" || current.defName == "BookOfInnerFire" || current.defName == "SpellOf_Firestorm" || current.defName == "SpellOf_DryGround") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_Firestorm" || current.defName == "SpellOf_DryGround") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.IceMage) - // { - // if (current.defName == "Torn_BookOfHeartOfFrost" || current.defName == "BookOfHeartOfFrost" || current.defName == "SpellOf_Blizzard" || current.defName == "SpellOf_WetGround") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_Blizzard" || current.defName == "SpellOf_WetGround") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.LitMage) - // { - // if (current.defName == "Torn_BookOfStormBorn" || current.defName == "BookOfStormBorn" || current.defName == "SpellOf_EyeOfTheStorm" || current.defName == "SpellOf_ChargeBattery") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_EyeOfTheStorm" || current.defName == "SpellOf_ChargeBattery") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Druid) - // { - // if (current.defName == "Torn_BookOfNature" || current.defName == "BookOfNature" || current.defName == "SpellOf_RegrowLimb" || current.defName == "SeedofRegrowth" || current.defName == "SpellOf_FertileLands") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_RegrowLimb" || current.defName == "SpellOf_FertileLands") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Summoner) - // { - // if (current.defName == "Torn_BookOfSummoner" || current.defName == "BookOfSummoner" || current.defName == "SpellOf_SummonPoppi" || - // current.defName == "TM_ManaMine" || current.defName == "TM_ManaMine_I" || current.defName == "TM_ManaMine_II" || current.defName == "TM_ManaMine_III" || - // current.defName == "DefensePylon" || current.defName == "DefensePylon_I" || current.defName == "DefensePylon_II" || current.defName == "DefensePylon_III" || current.defName == "Bullet_DefensePylon" || - // current.defName == "Launcher_DefensePylon" || current.defName == "Launcher_DefensePylon_I" || current.defName == "Launcher_DefensePylon_II" || current.defName == "Launcher_DefensePylon_III" || - // current.defName == "TM_Poppi") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_SummonPoppi") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Paladin) - // { - // if (current.defName == "Torn_BookOfValiant" || current.defName == "BookOfValiant" || current.defName == "SpellOf_HolyWrath") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_HolyWrath") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Priest) - // { - // if (current.defName == "Torn_BookOfPriest" || current.defName == "BookOfPriest" || current.defName == "SpellOf_Resurrection") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_Resurrection") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Bard) - // { - // if (current.defName == "Torn_BookOfBard" || current.defName == "BookOfBard" || current.defName == "SpellOf_BattleHymn") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_BattleHymn") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Necromancer) - // { - // if (current == TorannMagicDefOf.BookOfNecromancer || current == TorannMagicDefOf.Torn_BookOfUndead || current == TorannMagicDefOf.SpellOf_LichForm || current == TorannMagicDefOf.TM_Artifact_NecroticOrb) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current == TorannMagicDefOf.SpellOf_LichForm) - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Geomancer) - // { - // if (current.defName == "Torn_BookOfEarth" || current.defName == "BookOfEarth" || current.defName == "SpellOf_Meteor" || - // current.defName == "TM_Lesser_SentinelR" || current.defName == "TM_SentinelR" || current.defName == "TM_Greater_SentinelR") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_Meteor") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Demonkin) - // { - // if (current.defName == "Torn_BookOfDemons" || current.defName == "BookOfDemons" || current.defName == "SpellOf_Scorn" || current.defName == "SpellOf_PsychicShock") - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current.defName == "SpellOf_Scorn" || current.defName == "SpellOf_PsychicShock") - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Technomancer) - // { - // if (current == TorannMagicDefOf.Torn_BookOfMagitech || current == TorannMagicDefOf.BookOfMagitech || current == TorannMagicDefOf.SpellOf_TechnoShield || current == TorannMagicDefOf.SpellOf_Sabotage || current == TorannMagicDefOf.SpellOf_Overdrive || current == TorannMagicDefOf.SpellOf_OrbitalStrike) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current == TorannMagicDefOf.SpellOf_TechnoShield || current == TorannMagicDefOf.SpellOf_Sabotage || current == TorannMagicDefOf.SpellOf_Overdrive || current == TorannMagicDefOf.SpellOf_OrbitalStrike) - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.BloodMage) - // { - // if (current == TorannMagicDefOf.BookOfHemomancy || current == TorannMagicDefOf.Torn_BookOfHemomancy || current == TorannMagicDefOf.SpellOf_BloodMoon) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current == TorannMagicDefOf.SpellOf_BloodMoon) - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Enchanter) - // { - // if (current == TorannMagicDefOf.BookOfEnchanter || current == TorannMagicDefOf.Torn_BookOfEnchanter || current == TorannMagicDefOf.SpellOf_Shapeshift) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current == TorannMagicDefOf.SpellOf_Shapeshift) - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.Chronomancer) - // { - // if (current == TorannMagicDefOf.BookOfChronomancer || current == TorannMagicDefOf.Torn_BookOfChronomancer || current == TorannMagicDefOf.SpellOf_Recall) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - // else - // { - // if (current == TorannMagicDefOf.SpellOf_Recall) - // { - // classSpells.Add(current); - // } - // } - // if (!ModOptions.Settings.Instance.ChaosMage) - // { - // if (current == TorannMagicDefOf.BookOfChaos || current == TorannMagicDefOf.Torn_BookOfChaos) - // { - // if (!customThings.Contains(current)) - // { - // removedThings.Add(current); - // } - // } - // } - //} + void removeIfNotCustom(ThingDef thingDef) + { + if (!customThings.Contains(thingDef)) + removedThings.Add(thingDef); + } - for (int i = 0; i < removedCustomThings.Count; i++) + foreach (ThingDef current in DefDatabase.AllDefs) + { + // First check if this is a normal ThingDef we have a setting for + Settings.CheckboxOption option = thingDefIndexToSettingsRefMap.TryGetValue(current.index); + if (option != null) { - if (!removedThings.Contains(removedCustomThings[i])) - { - removedThings.Add(removedCustomThings[i]); - } + if (!option.isEnabled) + removeIfNotCustom(current); } - - for (int i = 0; i < removedSpells.Count; i++) + // If that fails, next we check for spells + else { - if (!customThings.Contains(removedSpells[i]) && !classSpells.Contains(removedSpells[i])) - { - removedThings.Add(removedSpells[i]); - removedCustomThings.Add(removedSpells[i]); - } + option = spellIndexToSettingsRefMap.TryGetValue(current.index); + if (option == null) continue; + + if (option.isEnabled) + classSpells.Add(current); + else + removeIfNotCustom(current); } + } + + removedThings.UnionWith(removedCustomThings); - for (int i = 0; i < removedThings.Count; i++) + for (int i = 0; i < removedSpells.Count; i++) + { + if (!customThings.Contains(removedSpells[i]) && !classSpells.Contains(removedSpells[i])) { - //Log.Message("removing " + removedThings[i].defName + " from def database"); - removedThings[i].resourceReadoutPriority = ResourceCountPriority.Uncounted; - DefDatabase.AllDefsListForReading.Remove(removedThings[i]); + removedThings.Add(removedSpells[i]); + removedCustomThings.Add(removedSpells[i]); } - - IEnumerable RecipeEnumerable = DefDatabase.AllDefs; - List removedRecipes = new List(); - Dictionary recipeDictionary = new Dictionary(); - bool anyRemovedCustomThings = removedCustomThings.Count > 0; + } - foreach (RecipeDef current in RecipeEnumerable) - { - if (anyRemovedCustomThings) - recipeDictionary[current.defName] = current; + foreach (ThingDef thingDef in removedThings) + { + if (thingDef == null) continue; // TODO: Find where the null is coming from. + thingDef.resourceReadoutPriority = ResourceCountPriority.Uncounted; + DefDatabase.AllDefsListForReading.Remove(thingDef); + } - (Func settingsValueGetter, ThingDef item) = recipeIndexMap.TryGetValue(current.index); - if (settingsValueGetter == null) continue; - if (settingsValueGetter()) continue; - if (customThings.Contains(item)) continue; - removedRecipes.Add(current); - //if (!ModOptions.Settings.Instance.Arcanist) - //{ - // if (current.defName == "Make_SpellOf_FoldReality" && !customThings.Contains(TorannMagicDefOf.SpellOf_FoldReality)) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.FireMage) - //{ - // if ((current.defName == "Make_SpellOf_Firestorm" && !customThings.Contains(TorannMagicDefOf.SpellOf_Firestorm)) || (current.defName == "Make_SpellOf_DryGround" && !customThings.Contains(TorannMagicDefOf.SpellOf_DryGround))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.IceMage) - //{ - // if ((current.defName == "Make_SpellOf_Overdrive" && !customThings.Contains(TorannMagicDefOf.SpellOf_Overdrive)) || (current.defName == "Make_SpellOf_WetGround" && !customThings.Contains(TorannMagicDefOf.SpellOf_WetGround))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.LitMage) - //{ - // if ((current.defName == "Make_SpellOf_EyeOfTheStorm" && !customThings.Contains(TorannMagicDefOf.SpellOf_EyeOfTheStorm)) || (current.defName == "Make_SpellOf_ChargeBattery" && !customThings.Contains(TorannMagicDefOf.SpellOf_ChargeBattery))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Druid) - //{ - // if ((current.defName == "Make_SpellOf_RegrowLimb" && !customThings.Contains(TorannMagicDefOf.SpellOf_RegrowLimb)) || (current.defName == "Make_SpellOf_FertileLands" && !customThings.Contains(TorannMagicDefOf.SpellOf_FertileLands))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Summoner) - //{ - // if ((current.defName == "Make_SpellOf_SummonPoppi" && !customThings.Contains(TorannMagicDefOf.SpellOf_SummonPoppi))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Paladin) - //{ - // if ((current.defName == "Make_SpellOf_HolyWrath" && !customThings.Contains(TorannMagicDefOf.SpellOf_HolyWrath))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Priest) - //{ - // if ((current.defName == "Make_SpellOf_Resurrection" && !customThings.Contains(TorannMagicDefOf.SpellOf_Resurrection))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Bard) - //{ - // if ((current.defName == "Make_SpellOf_BattleHymn" && !customThings.Contains(TorannMagicDefOf.SpellOf_BattleHymn))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Necromancer) - //{ - // if ((current.defName == "Make_SpellOf_FoldReality" && !customThings.Contains(TorannMagicDefOf.SpellOf_FoldReality))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Geomancer) - //{ - // if ((current.defName == "Make_SpellOf_Meteor" && !customThings.Contains(TorannMagicDefOf.SpellOf_Meteor))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Demonkin) - //{ - // if ((current.defName == "Make_SpellOf_Scorn" && !customThings.Contains(TorannMagicDefOf.SpellOf_Scorn)) || (current.defName == "Make_SpellOf_PsychicShock" && !customThings.Contains(TorannMagicDefOf.SpellOf_PsychicShock))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Technomancer) - //{ - // if ((current.defName == "Make_SpellOf_TechnoShield" && !customThings.Contains(TorannMagicDefOf.SpellOf_TechnoShield)) || - // (current.defName == "Make_SpellOf_Sabotage" && !customThings.Contains(TorannMagicDefOf.SpellOf_Sabotage)) || - // (current.defName == "Make_SpellOf_Overdrive" && !customThings.Contains(TorannMagicDefOf.SpellOf_Overdrive)) || - // (current.defName == "Make_SpellOf_OrbitalStrike" && !customThings.Contains(TorannMagicDefOf.SpellOf_OrbitalStrike))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.BloodMage) - //{ - // if ((current.defName == "Make_SpellOf_BloodMoon" && !customThings.Contains(TorannMagicDefOf.SpellOf_BloodMoon))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Enchanter) - //{ - // if ((current.defName == "Make_SpellOf_Shapeshift" && !customThings.Contains(TorannMagicDefOf.SpellOf_Shapeshift))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.Chronomancer) - //{ - // if ((current.defName == "Make_SpellOf_Recall" && !customThings.Contains(TorannMagicDefOf.SpellOf_Recall))) - // { - // removedRecipes.Add(current); - // } - //} - //if (!ModOptions.Settings.Instance.SuperSoldier) - //{ - // if (!ModOptions.Settings.Instance.SuperSoldier) - // { - // if ((current.defName == "Make_BookOfSuperSoldier" && !customThings.Contains(TorannMagicDefOf.BookOfSuperSoldier))) - // { - // removedRecipes.Add(current); - // } - // } - //} - } + List removedRecipes = new List(); + Dictionary recipeDictionary = new Dictionary(); + bool anyRemovedCustomThings = removedCustomThings.Count > 0; + foreach (RecipeDef current in DefDatabase.AllDefs) + { if (anyRemovedCustomThings) - { - removedRecipes.AddRange(removedCustomThings - .Select(td => recipeDictionary.TryGetValue($"Make_{td.defName}")) - .Where(recipeDef => recipeDef != null) - ); - } - //for (int i = 0; i < removedCustomThings.Count; i++) - //{ - // if (RecipeEnumerable.Any((RecipeDef x) => x.defName == "Make_" + removedCustomThings[i].defName)) - // { - // removedRecipes.Add(RecipeEnumerable.FirstOrDefault((RecipeDef x) => x.defName == ("Make_" + removedCustomThings[i].ToString()))); - // } - //} + recipeDictionary[current.defName] = current; - for (int i = 0; i < removedRecipes.Count; i++) - { - //Log.Message("removing " + removedRecipes[i].defName + " from def database"); - DefDatabase.AllDefsListForReading.Remove(removedRecipes[i]); - } + (Settings.CheckboxOption option, ThingDef item) = recipeIndexMap.TryGetValue(current.index); + if (option == null) continue; + if (option.isEnabled) continue; + if (customThings.Contains(item)) continue; + removedRecipes.Add(current); } - else + + foreach (ThingDef thingDef in removedCustomThings) + { + RecipeDef recipeDef = recipeDictionary.TryGetValue($"Make_{thingDef?.defName}"); // TODO: remove ? when the null todo above is taken care of + if (recipeDef != null) removedRecipes.Add(recipeDef); + } + + for (int i = 0; i < removedRecipes.Count; i++) { - Log.Warning("RimWorld of Magic Class Restrictions failed to load properly - no classes were disabled."); + //Log.Message("removing " + removedRecipes[i].defName + " from def database"); + DefDatabase.AllDefsListForReading.Remove(removedRecipes[i]); } } diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Settings.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Settings.cs index 0c02782d..517b9917 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Settings.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/Settings.cs @@ -9,6 +9,18 @@ namespace TorannMagic.ModOptions { public class Settings : Verse.ModSettings { + // This class lets us link boolean values to their labels for the class options + public class CheckboxOption + { + public bool isEnabled = true; + public string label; + + public CheckboxOption(string _label) + { + label = _label; + } + } + public float xpMultiplier = 1f; public float needMultiplier = 1f; public bool AICasting = true; @@ -17,10 +29,10 @@ public class Settings : Verse.ModSettings public bool AIMarking = true; public bool AIFighterMarking = false; public bool AIFriendlyMarking = false; - public float baseMageChance = 1f; - public float baseFighterChance = 1f; - public float advMageChance = 0.5f; - public float advFighterChance = 0.5f; + public float baseMageChance = 0.063f; + public float baseFighterChance = 0.063f; + public float advMageChance = 0.083f; + public float advFighterChance = 0.042f; public float supportTraitChance = 0.1f; public float magicyteChance = .005f; public bool showIconsMultiSelect = true; @@ -64,50 +76,50 @@ public class Settings : Verse.ModSettings public bool golemScreenShake = true; //class options - public bool Arcanist = true; - public bool FireMage = true; - public bool IceMage = true; - public bool LitMage = true; - public bool Druid = true; - public bool Paladin = true; - public bool Necromancer = true; - public bool Bard = true; - public bool Priest = true; - public bool Demonkin = true; - public bool Geomancer = true; - public bool Summoner = true; - public bool Technomancer = true; - public bool BloodMage = true; - public bool Enchanter = true; - public bool Chronomancer = true; - public bool Wanderer = true; - public bool ChaosMage = true; - public bool Brightmage = true; - public bool Shaman = true; - public bool Golemancer = true; - public bool Empath = true; - - public bool Gladiator = true; - public bool Bladedancer = true; - public bool Sniper = true; - public bool Ranger = true; - public bool Faceless = true; - public bool Psionic = true; - public bool DeathKnight = true; - public bool Monk = true; - public bool Wayfarer = true; - public bool Commander = true; - public bool SuperSoldier = true; - public bool Shadow = true; - public bool Apothecary = true; - - public bool ArcaneConduit = true; - public bool ManaWell = true; - public bool Boundless = true; - public bool Enlightened = true; - public bool Cursed = true; - public bool FaeBlood = true; - public bool GiantsBlood = true; + public static CheckboxOption Arcanist = new("TM_Arcanist"); + public static CheckboxOption FireMage = new("TM_FireMage"); + public static CheckboxOption IceMage = new("TM_IceMage"); + public static CheckboxOption LitMage = new("TM_LitMage"); + public static CheckboxOption Druid = new("TM_Druid"); + public static CheckboxOption Paladin = new("TM_Paladin"); + public static CheckboxOption Necromancer = new("TM_Necromancer"); + public static CheckboxOption Bard = new("TM_Bard"); + public static CheckboxOption Priest = new("TM_Priest"); + public static CheckboxOption Demonkin = new("TM_Demonkin"); + public static CheckboxOption Geomancer = new("TM_Geomancer"); + public static CheckboxOption Summoner = new("TM_Summoner"); + public static CheckboxOption Technomancer = new("TM_Technomancer"); + public static CheckboxOption BloodMage = new("TM_BloodMage"); + public static CheckboxOption Enchanter = new("TM_Enchanter"); + public static CheckboxOption Chronomancer = new("TM_Chronomancer"); + public static CheckboxOption Wanderer = new("TM_Wanderer"); + public static CheckboxOption ChaosMage = new("TM_ChaosMage"); + public static CheckboxOption Brightmage = new("TM_Brightmage"); + public static CheckboxOption Shaman = new("TM_Shaman"); + public static CheckboxOption Golemancer = new("TM_Golemancer"); + public static CheckboxOption Empath = new("TM_Empath"); + + public static CheckboxOption Gladiator = new("TM_Gladiator"); + public static CheckboxOption Bladedancer = new("TM_Bladedancer"); + public static CheckboxOption Sniper = new("TM_Sniper"); + public static CheckboxOption Ranger = new("TM_Ranger"); + public static CheckboxOption Faceless = new("TM_Faceless"); + public static CheckboxOption Psionic = new("TM_Psionic"); + public static CheckboxOption DeathKnight = new("TM_DeathKnight"); + public static CheckboxOption Monk = new("TM_Monk"); + public static CheckboxOption Wayfarer = new("TM_Wayfarer"); + public static CheckboxOption Commander = new("TM_Commander"); + public static CheckboxOption SuperSoldier = new("TM_SuperSoldier"); + public static CheckboxOption Shadow = new("TM_Shadow"); + public static CheckboxOption Apothecary = new("TM_Apothecary"); + + public static CheckboxOption ArcaneConduit = new("TM_ArcaneConduit"); + public static CheckboxOption ManaWell = new("TM_ManaWell"); + public static CheckboxOption Boundless = new("TM_Boundless"); + public static CheckboxOption Enlightened = new("TM_Enlightened"); + public static CheckboxOption Cursed = new("TM_Cursed"); + public static CheckboxOption FaeBlood = new("TM_FaeBlood"); + public static CheckboxOption GiantsBlood = new("TM_GiantsBlood"); //Faction settings public Dictionary FactionFighterSettings = new Dictionary(); @@ -132,10 +144,10 @@ public override void ExposeData() Scribe_Values.Look(ref this.AIMarking, "AIMarking", false, false); Scribe_Values.Look(ref this.AIFighterMarking, "AIFighterMarking", false, false); Scribe_Values.Look(ref this.AIFriendlyMarking, "AIFriendlyMarking", false, false); - Scribe_Values.Look(ref this.baseMageChance, "baseMageChance", 1f, false); - Scribe_Values.Look(ref this.baseFighterChance, "baseFighterChance", 1f, false); - Scribe_Values.Look(ref this.advMageChance, "advMageChance", 0.5f, false); - Scribe_Values.Look(ref this.advFighterChance, "advFighterChance", 0.5f, false); + Scribe_Values.Look(ref baseMageChance, "baseMageChance", 0.063f); + Scribe_Values.Look(ref baseFighterChance, "baseFighterChance", 0.063f); + Scribe_Values.Look(ref advMageChance, "advMageChance", 0.83f); + Scribe_Values.Look(ref advFighterChance, "advFighterChance", 0.042f); Scribe_Values.Look(ref this.supportTraitChance, "supportTraitChance", 0.1f, false); Scribe_Values.Look(ref this.magicyteChance, "magicyteChance", 0.005f, false); Scribe_Values.Look(ref this.showIconsMultiSelect, "showIconsMultiSelect", true, false); @@ -171,52 +183,54 @@ public override void ExposeData() Scribe_Values.Look(ref this.autocastAnimals, "autocastAnimals", false, false); Scribe_Values.Look(ref this.autocastQueueing, "autocastQueueing", false, false); - Scribe_Values.Look(ref this.showDormantFrames, "showDormantFrames", false, false); + Scribe_Values.Look(ref this.showDormantFrames, "sClassOptionhowDormantFrames", false, false); Scribe_Values.Look(ref this.showGolemsOnColonistBar, "showGolemsOnColonistBar", false, false); + // Mage classes enabled + Scribe_Values.Look(ref Arcanist.isEnabled, "Arcanist", true); + Scribe_Values.Look(ref Bard.isEnabled, "Bard", true); + Scribe_Values.Look(ref BloodMage.isEnabled, "BloodMage", true); + Scribe_Values.Look(ref Brightmage.isEnabled, "Brightmage", true); + Scribe_Values.Look(ref ChaosMage.isEnabled, "ChaosMage", true); + Scribe_Values.Look(ref Chronomancer.isEnabled, "Chronomancer", true); + Scribe_Values.Look(ref Demonkin.isEnabled, "Demonkin", true); + Scribe_Values.Look(ref Druid.isEnabled, "Druid", true); + Scribe_Values.Look(ref Empath.isEnabled, "Empath", true); + Scribe_Values.Look(ref Enchanter.isEnabled, "Enchanter", true); + Scribe_Values.Look(ref FireMage.isEnabled, "FireMage", true); + Scribe_Values.Look(ref Geomancer.isEnabled, "Geomancer", true); + Scribe_Values.Look(ref Golemancer.isEnabled, "Golemancer", true); + Scribe_Values.Look(ref IceMage.isEnabled, "IceMage", true); + Scribe_Values.Look(ref LitMage.isEnabled, "LitMage", true); + Scribe_Values.Look(ref Necromancer.isEnabled, "Necromancer", true); + Scribe_Values.Look(ref Paladin.isEnabled, "Paladin", true); + Scribe_Values.Look(ref Priest.isEnabled, "Priest", true); + Scribe_Values.Look(ref Shaman.isEnabled, "Shaman", true); + Scribe_Values.Look(ref Summoner.isEnabled, "Summoner", true); + Scribe_Values.Look(ref Technomancer.isEnabled, "Technomancer", true); + Scribe_Values.Look(ref Wanderer.isEnabled, "Wanderer", true); + // Fighter classes enabled + Scribe_Values.Look(ref Apothecary.isEnabled, "Apothecary", true); + Scribe_Values.Look(ref Bladedancer.isEnabled, "Bladedancer", true); + Scribe_Values.Look(ref Commander.isEnabled, "Commander", true); + Scribe_Values.Look(ref DeathKnight.isEnabled, "DeathKnight", true); + Scribe_Values.Look(ref Faceless.isEnabled, "Faceless", true); + Scribe_Values.Look(ref Gladiator.isEnabled, "Gladiator", true); + Scribe_Values.Look(ref Monk.isEnabled, "Monk", true); + Scribe_Values.Look(ref Psionic.isEnabled, "Psionic", true); + Scribe_Values.Look(ref Ranger.isEnabled, "Ranger", true); + Scribe_Values.Look(ref Shadow.isEnabled, "Shadow", true); + Scribe_Values.Look(ref Sniper.isEnabled, "Sniper", true); + Scribe_Values.Look(ref SuperSoldier.isEnabled, "SuperSoldier", true); + Scribe_Values.Look(ref Wayfarer.isEnabled, "Wayfarer", true); - Scribe_Values.Look(ref this.Arcanist, "Arcanist", true, false); - Scribe_Values.Look(ref this.FireMage, "FireMage", true, false); - Scribe_Values.Look(ref this.IceMage, "IceMage", true, false); - Scribe_Values.Look(ref this.LitMage, "LitMage", true, false); - Scribe_Values.Look(ref this.Geomancer, "Geomancer", true, false); - Scribe_Values.Look(ref this.Druid, "Druid", true, false); - Scribe_Values.Look(ref this.Paladin, "Paladin", true, false); - Scribe_Values.Look(ref this.Priest, "Priest", true, false); - Scribe_Values.Look(ref this.Bard, "Bard", true, false); - Scribe_Values.Look(ref this.Summoner, "Summoner", true, false); - Scribe_Values.Look(ref this.Necromancer, "Necromancer", true, false); - Scribe_Values.Look(ref this.Technomancer, "Technomancer", true, false); - Scribe_Values.Look(ref this.Demonkin, "Demonkin", true, false); - Scribe_Values.Look(ref this.BloodMage, "BloodMage", true, false); - Scribe_Values.Look(ref this.Enchanter, "Enchanter", true, false); - Scribe_Values.Look(ref this.Chronomancer, "Chronomancer", true, false); - Scribe_Values.Look(ref this.Gladiator, "Gladiator", true, false); - Scribe_Values.Look(ref this.Bladedancer, "Bladedancer", true, false); - Scribe_Values.Look(ref this.Sniper, "Sniper", true, false); - Scribe_Values.Look(ref this.Ranger, "Ranger", true, false); - Scribe_Values.Look(ref this.Faceless, "Faceless", true, false); - Scribe_Values.Look(ref this.Psionic, "Psionic", true, false); - Scribe_Values.Look(ref this.DeathKnight, "DeathKnight", true, false); - Scribe_Values.Look(ref this.Wanderer, "Wanderer", true, false); - Scribe_Values.Look(ref this.Wayfarer, "Wayfarer", true, false); - Scribe_Values.Look(ref this.ChaosMage, "ChaosMage", true, false); - Scribe_Values.Look(ref this.Monk, "Monk", true, false); - Scribe_Values.Look(ref this.Commander, "Commander", true, false); - Scribe_Values.Look(ref this.SuperSoldier, "SuperSoldier", true, false); - Scribe_Values.Look(ref this.Shadow, "Shadow", true, false); - Scribe_Values.Look(ref this.Brightmage, "Brightmage", true, false); - Scribe_Values.Look(ref this.Shaman, "Shaman", true, false); - Scribe_Values.Look(ref this.Golemancer, "Golemancer", true, false); - Scribe_Values.Look(ref this.Empath, "Empath", true, false); - Scribe_Values.Look(ref this.Apothecary, "Apothecary", true, false); Scribe_Collections.Look(ref this.CustomClass, "CustomClass"); - Scribe_Values.Look(ref this.ManaWell, "ManaWell", true, false); - Scribe_Values.Look(ref this.ArcaneConduit, "ArcaneConduit", true, false); - Scribe_Values.Look(ref this.Boundless, "Boundless", true, false); - Scribe_Values.Look(ref this.Enlightened, "Enlightened", true, false); - Scribe_Values.Look(ref this.Cursed, "Cursed", true, false); - Scribe_Values.Look(ref this.FaeBlood, "FaeBlood", true, false); - Scribe_Values.Look(ref this.GiantsBlood, "GiantsBlood", true, false); + Scribe_Values.Look(ref ManaWell.isEnabled, "ManaWell", true, false); + Scribe_Values.Look(ref ArcaneConduit.isEnabled, "ArcaneConduit", true, false); + Scribe_Values.Look(ref Boundless.isEnabled, "Boundless", true, false); + Scribe_Values.Look(ref Enlightened.isEnabled, "Enlightened", true, false); + Scribe_Values.Look(ref Cursed.isEnabled, "Cursed", true, false); + Scribe_Values.Look(ref FaeBlood.isEnabled, "FaeBlood", true, false); + Scribe_Values.Look(ref GiantsBlood.isEnabled, "GiantsBlood", true, false); Scribe_Collections.Look(ref this.FactionFighterSettings, "FactionFighterSettings"); Scribe_Collections.Look(ref this.FactionMageSettings, "FactionMageSettings"); } diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/SettingsRef.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/SettingsRef.cs deleted file mode 100644 index 9a29911a..00000000 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/SettingsRef.cs +++ /dev/null @@ -1,115 +0,0 @@ -using System; -using Verse; -using System.Collections.Generic; -using RimWorld; -using UnityEngine; - -namespace TorannMagic.ModOptions -{ - public class SettingsRef - { - public float xpMultiplier = Settings.Instance.xpMultiplier; - public float needMultiplier = Settings.Instance.needMultiplier; - public float deathExplosionRadius = Settings.Instance.deathExplosionRadius; - public bool AICasting = Settings.Instance.AICasting; - public bool AIAggressiveCasting = Settings.Instance.AIAggressiveCasting; - public bool AIHardMode = Settings.Instance.AIHardMode; - public bool AIMarking = Settings.Instance.AIMarking; - public bool AIFighterMarking = Settings.Instance.AIFighterMarking; - public bool AIFriendlyMarking = Settings.Instance.AIFriendlyMarking; - public float baseMageChance = Settings.Instance.baseMageChance; - public float baseFighterChance = Settings.Instance.baseFighterChance; - public float advMageChance = Settings.Instance.advMageChance; - public float advFighterChance = Settings.Instance.advFighterChance; - public float supportTraitChance = Settings.Instance.supportTraitChance; - public int deathExplosionMin = Settings.Instance.deathExplosionMin; - public int deathExplosionMax = Settings.Instance.deathExplosionMax; - public float magicyteChance = Settings.Instance.magicyteChance; - public bool showIconsMultiSelect = Settings.Instance.showIconsMultiSelect; - public float riftChallenge = Settings.Instance.riftChallenge; - public float wanderingLichChallenge = Settings.Instance.wanderingLichChallenge; - public float demonAssaultChallenge = Settings.Instance.demonAssaultChallenge; - public bool showGizmo = Settings.Instance.showGizmo; - public bool showLevelUpMessage = Settings.Instance.showLevelUpMessage; - public bool changeUndeadPawnAppearance = Settings.Instance.changeUndeadPawnAppearance; - public bool changeUndeadAnimalAppearance = Settings.Instance.changeUndeadAnimalAppearance; - public bool showClassIconOnColonistBar = Settings.Instance.showClassIconOnColonistBar; - public float classIconSize = Settings.Instance.classIconSize; - public bool unrestrictedBloodTypes = Settings.Instance.unrestrictedBloodTypes; - public float paracyteSoftCap = Settings.Instance.paracyteSoftCap; - public bool paracyteMagesCount = Settings.Instance.paracyteMagesCount; - public bool unrestrictedWeaponCopy = Settings.Instance.unrestrictedWeaponCopy; - public float undeadUpkeepMultiplier = Settings.Instance.undeadUpkeepMultiplier; - public float deathRetaliationDelayFactor = Settings.Instance.deathRetaliationDelayFactor; - public float deathRetaliationChance = Settings.Instance.deathRetaliationChance; - public bool deathRetaliationIsLethal = Settings.Instance.deathRetaliationIsLethal; - public bool shrinkIcons = Settings.Instance.shrinkIcons; - public Vector2 iconPosition = Settings.Instance.iconPosition; - public bool cameraSnap= Settings.Instance.cameraSnap; - - //autocast - public bool autocastEnabled = Settings.Instance.autocastEnabled; - public bool autocastAnimals = Settings.Instance.autocastAnimals; - public float autocastMinThreshold = Settings.Instance.autocastMinThreshold; - public float autocastCombatMinThreshold = Settings.Instance.autocastCombatMinThreshold; - public float autocastEvaluationFrequency = Settings.Instance.autocastEvaluationFrequency; - public bool autocastQueueing = Settings.Instance.autocastQueueing; - - //golem options - public bool showDormantFrames = Settings.Instance.showDormantFrames; - public bool showGolemsOnColonistBar = Settings.Instance.showGolemsOnColonistBar; - public bool golemScreenShake = Settings.Instance.golemScreenShake; - - //Class options - public bool Arcanist = Settings.Instance.Arcanist; - public bool FireMage = Settings.Instance.FireMage; - public bool IceMage = Settings.Instance.IceMage; - public bool LitMage = Settings.Instance.LitMage; - public bool Druid = Settings.Instance.Druid; - public bool Paladin = Settings.Instance.Paladin; - public bool Necromancer = Settings.Instance.Necromancer; - public bool Bard = Settings.Instance.Bard; - public bool Priest = Settings.Instance.Priest; - public bool Demonkin = Settings.Instance.Demonkin; - public bool Geomancer = Settings.Instance.Geomancer; - public bool Summoner = Settings.Instance.Summoner; - public bool Technomancer = Settings.Instance.Technomancer; - public bool BloodMage = Settings.Instance.BloodMage; - public bool Enchanter = Settings.Instance.Enchanter; - public bool Chronomancer = Settings.Instance.Chronomancer; - public bool Wanderer = Settings.Instance.Wanderer; - public bool ChaosMage = Settings.Instance.ChaosMage; - public bool Brightmage = Settings.Instance.Brightmage; - public bool Shaman = Settings.Instance.Shaman; - public bool Golemancer = Settings.Instance.Golemancer; - public bool Empath = Settings.Instance.Empath; - - public bool Gladiator = Settings.Instance.Gladiator; - public bool Bladedancer = Settings.Instance.Bladedancer; - public bool Sniper = Settings.Instance.Sniper; - public bool Ranger = Settings.Instance.Ranger; - public bool Faceless = Settings.Instance.Faceless; - public bool Psionic = Settings.Instance.Psionic; - public bool DeathKnight = Settings.Instance.DeathKnight; - public bool Monk = Settings.Instance.Monk; - public bool Wayfarer = Settings.Instance.Wayfarer; - public bool Commander = Settings.Instance.Commander; - public bool SuperSoldier = Settings.Instance.SuperSoldier; - public bool Shadow = Settings.Instance.Shadow; - public bool Apothecary = Settings.Instance.Apothecary; - - public bool ArcaneConduit = Settings.Instance.ArcaneConduit; - public bool ManaWell = Settings.Instance.ManaWell; - public bool Boundless = Settings.Instance.Boundless; - public bool Enlightened = Settings.Instance.Enlightened; - public bool Cursed = Settings.Instance.Cursed; - public bool FaeBlood = Settings.Instance.FaeBlood; - public bool GiantsBlood = Settings.Instance.GiantsBlood; - - //faction settings - public Dictionary FactionFighterSettings = Settings.Instance.FactionFighterSettings; - public Dictionary FactionMageSettings = Settings.Instance.FactionMageSettings; - - public Dictionary CustomClass = Settings.Instance.CustomClass; - } -} diff --git a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/TM_DebugTools.cs b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/TM_DebugTools.cs index cf00fced..744aef61 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/ModOptions/TM_DebugTools.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/ModOptions/TM_DebugTools.cs @@ -129,17 +129,15 @@ public static void RemoveClassHediffs(Pawn pawn) public static void RemoveClassTrait(Pawn pawn) { - for (int i = 0; i < TM_Data.AllClassTraits.Count; i++) + for (int j = 0; j < pawn.story.traits.allTraits.Count; j++) { - for (int j = 0; j < pawn.story.traits.allTraits.Count; j++) + if (TM_ClassUtility.AllClassTraits.Contains(pawn.story.traits.allTraits[j].def)) { - if (pawn.story.traits.allTraits[j].def == TM_Data.AllClassTraits[i]) - { - pawn.story.traits.allTraits.Remove(pawn.story.traits.allTraits[j]); - break; - } + pawn.story.traits.RemoveTrait(pawn.story.traits.allTraits[j]); + break; } } + if(pawn.story.traits.HasTrait(TorannMagicDefOf.TM_CursedTD)) { pawn.story.traits.RemoveTrait(pawn.story.traits.GetTrait(TorannMagicDefOf.TM_CursedTD)); diff --git a/RimWorldOfMagic/RimWorldOfMagic/RimWorldOfMagic.csproj b/RimWorldOfMagic/RimWorldOfMagic/RimWorldOfMagic.csproj index 64404a78..40a10865 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/RimWorldOfMagic.csproj +++ b/RimWorldOfMagic/RimWorldOfMagic/RimWorldOfMagic.csproj @@ -13,6 +13,7 @@ 512 true + 10 true @@ -585,7 +586,6 @@ - diff --git a/RimWorldOfMagic/RimWorldOfMagic/SihvRMagicScrollScribe/CompUseEffect_WriteMartialScript.cs b/RimWorldOfMagic/RimWorldOfMagic/SihvRMagicScrollScribe/CompUseEffect_WriteMartialScript.cs index a50aa814..a93a0c7a 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/SihvRMagicScrollScribe/CompUseEffect_WriteMartialScript.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/SihvRMagicScrollScribe/CompUseEffect_WriteMartialScript.cs @@ -15,7 +15,7 @@ public override void DoEffect(Pawn user) ThingDef tempPod = null; IntVec3 currentPos = parent.PositionHeld; Map map = parent.Map; - List cFighters = TM_ClassUtility.CustomFighterClasses; + TM_CustomClass[] cFighters = TM_ClassUtility.CustomFighterClasses; CompAbilityUserMight comp = user.GetCompAbilityUserMight(); if (parent.def != null && comp != null && user.IsSlave) @@ -82,10 +82,10 @@ public override void DoEffect(Pawn user) RetryWrite:; if (attempt < 20) { - float rnd = Rand.Range(0, 9 + cFighters.Count); + float rnd = Rand.Range(0, 9 + cFighters.Length); if (rnd < 1) { - if (ModOptions.Settings.Instance.Gladiator) + if (ModOptions.Settings.Gladiator.isEnabled) { tempPod = ThingDef.Named("BookOfGladiator"); } @@ -98,7 +98,7 @@ public override void DoEffect(Pawn user) else if (rnd < 2) { - if (ModOptions.Settings.Instance.Sniper) + if (ModOptions.Settings.Sniper.isEnabled) { tempPod = ThingDef.Named("BookOfSniper"); } @@ -110,7 +110,7 @@ public override void DoEffect(Pawn user) } else if (rnd < 3) { - if (ModOptions.Settings.Instance.Bladedancer) + if (ModOptions.Settings.Bladedancer.isEnabled) { tempPod = ThingDef.Named("BookOfBladedancer"); } @@ -122,7 +122,7 @@ public override void DoEffect(Pawn user) } else if (rnd < 4) { - if (ModOptions.Settings.Instance.Ranger) + if (ModOptions.Settings.Ranger.isEnabled) { tempPod = ThingDef.Named("BookOfRanger"); } @@ -134,7 +134,7 @@ public override void DoEffect(Pawn user) } else if (rnd < 5) { - if (ModOptions.Settings.Instance.Psionic) + if (ModOptions.Settings.Psionic.isEnabled) { tempPod = ThingDef.Named("BookOfPsionic"); } @@ -146,7 +146,7 @@ public override void DoEffect(Pawn user) } else if (rnd < 6) { - if (ModOptions.Settings.Instance.DeathKnight) + if (ModOptions.Settings.DeathKnight.isEnabled) { tempPod = ThingDef.Named("BookOfDeathKnight"); } @@ -158,7 +158,7 @@ public override void DoEffect(Pawn user) } else if (rnd < 7) { - if (ModOptions.Settings.Instance.Monk) + if (ModOptions.Settings.Monk.isEnabled) { tempPod = TorannMagicDefOf.BookOfMonk; } @@ -170,7 +170,7 @@ public override void DoEffect(Pawn user) } else if (rnd < 8) { - if (ModOptions.Settings.Instance.Commander) + if (ModOptions.Settings.Commander.isEnabled) { tempPod = TorannMagicDefOf.BookOfCommander; } @@ -182,7 +182,7 @@ public override void DoEffect(Pawn user) } else if(rnd < 9) { - if (ModOptions.Settings.Instance.Faceless) + if (ModOptions.Settings.Faceless.isEnabled) { tempPod = ThingDef.Named("BookOfFaceless"); } @@ -194,7 +194,7 @@ public override void DoEffect(Pawn user) } else { - if (cFighters.Count > 0) + if (cFighters.Length > 0) { tempPod = TM_ClassUtility.GetRandomCustomFighter().fullScript; } diff --git a/RimWorldOfMagic/RimWorldOfMagic/TM_Calc.cs b/RimWorldOfMagic/RimWorldOfMagic/TM_Calc.cs index 6fd85949..4a27b942 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/TM_Calc.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/TM_Calc.cs @@ -333,7 +333,7 @@ public static bool IsMightUser(Pawn pawn) if (pawn?.story?.traits?.allTraits == null) return false; CompAbilityUserMight comp = pawn.GetCompAbilityUserMight(); if (comp != null && comp.IsMightUser && comp.MightData != null && comp.Stamina != null) return true; - if (pawn.story.traits.allTraits.Any(t => TM_Data.MightTraits.Contains(t.def))) return true; + if (pawn.story.traits.allTraits.Any(t => TM_ClassUtility.MightTraits.Contains(t.def))) return true; if (pawn.needs != null && pawn.needs.AllNeeds.Any(t => t.def == TorannMagicDefOf.TM_Stamina)) return true; return false; } @@ -366,29 +366,18 @@ public static bool IsMagicUser(Pawn pawn) if (pawn.story.traits.HasTrait(TorannMagicDefOf.Faceless)) return false; CompAbilityUserMagic comp = pawn.GetCompAbilityUserMagic(); if (comp != null && comp.IsMagicUser && comp.MagicData != null && comp.Mana != null) return true; - if (pawn.story.traits.allTraits.Any(t => TM_Data.MagicTraits.Contains(t.def))) return true; + if (pawn.story.traits.allTraits.Any(t => TM_ClassUtility.MagicTraits.Contains(t.def))) return true; if (pawn.needs != null && pawn.needs.AllNeeds.Any(t => t.def == TorannMagicDefOf.TM_Mana)) return true; return false; } public static bool HasAdvancedClass(Pawn p) - { - if (p != null && p.story != null && p.story.traits != null) + { + if (p?.story?.traits == null) return false; + for (int i = p.story.traits.allTraits.Count - 1; i >= 0; i--) { - List customClasses = TM_ClassUtility.CustomClasses; - for (int i = 0; i < customClasses.Count; i++) - { - if (customClasses[i].isAdvancedClass) - { - foreach(Trait t in p.story.traits.allTraits) - { - if(t.def == customClasses[i].classTrait) - { - return true; - } - } - } - } + if (TM_ClassUtility.CustomAdvancedClassTraitMap.ContainsKey(p.story.traits.allTraits[i].def.index)) + return true; } return false; } @@ -2075,41 +2064,17 @@ public static float GetRWoMTraitChance() float chance = ((ModOptions.Settings.Instance.baseFighterChance * 6) + (ModOptions.Settings.Instance.baseMageChance * 6) + (9 * ModOptions.Settings.Instance.advFighterChance) + (18 * ModOptions.Settings.Instance.advMageChance)) / (allTraits.Count); return Mathf.Clamp01(chance); } - - public static float GetMagePrecurserChance() - { - float chance = 0f; - - chance = (ModOptions.Settings.Instance.baseMageChance * 6) / ((ModOptions.Settings.Instance.baseFighterChance * 6) + (ModOptions.Settings.Instance.baseMageChance * 6) + (9 * ModOptions.Settings.Instance.advFighterChance) + (18 * ModOptions.Settings.Instance.advMageChance)); - chance *= GetRWoMTraitChance(); - return chance; - } - - public static float GetFighterPrecurserChance() - { - float chance = 0f; - - chance = (ModOptions.Settings.Instance.baseFighterChance * 6) / ((ModOptions.Settings.Instance.baseFighterChance * 6) + (ModOptions.Settings.Instance.baseMageChance * 6) + (9 * ModOptions.Settings.Instance.advFighterChance) + (18 * ModOptions.Settings.Instance.advMageChance)); - chance *= GetRWoMTraitChance(); - return chance; - } - public static float GetMageSpawnChance() + public static string GetWeightedChance(float chance) { - float chance = 0f; - - chance = (ModOptions.Settings.Instance.advMageChance * 16) / ((ModOptions.Settings.Instance.baseFighterChance * 6) + (ModOptions.Settings.Instance.baseMageChance * 6) + (9 * ModOptions.Settings.Instance.advFighterChance) + (18 * ModOptions.Settings.Instance.advMageChance)); - chance *= GetRWoMTraitChance(); - return chance; - } + var inst = ModOptions.Settings.Instance; + float total = Math.Max(inst.baseMageChance + inst.baseFighterChance + inst.advMageChance + inst.advFighterChance, 1f); - public static float GetFighterSpawnChance() - { - float chance = 0f; - - chance = (ModOptions.Settings.Instance.advFighterChance * 8) / ((ModOptions.Settings.Instance.baseFighterChance * 6) + (ModOptions.Settings.Instance.baseMageChance * 6) + (9 * ModOptions.Settings.Instance.advFighterChance) + (18 * ModOptions.Settings.Instance.advMageChance)); - chance *= GetRWoMTraitChance(); - return chance; + float weightedChance = chance * 100 / total; + // cut the decimal if 100% + string formatted = weightedChance > 99.9f ? $"{weightedChance:F0}" : $"{weightedChance:F1}"; + // Add a + if the total is over 100% as when conflicts arise the percentage will be higher (unless full conflict) + return total > 1f && chance > 0f ? $"{formatted}+%" : $"{formatted} %"; } public static Area GetSpriteArea(Map map = null, bool makeNewArea = true) diff --git a/RimWorldOfMagic/RimWorldOfMagic/TM_ClassUtility.cs b/RimWorldOfMagic/RimWorldOfMagic/TM_ClassUtility.cs index ff9e03fe..ba295643 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/TM_ClassUtility.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/TM_ClassUtility.cs @@ -18,98 +18,242 @@ namespace TorannMagic { public static class TM_ClassUtility { - public static List CustomClasses; - public static readonly List CustomBaseClasses = new List(); - public static readonly List CustomMageClasses = new List(); - public static readonly List CustomFighterClasses = new List(); - public static readonly List CustomAdvancedClasses = new List(); - - //public static TM_CustomClass[] CustomClasses; - //public static readonly Dictionary CustomAdvancedClassTraitIndexMap = new Dictionary(); - //public static TM_CustomClass[] CustomBaseClasses; - //public static TM_CustomClass[] CustomMageClasses; - //public static TM_CustomClass[] CustomFighterClasses; - //public static TM_CustomClass[] CustomAdvancedClasses; + public static Dictionary NonCustomMagicTraits = new () + { + { TorannMagicDefOf.Arcanist, Settings.Arcanist }, + { TorannMagicDefOf.BloodMage, Settings.BloodMage }, + { TorannMagicDefOf.ChaosMage, Settings.ChaosMage }, + { TorannMagicDefOf.Chronomancer, Settings.Chronomancer }, + { TorannMagicDefOf.Druid, Settings.Druid }, + { TorannMagicDefOf.Enchanter, Settings.Enchanter }, + { TorannMagicDefOf.Faceless, Settings.Faceless }, + { TorannMagicDefOf.Geomancer, Settings.Geomancer }, + { TorannMagicDefOf.HeartOfFrost, Settings.IceMage }, + { TorannMagicDefOf.InnerFire, Settings.FireMage }, + { TorannMagicDefOf.Lich, Settings.Necromancer }, + { TorannMagicDefOf.Necromancer, Settings.Necromancer }, + { TorannMagicDefOf.Paladin, Settings.Paladin }, + { TorannMagicDefOf.Priest, Settings.Priest }, + { TorannMagicDefOf.StormBorn, Settings.LitMage }, + { TorannMagicDefOf.Succubus, Settings.Demonkin }, + { TorannMagicDefOf.Summoner, Settings.Summoner }, + { TorannMagicDefOf.TM_Bard, Settings.Bard }, + { TorannMagicDefOf.TM_Brightmage, Settings.Brightmage }, + { TorannMagicDefOf.TM_TheShadow, Settings.Shadow }, + { TorannMagicDefOf.TM_Wanderer, Settings.Wanderer }, + { TorannMagicDefOf.Technomancer, Settings.Technomancer }, + { TorannMagicDefOf.Warlock, Settings.Demonkin } + }; + + public static Dictionary NonCustomFighterTraits = new () + { + { TorannMagicDefOf.TM_Apothecary, Settings.Apothecary }, + { TorannMagicDefOf.Bladedancer, Settings.Bladedancer }, + { TorannMagicDefOf.DeathKnight, Settings.DeathKnight }, + { TorannMagicDefOf.Faceless, Settings.Faceless }, + { TorannMagicDefOf.Gladiator, Settings.Gladiator }, + { TorannMagicDefOf.Ranger, Settings.Ranger }, + { TorannMagicDefOf.TM_Commander, Settings.Commander }, + { TorannMagicDefOf.TM_Monk, Settings.Monk }, + { TorannMagicDefOf.TM_Psionic, Settings.Psionic }, + { TorannMagicDefOf.TM_Sniper, Settings.Sniper }, + { TorannMagicDefOf.TM_SuperSoldier, Settings.SuperSoldier }, + { TorannMagicDefOf.TM_TheShadow, Settings.Shadow }, + { TorannMagicDefOf.TM_Wayfarer, Settings.Wayfarer } + }; + + public static Dictionary MageSupportTraits = new () + { + { TorannMagicDefOf.TM_ArcaneConduitTD, Settings.ArcaneConduit }, + { TorannMagicDefOf.TM_ManaWellTD, Settings.ManaWell }, + { TorannMagicDefOf.TM_FaeBloodTD, Settings.FaeBlood }, + { TorannMagicDefOf.TM_EnlightenedTD, Settings.Enlightened }, + { TorannMagicDefOf.TM_CursedTD, Settings.Cursed } + }; + + public static Dictionary FighterSupportTraits = new () + { + { TorannMagicDefOf.TM_BoundlessTD, Settings.Boundless }, + { TorannMagicDefOf.TM_GiantsBloodTD, Settings.GiantsBlood } + }; + // Special rules for generating pawns. + public static Dictionary> ClassSpawnValidators = new Dictionary> + { + { TorannMagicDefOf.Warlock, static pawn => pawn.gender == Gender.Male }, + { TorannMagicDefOf.Succubus, static pawn => pawn.gender == Gender.Female }, + { TorannMagicDefOf.Lich, static pawn => false }, // Never spawn a lich under normal circumstances + { TorannMagicDefOf.TM_Possessor, static pawn => false }, // Never spawn possessor under normal circumstances + + }; + + public static HashSet MightTraits; + public static HashSet MagicTraits; + public static HashSet AllClassTraits; + public static Dictionary CustomClassTraitMap; + public static Dictionary CustomAdvancedClassTraitMap; + public static TM_CustomClass[] CustomClasses; + public static TM_CustomClass[] CustomBaseClasses; + public static TM_CustomClass[] CustomMageClasses; + public static TM_CustomClass[] CustomFighterClasses; + public static TM_CustomClass[] CustomAdvancedClasses; + + // Load all custom classes into the mod (regardless if enabled) + public static void InitializeCustomClasses() + { + // A Helper method to set the trait trackers to no custom classes. + static void setNoCustomClassDefaults() + { + CustomClassTraitMap = new Dictionary(); + CustomAdvancedClassTraitMap = new Dictionary(); + MagicTraits = new HashSet(NonCustomMagicTraits.Keys); + MightTraits = new HashSet(NonCustomFighterTraits.Keys); + AllClassTraits = new HashSet(NonCustomFighterTraits.Keys); + AllClassTraits.UnionWith(MagicTraits); + } + + try + { + setNoCustomClassDefaults(); + CustomClasses = TM_CustomClassDef.Named("TM_CustomClasses").customClasses.ToArray(); + foreach (TM_CustomClass cc in CustomClasses) + { + CustomClassTraitMap[cc.classTrait.index] = cc; + if (cc.isAdvancedClass) CustomAdvancedClassTraitMap[cc.classTrait.index] = cc; + if (cc.isMage) MagicTraits.Add(cc.classTrait); + if (cc.isFighter) MightTraits.Add(cc.classTrait); + AllClassTraits.Add(cc.classTrait); + } + } + catch + { + Log.Error("[Rimworld of Magic] Initializing Custom Classes failed. Disabling Custom Classes"); + setNoCustomClassDefaults(); + CustomClasses = Array.Empty(); + } + } + + // Load the enabled custom classes into appropriate variables after load + mod settings change public static void LoadCustomClasses() { - TM_CustomClassDef named = TM_CustomClassDef.Named("TM_CustomClasses"); - if (named == null) return; - - CustomClasses = named.customClasses; - //CustomAdvancedClassTraitIndexMap.Clear(); - //var CustomBaseClassesList = new List(); - //var CustomMageClassesList = new List(); - //var CustomFighterClassesList = new List(); - //var CustomAdvancedClassesList = new List(); - CustomBaseClasses.Clear(); - CustomMageClasses.Clear(); - CustomFighterClasses.Clear(); - CustomAdvancedClasses.Clear(); - - IEnumerable enabledCustomClasses = CustomClasses.Where(cc => - Settings.Instance.CustomClass.TryGetValue(cc.classTrait.ToString(), true)); - - foreach (TM_CustomClass cc in enabledCustomClasses) + try { - if (cc.isMage) + var CustomBaseClassesList = new List(); + var CustomMageClassesList = new List(); + var CustomFighterClassesList = new List(); + var CustomAdvancedClassesList = new List(); + + foreach (TM_CustomClass cc in CustomClasses) { - if (cc.isAdvancedClass) + if (!Settings.Instance.CustomClass.TryGetValue(cc.classTrait.ToString(), true)) continue; + + if (cc.isMage) { - if (cc.advancedClassOptions != null && cc.advancedClassOptions.canSpawnWithClass) + if (cc.isAdvancedClass) { - CustomMageClasses.Add(cc); + if (cc.advancedClassOptions != null && cc.advancedClassOptions.canSpawnWithClass) + { + CustomMageClassesList.Add(cc); + } + } + else + { + CustomMageClassesList.Add(cc); } } - else - { - CustomMageClasses.Add(cc); - } - } - if (cc.isFighter) - { - if (cc.isAdvancedClass) + + if (cc.isFighter) { - if (cc.advancedClassOptions != null && cc.advancedClassOptions.canSpawnWithClass) + if (cc.isAdvancedClass) + { + if (cc.advancedClassOptions != null && cc.advancedClassOptions.canSpawnWithClass) + { + CustomFighterClassesList.Add(cc); + } + } + else { - CustomFighterClasses.Add(cc); + CustomFighterClassesList.Add(cc); } } + + if (!cc.isAdvancedClass) + CustomBaseClassesList.Add(cc); //base classes cannot also be advanced classes, but advanced classes can act like base classes else - { - CustomFighterClasses.Add(cc); - } - } - if (!cc.isAdvancedClass) CustomBaseClasses.Add(cc); //base classes cannot also be advanced classes, but advanced classes can act like base classes - else - { - CustomAdvancedClasses.Add(cc); - //CustomAdvancedClassTraitIndexMap[cc.classTrait.index] = cc; + CustomAdvancedClassesList.Add(cc); + + CustomBaseClasses = CustomBaseClassesList.ToArray(); + CustomFighterClasses = CustomFighterClassesList.ToArray(); + CustomMageClasses = CustomMageClassesList.ToArray(); + CustomAdvancedClasses = CustomAdvancedClassesList.ToArray(); } - //CustomBaseClasses = CustomBaseClassesList.ToArray(); - //CustomFighterClasses = CustomFighterClassesList.ToArray(); - //CustomMageClasses = CustomMageClassesList.ToArray(); - //CustomAdvancedClasses = CustomAdvancedClassesList.ToArray(); + LoadClassIndexes(); + } + catch + { + Log.Error("Loading Enabled Custom Classes Failed. Disabling..."); + CustomClasses = Array.Empty(); + CustomBaseClasses = Array.Empty(); + CustomMageClasses = Array.Empty(); + CustomFighterClasses = Array.Empty(); + CustomAdvancedClasses = Array.Empty(); } - LoadClassIndexes(); - } public static void LoadClassIndexes() { CustomClassTraitIndexes = new Dictionary(); - for (int i = 0; i < CustomClasses.Count; i++) + for (int i = 0; i < CustomClasses.Length; i++) { CustomClassTraitIndexes[CustomClasses[i].classTrait.index] = i; } } + public static HashSet EnabledMageClasses = new HashSet(); + public static HashSet EnabledFighterClasses = new HashSet(); + // Switch these two to hashsets if they get bigger than 10 traitdefs or go custom + public static TraitDef[] EnabledMageSupportClasses; + public static TraitDef[] EnabledFighterSupportClasses; + public static void CacheEnabledClasses() + { + EnabledMageClasses.Clear(); + EnabledFighterClasses.Clear(); + // Add custom classes which have already checked if they are enabled + foreach (TM_CustomClass cc in CustomMageClasses) + { + EnabledMageClasses.Add(cc.classTrait); + } + foreach (TM_CustomClass cc in CustomFighterClasses) + { + EnabledFighterClasses.Add(cc.classTrait); + } + // Add the base classes if they are enabled + foreach (KeyValuePair pair in NonCustomMagicTraits) + { + if (pair.Value.isEnabled) EnabledMageClasses.Add(pair.Key); + } + foreach (KeyValuePair pair in NonCustomFighterTraits) + { + if (pair.Value.isEnabled) EnabledFighterClasses.Add(pair.Key); + } + // Handle the support classes. Use LINQ to avoid array annoyances + EnabledMageSupportClasses = MageSupportTraits + .Where(static pair => pair.Value.isEnabled) + .Select(static pair => pair.Key) + .ToArray(); + EnabledFighterSupportClasses = FighterSupportTraits + .Where(static pair => pair.Value.isEnabled) + .Select(static pair => pair.Key) + .ToArray(); + } + public static List CustomClassTraitDefs { get => CustomClasses.Select(t => t.classTrait).ToList(); } - private static Dictionary CustomClassTraitIndexes; // Dictionary to more quickly determine trait's CustomClasses index + // DEPRECATED: Use TM_ClassUtility.CustomClassTraitMap + public static Dictionary CustomClassTraitIndexes; // Dictionary to more quickly determine trait's CustomClasses index public static int IsCustomClassIndex(List allTraits) { @@ -132,7 +276,7 @@ public static int IsCustomClassIndex(List allTraits) public static int CustomClassIndexOfTraitDef(TraitDef trait) { - for (int i = 0; i < CustomClasses.Count; i++) + for (int i = 0; i < CustomClasses.Length; i++) { if (CustomClasses[i].classTrait.defName == trait.defName) { @@ -144,7 +288,7 @@ public static int CustomClassIndexOfTraitDef(TraitDef trait) public static int CustomClassIndexOfBaseMageClass(List allTraits) { - for (int i = 0; i < CustomClasses.Count; i++) + for (int i = 0; i < CustomClasses.Length; i++) { if (CustomClasses[i].isAdvancedClass) continue; if (!CustomClasses[i].isMage) continue; @@ -161,7 +305,7 @@ public static int CustomClassIndexOfBaseMageClass(List allTraits) public static int CustomClassIndexOfBaseFighterClass(List allTraits) { - for(int i = 0; i < CustomClasses.Count; i++) + for(int i = 0; i < CustomClasses.Length; i++) { if (CustomClasses[i].isAdvancedClass) continue; if (!CustomClasses[i].isFighter) continue; diff --git a/RimWorldOfMagic/RimWorldOfMagic/TM_Data.cs b/RimWorldOfMagic/RimWorldOfMagic/TM_Data.cs index 6105fcac..78b11b9f 100644 --- a/RimWorldOfMagic/RimWorldOfMagic/TM_Data.cs +++ b/RimWorldOfMagic/RimWorldOfMagic/TM_Data.cs @@ -5,6 +5,7 @@ using Verse.AI; using RimWorld; using System; +using TorannMagic.ModOptions; namespace TorannMagic { @@ -171,138 +172,42 @@ public static List MageTornScriptList() return enumerable.ToList(); } - public static List MagicTraits - { - get - { - List magicTraits = new List - { - TorannMagicDefOf.Arcanist, - TorannMagicDefOf.InnerFire, - TorannMagicDefOf.HeartOfFrost, - TorannMagicDefOf.StormBorn, - TorannMagicDefOf.Druid, - TorannMagicDefOf.Priest, - TorannMagicDefOf.Necromancer, - TorannMagicDefOf.Technomancer, - TorannMagicDefOf.Geomancer, - TorannMagicDefOf.Warlock, - TorannMagicDefOf.Succubus, - TorannMagicDefOf.ChaosMage, - TorannMagicDefOf.Paladin, - TorannMagicDefOf.Summoner, - TorannMagicDefOf.Lich, - TorannMagicDefOf.TM_Bard, - TorannMagicDefOf.Chronomancer, - TorannMagicDefOf.Enchanter, - TorannMagicDefOf.BloodMage, - TorannMagicDefOf.TM_Wanderer, - TorannMagicDefOf.TM_Brightmage, - TorannMagicDefOf.TM_Shaman, - TorannMagicDefOf.TM_Golemancer - }; - foreach (TMDefs.TM_CustomClass cc in TM_ClassUtility.CustomClasses) - { - if (cc.isMage && !magicTraits.Contains(cc.classTrait)) - { - magicTraits.Add(cc.classTrait); - } - } - return magicTraits; - } - } - public static List EnabledMagicTraits + // DEPRECATED. Use TM_ClassUtility.EnabledMagicTraits instead. This is just here to prevent save breaking for ArcanePathway. { get { List magicTraits = new List(); - magicTraits.Clear(); - - if (ModOptions.Settings.Instance.Arcanist) { magicTraits.Add(TorannMagicDefOf.Arcanist); } - if (ModOptions.Settings.Instance.FireMage) { magicTraits.Add(TorannMagicDefOf.InnerFire); } - if (ModOptions.Settings.Instance.IceMage) { magicTraits.Add(TorannMagicDefOf.HeartOfFrost); } - if (ModOptions.Settings.Instance.LitMage) { magicTraits.Add(TorannMagicDefOf.StormBorn); } - if (ModOptions.Settings.Instance.Druid) { magicTraits.Add(TorannMagicDefOf.Druid); } - if (ModOptions.Settings.Instance.Priest) { magicTraits.Add(TorannMagicDefOf.Priest); } - if (ModOptions.Settings.Instance.Necromancer) { magicTraits.Add(TorannMagicDefOf.Necromancer); } - if (ModOptions.Settings.Instance.Technomancer) { magicTraits.Add(TorannMagicDefOf.Technomancer); } - if (ModOptions.Settings.Instance.Geomancer) { magicTraits.Add(TorannMagicDefOf.Geomancer); } - if (ModOptions.Settings.Instance.Demonkin) { magicTraits.Add(TorannMagicDefOf.Warlock); } - if (ModOptions.Settings.Instance.Demonkin) { magicTraits.Add(TorannMagicDefOf.Succubus); } - if (ModOptions.Settings.Instance.ChaosMage) { magicTraits.Add(TorannMagicDefOf.ChaosMage); } - if (ModOptions.Settings.Instance.Paladin) { magicTraits.Add(TorannMagicDefOf.Paladin); } - if (ModOptions.Settings.Instance.Summoner) { magicTraits.Add(TorannMagicDefOf.Summoner); } - if (ModOptions.Settings.Instance.Bard) { magicTraits.Add(TorannMagicDefOf.TM_Bard); } - if (ModOptions.Settings.Instance.Chronomancer) { magicTraits.Add(TorannMagicDefOf.Chronomancer); } - if (ModOptions.Settings.Instance.Enchanter) { magicTraits.Add(TorannMagicDefOf.Enchanter); } - if (ModOptions.Settings.Instance.BloodMage) { magicTraits.Add(TorannMagicDefOf.BloodMage); } - if (ModOptions.Settings.Instance.Brightmage) { magicTraits.Add(TorannMagicDefOf.TM_Brightmage); } - if (ModOptions.Settings.Instance.Shaman) { magicTraits.Add(TorannMagicDefOf.TM_Shaman); } - if (ModOptions.Settings.Instance.Golemancer) { magicTraits.Add(TorannMagicDefOf.TM_Golemancer); } - foreach (TMDefs.TM_CustomClass cc in TM_ClassUtility.CustomClasses) - { - if (cc.isMage && !magicTraits.Contains(cc.classTrait) && ModOptions.Settings.Instance.CustomClass[cc.classTrait.ToString()]) - { - magicTraits.Add(cc.classTrait); - } - } - return magicTraits; - } - } - public static List MightTraits - { - get - { - List mightTraits = new List - { - TorannMagicDefOf.Bladedancer, - TorannMagicDefOf.DeathKnight, - TorannMagicDefOf.Gladiator, - TorannMagicDefOf.Faceless, - TorannMagicDefOf.TM_Sniper, - TorannMagicDefOf.Ranger, - TorannMagicDefOf.TM_Psionic, - TorannMagicDefOf.TM_Monk, - TorannMagicDefOf.TM_Commander, - TorannMagicDefOf.TM_SuperSoldier, - TorannMagicDefOf.TM_Wayfarer - }; + if (Settings.Arcanist.isEnabled) { magicTraits.Add(TorannMagicDefOf.Arcanist); } + if (Settings.FireMage.isEnabled) { magicTraits.Add(TorannMagicDefOf.InnerFire); } + if (Settings.IceMage.isEnabled) { magicTraits.Add(TorannMagicDefOf.HeartOfFrost); } + if (Settings.LitMage.isEnabled) { magicTraits.Add(TorannMagicDefOf.StormBorn); } + if (Settings.Druid.isEnabled) { magicTraits.Add(TorannMagicDefOf.Druid); } + if (Settings.Priest.isEnabled) { magicTraits.Add(TorannMagicDefOf.Priest); } + if (Settings.Necromancer.isEnabled) { magicTraits.Add(TorannMagicDefOf.Necromancer); } + if (Settings.Technomancer.isEnabled) { magicTraits.Add(TorannMagicDefOf.Technomancer); } + if (Settings.Geomancer.isEnabled) { magicTraits.Add(TorannMagicDefOf.Geomancer); } + if (Settings.Demonkin.isEnabled) { magicTraits.Add(TorannMagicDefOf.Warlock); } + if (Settings.Demonkin.isEnabled) { magicTraits.Add(TorannMagicDefOf.Succubus); } + if (Settings.ChaosMage.isEnabled) { magicTraits.Add(TorannMagicDefOf.ChaosMage); } + if (Settings.Paladin.isEnabled) { magicTraits.Add(TorannMagicDefOf.Paladin); } + if (Settings.Summoner.isEnabled) { magicTraits.Add(TorannMagicDefOf.Summoner); } + if (Settings.Bard.isEnabled) { magicTraits.Add(TorannMagicDefOf.TM_Bard); } + if (Settings.Chronomancer.isEnabled) { magicTraits.Add(TorannMagicDefOf.Chronomancer); } + if (Settings.Enchanter.isEnabled) { magicTraits.Add(TorannMagicDefOf.Enchanter); } + if (Settings.BloodMage.isEnabled) { magicTraits.Add(TorannMagicDefOf.BloodMage); } + if (Settings.Brightmage.isEnabled) { magicTraits.Add(TorannMagicDefOf.TM_Brightmage); } + if (Settings.Shaman.isEnabled) { magicTraits.Add(TorannMagicDefOf.TM_Shaman); } + if (Settings.Golemancer.isEnabled) { magicTraits.Add(TorannMagicDefOf.TM_Golemancer); } foreach (TMDefs.TM_CustomClass cc in TM_ClassUtility.CustomClasses) { - if (cc.isFighter && !mightTraits.Contains(cc.classTrait)) + if (cc.isMage && !magicTraits.Contains(cc.classTrait) && Settings.Instance.CustomClass[cc.classTrait.ToString()]) { - mightTraits.Add(cc.classTrait); + magicTraits.Add(cc.classTrait); } } - return mightTraits; - } - } - - public static List AllClassTraits - { - get - { - List allClassTraits = new List(); - allClassTraits.Clear(); - allClassTraits.AddRange(MightTraits); - allClassTraits.AddRange(MagicTraits); - //allClassTraits.AddRange(TM_ClassUtility.CustomClassTraitDefs); - return allClassTraits; - } - } - - public static List AllClassConflictTraits - { - get - { - List allClassConflictTraits = new List(); - allClassConflictTraits.Clear(); - allClassConflictTraits.AddRange(AllClassTraits); - allClassConflictTraits.Add(TorannMagicDefOf.TM_Gifted); - AllClassConflictTraits.Add(TorannMagicDefOf.PhysicalProdigy); - return allClassConflictTraits; + return magicTraits; } }