From 1cf4058d312bf1f9347783a80abfb23fb170a2de Mon Sep 17 00:00:00 2001 From: twix <91138333+whichtwix@users.noreply.github.com> Date: Fri, 19 Apr 2024 15:03:04 +0600 Subject: [PATCH] conditionally add to hudstring, remove uneeded patch --- source/Patches/CustomOption/Base.cs | 27 +- source/Patches/CustomOption/Generate.cs | 599 ++++++++++++------------ source/Patches/CustomOption/Header.cs | 2 +- source/Patches/CustomOption/Number.cs | 2 +- source/Patches/CustomOption/Patches.cs | 12 - source/Patches/CustomOption/String.cs | 5 +- source/Patches/CustomOption/Toggle.cs | 5 +- source/Patches/GameSettings.cs | 8 +- 8 files changed, 337 insertions(+), 323 deletions(-) diff --git a/source/Patches/CustomOption/Base.cs b/source/Patches/CustomOption/Base.cs index 6503150f9..fe281dbc2 100644 --- a/source/Patches/CustomOption/Base.cs +++ b/source/Patches/CustomOption/Base.cs @@ -14,7 +14,7 @@ public class CustomOption protected internal CustomOption(int id, MultiMenu menu, string name, CustomOptionType type, object defaultValue, - Func format = null) + Func format = null, CustomOption dependsOn = null, int? stringoptionneedstobe = null) { ID = id; Menu = menu; @@ -22,6 +22,8 @@ protected internal CustomOption(int id, MultiMenu menu, string name, CustomOptio Type = type; DefaultValue = Value = defaultValue; Format = format ?? (obj => $"{obj}"); + DependsOn = dependsOn; + RequiredStringOptionValue = stringoptionneedstobe; if (Type == CustomOptionType.Button) return; AllOptions.Add(this); @@ -32,6 +34,8 @@ protected internal CustomOption(int id, MultiMenu menu, string name, CustomOptio protected internal OptionBehaviour Setting { get; set; } protected internal CustomOptionType Type { get; set; } public object DefaultValue { get; set; } + public CustomOption DependsOn { get; set; } + public int? RequiredStringOptionValue { get; set; } public static bool LobbyTextScroller { get; set; } = true; @@ -45,6 +49,27 @@ public virtual void OptionCreated() Setting.name = Setting.gameObject.name = Name; } + public virtual bool ShouldShow() + { + if (DependsOn == null) return true; + + if (DependsOn is CustomToggleOption toggle && toggle.Get() == false) + { + return false; + } + else if (DependsOn is CustomNumberOption number && number.Get() == 0) + { + return false; + } + else if (DependsOn is CustomStringOption stringtoggle) + { + var selected = stringtoggle.Get(); + if (selected != RequiredStringOptionValue) return false; + } + + return true; + } + protected internal void Set(object value, bool SendRpc = true) { diff --git a/source/Patches/CustomOption/Generate.cs b/source/Patches/CustomOption/Generate.cs index b50fbca05..2186759c2 100644 --- a/source/Patches/CustomOption/Generate.cs +++ b/source/Patches/CustomOption/Generate.cs @@ -666,101 +666,100 @@ public static void GenerateAll() GameMode = new CustomStringOption(num++, MultiMenu.main, "Game Mode", new[] {"Classic", "All Any", "Killing Only", "Cultist" }); ClassicSettings = - new CustomHeaderOption(num++, MultiMenu.main, "Classic Game Mode Settings"); + new CustomHeaderOption(num++, MultiMenu.main, "Classic Game Mode Settings", GameMode, 0); MinNeutralBenignRoles = - new CustomNumberOption(num++, MultiMenu.main, "Min Neutral Benign Roles", 1, 0, 3, 1); + new CustomNumberOption(num++, MultiMenu.main, "Min Neutral Benign Roles", 1, 0, 3, 1, dependsOn: GameMode, stringoptionneedstobe: 0); MaxNeutralBenignRoles = - new CustomNumberOption(num++, MultiMenu.main, "Max Neutral Benign Roles", 1, 0, 3, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Neutral Benign Roles", 1, 0, 3, 1, dependsOn: GameMode, stringoptionneedstobe: 0); MinNeutralEvilRoles = - new CustomNumberOption(num++, MultiMenu.main, "Min Neutral Evil Roles", 1, 0, 3, 1); + new CustomNumberOption(num++, MultiMenu.main, "Min Neutral Evil Roles", 1, 0, 3, 1, dependsOn: GameMode, stringoptionneedstobe: 0); MaxNeutralEvilRoles = - new CustomNumberOption(num++, MultiMenu.main, "Max Neutral Evil Roles", 1, 0, 3, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Neutral Evil Roles", 1, 0, 3, 1, dependsOn: GameMode, stringoptionneedstobe: 0); MinNeutralKillingRoles = - new CustomNumberOption(num++, MultiMenu.main, "Min Neutral Killing Roles", 1, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Min Neutral Killing Roles", 1, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 0); MaxNeutralKillingRoles = - new CustomNumberOption(num++, MultiMenu.main, "Max Neutral Killing Roles", 1, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Neutral Killing Roles", 1, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 0); - AllAnySettings = - new CustomHeaderOption(num++, MultiMenu.main, "All Any Settings"); - RandomNumberImps = new CustomToggleOption(num++, MultiMenu.main, "Random Number Of Impostors", true); + AllAnySettings = new CustomHeaderOption(num++, MultiMenu.main, "All Any Settings", GameMode, 1); + RandomNumberImps = new CustomToggleOption(num++, MultiMenu.main, "Random Number Of Impostors", true, GameMode, 1); KillingOnlySettings = - new CustomHeaderOption(num++, MultiMenu.main, "Killing Only Settings"); + new CustomHeaderOption(num++, MultiMenu.main, "Killing Only Settings", GameMode, 2); NeutralRoles = - new CustomNumberOption(num++, MultiMenu.main, "Neutral Roles", 1, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Neutral Roles", 1, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 2); VeteranCount = - new CustomNumberOption(num++, MultiMenu.main, "Veteran Count", 1, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Veteran Count", 1, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 2); VigilanteCount = - new CustomNumberOption(num++, MultiMenu.main, "Vigilante Count", 1, 0, 5, 1); - AddArsonist = new CustomToggleOption(num++, MultiMenu.main, "Add Arsonist", true); - AddPlaguebearer = new CustomToggleOption(num++, MultiMenu.main, "Add Plaguebearer", true); + new CustomNumberOption(num++, MultiMenu.main, "Vigilante Count", 1, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 2); + AddArsonist = new CustomToggleOption(num++, MultiMenu.main, "Add Arsonist", true, GameMode, 2); + AddPlaguebearer = new CustomToggleOption(num++, MultiMenu.main, "Add Plaguebearer", true, GameMode, 2); CultistSettings = - new CustomHeaderOption(num++, MultiMenu.main, "Cultist Settings"); + new CustomHeaderOption(num++, MultiMenu.main, "Cultist Settings", GameMode, 3); MayorCultistOn = new CustomNumberOption(num++, MultiMenu.main, "Mayor (Cultist Mode)", 100f, 0f, 100f, 10f, - PercentFormat); + PercentFormat, GameMode, 3); SeerCultistOn = new CustomNumberOption(num++, MultiMenu.main, "Seer (Cultist Mode)", 100f, 0f, 100f, 10f, - PercentFormat); + PercentFormat, GameMode, 3); SheriffCultistOn = new CustomNumberOption(num++, MultiMenu.main, "Sheriff (Cultist Mode)", 100f, 0f, 100f, 10f, - PercentFormat); + PercentFormat, GameMode, 3); SurvivorCultistOn = new CustomNumberOption(num++, MultiMenu.main, "Survivor (Cultist Mode)", 100f, 0f, 100f, 10f, - PercentFormat); + PercentFormat, GameMode, 3); NumberOfSpecialRoles = - new CustomNumberOption(num++, MultiMenu.main, "Number Of Special Roles", 4, 0, 4, 1); + new CustomNumberOption(num++, MultiMenu.main, "Number Of Special Roles", 4, 0, 4, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxChameleons = - new CustomNumberOption(num++, MultiMenu.main, "Max Chameleons", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Chameleons", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxEngineers = - new CustomNumberOption(num++, MultiMenu.main, "Max Engineers", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Engineers", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxInvestigators = - new CustomNumberOption(num++, MultiMenu.main, "Max Investigators", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Investigators", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxMystics = - new CustomNumberOption(num++, MultiMenu.main, "Max Mystics", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Mystics", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxSnitches = - new CustomNumberOption(num++, MultiMenu.main, "Max Snitches", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Snitches", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxSpies = - new CustomNumberOption(num++, MultiMenu.main, "Max Spies", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Spies", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxTransporters = - new CustomNumberOption(num++, MultiMenu.main, "Max Transporters", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Transporters", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MaxVigilantes = - new CustomNumberOption(num++, MultiMenu.main, "Max Vigilantes", 3, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Max Vigilantes", 3, 0, 5, 1, dependsOn: GameMode, stringoptionneedstobe: 3); WhisperCooldown = - new CustomNumberOption(num++, MultiMenu.main, "Initial Whisper Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.main, "Initial Whisper Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, GameMode, 3); IncreasedCooldownPerWhisper = - new CustomNumberOption(num++, MultiMenu.main, "Increased Cooldown Per Whisper", 5f, 0f, 15f, 0.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.main, "Increased Cooldown Per Whisper", 5f, 0f, 15f, 0.5f, CooldownFormat, GameMode, 3); WhisperRadius = - new CustomNumberOption(num++, MultiMenu.main, "Whisper Radius", 1f, 0.25f, 5f, 0.25f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.main, "Whisper Radius", 1f, 0.25f, 5f, 0.25f, MultiplierFormat, GameMode, 3); ConversionPercentage = new CustomNumberOption(num++, MultiMenu.main, "Conversion Percentage", 25f, 0f, 100f, 5f, - PercentFormat); + PercentFormat, GameMode, 3); DecreasedPercentagePerConversion = new CustomNumberOption(num++, MultiMenu.main, "Decreased Conversion Percentage Per Conversion", 5f, 0f, 15f, 1f, - PercentFormat); + PercentFormat, GameMode, 3); ReviveCooldown = - new CustomNumberOption(num++, MultiMenu.main, "Initial Revive Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.main, "Initial Revive Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, GameMode, 3); IncreasedCooldownPerRevive = - new CustomNumberOption(num++, MultiMenu.main, "Increased Cooldown Per Revive", 25f, 10f, 60f, 2.5f, CooldownFormat); - MaxReveals = new CustomNumberOption(num++, MultiMenu.main, "Maximum Number Of Reveals", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.main, "Increased Cooldown Per Revive", 25f, 10f, 60f, 2.5f, CooldownFormat, GameMode, 3); + MaxReveals = new CustomNumberOption(num++, MultiMenu.main, "Maximum Number Of Reveals", 5, 1, 15, 1, dependsOn: GameMode, stringoptionneedstobe: 3); MapSettings = new CustomHeaderOption(num++, MultiMenu.main, "Map Settings"); RandomMapEnabled = new CustomToggleOption(num++, MultiMenu.main, "Choose Random Map", false); - RandomMapSkeld = new CustomNumberOption(num++, MultiMenu.main, "Skeld Chance", 0f, 0f, 100f, 10f, PercentFormat); - RandomMapMira = new CustomNumberOption(num++, MultiMenu.main, "Mira Chance", 0f, 0f, 100f, 10f, PercentFormat); - RandomMapPolus = new CustomNumberOption(num++, MultiMenu.main, "Polus Chance", 0f, 0f, 100f, 10f, PercentFormat); - RandomMapAirship = new CustomNumberOption(num++, MultiMenu.main, "Airship Chance", 0f, 0f, 100f, 10f, PercentFormat); - RandomMapFungle = new CustomNumberOption(num++, MultiMenu.main, "Fungle Chance", 0f, 0f, 100f, 10f, PercentFormat); - RandomMapSubmerged = new CustomNumberOption(num++, MultiMenu.main, "Submerged Chance", 0f, 0f, 100f, 10f, PercentFormat); - AutoAdjustSettings = new CustomToggleOption(num++, MultiMenu.main, "Auto Adjust Settings", false); - SmallMapHalfVision = new CustomToggleOption(num++, MultiMenu.main, "Half Vision On Skeld/Mira HQ", false); + RandomMapSkeld = new CustomNumberOption(num++, MultiMenu.main, "Skeld Chance", 0f, 0f, 100f, 10f, PercentFormat, RandomMapEnabled); + RandomMapMira = new CustomNumberOption(num++, MultiMenu.main, "Mira Chance", 0f, 0f, 100f, 10f, PercentFormat, RandomMapEnabled); + RandomMapPolus = new CustomNumberOption(num++, MultiMenu.main, "Polus Chance", 0f, 0f, 100f, 10f, PercentFormat, RandomMapEnabled); + RandomMapAirship = new CustomNumberOption(num++, MultiMenu.main, "Airship Chance", 0f, 0f, 100f, 10f, PercentFormat, RandomMapEnabled); + RandomMapFungle = new CustomNumberOption(num++, MultiMenu.main, "Fungle Chance", 0f, 0f, 100f, 10f, PercentFormat, RandomMapEnabled); + RandomMapSubmerged = new CustomNumberOption(num++, MultiMenu.main, "Submerged Chance", 0f, 0f, 100f, 10f, PercentFormat, RandomMapEnabled); + AutoAdjustSettings = new CustomToggleOption(num++, MultiMenu.main, "Auto Adjust Settings", false, RandomMapEnabled); + SmallMapHalfVision = new CustomToggleOption(num++, MultiMenu.main, "Half Vision On Skeld/Mira HQ", false, RandomMapEnabled); SmallMapDecreasedCooldown = - new CustomNumberOption(num++, MultiMenu.main, "Mira HQ Decreased Cooldowns", 0f, 0f, 15f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.main, "Mira HQ Decreased Cooldowns", 0f, 0f, 15f, 2.5f, CooldownFormat, RandomMapEnabled); LargeMapIncreasedCooldown = - new CustomNumberOption(num++, MultiMenu.main, "Airship/Submerged Increased Cooldowns", 0f, 0f, 15f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.main, "Airship/Submerged Increased Cooldowns", 0f, 0f, 15f, 2.5f, CooldownFormat, RandomMapEnabled); SmallMapIncreasedShortTasks = - new CustomNumberOption(num++, MultiMenu.main, "Skeld/Mira HQ Increased Short Tasks", 0, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Skeld/Mira HQ Increased Short Tasks", 0, 0, 5, 1, dependsOn: RandomMapEnabled); SmallMapIncreasedLongTasks = - new CustomNumberOption(num++, MultiMenu.main, "Skeld/Mira HQ Increased Long Tasks", 0, 0, 3, 1); + new CustomNumberOption(num++, MultiMenu.main, "Skeld/Mira HQ Increased Long Tasks", 0, 0, 3, 1, dependsOn: RandomMapEnabled); LargeMapDecreasedShortTasks = - new CustomNumberOption(num++, MultiMenu.main, "Airship/Submerged Decreased Short Tasks", 0, 0, 5, 1); + new CustomNumberOption(num++, MultiMenu.main, "Airship/Submerged Decreased Short Tasks", 0, 0, 5, 1, dependsOn: RandomMapEnabled); LargeMapDecreasedLongTasks = - new CustomNumberOption(num++, MultiMenu.main, "Airship/Submerged Decreased Long Tasks", 0, 0, 3, 1); + new CustomNumberOption(num++, MultiMenu.main, "Airship/Submerged Decreased Long Tasks", 0, 0, 3, 1, dependsOn: RandomMapEnabled); BetterPolusSettings = new CustomHeaderOption(num++, MultiMenu.main, "Better Polus Settings"); @@ -808,482 +807,482 @@ public static void GenerateAll() AssassinateAfterVoting = new CustomToggleOption(num++, MultiMenu.imposter, "Assassin Can Guess After Voting", false); Aurial = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Aurial"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Aurial", AurialOn); RadiateRange = - new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Range", 1f, 0.25f, 5f, 0.25f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Range", 1f, 0.25f, 5f, 0.25f, MultiplierFormat, AurialOn); RadiateCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, AurialOn); RadiateInvis = - new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate See Delay", 10f, 0f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate See Delay", 10f, 0f, 15f, 1f, CooldownFormat, AurialOn); RadiateCount = - new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Uses To See", 3, 1, 5, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Uses To See", 3, 1, 5, 1, dependsOn: AurialOn); RadiateSucceedChance = - new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Succeed Chance", 100f, 0f, 100f, 10f, PercentFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Radiate Succeed Chance", 100f, 0f, 100f, 10f, PercentFormat, AurialOn); Detective = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Detective"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Detective", DetectiveOn); ExamineCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Examine Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - DetectiveReportOn = new CustomToggleOption(num++, MultiMenu.crewmate, "Show Detective Reports", true); + new CustomNumberOption(num++, MultiMenu.crewmate, "Examine Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, DetectiveOn); + DetectiveReportOn = new CustomToggleOption(num++, MultiMenu.crewmate, "Show Detective Reports", true, DetectiveOn); DetectiveRoleDuration = new CustomNumberOption(num++, MultiMenu.crewmate, "Time Where Detective Will Have Role", 15f, 0f, 60f, 2.5f, - CooldownFormat); + CooldownFormat, DetectiveOn); DetectiveFactionDuration = new CustomNumberOption(num++, MultiMenu.crewmate, "Time Where Detective Will Have Faction", 30f, 0f, 60f, 2.5f, - CooldownFormat); - CanDetectLastKiller = new CustomToggleOption(num++, MultiMenu.crewmate, "Can Detect Last Killer", false); + CooldownFormat, DetectiveOn); + CanDetectLastKiller = new CustomToggleOption(num++, MultiMenu.crewmate, "Can Detect Last Killer", false, DetectiveOn); Haunter = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Haunter"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Haunter", HaunterOn); HaunterTasksRemainingClicked = - new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Haunter Can Be Clicked", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Haunter Can Be Clicked", 5, 1, 15, 1, dependsOn: HaunterOn); HaunterTasksRemainingAlert = - new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Alert Is Sent", 1, 1, 5, 1); - HaunterRevealsNeutrals = new CustomToggleOption(num++, MultiMenu.crewmate, "Haunter Reveals Neutral Roles", false); - HaunterCanBeClickedBy = new CustomStringOption(num++, MultiMenu.crewmate, "Who Can Click Haunter", new[] { "All", "Non-Crew", "Imps Only" }); + new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Alert Is Sent", 1, 1, 5, 1, dependsOn: HaunterOn); + HaunterRevealsNeutrals = new CustomToggleOption(num++, MultiMenu.crewmate, "Haunter Reveals Neutral Roles", false, HaunterOn); + HaunterCanBeClickedBy = new CustomStringOption(num++, MultiMenu.crewmate, "Who Can Click Haunter", new[] { "All", "Non-Crew", "Imps Only" }, HaunterOn); Investigator = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Investigator"); - FootprintSize = new CustomNumberOption(num++, MultiMenu.crewmate, "Footprint Size", 4f, 1f, 10f, 1f); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Investigator", InvestigatorOn); + FootprintSize = new CustomNumberOption(num++, MultiMenu.crewmate, "Footprint Size", 4f, 1f, 10f, 1f, dependsOn: InvestigatorOn); FootprintInterval = - new CustomNumberOption(num++, MultiMenu.crewmate, "Footprint Interval", 0.1f, 0.05f, 1f, 0.05f, CooldownFormat); - FootprintDuration = new CustomNumberOption(num++, MultiMenu.crewmate, "Footprint Duration", 10f, 1f, 15f, 0.5f, CooldownFormat); - AnonymousFootPrint = new CustomToggleOption(num++, MultiMenu.crewmate, "Anonymous Footprint", false); - VentFootprintVisible = new CustomToggleOption(num++, MultiMenu.crewmate, "Footprint Vent Visible", false); + new CustomNumberOption(num++, MultiMenu.crewmate, "Footprint Interval", 0.1f, 0.05f, 1f, 0.05f, CooldownFormat, InvestigatorOn); + FootprintDuration = new CustomNumberOption(num++, MultiMenu.crewmate, "Footprint Duration", 10f, 1f, 15f, 0.5f, CooldownFormat, InvestigatorOn); + AnonymousFootPrint = new CustomToggleOption(num++, MultiMenu.crewmate, "Anonymous Footprint", false, InvestigatorOn); + VentFootprintVisible = new CustomToggleOption(num++, MultiMenu.crewmate, "Footprint Vent Visible", false, InvestigatorOn); Mystic = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Mystic"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Mystic", MysticOn); MysticArrowDuration = - new CustomNumberOption(num++, MultiMenu.crewmate, "Dead Body Arrow Duration", 0.1f, 0f, 1f, 0.05f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Dead Body Arrow Duration", 0.1f, 0f, 1f, 0.05f, CooldownFormat, MysticOn); Oracle = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Oracle"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Oracle", OracleOn); ConfessCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Confess Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Confess Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, OracleOn); RevealAccuracy = new CustomNumberOption(num++, MultiMenu.crewmate, "Reveal Accuracy", 80f, 0f, 100f, 10f, - PercentFormat); + PercentFormat, OracleOn); NeutralBenignShowsEvil = - new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Benign Roles Show Evil", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Benign Roles Show Evil", false, OracleOn); NeutralEvilShowsEvil = - new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Evil Roles Show Evil", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Evil Roles Show Evil", false, OracleOn); NeutralKillingShowsEvil = - new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Killing Roles Show Evil", true); + new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Killing Roles Show Evil", true, OracleOn); Seer = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Seer"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Seer", SeerOn); SeerCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Seer Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Seer Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, SeerOn); CrewKillingRed = - new CustomToggleOption(num++, MultiMenu.crewmate, "Crewmate Killing Roles Are Red", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Crewmate Killing Roles Are Red", false, SeerOn); NeutBenignRed = - new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Benign Roles Are Red", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Benign Roles Are Red", false, SeerOn); NeutEvilRed = - new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Evil Roles Are Red", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Evil Roles Are Red", false, SeerOn); NeutKillingRed = - new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Killing Roles Are Red", true); + new CustomToggleOption(num++, MultiMenu.crewmate, "Neutral Killing Roles Are Red", true, SeerOn); TraitorColourSwap = - new CustomToggleOption(num++, MultiMenu.crewmate, "Traitor Does Not Swap Colours", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Traitor Does Not Swap Colours", false, SeerOn); - Snitch = new CustomHeaderOption(num++, MultiMenu.crewmate, "Snitch"); - SnitchSeesNeutrals = new CustomToggleOption(num++, MultiMenu.crewmate, "Snitch Sees Neutral Roles", false); + Snitch = new CustomHeaderOption(num++, MultiMenu.crewmate, "Snitch", SnitchOn); + SnitchSeesNeutrals = new CustomToggleOption(num++, MultiMenu.crewmate, "Snitch Sees Neutral Roles", false, SnitchOn); SnitchTasksRemaining = - new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Revealed", 1, 1, 5, 1); - SnitchSeesImpInMeeting = new CustomToggleOption(num++, MultiMenu.crewmate, "Snitch Sees Impostors In Meetings", true); - SnitchSeesTraitor = new CustomToggleOption(num++, MultiMenu.crewmate, "Snitch Sees Traitor", true); + new CustomNumberOption(num++, MultiMenu.crewmate, "Tasks Remaining When Revealed", 1, 1, 5, 1, dependsOn: SnitchOn); + SnitchSeesImpInMeeting = new CustomToggleOption(num++, MultiMenu.crewmate, "Snitch Sees Impostors In Meetings", true, SnitchOn); + SnitchSeesTraitor = new CustomToggleOption(num++, MultiMenu.crewmate, "Snitch Sees Traitor", true, SnitchOn); Spy = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Spy"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Spy", SpyOn); WhoSeesDead = new CustomStringOption(num++, MultiMenu.crewmate, "Who Sees Dead Bodies On Admin", - new[] { "Nobody", "Spy", "Everyone But Spy", "Everyone" }); + new[] { "Nobody", "Spy", "Everyone But Spy", "Everyone" }, SpyOn); Tracker = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Tracker"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Tracker", TrackerOn); UpdateInterval = - new CustomNumberOption(num++, MultiMenu.crewmate, "Arrow Update Interval", 5f, 0.5f, 15f, 0.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Arrow Update Interval", 5f, 0.5f, 15f, 0.5f, CooldownFormat, TrackerOn); TrackCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Track Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - ResetOnNewRound = new CustomToggleOption(num++, MultiMenu.crewmate, "Tracker Arrows Reset After Each Round", false); - MaxTracks = new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Tracks Per Round", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Track Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, TrackerOn); + ResetOnNewRound = new CustomToggleOption(num++, MultiMenu.crewmate, "Tracker Arrows Reset After Each Round", false, TrackerOn); + MaxTracks = new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Tracks Per Round", 5, 1, 15, 1, dependsOn: TrackerOn); Trapper = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Trapper"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Trapper", TrapperOn); MinAmountOfTimeInTrap = - new CustomNumberOption(num++, MultiMenu.crewmate, "Min Amount Of Time In Trap To Register", 1f, 0f, 15f, 0.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Min Amount Of Time In Trap To Register", 1f, 0f, 15f, 0.5f, CooldownFormat, TrapperOn); TrapCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Trap Cooldown", 25f, 10f, 40f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Trap Cooldown", 25f, 10f, 40f, 2.5f, CooldownFormat, TrapperOn); TrapsRemoveOnNewRound = - new CustomToggleOption(num++, MultiMenu.crewmate, "Traps Removed After Each Round", true); + new CustomToggleOption(num++, MultiMenu.crewmate, "Traps Removed After Each Round", true, TrapperOn); MaxTraps = - new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Traps Per Game", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Traps Per Game", 5, 1, 15, 1, dependsOn: TrapperOn); TrapSize = - new CustomNumberOption(num++, MultiMenu.crewmate, "Trap Size", 0.25f, 0.05f, 1f, 0.05f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Trap Size", 0.25f, 0.05f, 1f, 0.05f, MultiplierFormat, TrapperOn); MinAmountOfPlayersInTrap = - new CustomNumberOption(num++, MultiMenu.crewmate, "Minimum Number Of Roles Required To Trigger Trap", 3, 1, 5, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Minimum Number Of Roles Required To Trigger Trap", 3, 1, 5, 1, dependsOn: TrapperOn); Sheriff = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Sheriff"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Sheriff", SheriffOn); SheriffKillOther = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Miskill Kills Crewmate", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Miskill Kills Crewmate", false, SheriffOn); SheriffKillsDoomsayer = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Doomsayer", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Doomsayer", false, SheriffOn); SheriffKillsExecutioner = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Executioner", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Executioner", false, SheriffOn); SheriffKillsJester = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Jester", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Jester", false, SheriffOn); SheriffKillsArsonist = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Arsonist", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Arsonist", false, SheriffOn); SheriffKillsGlitch = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills The Glitch", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills The Glitch", false, SheriffOn); SheriffKillsJuggernaut = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Juggernaut", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Juggernaut", false, SheriffOn); SheriffKillsPlaguebearer = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Plaguebearer", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Plaguebearer", false, SheriffOn); SheriffKillsVampire = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Vampire", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Vampire", false, SheriffOn); SheriffKillsWerewolf = - new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Werewolf", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Kills Werewolf", false, SheriffOn); SheriffKillCd = - new CustomNumberOption(num++, MultiMenu.crewmate, "Sheriff Kill Cooldown", 25f, 10f, 40f, 2.5f, CooldownFormat); - SheriffBodyReport = new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Can Report Who They've Killed"); + new CustomNumberOption(num++, MultiMenu.crewmate, "Sheriff Kill Cooldown", 25f, 10f, 40f, 2.5f, CooldownFormat, SheriffOn); + SheriffBodyReport = new CustomToggleOption(num++, MultiMenu.crewmate, "Sheriff Can Report Who They've Killed", dependsOn: SheriffOn); VampireHunter = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Vampire Hunter"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Vampire Hunter", VampireHunterOn); StakeCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Stake Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - MaxFailedStakesPerGame = new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Failed Stakes Per Game", 5, 1, 15, 1); - CanStakeRoundOne = new CustomToggleOption(num++, MultiMenu.crewmate, "Can Stake Round One", false); - SelfKillAfterFinalStake = new CustomToggleOption(num++, MultiMenu.crewmate, "Self Kill On Failure To Kill A Vamp With All Stakes", false); + new CustomNumberOption(num++, MultiMenu.crewmate, "Stake Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, VampireHunterOn); + MaxFailedStakesPerGame = new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Failed Stakes Per Game", 5, 1, 15, 1, dependsOn: VampireHunterOn); + CanStakeRoundOne = new CustomToggleOption(num++, MultiMenu.crewmate, "Can Stake Round One", false, dependsOn: VampireHunterOn); + SelfKillAfterFinalStake = new CustomToggleOption(num++, MultiMenu.crewmate, "Self Kill On Failure To Kill A Vamp With All Stakes", false, VampireHunterOn); BecomeOnVampDeaths = - new CustomStringOption(num++, MultiMenu.crewmate, "What Vampire Hunter Becomes On All Vampire Deaths", new[] { "Crewmate", "Sheriff", "Veteran", "Vigilante" }); + new CustomStringOption(num++, MultiMenu.crewmate, "What Vampire Hunter Becomes On All Vampire Deaths", new[] { "Crewmate", "Sheriff", "Veteran", "Vigilante" }, VampireHunterOn); Veteran = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Veteran"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Veteran", VeteranOn); KilledOnAlert = - new CustomToggleOption(num++, MultiMenu.crewmate, "Can Be Killed On Alert", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Can Be Killed On Alert", false, VeteranOn); AlertCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Alert Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Alert Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, VeteranOn); AlertDuration = - new CustomNumberOption(num++, MultiMenu.crewmate, "Alert Duration", 10f, 5f, 15f, 1f, CooldownFormat); - MaxAlerts = new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Alerts", 5, 1, 15, 1); - - Vigilante = new CustomHeaderOption(num++, MultiMenu.crewmate, "Vigilante"); - VigilanteKills = new CustomNumberOption(num++, MultiMenu.crewmate, "Number Of Vigilante Kills", 1, 1, 15, 1); - VigilanteMultiKill = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Kill More Than Once Per Meeting", false); - VigilanteGuessNeutralBenign = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Neutral Benign Roles", false); - VigilanteGuessNeutralEvil = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Neutral Evil Roles", false); - VigilanteGuessNeutralKilling = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Neutral Killing Roles", false); - VigilanteGuessLovers = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Lovers", false); - VigilanteAfterVoting = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess After Voting", false); - - Altruist = new CustomHeaderOption(num++, MultiMenu.crewmate, "Altruist"); + new CustomNumberOption(num++, MultiMenu.crewmate, "Alert Duration", 10f, 5f, 15f, 1f, CooldownFormat, VeteranOn); + MaxAlerts = new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Alerts", 5, 1, 15, 1, dependsOn: VeteranOn); + + Vigilante = new CustomHeaderOption(num++, MultiMenu.crewmate, "Vigilante", VigilanteOn); + VigilanteKills = new CustomNumberOption(num++, MultiMenu.crewmate, "Number Of Vigilante Kills", 1, 1, 15, 1, dependsOn: VigilanteOn); + VigilanteMultiKill = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Kill More Than Once Per Meeting", false, VigilanteOn); + VigilanteGuessNeutralBenign = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Neutral Benign Roles", false, VigilanteOn); + VigilanteGuessNeutralEvil = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Neutral Evil Roles", false, VigilanteOn); + VigilanteGuessNeutralKilling = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Neutral Killing Roles", false, VigilanteOn); + VigilanteGuessLovers = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess Lovers", false, VigilanteOn); + VigilanteAfterVoting = new CustomToggleOption(num++, MultiMenu.crewmate, "Vigilante Can Guess After Voting", false, VigilanteOn); + + Altruist = new CustomHeaderOption(num++, MultiMenu.crewmate, "Altruist", AltruistOn); ReviveDuration = - new CustomNumberOption(num++, MultiMenu.crewmate, "Altruist Revive Duration", 10f, 1f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Altruist Revive Duration", 10f, 1f, 15f, 1f, CooldownFormat, AltruistOn); AltruistTargetBody = - new CustomToggleOption(num++, MultiMenu.crewmate, "Target's Body Disappears On Beginning Of Revive", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Target's Body Disappears On Beginning Of Revive", false, AltruistOn); Medic = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Medic"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Medic", MedicOn); ShowShielded = new CustomStringOption(num++, MultiMenu.crewmate, "Show Shielded Player", - new[] { "Self", "Medic", "Self+Medic", "Everyone" }); + new[] { "Self", "Medic", "Self+Medic", "Everyone" }, MedicOn); WhoGetsNotification = new CustomStringOption(num++, MultiMenu.crewmate, "Who Gets Murder Attempt Indicator", - new[] { "Medic", "Shielded", "Everyone", "Nobody" }); - ShieldBreaks = new CustomToggleOption(num++, MultiMenu.crewmate, "Shield Breaks On Murder Attempt", false); - MedicReportSwitch = new CustomToggleOption(num++, MultiMenu.crewmate, "Show Medic Reports"); + new[] { "Medic", "Shielded", "Everyone", "Nobody" }, MedicOn); + ShieldBreaks = new CustomToggleOption(num++, MultiMenu.crewmate, "Shield Breaks On Murder Attempt", false, MedicOn); + MedicReportSwitch = new CustomToggleOption(num++, MultiMenu.crewmate, "Show Medic Reports", dependsOn: MedicOn); MedicReportNameDuration = new CustomNumberOption(num++, MultiMenu.crewmate, "Time Where Medic Will Have Name", 0f, 0f, 60f, 2.5f, - CooldownFormat); + CooldownFormat, MedicOn); MedicReportColorDuration = new CustomNumberOption(num++, MultiMenu.crewmate, "Time Where Medic Will Have Color Type", 15f, 0f, 60f, 2.5f, - CooldownFormat); + CooldownFormat, MedicOn); Engineer = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Engineer"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Engineer", EngineerOn); MaxFixes = - new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Fixes", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Fixes", 5, 1, 15, 1, dependsOn: EngineerOn); Medium = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Medium"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Medium", MediumOn); MediateCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Mediate Cooldown", 10f, 1f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Mediate Cooldown", 10f, 1f, 15f, 1f, CooldownFormat, MediumOn); ShowMediatePlayer = - new CustomToggleOption(num++, MultiMenu.crewmate, "Reveal Appearance Of Mediate Target", true); + new CustomToggleOption(num++, MultiMenu.crewmate, "Reveal Appearance Of Mediate Target", true, MediumOn); ShowMediumToDead = - new CustomToggleOption(num++, MultiMenu.crewmate, "Reveal The Medium To The Mediate Target", true); + new CustomToggleOption(num++, MultiMenu.crewmate, "Reveal The Medium To The Mediate Target", true, MediumOn); DeadRevealed = - new CustomStringOption(num++, MultiMenu.crewmate, "Who Is Revealed With Mediate", new[] { "Oldest Dead", "Newest Dead", "All Dead" }); + new CustomStringOption(num++, MultiMenu.crewmate, "Who Is Revealed With Mediate", new[] { "Oldest Dead", "Newest Dead", "All Dead" }, MediumOn); Prosecutor = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Prosecutor"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Prosecutor", ProsecutorOn); ProsDiesOnIncorrectPros = - new CustomToggleOption(num++, MultiMenu.crewmate, "Prosecutor Dies When They Exile A Crewmate", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Prosecutor Dies When They Exile A Crewmate", false, ProsecutorOn); Swapper = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Swapper"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Swapper", SwapperOn); SwapperButton = - new CustomToggleOption(num++, MultiMenu.crewmate, "Swapper Can Button", true); + new CustomToggleOption(num++, MultiMenu.crewmate, "Swapper Can Button", true, SwapperOn); Transporter = - new CustomHeaderOption(num++, MultiMenu.crewmate, "Transporter"); + new CustomHeaderOption(num++, MultiMenu.crewmate, "Transporter", TransporterOn); TransportCooldown = - new CustomNumberOption(num++, MultiMenu.crewmate, "Transport Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.crewmate, "Transport Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, TransporterOn); TransportMaxUses = - new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Transports", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.crewmate, "Maximum Number Of Transports", 5, 1, 15, 1, dependsOn: TransporterOn); TransporterVitals = - new CustomToggleOption(num++, MultiMenu.crewmate, "Transporter Can Use Vitals", false); + new CustomToggleOption(num++, MultiMenu.crewmate, "Transporter Can Use Vitals", false, TransporterOn); - Amnesiac = new CustomHeaderOption(num++, MultiMenu.neutral, "Amnesiac"); + Amnesiac = new CustomHeaderOption(num++, MultiMenu.neutral, "Amnesiac", AmnesiacOn); RememberArrows = - new CustomToggleOption(num++, MultiMenu.neutral, "Amnesiac Gets Arrows Pointing To Dead Bodies", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Amnesiac Gets Arrows Pointing To Dead Bodies", false, AmnesiacOn); RememberArrowDelay = - new CustomNumberOption(num++, MultiMenu.neutral, "Time After Death Arrow Appears", 5f, 0f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Time After Death Arrow Appears", 5f, 0f, 15f, 1f, CooldownFormat, AmnesiacOn); GuardianAngel = - new CustomHeaderOption(num++, MultiMenu.neutral, "Guardian Angel"); + new CustomHeaderOption(num++, MultiMenu.neutral, "Guardian Angel", GuardianAngelOn); ProtectCd = - new CustomNumberOption(num++, MultiMenu.neutral, "Protect Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Protect Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, GuardianAngelOn); ProtectDuration = - new CustomNumberOption(num++, MultiMenu.neutral, "Protect Duration", 10f, 5f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Protect Duration", 10f, 5f, 15f, 1f, CooldownFormat, GuardianAngelOn); ProtectKCReset = - new CustomNumberOption(num++, MultiMenu.neutral, "Kill Cooldown Reset When Protected", 2.5f, 0f, 15f, 0.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Kill Cooldown Reset When Protected", 2.5f, 0f, 15f, 0.5f, CooldownFormat, GuardianAngelOn); MaxProtects = - new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Number Of Protects", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Number Of Protects", 5, 1, 15, 1, dependsOn: GuardianAngelOn); ShowProtect = new CustomStringOption(num++, MultiMenu.neutral, "Show Protected Player", - new[] { "Self", "Guardian Angel", "Self+GA", "Everyone" }); + new[] { "Self", "Guardian Angel", "Self+GA", "Everyone" }, GuardianAngelOn); GaOnTargetDeath = new CustomStringOption(num++, MultiMenu.neutral, "GA Becomes On Target Dead", - new[] { "Crew", "Amnesiac", "Survivor", "Jester" }); + new[] { "Crew", "Amnesiac", "Survivor", "Jester" }, GuardianAngelOn); GATargetKnows = - new CustomToggleOption(num++, MultiMenu.neutral, "Target Knows GA Exists", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Target Knows GA Exists", false, GuardianAngelOn); GAKnowsTargetRole = - new CustomToggleOption(num++, MultiMenu.neutral, "GA Knows Targets Role", false); + new CustomToggleOption(num++, MultiMenu.neutral, "GA Knows Targets Role", false, GuardianAngelOn); EvilTargetPercent = new CustomNumberOption(num++, MultiMenu.neutral, "Odds Of Target Being Evil", 20f, 0f, 100f, 10f, - PercentFormat); + PercentFormat, GuardianAngelOn); Survivor = - new CustomHeaderOption(num++, MultiMenu.neutral, "Survivor"); + new CustomHeaderOption(num++, MultiMenu.neutral, "Survivor", SurvivorOn); VestCd = - new CustomNumberOption(num++, MultiMenu.neutral, "Vest Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Vest Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, SurvivorOn); VestDuration = - new CustomNumberOption(num++, MultiMenu.neutral, "Vest Duration", 10f, 5f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Vest Duration", 10f, 5f, 15f, 1f, CooldownFormat, SurvivorOn); VestKCReset = - new CustomNumberOption(num++, MultiMenu.neutral, "Kill Cooldown Reset On Attack", 2.5f, 0f, 15f, 0.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Kill Cooldown Reset On Attack", 2.5f, 0f, 15f, 0.5f, CooldownFormat, SurvivorOn); MaxVests = - new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Number Of Vests", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Number Of Vests", 5, 1, 15, 1, dependsOn: SurvivorOn); - Doomsayer = new CustomHeaderOption(num++, MultiMenu.neutral, "Doomsayer"); + Doomsayer = new CustomHeaderOption(num++, MultiMenu.neutral, "Doomsayer", DoomsayerOn); ObserveCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Observe Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - DoomsayerGuessNeutralBenign = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Neutral Benign Roles", false); - DoomsayerGuessNeutralEvil = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Neutral Evil Roles", false); - DoomsayerGuessNeutralKilling = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Neutral Killing Roles", false); - DoomsayerGuessImpostors = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Impostor Roles", false); - DoomsayerAfterVoting = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess After Voting", false); - DoomsayerGuessesToWin = new CustomNumberOption(num++, MultiMenu.neutral, "Number Of Doomsayer Kills To Win", 3, 1, 5, 1); + new CustomNumberOption(num++, MultiMenu.neutral, "Observe Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, DoomsayerOn); + DoomsayerGuessNeutralBenign = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Neutral Benign Roles", false, DoomsayerOn); + DoomsayerGuessNeutralEvil = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Neutral Evil Roles", false, DoomsayerOn); + DoomsayerGuessNeutralKilling = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Neutral Killing Roles", false, DoomsayerOn); + DoomsayerGuessImpostors = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess Impostor Roles", false, DoomsayerOn); + DoomsayerAfterVoting = new CustomToggleOption(num++, MultiMenu.neutral, "Doomsayer Can Guess After Voting", false, DoomsayerOn); + DoomsayerGuessesToWin = new CustomNumberOption(num++, MultiMenu.neutral, "Number Of Doomsayer Kills To Win", 3, 1, 5, 1, dependsOn: DoomsayerOn); Executioner = - new CustomHeaderOption(num++, MultiMenu.neutral, "Executioner"); + new CustomHeaderOption(num++, MultiMenu.neutral, "Executioner", ExecutionerOn); OnTargetDead = new CustomStringOption(num++, MultiMenu.neutral, "Executioner Becomes On Target Dead", - new[] { "Crew", "Amnesiac", "Survivor", "Jester" }); + new[] { "Crew", "Amnesiac", "Survivor", "Jester" }, ExecutionerOn); ExecutionerButton = - new CustomToggleOption(num++, MultiMenu.neutral, "Executioner Can Button", true); + new CustomToggleOption(num++, MultiMenu.neutral, "Executioner Can Button", true,ExecutionerOn); ExecutionerTorment = - new CustomToggleOption(num++, MultiMenu.neutral, "Executioner Torments Player On Victory", true); + new CustomToggleOption(num++, MultiMenu.neutral, "Executioner Torments Player On Victory", true, ExecutionerOn); Jester = - new CustomHeaderOption(num++, MultiMenu.neutral, "Jester"); + new CustomHeaderOption(num++, MultiMenu.neutral, "Jester", JesterOn); JesterButton = - new CustomToggleOption(num++, MultiMenu.neutral, "Jester Can Button", true); + new CustomToggleOption(num++, MultiMenu.neutral, "Jester Can Button", true, JesterOn); JesterVent = - new CustomToggleOption(num++, MultiMenu.neutral, "Jester Can Hide In Vents", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Jester Can Hide In Vents", false, JesterOn); JesterImpVision = - new CustomToggleOption(num++, MultiMenu.neutral, "Jester Has Impostor Vision", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Jester Has Impostor Vision", false, JesterOn); JesterHaunt = - new CustomToggleOption(num++, MultiMenu.neutral, "Jester Haunts Player On Victory", true); + new CustomToggleOption(num++, MultiMenu.neutral, "Jester Haunts Player On Victory", true, JesterOn); Phantom = - new CustomHeaderOption(num++, MultiMenu.neutral, "Phantom"); + new CustomHeaderOption(num++, MultiMenu.neutral, "Phantom", PhantomOn); PhantomTasksRemaining = - new CustomNumberOption(num++, MultiMenu.neutral, "Tasks Remaining When Phantom Can Be Clicked", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.neutral, "Tasks Remaining When Phantom Can Be Clicked", 5, 1, 15, 1, dependsOn: PhantomOn); PhantomSpook = - new CustomToggleOption(num++, MultiMenu.neutral, "Phantom Spooks Player On Victory", true); + new CustomToggleOption(num++, MultiMenu.neutral, "Phantom Spooks Player On Victory", true, PhantomOn); - Arsonist = new CustomHeaderOption(num++, MultiMenu.neutral, "Arsonist"); + Arsonist = new CustomHeaderOption(num++, MultiMenu.neutral, "Arsonist", ArsonistOn); DouseCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Douse Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Douse Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, ArsonistOn); MaxDoused = - new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Alive Players Doused", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Alive Players Doused", 5, 1, 15, 1, dependsOn: ArsonistOn); ArsoImpVision = - new CustomToggleOption(num++, MultiMenu.neutral, "Arsonist Has Impostor Vision", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Arsonist Has Impostor Vision", false, ArsonistOn); IgniteCdRemoved = - new CustomToggleOption(num++, MultiMenu.neutral, "Ignite Cooldown Removed When Arsonist Is Last Killer", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Ignite Cooldown Removed When Arsonist Is Last Killer", false, ArsonistOn); Juggernaut = - new CustomHeaderOption(num++, MultiMenu.neutral, "Juggernaut"); - JuggKillCooldown = new CustomNumberOption(num++, MultiMenu.neutral, "Juggernaut Initial Kill Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - ReducedKCdPerKill = new CustomNumberOption(num++, MultiMenu.neutral, "Reduced Kill Cooldown Per Kill", 5f, 2.5f, 10f, 2.5f, CooldownFormat); + new CustomHeaderOption(num++, MultiMenu.neutral, "Juggernaut", HiddenRoles); + JuggKillCooldown = new CustomNumberOption(num++, MultiMenu.neutral, "Juggernaut Initial Kill Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, HiddenRoles); + ReducedKCdPerKill = new CustomNumberOption(num++, MultiMenu.neutral, "Reduced Kill Cooldown Per Kill", 5f, 2.5f, 10f, 2.5f, CooldownFormat, HiddenRoles); JuggVent = - new CustomToggleOption(num++, MultiMenu.neutral, "Juggernaut Can Vent", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Juggernaut Can Vent", false, HiddenRoles); - Plaguebearer = new CustomHeaderOption(num++, MultiMenu.neutral, "Plaguebearer"); + Plaguebearer = new CustomHeaderOption(num++, MultiMenu.neutral, "Plaguebearer", PlaguebearerOn); InfectCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Infect Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Infect Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, PlaguebearerOn); PestKillCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Pestilence Kill Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Pestilence Kill Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, PlaguebearerOn); PestVent = - new CustomToggleOption(num++, MultiMenu.neutral, "Pestilence Can Vent", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Pestilence Can Vent", false, PlaguebearerOn); TheGlitch = - new CustomHeaderOption(num++, MultiMenu.neutral, "The Glitch"); - MimicCooldownOption = new CustomNumberOption(num++, MultiMenu.neutral, "Mimic Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - MimicDurationOption = new CustomNumberOption(num++, MultiMenu.neutral, "Mimic Duration", 10f, 1f, 15f, 1f, CooldownFormat); - HackCooldownOption = new CustomNumberOption(num++, MultiMenu.neutral, "Hack Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); - HackDurationOption = new CustomNumberOption(num++, MultiMenu.neutral, "Hack Duration", 10f, 1f, 15f, 1f, CooldownFormat); + new CustomHeaderOption(num++, MultiMenu.neutral, "The Glitch", GlitchOn); + MimicCooldownOption = new CustomNumberOption(num++, MultiMenu.neutral, "Mimic Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, GlitchOn); + MimicDurationOption = new CustomNumberOption(num++, MultiMenu.neutral, "Mimic Duration", 10f, 1f, 15f, 1f, CooldownFormat, GlitchOn); + HackCooldownOption = new CustomNumberOption(num++, MultiMenu.neutral, "Hack Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, GlitchOn); + HackDurationOption = new CustomNumberOption(num++, MultiMenu.neutral, "Hack Duration", 10f, 1f, 15f, 1f, CooldownFormat, GlitchOn); GlitchKillCooldownOption = - new CustomNumberOption(num++, MultiMenu.neutral, "Glitch Kill Cooldown", 25f, 10f, 120f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Glitch Kill Cooldown", 25f, 10f, 120f, 2.5f, CooldownFormat, GlitchOn); GlitchHackDistanceOption = - new CustomStringOption(num++, MultiMenu.neutral, "Glitch Hack Distance", new[] { "Short", "Normal", "Long" }); + new CustomStringOption(num++, MultiMenu.neutral, "Glitch Hack Distance", new[] { "Short", "Normal", "Long" }, GlitchOn); GlitchVent = - new CustomToggleOption(num++, MultiMenu.neutral, "Glitch Can Vent", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Glitch Can Vent", false, GlitchOn); - Vampire = new CustomHeaderOption(num++, MultiMenu.neutral, "Vampire"); + Vampire = new CustomHeaderOption(num++, MultiMenu.neutral, "Vampire", VampireOn); BiteCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Vampire Bite Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Vampire Bite Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, VampireOn); VampImpVision = - new CustomToggleOption(num++, MultiMenu.neutral, "Vampires Have Impostor Vision", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Vampires Have Impostor Vision", false, VampireOn); VampVent = - new CustomToggleOption(num++, MultiMenu.neutral, "Vampires Can Vent", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Vampires Can Vent", false, VampireOn); NewVampCanAssassin = - new CustomToggleOption(num++, MultiMenu.neutral, "New Vampire Can Assassinate", false); + new CustomToggleOption(num++, MultiMenu.neutral, "New Vampire Can Assassinate", false, VampireOn); MaxVampiresPerGame = - new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Vampires Per Game", 2, 2, 5, 1); + new CustomNumberOption(num++, MultiMenu.neutral, "Maximum Vampires Per Game", 2, 2, 5, 1, dependsOn: VampireOn); CanBiteNeutralBenign = - new CustomToggleOption(num++, MultiMenu.neutral, "Can Convert Neutral Benign Roles", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Can Convert Neutral Benign Roles", false, VampireOn); CanBiteNeutralEvil = - new CustomToggleOption(num++, MultiMenu.neutral, "Can Convert Neutral Evil Roles", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Can Convert Neutral Evil Roles", false, VampireOn); - Werewolf = new CustomHeaderOption(num++, MultiMenu.neutral, "Werewolf"); + Werewolf = new CustomHeaderOption(num++, MultiMenu.neutral, "Werewolf", WerewolfOn); RampageCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Rampage Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Rampage Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, WerewolfOn); RampageDuration = - new CustomNumberOption(num++, MultiMenu.neutral, "Rampage Duration", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Rampage Duration", 25f, 10f, 60f, 2.5f, CooldownFormat, WerewolfOn); RampageKillCooldown = - new CustomNumberOption(num++, MultiMenu.neutral, "Rampage Kill Cooldown", 10f, 0.5f, 15f, 0.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.neutral, "Rampage Kill Cooldown", 10f, 0.5f, 15f, 0.5f, CooldownFormat, WerewolfOn); WerewolfVent = - new CustomToggleOption(num++, MultiMenu.neutral, "Werewolf Can Vent When Rampaged", false); + new CustomToggleOption(num++, MultiMenu.neutral, "Werewolf Can Vent When Rampaged", false, WerewolfOn); Escapist = - new CustomHeaderOption(num++, MultiMenu.imposter, "Escapist"); + new CustomHeaderOption(num++, MultiMenu.imposter, "Escapist", EscapistOn); EscapeCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Recall Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Recall Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, EscapistOn); EscapistVent = - new CustomToggleOption(num++, MultiMenu.imposter, "Escapist Can Vent", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Escapist Can Vent", false, EscapistOn); Grenadier = - new CustomHeaderOption(num++, MultiMenu.imposter, "Grenadier"); + new CustomHeaderOption(num++, MultiMenu.imposter, "Grenadier", GrenadierOn); GrenadeCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Flash Grenade Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Flash Grenade Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, GrenadierOn); GrenadeDuration = - new CustomNumberOption(num++, MultiMenu.imposter, "Flash Grenade Duration", 10f, 5f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Flash Grenade Duration", 10f, 5f, 15f, 1f, CooldownFormat, GrenadierOn); FlashRadius = - new CustomNumberOption(num++, MultiMenu.imposter, "Flash Radius", 1f, 0.25f, 5f, 0.25f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Flash Radius", 1f, 0.25f, 5f, 0.25f, MultiplierFormat, GrenadierOn); GrenadierIndicators = - new CustomToggleOption(num++, MultiMenu.imposter, "Indicate Flashed Crewmates", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Indicate Flashed Crewmates", false, GrenadierOn); GrenadierVent = - new CustomToggleOption(num++, MultiMenu.imposter, "Grenadier Can Vent", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Grenadier Can Vent", false, GrenadierOn); Morphling = - new CustomHeaderOption(num++, MultiMenu.imposter, "Morphling"); + new CustomHeaderOption(num++, MultiMenu.imposter, "Morphling", MorphlingOn); MorphlingCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Morphling Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Morphling Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, MorphlingOn); MorphlingDuration = - new CustomNumberOption(num++, MultiMenu.imposter, "Morphling Duration", 10f, 5f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Morphling Duration", 10f, 5f, 15f, 1f, CooldownFormat, MorphlingOn); MorphlingVent = - new CustomToggleOption(num++, MultiMenu.imposter, "Morphling Can Vent", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Morphling Can Vent", false, MorphlingOn); - Swooper = new CustomHeaderOption(num++, MultiMenu.imposter, "Swooper"); + Swooper = new CustomHeaderOption(num++, MultiMenu.imposter, "Swooper", SwooperOn); SwoopCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Swoop Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Swoop Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, SwooperOn); SwoopDuration = - new CustomNumberOption(num++, MultiMenu.imposter, "Swoop Duration", 10f, 5f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Swoop Duration", 10f, 5f, 15f, 1f, CooldownFormat, SwooperOn); SwooperVent = - new CustomToggleOption(num++, MultiMenu.imposter, "Swooper Can Vent", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Swooper Can Vent", false, SwooperOn); - Venerer = new CustomHeaderOption(num++, MultiMenu.imposter, "Venerer"); + Venerer = new CustomHeaderOption(num++, MultiMenu.imposter, "Venerer", VenererOn); AbilityCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Ability Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Ability Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, VenererOn); AbilityDuration = - new CustomNumberOption(num++, MultiMenu.imposter, "Ability Duration", 10f, 5f, 15f, 1f, CooldownFormat); - SprintSpeed = new CustomNumberOption(num++, MultiMenu.imposter, "Sprint Speed", 1.25f, 1.05f, 2.5f, 0.05f, MultiplierFormat); - FreezeSpeed = new CustomNumberOption(num++, MultiMenu.imposter, "Freeze Speed", 0.75f, 0.25f, 1f, 0.05f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Ability Duration", 10f, 5f, 15f, 1f, CooldownFormat, VenererOn); + SprintSpeed = new CustomNumberOption(num++, MultiMenu.imposter, "Sprint Speed", 1.25f, 1.05f, 2.5f, 0.05f, MultiplierFormat, VenererOn); + FreezeSpeed = new CustomNumberOption(num++, MultiMenu.imposter, "Freeze Speed", 0.75f, 0.25f, 1f, 0.05f, MultiplierFormat, VenererOn); Bomber = - new CustomHeaderOption(num++, MultiMenu.imposter, "Bomber"); + new CustomHeaderOption(num++, MultiMenu.imposter, "Bomber", BomberOn); DetonateDelay = - new CustomNumberOption(num++, MultiMenu.imposter, "Detonate Delay", 5f, 1f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Detonate Delay", 5f, 1f, 15f, 1f, CooldownFormat, BomberOn); MaxKillsInDetonation = - new CustomNumberOption(num++, MultiMenu.imposter, "Max Kills In Detonation", 5, 1, 15, 1); + new CustomNumberOption(num++, MultiMenu.imposter, "Max Kills In Detonation", 5, 1, 15, 1, dependsOn: BomberOn); DetonateRadius = - new CustomNumberOption(num++, MultiMenu.imposter, "Detonate Radius", 0.25f, 0.05f, 1f, 0.05f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Detonate Radius", 0.25f, 0.05f, 1f, 0.05f, MultiplierFormat, BomberOn); BomberVent = - new CustomToggleOption(num++, MultiMenu.imposter, "Bomber Can Vent", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Bomber Can Vent", false, BomberOn); - Traitor = new CustomHeaderOption(num++, MultiMenu.imposter, "Traitor"); - LatestSpawn = new CustomNumberOption(num++, MultiMenu.imposter, "Minimum People Alive When Traitor Can Spawn", 5, 3, 15, 1); + Traitor = new CustomHeaderOption(num++, MultiMenu.imposter, "Traitor", TraitorOn); + LatestSpawn = new CustomNumberOption(num++, MultiMenu.imposter, "Minimum People Alive When Traitor Can Spawn", 5, 3, 15, 1, dependsOn: TraitorOn); NeutralKillingStopsTraitor = - new CustomToggleOption(num++, MultiMenu.imposter, "Traitor Won't Spawn If Any Neutral Killing Is Alive", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Traitor Won't Spawn If Any Neutral Killing Is Alive", false, TraitorOn); - Warlock = new CustomHeaderOption(num++, MultiMenu.imposter, "Warlock"); + Warlock = new CustomHeaderOption(num++, MultiMenu.imposter, "Warlock", WarlockOn); ChargeUpDuration = - new CustomNumberOption(num++, MultiMenu.imposter, "Time It Takes To Fully Charge", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Time It Takes To Fully Charge", 25f, 10f, 60f, 2.5f, CooldownFormat, WarlockOn); ChargeUseDuration = - new CustomNumberOption(num++, MultiMenu.imposter, "Time It Takes To Use Full Charge", 1f, 0.05f, 5f, 0.05f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Time It Takes To Use Full Charge", 1f, 0.05f, 5f, 0.05f, CooldownFormat, WarlockOn); - Blackmailer = new CustomHeaderOption(num++, MultiMenu.imposter, "Blackmailer"); + Blackmailer = new CustomHeaderOption(num++, MultiMenu.imposter, "Blackmailer", BlackmailerOn); BlackmailCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Initial Blackmail Cooldown", 10f, 1f, 15f, 1f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Initial Blackmail Cooldown", 10f, 1f, 15f, 1f, CooldownFormat, BlackmailerOn); - Miner = new CustomHeaderOption(num++, MultiMenu.imposter, "Miner"); + Miner = new CustomHeaderOption(num++, MultiMenu.imposter, "Miner", MinerOn); MineCooldown = - new CustomNumberOption(num++, MultiMenu.imposter, "Mine Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Mine Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, MinerOn); - Undertaker = new CustomHeaderOption(num++, MultiMenu.imposter, "Undertaker"); - DragCooldown = new CustomNumberOption(num++, MultiMenu.imposter, "Drag Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat); + Undertaker = new CustomHeaderOption(num++, MultiMenu.imposter, "Undertaker", UndertakerOn); + DragCooldown = new CustomNumberOption(num++, MultiMenu.imposter, "Drag Cooldown", 25f, 10f, 60f, 2.5f, CooldownFormat, UndertakerOn); UndertakerDragSpeed = - new CustomNumberOption(num++, MultiMenu.imposter, "Undertaker Drag Speed", 0.75f, 0.25f, 1f, 0.05f, MultiplierFormat); + new CustomNumberOption(num++, MultiMenu.imposter, "Undertaker Drag Speed", 0.75f, 0.25f, 1f, 0.05f, MultiplierFormat, UndertakerOn); UndertakerVent = - new CustomToggleOption(num++, MultiMenu.imposter, "Undertaker Can Vent", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Undertaker Can Vent", false, UndertakerOn); UndertakerVentWithBody = - new CustomToggleOption(num++, MultiMenu.imposter, "Undertaker Can Vent While Dragging", false); + new CustomToggleOption(num++, MultiMenu.imposter, "Undertaker Can Vent While Dragging", false, UndertakerOn); - Bait = new CustomHeaderOption(num++, MultiMenu.modifiers, "Bait"); - BaitMinDelay = new CustomNumberOption(num++, MultiMenu.modifiers, "Minimum Delay for the Bait Report", 0f, 0f, 15f, 0.5f, CooldownFormat); - BaitMaxDelay = new CustomNumberOption(num++, MultiMenu.modifiers, "Maximum Delay for the Bait Report", 1f, 0f, 15f, 0.5f, CooldownFormat); + Bait = new CustomHeaderOption(num++, MultiMenu.modifiers, "Bait", BaitOn); + BaitMinDelay = new CustomNumberOption(num++, MultiMenu.modifiers, "Minimum Delay for the Bait Report", 0f, 0f, 15f, 0.5f, CooldownFormat, BaitOn); + BaitMaxDelay = new CustomNumberOption(num++, MultiMenu.modifiers, "Maximum Delay for the Bait Report", 1f, 0f, 15f, 0.5f, CooldownFormat, BaitOn); - Diseased = new CustomHeaderOption(num++, MultiMenu.modifiers, "Diseased"); - DiseasedKillMultiplier = new CustomNumberOption(num++, MultiMenu.modifiers, "Diseased Kill Multiplier", 3f, 1.5f, 5f, 0.5f, MultiplierFormat); + Diseased = new CustomHeaderOption(num++, MultiMenu.modifiers, "Diseased", DiseasedOn); + DiseasedKillMultiplier = new CustomNumberOption(num++, MultiMenu.modifiers, "Diseased Kill Multiplier", 3f, 1.5f, 5f, 0.5f, MultiplierFormat, DiseasedOn); - Frosty = new CustomHeaderOption(num++, MultiMenu.modifiers, "Frosty"); - ChillDuration = new CustomNumberOption(num++, MultiMenu.modifiers, "Chill Duration", 10f, 1f, 15f, 1f, CooldownFormat); - ChillStartSpeed = new CustomNumberOption(num++, MultiMenu.modifiers, "Chill Start Speed", 0.75f, 0.25f, 0.95f, 0.05f, MultiplierFormat); + Frosty = new CustomHeaderOption(num++, MultiMenu.modifiers, "Frosty", FrostyOn); + ChillDuration = new CustomNumberOption(num++, MultiMenu.modifiers, "Chill Duration", 10f, 1f, 15f, 1f, CooldownFormat, FrostyOn); + ChillStartSpeed = new CustomNumberOption(num++, MultiMenu.modifiers, "Chill Start Speed", 0.75f, 0.25f, 0.95f, 0.05f, MultiplierFormat, FrostyOn); - Flash = new CustomHeaderOption(num++, MultiMenu.modifiers, "Flash"); - FlashSpeed = new CustomNumberOption(num++, MultiMenu.modifiers, "Flash Speed", 1.25f, 1.05f, 2.5f, 0.05f, MultiplierFormat); + Flash = new CustomHeaderOption(num++, MultiMenu.modifiers, "Flash", FlashOn); + FlashSpeed = new CustomNumberOption(num++, MultiMenu.modifiers, "Flash Speed", 1.25f, 1.05f, 2.5f, 0.05f, MultiplierFormat, FlashOn); - Giant = new CustomHeaderOption(num++, MultiMenu.modifiers, "Giant"); - GiantSlow = new CustomNumberOption(num++, MultiMenu.modifiers, "Giant Speed", 0.75f, 0.25f, 1f, 0.05f, MultiplierFormat); + Giant = new CustomHeaderOption(num++, MultiMenu.modifiers, "Giant", GiantOn); + GiantSlow = new CustomNumberOption(num++, MultiMenu.modifiers, "Giant Speed", 0.75f, 0.25f, 1f, 0.05f, MultiplierFormat, GiantOn); Lovers = - new CustomHeaderOption(num++, MultiMenu.modifiers, "Lovers"); + new CustomHeaderOption(num++, MultiMenu.modifiers, "Lovers", LoversOn); BothLoversDie = new CustomToggleOption(num++, MultiMenu.modifiers, "Both Lovers Die"); LovingImpPercent = new CustomNumberOption(num++, MultiMenu.modifiers, "Loving Impostor Probability", 20f, 0f, 100f, 10f, - PercentFormat); - NeutralLovers = new CustomToggleOption(num++, MultiMenu.modifiers, "Neutral Roles Can Be Lovers"); + PercentFormat, LoversOn); + NeutralLovers = new CustomToggleOption(num++, MultiMenu.modifiers, "Neutral Roles Can Be Lovers", dependsOn: LoversOn); - Underdog = new CustomHeaderOption(num++, MultiMenu.modifiers, "Underdog"); - UnderdogKillBonus = new CustomNumberOption(num++, MultiMenu.modifiers, "Kill Cooldown Bonus", 5f, 2.5f, 10f, 2.5f, CooldownFormat); - UnderdogIncreasedKC = new CustomToggleOption(num++, MultiMenu.modifiers, "Increased Kill Cooldown When 2+ Imps", true); + Underdog = new CustomHeaderOption(num++, MultiMenu.modifiers, "Underdog", UnderdogOn); + UnderdogKillBonus = new CustomNumberOption(num++, MultiMenu.modifiers, "Kill Cooldown Bonus", 5f, 2.5f, 10f, 2.5f, CooldownFormat, UnderdogOn); + UnderdogIncreasedKC = new CustomToggleOption(num++, MultiMenu.modifiers, "Increased Kill Cooldown When 2+ Imps", true, UnderdogOn); } } } \ No newline at end of file diff --git a/source/Patches/CustomOption/Header.cs b/source/Patches/CustomOption/Header.cs index 220226a8b..0d33d7211 100644 --- a/source/Patches/CustomOption/Header.cs +++ b/source/Patches/CustomOption/Header.cs @@ -2,7 +2,7 @@ namespace TownOfUs.CustomOption { public class CustomHeaderOption : CustomOption { - protected internal CustomHeaderOption(int id, MultiMenu menu, string name) : base(id, menu, name, CustomOptionType.Header, 0) + protected internal CustomHeaderOption(int id, MultiMenu menu, string name, CustomOption dependsOn = null, int? stringoptionneedstobe = null) : base(id, menu, name, CustomOptionType.Header, 0, dependsOn: dependsOn, stringoptionneedstobe: stringoptionneedstobe) { } diff --git a/source/Patches/CustomOption/Number.cs b/source/Patches/CustomOption/Number.cs index a8d19cdb3..259397bbb 100644 --- a/source/Patches/CustomOption/Number.cs +++ b/source/Patches/CustomOption/Number.cs @@ -6,7 +6,7 @@ namespace TownOfUs.CustomOption public class CustomNumberOption : CustomOption { protected internal CustomNumberOption(int id, MultiMenu menu, string name, float value, float min, float max, float increment, - Func format = null) : base(id, menu, name, CustomOptionType.Number, value, format) + Func format = null, CustomOption dependsOn = null, int? stringoptionneedstobe = null) : base(id, menu, name, CustomOptionType.Number, value, format, dependsOn, stringoptionneedstobe) { Min = min; Max = max; diff --git a/source/Patches/CustomOption/Patches.cs b/source/Patches/CustomOption/Patches.cs index bdacbd901..97b76c272 100644 --- a/source/Patches/CustomOption/Patches.cs +++ b/source/Patches/CustomOption/Patches.cs @@ -475,18 +475,6 @@ public static bool Prefix(StringOption __instance) } } - [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.RpcSyncSettings))] - private class PlayerControlPatch - { - public static void Postfix() - { - if (PlayerControl.AllPlayerControls.Count < 2 || !AmongUsClient.Instance || - !PlayerControl.LocalPlayer || !AmongUsClient.Instance.AmHost) return; - - Rpc.SendRpc(); - } - } - [HarmonyPatch(typeof(PlayerPhysics), nameof(PlayerPhysics.CoSpawnPlayer))] private class PlayerJoinPatch { diff --git a/source/Patches/CustomOption/String.cs b/source/Patches/CustomOption/String.cs index a8225651c..b77cae4fe 100644 --- a/source/Patches/CustomOption/String.cs +++ b/source/Patches/CustomOption/String.cs @@ -2,9 +2,8 @@ namespace TownOfUs.CustomOption { public class CustomStringOption : CustomOption { - protected internal CustomStringOption(int id, MultiMenu menu, string name, string[] values) : base(id, menu, name, - CustomOptionType.String, - 0) + protected internal CustomStringOption(int id, MultiMenu menu, string name, string[] values, CustomOption dependsOn = null, int? stringoptionneedstobe = null) : base(id, menu, name, + CustomOptionType.String, 0, dependsOn: dependsOn, stringoptionneedstobe: stringoptionneedstobe) { Values = values; Format = value => Values[(int) value]; diff --git a/source/Patches/CustomOption/Toggle.cs b/source/Patches/CustomOption/Toggle.cs index 6c80168c5..fc147cac3 100644 --- a/source/Patches/CustomOption/Toggle.cs +++ b/source/Patches/CustomOption/Toggle.cs @@ -2,9 +2,8 @@ namespace TownOfUs.CustomOption { public class CustomToggleOption : CustomOption { - protected internal CustomToggleOption(int id, MultiMenu menu, string name, bool value = true) : base(id, menu, name, - CustomOptionType.Toggle, - value) + protected internal CustomToggleOption(int id, MultiMenu menu, string name, bool value = true, CustomOption dependsOn = null, int? stringoptionneedstobe = null) : base(id, menu, name, + CustomOptionType.Toggle, value, dependsOn: dependsOn, stringoptionneedstobe: stringoptionneedstobe) { Format = val => (bool) val ? "On" : "Off"; } diff --git a/source/Patches/GameSettings.cs b/source/Patches/GameSettings.cs index fd59f4836..254e19251 100644 --- a/source/Patches/GameSettings.cs +++ b/source/Patches/GameSettings.cs @@ -45,10 +45,14 @@ private static void Postfix(ref string __result) if (option.Type == CustomOptionType.Button) continue; - if (option.Type == CustomOptionType.Header) + if (option.Type == CustomOptionType.Header && option.ShouldShow()) + { builder.AppendLine($"\n{option.Name}"); - else + } + else if (option.ShouldShow()) + { builder.AppendLine($" {option.Name}: {option}"); + } } }