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;
}
}