diff --git a/Modules/CustomRoleSelector.cs b/Modules/CustomRoleSelector.cs index 9ca92c633..e97821ff3 100644 --- a/Modules/CustomRoleSelector.cs +++ b/Modules/CustomRoleSelector.cs @@ -24,9 +24,7 @@ namespace EHR.Modules private static void GetNeutralCounts(int NKmaxOpt, int NKminOpt, int NNKmaxOpt, int NNKminOpt, ref int ResultNKnum, ref int ResultNNKnum) { var rd = IRandom.Instance; - if (NNKmaxOpt > 0 && NNKmaxOpt >= NNKminOpt) ResultNNKnum = rd.Next(NNKminOpt, NNKmaxOpt + 1); - if (NKmaxOpt > 0 && NKmaxOpt >= NKminOpt) ResultNKnum = rd.Next(NKminOpt, NKmaxOpt + 1); } @@ -124,14 +122,10 @@ namespace EHR.Modules RoleAssignInfo info = new(role, chance, count); - if (role.IsImpostor()) - Roles[RoleAssignType.Impostor].Add(info); - else if (role.IsNK()) - Roles[RoleAssignType.NeutralKilling].Add(info); - else if (role.IsNonNK()) - Roles[RoleAssignType.NonKillingNeutral].Add(info); - else - Roles[RoleAssignType.Crewmate].Add(info); + if (role.IsImpostor()) Roles[RoleAssignType.Impostor].Add(info); + else if (role.IsNK()) Roles[RoleAssignType.NeutralKilling].Add(info); + else if (role.IsNonNK()) Roles[RoleAssignType.NonKillingNeutral].Add(info); + else Roles[RoleAssignType.Crewmate].Add(info); } LoversData.OneIsImp &= Roles[RoleAssignType.Impostor].Count(x => x.SpawnChance == 100) < optImpNum; @@ -167,28 +161,37 @@ namespace EHR.Modules Logger.Info(string.Join(", ", Roles[RoleAssignType.Crewmate].Select(x => $"{x.Role}: {x.SpawnChance}% - {x.MaxCount}")), "CrewRoles"); Logger.Msg("=====================================================", "AllActiveRoles"); + Dictionary subCategoryLimits = Options.RoleSubCategoryLimits + .Where(x => x.Value[0].GetBool()) + .ToDictionary(x => x.Key, x => IRandom.Instance.Next(x.Value[1].GetInt(), x.Value[2].GetInt() + 1)); + + if (subCategoryLimits.Count > 0) Logger.Info($"Sub-Category Limits: {string.Join(", ", subCategoryLimits.Select(x => $"{x.Key}: {x.Value}"))}", "SubCategoryLimits"); + foreach (RoleAssignType type in Roles.Keys.ToArray()) { Roles[type] = Roles[type] .Shuffle() .OrderBy(x => x.SpawnChance != 100) .DistinctBy(x => x.Role) - .Take(GetTakeAmount()) - .ToList(); - - continue; - - int GetTakeAmount() - { - return type switch + .Select(x => ( + Info: x, + Limit: subCategoryLimits.TryGetValue(x.OptionType, out var limit) + ? (Exists: true, Value: limit) + : (Exists: false, Value: 0))) + .GroupBy(x => x.Info.OptionType) + .Select(x => (Grouping: x, x.FirstOrDefault().Limit)) + .SelectMany(x => x.Limit.Exists ? x.Grouping.Take(x.Limit.Value) : x.Grouping) + .OrderByDescending(x => x.Limit is { Exists: true, Value: > 0 }) + .Select(x => x.Info) + .Take(type switch { RoleAssignType.Impostor => optImpNum, RoleAssignType.NeutralKilling => optNeutralKillingNum, RoleAssignType.NonKillingNeutral => optNonNeutralKillingNum, RoleAssignType.Crewmate => playerCount, _ => 0 - }; - } + }) + .ToList(); } Logger.Msg("======================================================", "SelectedRoles"); @@ -667,6 +670,8 @@ namespace EHR.Modules public int MaxCount => maxCount; public int AssignedCount { get; set; } + + public RoleOptionType OptionType { get; } = role.GetRoleOptionType(); } } } \ No newline at end of file diff --git a/Modules/CustomRolesHelper.cs b/Modules/CustomRolesHelper.cs index f5b351a48..094e077ec 100644 --- a/Modules/CustomRolesHelper.cs +++ b/Modules/CustomRolesHelper.cs @@ -1289,9 +1289,7 @@ namespace EHR public static RoleOptionType GetRoleOptionType(this CustomRoles role) { if (role.IsImpostor()) return role.GetImpostorRoleCategory(); - if (role.IsCrewmate()) return role.GetCrewmateRoleCategory(); - if (role.IsNeutral(true)) return role.GetNeutralRoleCategory(); return RoleOptionType.Crewmate_Miscellaneous; @@ -1647,14 +1645,6 @@ namespace EHR Neutral_Killing } - public enum SimpleRoleOptionType - { - Crewmate, - Impostor, - NK, - NNK - } - public enum AddonTypes { ImpOnly, diff --git a/Modules/DevManager.cs b/Modules/DevManager.cs index f34663f9b..2c1d29ea0 100644 --- a/Modules/DevManager.cs +++ b/Modules/DevManager.cs @@ -129,7 +129,9 @@ namespace EHR new("coralcolt#2815", "#ed5356", "YouTuber", true), // TheDarkYT new("deltasunny#0515", "#ff0000", "YouTuber", true), // LuffyFelx new("strangeant#6543", isUp: true), // after.edits - new("ninjanice#3990", isUp: true), // after.edits + new("ninjanice#3990", isUp: true), // void_daora + new("magicmill#4146", isUp: true), // Sr.Angel + new("blessedtes#6684", "#ff0000", "YouTuber", true), // Gabriel So Capa // Sponsor new("recentduct#6068", "#FF00FF", "高冷男模法师", false, true), diff --git a/Modules/LobbyNotifierForDiscord.cs b/Modules/LobbyNotifierForDiscord.cs index 820acc063..d926e6d6b 100644 --- a/Modules/LobbyNotifierForDiscord.cs +++ b/Modules/LobbyNotifierForDiscord.cs @@ -91,6 +91,8 @@ namespace EHR.Modules public static void NotifyLobbyStatusChanged(LobbyStatus status) { + if (!Options.PostLobbyCodeToEHRDiscordServer.GetBool()) return; + if (GameCode.IntToGameName(AmongUsClient.Instance.GameId) != LastRoomCode) { status = LobbyStatus.Closed; diff --git a/Modules/OptionHolder.cs b/Modules/OptionHolder.cs index af39886f0..db9396767 100644 --- a/Modules/OptionHolder.cs +++ b/Modules/OptionHolder.cs @@ -71,6 +71,8 @@ namespace EHR public static Dictionary CustomRoleSpawnChances; public static Dictionary CustomAdtRoleSpawnRate; + public static Dictionary RoleSubCategoryLimits = []; + public static readonly string[] Rates = [ "Rate0", @@ -1372,6 +1374,37 @@ namespace EHR LoadingPercentage = 65; MainLoadingText = "Building game settings"; + new TextOptionItem(100030, "MenuTitle.RoleListMaker", TabGroup.GameSettings) + .SetGameMode(CustomGameMode.Standard) + .SetColor(new Color32(0, 165, 255, byte.MaxValue)); + + int id = 19820; + + foreach (RoleOptionType roleOptionType in Enum.GetValues()) + { + Color roleOptionTypeColor = roleOptionType.GetRoleOptionTypeColor(); + var options = new OptionItem[3]; + + options[0] = new BooleanOptionItem(id++, $"RoleSubCategoryLimitOptions.{roleOptionType}.EnableLimit", false, TabGroup.GameSettings) + .SetGameMode(CustomGameMode.Standard) + .SetHeader(true) + .SetColor(roleOptionTypeColor); + + options[1] = new IntegerOptionItem(id++, $"RoleSubCategoryLimitOptions.{roleOptionType}.Min", new(0, 15, 1), 1, TabGroup.GameSettings) + .SetParent(options[0]) + .SetGameMode(CustomGameMode.Standard) + .SetValueFormat(OptionFormat.Players) + .SetColor(roleOptionTypeColor); + + options[2] = new IntegerOptionItem(id++, $"RoleSubCategoryLimitOptions.{roleOptionType}.Max", new(0, 15, 1), 1, TabGroup.GameSettings) + .SetParent(options[0]) + .SetGameMode(CustomGameMode.Standard) + .SetValueFormat(OptionFormat.Players) + .SetColor(roleOptionTypeColor); + + RoleSubCategoryLimits[roleOptionType] = options; + } + new TextOptionItem(100023, "MenuTitle.Ejections", TabGroup.GameSettings) .SetGameMode(CustomGameMode.Standard) .SetColor(new Color32(255, 238, 232, byte.MaxValue)); @@ -1408,7 +1441,7 @@ namespace EHR LoadingPercentage = 67; - //Maps Settings + // Map Settings new TextOptionItem(100024, "MenuTitle.MapsSettings", TabGroup.GameSettings) .SetGameMode(CustomGameMode.Standard) .SetColor(new Color32(19, 188, 233, byte.MaxValue)); diff --git a/Patches/CredentialsPatch.cs b/Patches/CredentialsPatch.cs index efaedff6b..498b3f270 100644 --- a/Patches/CredentialsPatch.cs +++ b/Patches/CredentialsPatch.cs @@ -4,6 +4,7 @@ using EHR.Modules; using HarmonyLib; using TMPro; using UnityEngine; +using UnityEngine.SceneManagement; using static EHR.Translator; @@ -97,10 +98,10 @@ namespace EHR VersionShower.name = "EHR Version Shower"; VersionShower.transform.localPosition = friendCode.transform.localPosition + new Vector3(3.2f, 0f, 0f); VersionShower.transform.localScale *= 1.7f; - var TMP = VersionShower.GetComponent(); - TMP.alignment = TextAlignmentOptions.Right; - TMP.fontSize = 30f; - TMP.SetText(credentialsText); + var tmp = VersionShower.GetComponent(); + tmp.alignment = TextAlignmentOptions.Right; + tmp.fontSize = 30f; + tmp.SetText(credentialsText); } var newRequest = GameObject.Find("NewRequest"); @@ -110,6 +111,125 @@ namespace EHR newRequest.transform.localPosition -= new Vector3(0f, 0f, 10f); newRequest.transform.localScale = new(0.8f, 1f, 1f); } + + var friendsButton = GameObject.Find("FriendsButton"); + + if (friendsButton != null) + { + friendsButton.transform.FindChild("Highlight").GetComponent().color = new(0f, 0.647f, 1f, 1f); + friendsButton.transform.FindChild("Inactive").GetComponent().color = new(0f, 0.847f, 1f, 1f); + } + } + } + + [HarmonyPatch(typeof(FriendsListUI), nameof(FriendsListUI.Open))] + static class FriendsListUIOpenPatch + { + public static bool Prefix(FriendsListUI __instance) + { + try + { + if (__instance.gameObject.activeSelf || __instance.currentSceneName == "") + { + __instance.Close(); + } + else + { + FriendsListBar[] componentsInChildren = __instance.GetComponentsInChildren(true); + + for (int index = 0; index < componentsInChildren.Length; ++index) + { + if (componentsInChildren[index] != null) + Object.Destroy(componentsInChildren[index].gameObject); + } + + Scene activeScene = SceneManager.GetActiveScene(); + __instance.currentSceneName = activeScene.name; + __instance.UpdateFriendCodeUI(); + + if (DestroyableSingleton.InstanceExists && DestroyableSingleton.Instance != null && DestroyableSingleton.Instance.Chat != null && DestroyableSingleton.Instance.Chat.IsOpenOrOpening || ShipStatus.Instance != null) + return false; + + __instance.friendBars = new(); + __instance.lobbyBars = new(); + __instance.notifBars = new(); + __instance.platformFriendBars = new(); + __instance.viewingAllFriends = true; + __instance.gameObject.SetActive(true); + __instance.guestAccountWarnings.ForEach((Action)(t => t.gameObject.SetActive(false))); + __instance.ViewRequestsButton.color = __instance.NoRequestsColor; + __instance.ViewRequestsText.text = DestroyableSingleton.Instance.GetString(StringNames.NoNewRequests); + + __instance.StartCoroutine(DestroyableSingleton.Instance.RefreshFriendsList((Action)(() => + { + __instance.ClearNotifs(); + + if (DestroyableSingleton.Instance.IsFriendsListAllowed()) + { + __instance.AddFriendObjects.SetActive(true); + __instance.RefreshBlockedPlayers(); + __instance.RefreshFriends(); + __instance.RefreshNotifications(); + } + else + { + __instance.AddFriendObjects.SetActive(false); + __instance.guestAccountWarnings.ForEach((Action)(g => g.SetUp())); + } + + __instance.RefreshRecentlyPlayed(); + __instance.RefreshPlatformFriends(); + + foreach (FriendsListBar friendBar in __instance.friendBars) + { + foreach (PassiveButton passiveButton in friendBar.ControllerSelectable) + ControllerManager.Instance.AddSelectableUiElement(passiveButton); + } + + foreach (FriendsListBar platformFriendBar in __instance.platformFriendBars) + { + foreach (PassiveButton passiveButton in platformFriendBar.ControllerSelectable) + ControllerManager.Instance.AddSelectableUiElement(passiveButton); + } + + foreach (FriendsListBar notifBar in __instance.notifBars) + { + foreach (PassiveButton passiveButton in notifBar.ControllerSelectable) + ControllerManager.Instance.AddSelectableUiElement(passiveButton); + } + + foreach (FriendsListBar lobbyBar in __instance.lobbyBars) + { + foreach (PassiveButton passiveButton in lobbyBar.ControllerSelectable) + ControllerManager.Instance.AddSelectableUiElement(passiveButton); + } + + ControllerManager.Instance.PickTopSelectable(); + }))); + + if (__instance.currentSceneName == "OnlineGame") + { + __instance.RefreshLobbyPlayers(); + __instance.LobbyPlayersTab.SetActive(true); + __instance.LobbyPlayersInactiveTab.SetActive(false); + __instance.OpenTab(0); + } + else + { + __instance.LobbyPlayersInactiveTab.SetActive(true); + __instance.LobbyPlayersTab.SetActive(false); + __instance.OpenTab(2); + } + + ControllerManager.Instance.OpenOverlayMenu(__instance.name, __instance.BackButton, __instance.DefaultButtonSelected, __instance.ControllerSelectable); + } + } + catch (Exception e) + { + Utils.ThrowException(e); + } + + return false; } } @@ -164,9 +284,9 @@ namespace EHR Dictionary, (Sprite, Color, Color, Color, Color)> mainButtons = new() { - { [__instance.playButton, __instance.inventoryButton, __instance.shopButton], (standardActiveSprite, new(1f, 0.524f, 0.549f, 0.8f), shade, Color.white, Color.white) }, - { [__instance.newsButton, __instance.myAccountButton, __instance.settingsButton], (minorActiveSprite, new(1f, 0.825f, 0.686f, 0.8f), shade, Color.white, Color.white) }, - { [__instance.creditsButton, __instance.quitButton], (minorActiveSprite, new(0.526f, 1f, 0.792f, 0.8f), shade, Color.white, Color.white) } + { [__instance.playButton, __instance.inventoryButton, __instance.shopButton], (standardActiveSprite, new(0f, 0.647f, 1f, 0.8f), shade, Color.white, Color.white) }, + { [__instance.newsButton, __instance.myAccountButton, __instance.settingsButton], (minorActiveSprite, new(0.825f, 0.825f, 0.286f, 0.8f), shade, Color.white, Color.white) }, + { [__instance.creditsButton, __instance.quitButton], (minorActiveSprite, new(0.226f, 1f, 0.792f, 0.8f), shade, Color.white, Color.white) } }; foreach (KeyValuePair, (Sprite, Color, Color, Color, Color)> kvp in mainButtons) diff --git a/Patches/GameOptionsMenuPatch.cs b/Patches/GameOptionsMenuPatch.cs index 1163e0501..5f3fbe51c 100644 --- a/Patches/GameOptionsMenuPatch.cs +++ b/Patches/GameOptionsMenuPatch.cs @@ -241,21 +241,21 @@ namespace EHR { scaleOffset = new(-0.18f, 0, 0); positionOffset = new(0.3f, 0f, 0f); - color = new(0.8f, 0.8f, 0.2f); + color = new(0.35f, 0f, 0f); sizeDelta_x = 5.1f; } else if (option.Parent?.Parent != null) { scaleOffset = new(-0.12f, 0, 0); positionOffset = new(0.2f, 0f, 0f); - color = new(0.5f, 0.2f, 0.8f); + color = new(0.35f, 0.35f, 0f); sizeDelta_x = 5.3f; } else if (option.Parent != null) { scaleOffset = new(-0.05f, 0, 0); positionOffset = new(0.1f, 0f, 0f); - color = new(0.2f, 0.8f, 0.8f); + color = new(0f, 0f, 0.35f); sizeDelta_x = 5.5f; } diff --git a/Patches/GameStartManagerPatch.cs b/Patches/GameStartManagerPatch.cs index 70ab06255..fc4e5cd38 100644 --- a/Patches/GameStartManagerPatch.cs +++ b/Patches/GameStartManagerPatch.cs @@ -228,23 +228,21 @@ namespace EHR instance.StartButton.gameObject.SetActive(true); instance.RulesPresetText.text = DestroyableSingleton.Instance.GetString(GameOptionsManager.Instance.CurrentGameOptions.GetRulesPresetTitle()); - if (GameCode.IntToGameName(AmongUsClient.Instance.GameId) == null) - instance.privatePublicPanelText.text = DestroyableSingleton.Instance.GetString(StringNames.LocalButton); - else if (AmongUsClient.Instance.IsGamePublic) - instance.privatePublicPanelText.text = DestroyableSingleton.Instance.GetString(StringNames.PublicHeader); - else - instance.privatePublicPanelText.text = DestroyableSingleton.Instance.GetString(StringNames.PrivateHeader); + if (GameCode.IntToGameName(AmongUsClient.Instance.GameId) == null) instance.privatePublicPanelText.text = DestroyableSingleton.Instance.GetString(StringNames.LocalButton); + else if (AmongUsClient.Instance.IsGamePublic) instance.privatePublicPanelText.text = DestroyableSingleton.Instance.GetString(StringNames.PublicHeader); + else instance.privatePublicPanelText.text = DestroyableSingleton.Instance.GetString(StringNames.PrivateHeader); instance.HostPrivateButton.gameObject.SetActive(!AmongUsClient.Instance.IsGamePublic); instance.HostPublicButton.gameObject.SetActive(AmongUsClient.Instance.IsGamePublic); - if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) && Input.GetKeyDown(KeyCode.C)) ClipboardHelper.PutClipboardString(GameCode.IntToGameName(AmongUsClient.Instance.GameId)); + + if ((Input.GetKey(KeyCode.LeftControl) || Input.GetKey(KeyCode.RightControl)) && Input.GetKeyDown(KeyCode.C)) + ClipboardHelper.PutClipboardString(GameCode.IntToGameName(AmongUsClient.Instance.GameId)); if (GameData.Instance.PlayerCount != instance.LastPlayerCount) { instance.LastPlayerCount = GameData.Instance.PlayerCount; var text = ""; if (instance.LastPlayerCount > instance.MinPlayers) text = ""; - if (instance.LastPlayerCount == instance.MinPlayers) text = ""; instance.PlayerCounter.text = $"{text}{instance.LastPlayerCount}/{(AmongUsClient.Instance.NetworkMode == NetworkModes.LocalGame ? 15 : GameManager.Instance.LogicOptions.MaxPlayers)}"; diff --git a/Patches/HudPatch.cs b/Patches/HudPatch.cs index 13c5d5044..019c9877c 100644 --- a/Patches/HudPatch.cs +++ b/Patches/HudPatch.cs @@ -26,6 +26,8 @@ namespace EHR.Patches public static string AchievementUnlockedText = string.Empty; + public static void ClearLowerInfoText() => LowerInfoText.text = string.Empty; + public static bool Prefix(HudManager __instance) { if (PlayerControl.LocalPlayer != null) return true; diff --git a/Patches/PlayerControlPatch.cs b/Patches/PlayerControlPatch.cs index bc28660c5..662ef1a34 100644 --- a/Patches/PlayerControlPatch.cs +++ b/Patches/PlayerControlPatch.cs @@ -1153,6 +1153,9 @@ namespace EHR CustomRoles role = pc.GetCustomRole(); if (role.AlwaysUsesUnshift() || (role.SimpleAbilityTrigger() && Options.UseUnshiftTrigger.GetBool() && (!pc.IsNeutralKiller() || Options.UseUnshiftTriggerForNKs.GetBool()))) pc.RpcShapeshift(pc, false); } + + if (HudManagerPatch.AchievementUnlockedText == string.Empty) + HudManagerPatch.ClearLowerInfoText(); } } diff --git a/Patches/PlayerJoinAndLeftPatch.cs b/Patches/PlayerJoinAndLeftPatch.cs index 022fbc66a..5360ddcb9 100644 --- a/Patches/PlayerJoinAndLeftPatch.cs +++ b/Patches/PlayerJoinAndLeftPatch.cs @@ -66,23 +66,20 @@ namespace EHR ChatCommands.DraftResult = []; ChatCommands.DraftRoles = []; - if (Options.PostLobbyCodeToEHRDiscordServer.GetBool()) + LateTask.New(() => { - LateTask.New(() => + if (GameStates.IsOnlineGame && GameStates.IsVanillaServer) { - if (GameStates.IsOnlineGame && GameStates.IsVanillaServer) + try { - try - { - LobbyNotifierForDiscord.NotifyLobbyStatusChanged(LobbyStatus.In_Lobby); - } - catch (Exception e) - { - Utils.ThrowException(e); - } + LobbyNotifierForDiscord.NotifyLobbyStatusChanged(LobbyStatus.In_Lobby); } - }, 5f, "NotifyLobbyCreated"); - } + catch (Exception e) + { + Utils.ThrowException(e); + } + } + }, 5f, "NotifyLobbyCreated"); } } } diff --git a/Resources/Lang/en_US.json b/Resources/Lang/en_US.json index 1310547fb..4c096057c 100644 --- a/Resources/Lang/en_US.json +++ b/Resources/Lang/en_US.json @@ -67,6 +67,48 @@ "ROT.AddonType.Helpful": "★ Helpful Add-ons", "ROT.AddonType.Harmful": "★ Harmful Add-ons", "ROT.AddonType.Mixed": "★ Mixed Add-ons", + "RoleSubCategoryLimitOptions.Impostor_Killing.EnableLimit": "<#ffffff>Alter the number of Impostor Killing <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Impostor_Support.EnableLimit": "<#ffffff>Alter the number of Impostor Support <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Impostor_Concealing.EnableLimit": "<#ffffff>Alter the number of Impostor Concealing <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Impostor_Miscellaneous.EnableLimit": "<#ffffff>Alter the number of Impostor Miscellaneous <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.MadMates.EnableLimit": "<#ffffff>Alter the number of Madmate <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Crewmate_Investigate.EnableLimit": "<#ffffff>Alter the number of Crewmate Investigate <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Crewmate_Support.EnableLimit": "<#ffffff>Alter the number of Crewmate Support <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Crewmate_Power.EnableLimit": "<#ffffff>Alter the number of Crewmate Power <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Crewmate_Killing.EnableLimit": "<#ffffff>Alter the number of Crewmate Killing <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Crewmate_Chaos.EnableLimit": "<#ffffff>Alter the number of Crewmate Chaos <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Crewmate_Miscellaneous.EnableLimit": "<#ffffff>Alter the number of Crewmate Miscellaneous <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Neutral_Evil.EnableLimit": "<#ffffff>Alter the number of Neutral Evil <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Neutral_Benign.EnableLimit": "<#ffffff>Alter the number of Neutral Benign <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Neutral_Killing.EnableLimit": "<#ffffff>Alter the number of Neutral Killing <#ffffff>roles in the game", + "RoleSubCategoryLimitOptions.Impostor_Killing.Min": "Minimum Impostor Killing Roles", + "RoleSubCategoryLimitOptions.Impostor_Killing.Max": "Maximum Impostor Killing Roles", + "RoleSubCategoryLimitOptions.Impostor_Support.Min": "Minimum Impostor Support Roles", + "RoleSubCategoryLimitOptions.Impostor_Support.Max": "Maximum Impostor Support Roles", + "RoleSubCategoryLimitOptions.Impostor_Concealing.Min": "Minimum Impostor Concealing Roles", + "RoleSubCategoryLimitOptions.Impostor_Concealing.Max": "Maximum Impostor Concealing Roles", + "RoleSubCategoryLimitOptions.Impostor_Miscellaneous.Min": "Minimum Impostor Miscellaneous Roles", + "RoleSubCategoryLimitOptions.Impostor_Miscellaneous.Max": "Maximum Impostor Miscellaneous Roles", + "RoleSubCategoryLimitOptions.MadMates.Min": "Minimum Madmate Roles", + "RoleSubCategoryLimitOptions.MadMates.Max": "Maximum Madmate Roles", + "RoleSubCategoryLimitOptions.Crewmate_Investigate.Min": "Minimum Crewmate Investigate Roles", + "RoleSubCategoryLimitOptions.Crewmate_Investigate.Max": "Maximum Crewmate Investigate Roles", + "RoleSubCategoryLimitOptions.Crewmate_Support.Min": "Minimum Crewmate Support Roles", + "RoleSubCategoryLimitOptions.Crewmate_Support.Max": "Maximum Crewmate Support Roles", + "RoleSubCategoryLimitOptions.Crewmate_Power.Min": "Minimum Crewmate Power Roles", + "RoleSubCategoryLimitOptions.Crewmate_Power.Max": "Maximum Crewmate Power Roles", + "RoleSubCategoryLimitOptions.Crewmate_Killing.Min": "Minimum Crewmate Killing Roles", + "RoleSubCategoryLimitOptions.Crewmate_Killing.Max": "Maximum Crewmate Killing Roles", + "RoleSubCategoryLimitOptions.Crewmate_Chaos.Min": "Minimum Crewmate Chaos Roles", + "RoleSubCategoryLimitOptions.Crewmate_Chaos.Max": "Maximum Crewmate Chaos Roles", + "RoleSubCategoryLimitOptions.Crewmate_Miscellaneous.Min": "Minimum Crewmate Miscellaneous Roles", + "RoleSubCategoryLimitOptions.Crewmate_Miscellaneous.Max": "Maximum Crewmate Miscellaneous Roles", + "RoleSubCategoryLimitOptions.Neutral_Evil.Min": "Minimum Neutral Evil Roles", + "RoleSubCategoryLimitOptions.Neutral_Evil.Max": "Maximum Neutral Evil Roles", + "RoleSubCategoryLimitOptions.Neutral_Benign.Min": "Minimum Neutral Benign Roles", + "RoleSubCategoryLimitOptions.Neutral_Benign.Max": "Maximum Neutral Benign Roles", + "RoleSubCategoryLimitOptions.Neutral_Killing.Min": "Minimum Neutral Killing Roles", + "RoleSubCategoryLimitOptions.Neutral_Killing.Max": "Maximum Neutral Killing Roles", "CTA.TeamEnabled.Prefix": "Enable ", "CTA.TeamEnabled.Suffix": " ", "CTA.KnowRoles": "Players Know Each Others' Roles", @@ -1149,6 +1191,7 @@ "MenuTitle.Guessers": "★ Guesser Mode ★", "MenuTitle.CTA": "★ Custom Team Assignment ★", "MenuTitle.AFKDetection": "★ AFK Detection ★", + "MenuTitle.RoleListMaker": "★ Role List Maker ★", "ReadyCheckMessage": "The host is checking how many players are ready to start the game.\\nPlease type /ready to let the host know you're not AFK.", "ReadyCheckTitle": "<#ffff00>★ Ready Check ★", "EveryoneReadyTitle": "<#00ff00>Everyone is ready!", diff --git a/Roles/Impostor/Occultist.cs b/Roles/Impostor/Occultist.cs index 117971da6..21b089320 100644 --- a/Roles/Impostor/Occultist.cs +++ b/Roles/Impostor/Occultist.cs @@ -34,7 +34,7 @@ namespace EHR.Impostor public override void SetupCustomOption() { - StartSetup(645350) + StartSetup(645250) .AutoSetupOption(ref AbilityUseLimit, 0, new IntegerValueRule(0, 20, 1), OptionFormat.Times) .AutoSetupOption(ref ReviveTime, 5, new IntegerValueRule(0, 60, 1), OptionFormat.Seconds) .AutoSetupOption(ref ArrowsToBodies, false)