diff --git a/TrollMod17/Buttons/BardTuneButton.cs b/TrollMod17/Buttons/BardTuneButton.cs new file mode 100644 index 0000000..edfae28 --- /dev/null +++ b/TrollMod17/Buttons/BardTuneButton.cs @@ -0,0 +1,44 @@ +using MiraAPI.Hud; +using MiraAPI.Utilities.Assets; +using UnityEngine; +using TrollMod17.Networking; +using MiraAPI.GameOptions; +using TrollMod17.Options; + +namespace TrollMod17.Buttons; + +public class BardTuneButton : CustomActionButton +{ + public override string Name => "Tune"; + public override float Cooldown => 25f; + public override float EffectDuration => 6f; + public override LoadableAsset Sprite => MiraAssets.RoundedBox; + public override int MaxUses + { + get + { + var inst = OptionGroupSingleton.Instance; + var value = inst != null ? inst.BardMaxUses : global::TrollMod17.Options.MaxUses.One; + return (int)value; + } + } + public override float InitialCooldown => 10f; + public override ButtonLocation Location => ButtonLocation.BottomLeft; + private const float Radius = 3.5f; + + public override bool Enabled(RoleBehaviour? role) + { + return role is TrollMod17.Roles.BardRole; + } + + protected override void OnClick() + { + var center = PlayerControl.LocalPlayer.GetTruePosition(); + AbilityRpcs.BardStartTune(PlayerControl.LocalPlayer, center, Radius, EffectDuration); + } + + public override void OnEffectEnd() + { + AbilityRpcs.BardEndTune(PlayerControl.LocalPlayer); + } +} diff --git a/TrollMod17/Buttons/GuardianShieldButton.cs b/TrollMod17/Buttons/GuardianShieldButton.cs index 344284c..3c12b6e 100644 --- a/TrollMod17/Buttons/GuardianShieldButton.cs +++ b/TrollMod17/Buttons/GuardianShieldButton.cs @@ -4,6 +4,8 @@ using TrollMod17.Networking; using Il2CppSystem; using TrollMod17.Settings; +using MiraAPI.GameOptions; +using TrollMod17.Options; namespace TrollMod17.Buttons; @@ -13,7 +15,15 @@ public class GuardianShieldButton : CustomActionButton public override float Cooldown => 25f; public override float EffectDuration => 6f; public override LoadableAsset Sprite => MiraAssets.RefreshIcon; - public override int MaxUses => 1; + public override int MaxUses + { + get + { + var inst = OptionGroupSingleton.Instance; + var value = inst != null ? inst.GuardianMaxUses : global::TrollMod17.Options.MaxUses.One; + return (int)value; // Infinite maps to 0 + } + } public override float Distance => 2.5f; public override ButtonLocation Location => TMLocalSettings.ButtonsPosition == ButtonPos.Left ? ButtonLocation.BottomLeft : ButtonLocation.BottomRight; @@ -58,14 +68,12 @@ public override void SetOutline(bool active) protected override void OnClick() { if (Target == null) return; - if (!AmongUsClient.Instance.AmHost) return; _lastShieldedId = Target.PlayerId; AbilityRpcs.GuardianStartShield(PlayerControl.LocalPlayer, Target.PlayerId, EffectDuration); } public override void OnEffectEnd() { - if (!AmongUsClient.Instance.AmHost) { ResetTarget(); return; } if (_lastShieldedId != 0) { AbilityRpcs.GuardianEndShield(PlayerControl.LocalPlayer, _lastShieldedId); diff --git a/TrollMod17/Buttons/IllusionistGlimmerButton.cs b/TrollMod17/Buttons/IllusionistGlimmerButton.cs new file mode 100644 index 0000000..826b9be --- /dev/null +++ b/TrollMod17/Buttons/IllusionistGlimmerButton.cs @@ -0,0 +1,44 @@ +using MiraAPI.Hud; +using MiraAPI.Utilities.Assets; +using UnityEngine; +using TrollMod17.Networking; +using MiraAPI.GameOptions; +using TrollMod17.Options; + +namespace TrollMod17.Buttons; + +public class IllusionistGlimmerButton : CustomActionButton +{ + public override string Name => "Glimmer"; + public override float Cooldown => 25f; + public override float EffectDuration => 6f; + public override LoadableAsset Sprite => MiraAssets.RoundedBox; + public override int MaxUses + { + get + { + var inst = OptionGroupSingleton.Instance; + var value = inst != null ? inst.IllusionistMaxUses : global::TrollMod17.Options.MaxUses.One; + return (int)value; + } + } + public override float InitialCooldown => 10f; + public override ButtonLocation Location => ButtonLocation.BottomRight; + private const float Radius = 3.5f; + + public override bool Enabled(RoleBehaviour? role) + { + return role is TrollMod17.Roles.IllusionistRole; + } + + protected override void OnClick() + { + var center = PlayerControl.LocalPlayer.GetTruePosition(); + AbilityRpcs.IllusionistStartGlimmer(PlayerControl.LocalPlayer, center, Radius, EffectDuration); + } + + public override void OnEffectEnd() + { + AbilityRpcs.IllusionistEndGlimmer(PlayerControl.LocalPlayer); + } +} diff --git a/TrollMod17/Buttons/ShadowCloakButton.cs b/TrollMod17/Buttons/ShadowCloakButton.cs index 6acfcac..ba4eab1 100644 --- a/TrollMod17/Buttons/ShadowCloakButton.cs +++ b/TrollMod17/Buttons/ShadowCloakButton.cs @@ -4,6 +4,8 @@ using TrollMod17.Networking; using Il2CppSystem; using TrollMod17.Settings; +using MiraAPI.GameOptions; +using TrollMod17.Options; namespace TrollMod17.Buttons; @@ -13,7 +15,15 @@ public class ShadowCloakButton : CustomActionButton public override float Cooldown => 25f; public override float EffectDuration => 6f; public override LoadableAsset Sprite => MiraAssets.RefreshIcon; - public override int MaxUses => 1; + public override int MaxUses + { + get + { + var inst = OptionGroupSingleton.Instance; + var value = inst != null ? inst.ShadowMaxUses : global::TrollMod17.Options.MaxUses.One; + return (int)value; // Infinite maps to 0 + } + } public override float Distance => 2.6f; public override ButtonLocation Location => TMLocalSettings.ButtonsPosition == ButtonPos.Left ? ButtonLocation.BottomLeft : ButtonLocation.BottomRight; @@ -54,7 +64,6 @@ public override void SetOutline(bool active) protected override void OnClick() { - if (!AmongUsClient.Instance.AmHost) return; var me = PlayerControl.LocalPlayer; if (Target) { @@ -65,7 +74,6 @@ protected override void OnClick() public override void OnEffectEnd() { - if (!AmongUsClient.Instance.AmHost) return; var me = PlayerControl.LocalPlayer; AbilityRpcs.ShadowEndCloak(me, me.PlayerId); } diff --git a/TrollMod17/Buttons/TricksterSmokeButton.cs b/TrollMod17/Buttons/TricksterSmokeButton.cs index 5334e86..b0a5baa 100644 --- a/TrollMod17/Buttons/TricksterSmokeButton.cs +++ b/TrollMod17/Buttons/TricksterSmokeButton.cs @@ -3,6 +3,8 @@ using UnityEngine; using TrollMod17.Networking; using TrollMod17.Settings; +using MiraAPI.GameOptions; +using TrollMod17.Options; namespace TrollMod17.Buttons; @@ -12,7 +14,15 @@ public class TricksterSmokeButton : CustomActionButton public override float Cooldown => 25f; public override float EffectDuration => 6f; public override LoadableAsset Sprite => MiraAssets.RefreshIcon; - public override int MaxUses => 1; + public override int MaxUses + { + get + { + var inst = OptionGroupSingleton.Instance; + var value = inst != null ? inst.TricksterMaxUses : global::TrollMod17.Options.MaxUses.One; + return (int)value; // Infinite maps to 0 + } + } public override float InitialCooldown => 10f; public override ButtonLocation Location => TMLocalSettings.ButtonsPosition == ButtonPos.Left ? ButtonLocation.BottomLeft : ButtonLocation.BottomRight; @@ -25,14 +35,12 @@ public override bool Enabled(RoleBehaviour? role) protected override void OnClick() { - if (!AmongUsClient.Instance.AmHost) return; var center = PlayerControl.LocalPlayer.GetTruePosition(); AbilityRpcs.TricksterStartSmoke(PlayerControl.LocalPlayer, center, SmokeRadius, EffectDuration); } public override void OnEffectEnd() { - if (!AmongUsClient.Instance.AmHost) return; AbilityRpcs.TricksterEndSmoke(PlayerControl.LocalPlayer); } } diff --git a/TrollMod17/Cosmetics/AbilityCosmetics.cs b/TrollMod17/Cosmetics/AbilityCosmetics.cs index 69ab73d..2f62fca 100644 --- a/TrollMod17/Cosmetics/AbilityCosmetics.cs +++ b/TrollMod17/Cosmetics/AbilityCosmetics.cs @@ -8,21 +8,23 @@ namespace TrollMod17.Cosmetics; public static class AbilityCosmetics { - // Among Us native cosmetics-backed state private static readonly Dictionary _savedPhantomAlpha = new(); private static readonly HashSet _shielded = new(); private static readonly HashSet _smoked = new(); + private static readonly Dictionary _originalColors = new(); + private static readonly HashSet _tuned = new(); + private static readonly HashSet _glimmered = new(); + private static readonly Dictionary _glimmerAlpha = new(); public static void ApplyShadowCloak(PlayerControl p, float alphaFactor) { if (!p || p.cosmetics == null) return; - // Save current phantom alpha, then set reduced alpha try { var current = p.cosmetics.GetPhantomRoleAlpha(); _savedPhantomAlpha[p] = current; } - catch { /* ignore */ } + catch { } p.cosmetics.SetPhantomRoleAlpha(Mathf.Clamp01(alphaFactor)); } @@ -36,7 +38,6 @@ public static void RemoveShadowCloak(PlayerControl p) } else { - // fallback reset p.cosmetics.SetPhantomRoleAlpha(1f); } } @@ -60,24 +61,43 @@ public static void RemoveShieldTint(PlayerControl p) public static void ApplySmokeDarkenInRadius(Vector2 center, float radius) { + ClearSmokeDarken(); + foreach (var pc in PlayerControl.AllPlayerControls) { if (!pc || pc.cosmetics == null) continue; var d = Vector2.Distance(center, pc.GetTruePosition()); if (d > radius) continue; - pc.cosmetics.FadeBlackCosmetics(0.6f); - _smoked.Add(pc); + + if (pc.cosmetics.currentBodySprite != null && pc.cosmetics.currentBodySprite.BodySprite != null) + { + var sprite = pc.cosmetics.currentBodySprite.BodySprite; + _originalColors[pc] = sprite.color; + + var darkenedColor = new Color(0.1f, 0.1f, 0.1f, sprite.color.a); + sprite.color = darkenedColor; + + _smoked.Add(pc); + } } } public static void ClearSmokeDarken() { - foreach (var p in _smoked) + foreach (var pc in _smoked) { - if (!p || p.cosmetics == null) continue; - p.cosmetics.FadeBlackCosmetics(0f); + if (!pc || pc.cosmetics == null) continue; + + if (_originalColors.TryGetValue(pc, out var originalColor) && + pc.cosmetics.currentBodySprite != null && + pc.cosmetics.currentBodySprite.BodySprite != null) + { + pc.cosmetics.currentBodySprite.BodySprite.color = originalColor; + } } + _smoked.Clear(); + _originalColors.Clear(); } public static void SpawnPulseRing(Vector2 center, Color color, float duration) @@ -109,4 +129,62 @@ private static IEnumerator SpawnPulseRingCo(Vector2 center, Color color, float d if (go) UnityEngine.Object.Destroy(go); } + + public static void ApplyTuneGlow(Vector2 center, float radius) + { + foreach (var pc in PlayerControl.AllPlayerControls) + { + if (!pc || pc.cosmetics == null) continue; + var d = Vector2.Distance(center, pc.GetTruePosition()); + if (d > radius) continue; + pc.cosmetics.SetOutline(true, new Nullable(new Color(1f, 0.9f, 0.2f, 1f))); + _tuned.Add(pc); + } + } + + public static void ClearTuneGlow() + { + foreach (var pc in _tuned) + { + if (!pc || pc.cosmetics == null) continue; + pc.cosmetics.SetOutline(false, new Nullable()); + } + _tuned.Clear(); + } + + public static void ApplyGlimmerInRadius(Vector2 center, float radius) + { + foreach (var pc in PlayerControl.AllPlayerControls) + { + if (!pc || pc.cosmetics == null) continue; + var d = Vector2.Distance(center, pc.GetTruePosition()); + if (d > radius) continue; + if (!_glimmerAlpha.ContainsKey(pc)) + { + float a = 1f; + try { a = pc.cosmetics.GetPhantomRoleAlpha(); } catch { } + _glimmerAlpha[pc] = a; + } + pc.cosmetics.SetPhantomRoleAlpha(0.5f); + _glimmered.Add(pc); + } + } + + public static void ClearGlimmer() + { + foreach (var pc in _glimmered) + { + if (!pc || pc.cosmetics == null) continue; + if (_glimmerAlpha.TryGetValue(pc, out var a)) + { + pc.cosmetics.SetPhantomRoleAlpha(a); + } + else + { + pc.cosmetics.SetPhantomRoleAlpha(1f); + } + } + _glimmered.Clear(); + _glimmerAlpha.Clear(); + } } diff --git a/TrollMod17/Networking/AbilityRpcs.cs b/TrollMod17/Networking/AbilityRpcs.cs index 327a283..f4802b3 100644 --- a/TrollMod17/Networking/AbilityRpcs.cs +++ b/TrollMod17/Networking/AbilityRpcs.cs @@ -10,7 +10,7 @@ namespace TrollMod17.Networking; public static class AbilityRpcs { - [MethodRpc((uint)TrollRpcCalls.ShadowStartCloak, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.ShadowStartCloak, LocalHandling = RpcLocalHandling.Before)] public static void ShadowStartCloak(PlayerControl sender, byte playerId, float duration) { var p = GetPlayer(playerId); @@ -20,7 +20,7 @@ public static void ShadowStartCloak(PlayerControl sender, byte playerId, float d AbilityCosmetics.SpawnPulseRing(p.GetTruePosition(), new Color(0.4f, 0.1f, 0.7f, 0.9f), 0.35f); } - [MethodRpc((uint)TrollRpcCalls.GuardianStartShield, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.GuardianStartShield, LocalHandling = RpcLocalHandling.Before)] public static void GuardianStartShield(PlayerControl sender, byte targetId, float duration) { var t = GetPlayer(targetId); @@ -30,7 +30,7 @@ public static void GuardianStartShield(PlayerControl sender, byte targetId, floa AbilityCosmetics.SpawnPulseRing(t.GetTruePosition(), new Color(0.2f, 1f, 0.7f, 0.9f), 0.4f); } - [MethodRpc((uint)TrollRpcCalls.TricksterStartSmoke, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.TricksterStartSmoke, LocalHandling = RpcLocalHandling.Before)] public static void TricksterStartSmoke(PlayerControl sender, Vector2 center, float radius, float duration) { AbilityCosmetics.ApplySmokeDarkenInRadius(center, radius); @@ -38,7 +38,7 @@ public static void TricksterStartSmoke(PlayerControl sender, Vector2 center, flo AbilityCosmetics.SpawnPulseRing(center, new Color(0f, 0f, 0f, 0.85f), 0.35f); } - [MethodRpc((uint)TrollRpcCalls.ShadowStartBlinkBehind, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.ShadowStartBlinkBehind, LocalHandling = RpcLocalHandling.Before)] public static void ShadowStartBlinkBehind(PlayerControl sender, byte attackerId, byte targetId) { var a = GetPlayer(attackerId); @@ -75,7 +75,7 @@ private static IEnumerator RemoveAfter(System.Action action, float seconds) } // Explicit END RPCs to guarantee cleanup across clients - [MethodRpc((uint)TrollRpcCalls.ShadowEndCloak, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.ShadowEndCloak, LocalHandling = RpcLocalHandling.Before)] public static void ShadowEndCloak(PlayerControl sender, byte playerId) { var p = GetPlayer(playerId); @@ -83,7 +83,7 @@ public static void ShadowEndCloak(PlayerControl sender, byte playerId) AbilityCosmetics.RemoveShadowCloak(p); } - [MethodRpc((uint)TrollRpcCalls.GuardianEndShield, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.GuardianEndShield, LocalHandling = RpcLocalHandling.Before)] public static void GuardianEndShield(PlayerControl sender, byte targetId) { var t = GetPlayer(targetId); @@ -91,9 +91,35 @@ public static void GuardianEndShield(PlayerControl sender, byte targetId) AbilityCosmetics.RemoveShieldTint(t); } - [MethodRpc((uint)TrollRpcCalls.TricksterEndSmoke, LocalHandling = RpcLocalHandling.None)] + [MethodRpc((uint)TrollRpcCalls.TricksterEndSmoke, LocalHandling = RpcLocalHandling.Before)] public static void TricksterEndSmoke(PlayerControl sender) { AbilityCosmetics.ClearSmokeDarken(); } + + [MethodRpc((uint)TrollRpcCalls.BardStartTune, LocalHandling = RpcLocalHandling.Before)] + public static void BardStartTune(PlayerControl sender, Vector2 center, float radius, float duration) + { + AbilityCosmetics.ApplyTuneGlow(center, radius); + Coroutines.Start(RemoveAfter(AbilityCosmetics.ClearTuneGlow, duration)); + } + + [MethodRpc((uint)TrollRpcCalls.BardEndTune, LocalHandling = RpcLocalHandling.Before)] + public static void BardEndTune(PlayerControl sender) + { + AbilityCosmetics.ClearTuneGlow(); + } + + [MethodRpc((uint)TrollRpcCalls.IllusionistStartGlimmer, LocalHandling = RpcLocalHandling.Before)] + public static void IllusionistStartGlimmer(PlayerControl sender, Vector2 center, float radius, float duration) + { + AbilityCosmetics.ApplyGlimmerInRadius(center, radius); + Coroutines.Start(RemoveAfter(AbilityCosmetics.ClearGlimmer, duration)); + } + + [MethodRpc((uint)TrollRpcCalls.IllusionistEndGlimmer, LocalHandling = RpcLocalHandling.Before)] + public static void IllusionistEndGlimmer(PlayerControl sender) + { + AbilityCosmetics.ClearGlimmer(); + } } diff --git a/TrollMod17/Networking/TrollRpcCalls.cs b/TrollMod17/Networking/TrollRpcCalls.cs index 9cfc041..ddc4492 100644 --- a/TrollMod17/Networking/TrollRpcCalls.cs +++ b/TrollMod17/Networking/TrollRpcCalls.cs @@ -9,4 +9,8 @@ public enum TrollRpcCalls : uint ShadowEndCloak = 4111, GuardianEndShield = 4112, TricksterEndSmoke = 4113, + BardStartTune = 4121, + BardEndTune = 4122, + IllusionistStartGlimmer = 4123, + IllusionistEndGlimmer = 4124, } diff --git a/TrollMod17/Options/BardOptions.cs b/TrollMod17/Options/BardOptions.cs new file mode 100644 index 0000000..432f48c --- /dev/null +++ b/TrollMod17/Options/BardOptions.cs @@ -0,0 +1,15 @@ +using MiraAPI.GameOptions; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.Utilities; +using UnityEngine; + +namespace TrollMod17.Options; + +public class BardOptions : AbstractOptionGroup +{ + public override string GroupName => "Bard Options"; + public override Color GroupColor => new Color32(255, 210, 70, 255); + + [ModdedEnumOption("Bard Max Uses", typeof(MaxUses), new[] { "1", "2", "3", "4", "5", "Infinite" })] + public MaxUses BardMaxUses { get; set; } = MaxUses.One; +} diff --git a/TrollMod17/Options/CommonEnums.cs b/TrollMod17/Options/CommonEnums.cs new file mode 100644 index 0000000..cf32485 --- /dev/null +++ b/TrollMod17/Options/CommonEnums.cs @@ -0,0 +1,11 @@ +namespace TrollMod17.Options; + +public enum MaxUses +{ + One = 1, + Two = 2, + Three = 3, + Four = 4, + Five = 5, + Infinite = 0, +} diff --git a/TrollMod17/Options/GuardianOptions.cs b/TrollMod17/Options/GuardianOptions.cs index 731314f..c9acd44 100644 --- a/TrollMod17/Options/GuardianOptions.cs +++ b/TrollMod17/Options/GuardianOptions.cs @@ -10,9 +10,6 @@ public class GuardianOptions : AbstractOptionGroup "Guardian Options"; public override Color GroupColor => new Color32(30, 200, 140, 255); - [ModdedNumberOption("Guardian Count", min: 0, max: 2, increment: 1f, formatString: "0")] - public float GuardianCount { get; set; } = 1f; - - [ModdedNumberOption("Guardian Spawn Chance", min: 0, max: 100, increment: 5f, formatString: "0", suffixType: MiraNumberSuffixes.Percent)] - public float GuardianSpawnChance { get; set; } = 35f; + [ModdedEnumOption("Guardian Max Uses", typeof(MaxUses), new[] { "1", "2", "3", "4", "5", "Infinite" })] + public MaxUses GuardianMaxUses { get; set; } = MaxUses.One; } diff --git a/TrollMod17/Options/IllusionistOptions.cs b/TrollMod17/Options/IllusionistOptions.cs new file mode 100644 index 0000000..ff51731 --- /dev/null +++ b/TrollMod17/Options/IllusionistOptions.cs @@ -0,0 +1,15 @@ +using MiraAPI.GameOptions; +using MiraAPI.GameOptions.Attributes; +using MiraAPI.Utilities; +using UnityEngine; + +namespace TrollMod17.Options; + +public class IllusionistOptions : AbstractOptionGroup +{ + public override string GroupName => "Illusionist Options"; + public override Color GroupColor => new Color32(140, 200, 255, 255); + + [ModdedEnumOption("Illusionist Max Uses", typeof(MaxUses), new[] { "1", "2", "3", "4", "5", "Infinite" })] + public MaxUses IllusionistMaxUses { get; set; } = MaxUses.One; +} diff --git a/TrollMod17/Options/ShadowOptions.cs b/TrollMod17/Options/ShadowOptions.cs index 7ededb3..29a02ad 100644 --- a/TrollMod17/Options/ShadowOptions.cs +++ b/TrollMod17/Options/ShadowOptions.cs @@ -10,9 +10,6 @@ public class ShadowOptions : AbstractOptionGroup public override string GroupName => "Shadow Options"; public override Color GroupColor => new Color32(120, 50, 200, 255); - [ModdedNumberOption("Shadow Count", min: 0, max: 2, increment: 1f, formatString: "0")] - public float ShadowCount { get; set; } = 1f; - - [ModdedNumberOption("Shadow Spawn Chance", min: 0, max: 100, increment: 5f, formatString: "0", suffixType: MiraNumberSuffixes.Percent)] - public float ShadowSpawnChance { get; set; } = 40f; + [ModdedEnumOption("Shadow Max Uses", typeof(MaxUses), new[] { "1", "2", "3", "4", "5", "Infinite" })] + public MaxUses ShadowMaxUses { get; set; } = MaxUses.One; } diff --git a/TrollMod17/Options/TricksterOptions.cs b/TrollMod17/Options/TricksterOptions.cs index bdf42c0..965019a 100644 --- a/TrollMod17/Options/TricksterOptions.cs +++ b/TrollMod17/Options/TricksterOptions.cs @@ -10,9 +10,6 @@ public class TricksterOptions : AbstractOptionGroup "Trickster Options"; public override Color GroupColor => new Color32(255, 160, 30, 255); - [ModdedNumberOption("Trickster Count", min: 0, max: 2, increment: 1f, formatString: "0")] - public float TricksterCount { get; set; } = 1f; - - [ModdedNumberOption("Trickster Spawn Chance", min: 0, max: 100, increment: 5f, formatString: "0", suffixType: MiraNumberSuffixes.Percent)] - public float TricksterSpawnChance { get; set; } = 30f; + [ModdedEnumOption("Trickster Max Uses", typeof(MaxUses), new[] { "1", "2", "3", "4", "5", "Infinite" })] + public MaxUses TricksterMaxUses { get; set; } = MaxUses.One; } diff --git a/TrollMod17/Roles/BardRole.cs b/TrollMod17/Roles/BardRole.cs new file mode 100644 index 0000000..e04c692 --- /dev/null +++ b/TrollMod17/Roles/BardRole.cs @@ -0,0 +1,22 @@ +using MiraAPI.Roles; +using UnityEngine; + +namespace TrollMod17.Roles; + +public class BardRole : CrewmateRole, ICustomRole +{ + public string RoleName => "Bard"; + public string RoleLongDescription => "Plays a tune that blesses nearby crewmates."; + public string RoleDescription => RoleLongDescription; + public Color RoleColor => new Color32(255, 210, 70, 255); + public ModdedRoleTeams Team => ModdedRoleTeams.Crewmate; + + public CustomRoleConfiguration Configuration => new(this) + { + CanUseSabotage = false, + MaxRoleCount = 2, + UseVanillaKillButton = false, + CanUseVent = false, + TasksCountForProgress = true, + }; +} diff --git a/TrollMod17/Roles/GuardianRole.cs b/TrollMod17/Roles/GuardianRole.cs index 53da727..a926370 100644 --- a/TrollMod17/Roles/GuardianRole.cs +++ b/TrollMod17/Roles/GuardianRole.cs @@ -22,22 +22,4 @@ public class GuardianRole : CrewmateRole, ICustomRole CanUseVent = false, TasksCountForProgress = true, }; - - [HideFromIl2Cpp] - public int? GetCount() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.GuardianCount : 1f; - var count = Mathf.Clamp(Mathf.RoundToInt(value), 0, Configuration.MaxRoleCount); - return count; - } - - [HideFromIl2Cpp] - public int? GetChance() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.GuardianSpawnChance : 35f; - var chance = Mathf.Clamp(Mathf.RoundToInt(value), 0, 100); - return chance; - } } diff --git a/TrollMod17/Roles/IllusionistRole.cs b/TrollMod17/Roles/IllusionistRole.cs new file mode 100644 index 0000000..6cf7590 --- /dev/null +++ b/TrollMod17/Roles/IllusionistRole.cs @@ -0,0 +1,22 @@ +using MiraAPI.Roles; +using UnityEngine; + +namespace TrollMod17.Roles; + +public class IllusionistRole : ImpostorRole, ICustomRole +{ + public string RoleName => "Illusionist"; + public string RoleLongDescription => "Bends light to haze nearby vision."; + public string RoleDescription => RoleLongDescription; + public Color RoleColor => new Color32(140, 200, 255, 255); + public ModdedRoleTeams Team => ModdedRoleTeams.Impostor; + + public CustomRoleConfiguration Configuration => new(this) + { + CanUseSabotage = false, + MaxRoleCount = 2, + UseVanillaKillButton = false, + CanUseVent = true, + TasksCountForProgress = false, + }; +} diff --git a/TrollMod17/Roles/ShadowRole.cs b/TrollMod17/Roles/ShadowRole.cs index 5c22cbf..f057d98 100644 --- a/TrollMod17/Roles/ShadowRole.cs +++ b/TrollMod17/Roles/ShadowRole.cs @@ -22,22 +22,4 @@ public class ShadowRole : ImpostorRole, ICustomRole CanUseVent = true, TasksCountForProgress = false, }; - - [HideFromIl2Cpp] - public int? GetCount() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.ShadowCount : 1f; - var count = Mathf.Clamp(Mathf.RoundToInt(value), 0, Configuration.MaxRoleCount); - return count; - } - - [HideFromIl2Cpp] - public int? GetChance() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.ShadowSpawnChance : 40f; - var chance = Mathf.Clamp(Mathf.RoundToInt(value), 0, 100); - return chance; - } } diff --git a/TrollMod17/Roles/TricksterRole.cs b/TrollMod17/Roles/TricksterRole.cs index 41490e2..844ce37 100644 --- a/TrollMod17/Roles/TricksterRole.cs +++ b/TrollMod17/Roles/TricksterRole.cs @@ -17,27 +17,8 @@ public class TricksterRole : ImpostorRole, ICustomRole public CustomRoleConfiguration Configuration => new(this) { CanUseSabotage = false, - MaxRoleCount = 2, UseVanillaKillButton = false, CanUseVent = false, TasksCountForProgress = false, }; - - [HideFromIl2Cpp] - public int? GetCount() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.TricksterCount : 1f; - var count = Mathf.Clamp(Mathf.RoundToInt(value), 0, Configuration.MaxRoleCount); - return count; - } - - [HideFromIl2Cpp] - public int? GetChance() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.TricksterSpawnChance : 30f; - var chance = Mathf.Clamp(Mathf.RoundToInt(value), 0, 100); - return chance; - } } diff --git a/TrollMod17/Roles/WardenRole.cs b/TrollMod17/Roles/WardenRole.cs index 0aea2c4..17c4fbf 100644 --- a/TrollMod17/Roles/WardenRole.cs +++ b/TrollMod17/Roles/WardenRole.cs @@ -22,22 +22,4 @@ public class WardenRole : CrewmateRole, ICustomRole CanUseVent = false, TasksCountForProgress = true, }; - - [HideFromIl2Cpp] - public int? GetCount() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.WardenCount : 1f; - var count = Mathf.Clamp(Mathf.RoundToInt(value), 0, Configuration.MaxRoleCount); - return count; - } - - [HideFromIl2Cpp] - public int? GetChance() - { - var inst = OptionGroupSingleton.Instance; - var value = inst != null ? inst.WardenSpawnChance : 50f; - var chance = Mathf.Clamp(Mathf.RoundToInt(value), 0, 100); - return chance; - } } diff --git a/TrollMod17/TrollMod17.csproj b/TrollMod17/TrollMod17.csproj index 9e1b03f..50d43ab 100644 --- a/TrollMod17/TrollMod17.csproj +++ b/TrollMod17/TrollMod17.csproj @@ -4,7 +4,7 @@ latest embedded - 1.5.0 + 1.5.1 dev TrollMod AUMods_IT, Manu @@ -20,300 +20,6 @@ - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\0Harmony.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\AsmResolver.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\AsmResolver.DotNet.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\AsmResolver.PE.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\AsmResolver.PE.File.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\AssetRipper.CIL.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\AssetRipper.Primitives.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\BepInEx.Core.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\BepInEx.Preloader.Core.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\BepInEx.Unity.Common.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\BepInEx.Unity.IL2CPP.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Cpp2IL.Core.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Disarm.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Gee.External.Capstone.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Iced.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Il2CppInterop.Common.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Il2CppInterop.Generator.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Il2CppInterop.HarmonySupport.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Il2CppInterop.Runtime.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\LibCpp2IL.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Mono.Cecil.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Mono.Cecil.Mdb.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Mono.Cecil.Pdb.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\Mono.Cecil.Rocks.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\MonoMod.Backports.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\MonoMod.ILHelpers.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\MonoMod.RuntimeDetour.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\MonoMod.Utils.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\SemanticVersioning.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\StableNameDotNet.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.AccessibilityModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.AIModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.AndroidJNIModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.AnimationModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.AssetBundleModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.AudioModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ClothModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ClusterInputModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ClusterRendererModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ContentLoadModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.CoreModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.CrashReportingModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.DirectorModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.DSPGraphModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.GameCenterModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.GIModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.GridModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.HotReloadModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ImageConversionModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.IMGUIModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.InputLegacyModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.InputModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.JSONSerializeModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.LocalizationModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ParticleSystemModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.PerformanceReportingModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.Physics2DModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.PhysicsModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ProfilerModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.PropertiesModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.RuntimeInitializeOnLoadManagerInitializerModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.ScreenCaptureModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.SharedInternalsModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.SpriteMaskModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.SpriteShapeModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.StreamingModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.SubstanceModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.SubsystemsModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TerrainModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TerrainPhysicsModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TextCoreFontEngineModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TextCoreTextEngineModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TextRenderingModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TilemapModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.TLSModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UIElementsModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UIModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UmbraModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityAnalyticsCommonModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityAnalyticsModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityConnectModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityCurlModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityTestProtocolModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityWebRequestAssetBundleModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityWebRequestAudioModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityWebRequestModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityWebRequestTextureModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.UnityWebRequestWWWModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.VehiclesModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.VFXModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.VideoModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.VirtualTexturingModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.VRModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.WindModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\unity-libs\UnityEngine.XRModule.dll - - - ..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\Among Us - Copia (3)\BepInEx\core\WasmDisassembler.dll - - - diff --git a/TrollMod17/TrollMod17Plugin.cs b/TrollMod17/TrollMod17Plugin.cs index 2a65e6c..882e205 100644 --- a/TrollMod17/TrollMod17Plugin.cs +++ b/TrollMod17/TrollMod17Plugin.cs @@ -1,16 +1,18 @@ -using BepInEx; +using BepInEx; using BepInEx.Configuration; using BepInEx.Unity.IL2CPP; using HarmonyLib; using MiraAPI; using MiraAPI.PluginLoading; using MiraAPI.Utilities; +using MiraAPI.Hud; using Reactor; using Reactor.Networking; using Reactor.Networking.Attributes; using Reactor.Patches; using Reactor.Utilities; using UnityEngine; +using TrollMod17.Buttons; namespace TrollMod17; @@ -24,7 +26,7 @@ public partial class TrollModPlugin : BasePlugin, IMiraPlugin public Harmony Harmony { get; } = new(Id); public string OptionsTitleText => "Troll\nMod"; public ConfigFile GetConfigFile() => Config; - public static string ModVersion = "1.5.0"; + public static string ModVersion = "1.5.1"; public override void Load() {