diff --git a/Modules/GuessManager.cs b/Modules/GuessManager.cs index 7e0cc1f5d4..68cdf5e178 100644 --- a/Modules/GuessManager.cs +++ b/Modules/GuessManager.cs @@ -120,17 +120,17 @@ public static bool GuesserMsg(PlayerControl pc, string msg, bool isUI = false) pc.ShowInfoMessage(isUI, GetString("GuessDead")); return true; } - if (!pc.Is(CustomRoles.NiceGuesser)) + if ((pc.Is(Custom_Team.Crewmate) || pc.Is(CustomRoles.Narc)) && !Options.CrewmatesCanGuess.GetBool()) { - if (pc.GetCustomRole().IsCrewmate() && !Options.CrewmatesCanGuess.GetBool() && !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.Judge)) + if (!pc.Is(CustomRoles.NiceGuesser) && !pc.Is(CustomRoles.EvilGuesser) && !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.Judge) && !pc.Is(CustomRoles.Councillor)) { pc.ShowInfoMessage(isUI, GetString("GuessNotAllowed")); return true; } } - if (!pc.Is(CustomRoles.EvilGuesser)) + if ((pc.Is(Custom_Team.Impostor) || pc.GetCustomRole().IsMadmate()) && !pc.Is(CustomRoles.Narc) && !Options.ImpostorsCanGuess.GetBool()) { - if ((pc.Is(Custom_Team.Impostor) || pc.GetCustomRole().IsMadmate()) && !Options.ImpostorsCanGuess.GetBool() && !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.Councillor)) + if (!pc.Is(CustomRoles.EvilGuesser) && !pc.Is(CustomRoles.Guesser) && !pc.Is(CustomRoles.Councillor)) { pc.ShowInfoMessage(isUI, GetString("GuessNotAllowed")); return true; @@ -244,7 +244,7 @@ public static bool GuesserMsg(PlayerControl pc, string msg, bool isUI = false) if (!role.IsEnable() && !role.RoleExist(true) && Options.CanOnlyGuessEnabled.GetBool()) { - pc.ShowInfoMessage(isUI, string.Format(GetString("GuessRoleNotEnabled"), role.ToString())); + pc.ShowInfoMessage(isUI, string.Format(GetString("GuessRoleNotEnabled"), GetString(role.ToString()))); return true; } if (role == CustomRoles.Bait && target.Is(CustomRoles.Bait) && Bait.BaitNotification.GetBool()) @@ -293,14 +293,14 @@ public static bool GuesserMsg(PlayerControl pc, string msg, bool isUI = false) if (role.IsAdditionRole() && !Options.CanGuessAddons.GetBool()) { // Impostors Cant Guess Addons - if (Options.ImpostorsCanGuess.GetBool() && (pc.Is(Custom_Team.Impostor) || pc.GetCustomRole().IsMadmate()) && !(pc.Is(CustomRoles.EvilGuesser) || pc.Is(CustomRoles.Guesser))) + if (Options.ImpostorsCanGuess.GetBool() && (pc.Is(Custom_Team.Impostor) || pc.GetCustomRole().IsMadmate()) && !pc.Is(CustomRoles.Narc) && !(pc.Is(CustomRoles.EvilGuesser) || pc.Is(CustomRoles.Guesser))) { pc.ShowInfoMessage(isUI, GetString("GuessAdtRole")); return true; } // Crewmates Cant Guess Addons - if (Options.CrewmatesCanGuess.GetBool() && pc.Is(Custom_Team.Crewmate) && !(pc.Is(CustomRoles.NiceGuesser) || pc.Is(CustomRoles.Guesser))) + if (Options.CrewmatesCanGuess.GetBool() && (pc.Is(Custom_Team.Crewmate) || pc.Is(CustomRoles.Narc)) && !(pc.Is(CustomRoles.NiceGuesser) || pc.Is(CustomRoles.Guesser))) { pc.ShowInfoMessage(isUI, GetString("GuessAdtRole")); return true; @@ -322,7 +322,7 @@ public static bool GuesserMsg(PlayerControl pc, string msg, bool isUI = false) } if ((role.IsImpostor() || role.IsMadmate()) && !Options.ImpCanGuessImp.GetBool()) { - if (Options.ImpostorsCanGuess.GetBool() && (pc.Is(Custom_Team.Impostor) || pc.GetCustomRole().IsMadmate()) && !(pc.Is(CustomRoles.EvilGuesser) || pc.Is(CustomRoles.Guesser))) + if (Options.ImpostorsCanGuess.GetBool() && (pc.Is(Custom_Team.Impostor) || pc.GetCustomRole().IsMadmate()) && !pc.Is(CustomRoles.Narc) && !(pc.Is(CustomRoles.EvilGuesser) || pc.Is(CustomRoles.Guesser))) { pc.ShowInfoMessage(isUI, GetString("GuessImpRole")); return true; @@ -338,7 +338,7 @@ public static bool GuesserMsg(PlayerControl pc, string msg, bool isUI = false) } if (role.IsCrewmate() && !Options.CrewCanGuessCrew.GetBool()) { - if (Options.CrewmatesCanGuess.GetBool() && pc.Is(Custom_Team.Crewmate) && !(pc.Is(CustomRoles.NiceGuesser) || pc.Is(CustomRoles.Guesser))) + if (Options.CrewmatesCanGuess.GetBool() && (pc.Is(Custom_Team.Crewmate) || pc.Is(CustomRoles.Narc)) && !(pc.Is(CustomRoles.NiceGuesser) || pc.Is(CustomRoles.Guesser))) { pc.ShowInfoMessage(isUI, GetString("GuessCrewRole")); return true; @@ -642,14 +642,15 @@ public static void Postfix(MeetingHud __instance) if (Options.GuesserMode.GetBool()) { - if (PlayerControl.LocalPlayer.IsAlive() && (PlayerControl.LocalPlayer.Is(Custom_Team.Impostor) || PlayerControl.LocalPlayer.GetCustomRole().IsMadmate()) && Options.ImpostorsCanGuess.GetBool()) + if (PlayerControl.LocalPlayer.IsAlive() && (PlayerControl.LocalPlayer.Is(Custom_Team.Impostor) || PlayerControl.LocalPlayer.GetCustomRole().IsMadmate()) && !PlayerControl.LocalPlayer.Is(CustomRoles.Narc) && Options.ImpostorsCanGuess.GetBool()) CreateGuesserButton(__instance); - else if (PlayerControl.LocalPlayer.GetCustomRole() is CustomRoles.EvilGuesser && !Options.ImpostorsCanGuess.GetBool()) + else if (PlayerControl.LocalPlayer.GetCustomRole() is CustomRoles.EvilGuesser && !PlayerControl.LocalPlayer.Is(CustomRoles.Narc) && !Options.ImpostorsCanGuess.GetBool()) CreateGuesserButton(__instance); - if (PlayerControl.LocalPlayer.IsAlive() && PlayerControl.LocalPlayer.GetCustomRole().IsCrewmate() && Options.CrewmatesCanGuess.GetBool()) + if (PlayerControl.LocalPlayer.IsAlive() && (PlayerControl.LocalPlayer.Is(Custom_Team.Crewmate) || PlayerControl.LocalPlayer.Is(CustomRoles.Narc)) && Options.CrewmatesCanGuess.GetBool()) CreateGuesserButton(__instance); - else if (PlayerControl.LocalPlayer.GetCustomRole() is CustomRoles.NiceGuesser && !Options.CrewmatesCanGuess.GetBool()) + else if ((PlayerControl.LocalPlayer.GetCustomRole() is CustomRoles.NiceGuesser + || (PlayerControl.LocalPlayer.Is(CustomRoles.EvilGuesser) && PlayerControl.LocalPlayer.Is(CustomRoles.Narc))) && !Options.CrewmatesCanGuess.GetBool()) CreateGuesserButton(__instance); if (PlayerControl.LocalPlayer.IsAlive() && PlayerControl.LocalPlayer.GetCustomRole().IsNK() && Options.NeutralKillersCanGuess.GetBool()) @@ -798,7 +799,7 @@ static void GuesserOnClick(byte playerId, MeetingHud __instance) { if (PlayerControl.LocalPlayer.Is(CustomRoles.EvilGuesser)) { - if (EvilGuesser.HideTabInGuesserUI(TabId)) continue; + if (EvilGuesser.HideTabInGuesserUI(PlayerControl.LocalPlayer, TabId)) continue; } else if (PlayerControl.LocalPlayer.Is(CustomRoles.NiceGuesser)) { @@ -820,8 +821,8 @@ static void GuesserOnClick(byte playerId, MeetingHud __instance) PlayerControl.LocalPlayer.Is(CustomRoles.Doomsayer) || PlayerControl.LocalPlayer.Is(CustomRoles.Guesser))) { - if (!Options.CrewCanGuessCrew.GetBool() && PlayerControl.LocalPlayer.Is(Custom_Team.Crewmate) && TabId == 0) continue; - if (!Options.ImpCanGuessImp.GetBool() && PlayerControl.LocalPlayer.Is(Custom_Team.Impostor) && TabId == 1) continue; + if (!Options.CrewCanGuessCrew.GetBool() && (PlayerControl.LocalPlayer.Is(Custom_Team.Crewmate) || PlayerControl.LocalPlayer.Is(CustomRoles.Narc)) && TabId == 0) continue; + if (!Options.ImpCanGuessImp.GetBool() && (PlayerControl.LocalPlayer.Is(Custom_Team.Impostor) || PlayerControl.LocalPlayer.GetCustomRole().IsMadmate()) && !PlayerControl.LocalPlayer.Is(CustomRoles.Narc) && TabId == 1) continue; if (!Options.CovenCanGuessCoven.GetBool() && PlayerControl.LocalPlayer.Is(Custom_Team.Coven) && TabId == 3) continue; if (!Options.CanGuessAddons.GetBool() && TabId == 4) continue; } diff --git a/Resources/Lang/en_US.json b/Resources/Lang/en_US.json index 3e6f78a397..b9876a8a0b 100644 --- a/Resources/Lang/en_US.json +++ b/Resources/Lang/en_US.json @@ -1581,6 +1581,8 @@ "NarcHasCrewVision": "Narc Has Crewmate Vision", "MadmateCanBeNarc": "Madmate Roles Can Be Narc", "ImpsCanKillEachOther": "Impostors Can Kill Each Other", + "NarcSharesGuessAccessWithCrew": "Shares Guess Access with Crewmates", + "NarcEGCanGuessCrew": "Narc Evil Guesser Can Guess Crewmate Roles", "RebirthUses": "Amount of Rebirths", "RebirthCountVotes": "Only rebirth to players who voted for them", diff --git a/Roles/AddOns/Crewmate/Narc.cs b/Roles/AddOns/Crewmate/Narc.cs index 128bdb67ed..9bdabaefec 100644 --- a/Roles/AddOns/Crewmate/Narc.cs +++ b/Roles/AddOns/Crewmate/Narc.cs @@ -17,6 +17,7 @@ public static class NarcManager private static OptionItem NarcHasCrewVision; //public static OptionItem MadmateCanBeNarc; public static OptionItem ImpsCanKillEachOther; + public static OptionItem ShareGuessAccessWithCrew; public static void SetUpOptionsForNarc(int id = 31400, CustomRoles role = CustomRoles.Narc, CustomGameMode customGameMode = CustomGameMode.Standard, TabGroup tab = TabGroup.Addons) { @@ -45,6 +46,9 @@ public static void SetUpOptionsForNarc(int id = 31400, CustomRoles role = Custom .SetParent(spawnOption) .SetGameMode(customGameMode); + ShareGuessAccessWithCrew = BooleanOptionItem.Create(id + 7, "NarcSharesGuessAccessWithCrew", false, tab, false) + .SetParent(spawnOption) + .SetGameMode(customGameMode); var countOption = IntegerOptionItem.Create(id + 1, "Maximum", new(1, 1, 1), 1, tab, false) .SetParent(spawnOption) diff --git a/Roles/Impostor/EvilGuesser.cs b/Roles/Impostor/EvilGuesser.cs index de0fb7249a..dd8634a0d6 100644 --- a/Roles/Impostor/EvilGuesser.cs +++ b/Roles/Impostor/EvilGuesser.cs @@ -14,7 +14,7 @@ internal class EvilGuesser : RoleBase private static OptionItem EGCanGuessTime; private static OptionItem EGCanGuessImp; private static OptionItem EGCanGuessAdt; - //private static OptionItem EGCanGuessTaskDoneSnitch; Not used + private static OptionItem NarcEGCanGuessCrew; private static OptionItem EGTryHideMsg; public override void SetupCustomOption() @@ -27,8 +27,8 @@ public override void SetupCustomOption() .SetParent(Options.CustomRoleSpawnChances[CustomRoles.EvilGuesser]); EGCanGuessAdt = BooleanOptionItem.Create(Id + 4, "GCanGuessAdt", false, TabGroup.ImpostorRoles, false) .SetParent(Options.CustomRoleSpawnChances[CustomRoles.EvilGuesser]); - //EGCanGuessTaskDoneSnitch = BooleanOptionItem.Create(Id + 5, "EGCanGuessTaskDoneSnitch", true, TabGroup.ImpostorRoles, false) - // .SetParent(Options.CustomRoleSpawnChances[CustomRoles.EvilGuesser]); + NarcEGCanGuessCrew = BooleanOptionItem.Create(Id + 5, "NarcEGCanGuessCrew", true, TabGroup.ImpostorRoles, false) + .SetParent(Options.CustomRoleSpawnChances[CustomRoles.EvilGuesser]); EGTryHideMsg = BooleanOptionItem.Create(Id + 6, "GuesserTryHideMsg", true, TabGroup.ImpostorRoles, false) .SetParent(Options.CustomRoleSpawnChances[CustomRoles.EvilGuesser]) .SetColor(Color.green); @@ -36,9 +36,10 @@ public override void SetupCustomOption() public static bool NeedHideMsg(PlayerControl pc) => pc.Is(CustomRoles.EvilGuesser) && EGTryHideMsg.GetBool(); - public static bool HideTabInGuesserUI(int TabId) + public static bool HideTabInGuesserUI(PlayerControl pc, int TabId) { - if (!EGCanGuessImp.GetBool() && TabId == 1) return true; + if (!EGCanGuessImp.GetBool() && TabId == 1 && !pc.Is(CustomRoles.Narc)) return true; + if (!NarcEGCanGuessCrew.GetBool() && TabId == 0 && pc.Is(CustomRoles.Narc)) return true; if (!EGCanGuessAdt.GetBool() && TabId == 3) return true; return false; @@ -61,12 +62,19 @@ public override bool GuessCheck(bool isUI, PlayerControl guesser, PlayerControl } // Evil Guesser Can't Guess Impostors - if ((role.IsImpostor() || role.IsMadmate()) && !EGCanGuessImp.GetBool()) + if ((role.IsImpostor() || role.IsMadmate()) && !EGCanGuessImp.GetBool() && !guesser.Is(CustomRoles.Narc)) { guesser.ShowInfoMessage(isUI, Translator.GetString("GuessImpRole")); return true; } + // Narc Evil Guesser can guess Impostors but cannot guess Crewmates + if (role.IsCrewmate() && !NarcEGCanGuessCrew.GetBool() && guesser.Is(CustomRoles.Narc)) + { + guesser.ShowInfoMessage(isUI, Translator.GetString("GuessCrewRole")); + return true; + } + return false; } }