Try to fix Loop Wanted issue (#632)

* Add new Gamemode and fix SettingMenu button order issue

* back path

* Fix

* Try to ban Crewmate Kill

* Rename LoopWanted to DoomTag & fix double suffix

* Rename

* Fix gurge said
This commit is contained in:
Christina authored and GitHub committed 2026-06-27 14:57:26 +02:00
1 parent 0cde09fcb6
commit 6a4d5cb4d5
22 files changed
+139 -143

No files matched your search

+2 -2
View File
@@ -504,8 +504,8 @@ public enum CustomRoles
// Snowdown
SnowdownPlayer,
// LoopWanted
LoopHunter,
// DoomTag
Tagger,
// GM
GM,
+2 -2
View File
@@ -504,8 +504,8 @@ public enum CustomRoles
// Snowdown
SnowdownPlayer,
// LoopWanted
LoopHunter,
// DoomTag
Tagger,
// GM
GM,
@@ -8,7 +8,7 @@ using static EHR.Translator;
namespace EHR.Gamemodes;
internal static class LoopWanted
internal static class DoomTag
{
private static Dictionary<byte, byte> TargetMap = [];
private static Dictionary<byte, long> LowerVisionList = [];
@@ -23,47 +23,47 @@ internal static class LoopWanted
private static OptionItem CarnivalSpeedMultiplier;
private static OptionItem ShowTargetArrow;
private static readonly string[] PunishmentModeOptions = ["LoopWanted.PunishSuicide", "LoopWanted.PunishLowerVision"];
private static readonly string[] PunishmentModeOptions = ["DoomTag.PunishSuicide", "DoomTag.PunishLowerVision"];
public static void SetupCustomOption()
{
var id = 69_226_001;
Color color = Utils.GetRoleColor(CustomRoles.LoopHunter);
const CustomGameMode gameMode = CustomGameMode.LoopWanted;
Color color = Utils.GetRoleColor(CustomRoles.Tagger);
const CustomGameMode gameMode = CustomGameMode.DoomTag;
const TabGroup tab = TabGroup.GameSettings;
BaseKillCooldown = new FloatOptionItem(id++, "LoopWanted.BaseKillCooldown", new(2.5f, 60f, 2.5f), 15f, tab)
BaseKillCooldown = new FloatOptionItem(id++, "DoomTag.BaseKillCooldown", new(2.5f, 60f, 2.5f), 15f, tab)
.SetHeader(true)
.SetGameMode(gameMode)
.SetColor(color)
.SetValueFormat(OptionFormat.Seconds);
PunishmentMode = new StringOptionItem(id++, "LoopWanted.PunishmentMode", PunishmentModeOptions, 0, tab)
PunishmentMode = new StringOptionItem(id++, "DoomTag.PunishmentMode", PunishmentModeOptions, 0, tab)
.SetGameMode(gameMode)
.SetColor(color);
LowerVisionMultiplier = new FloatOptionItem(id++, "LoopWanted.LowerVisionMultiplier", new(0f, 10f, 0.5f), 0.5f, tab)
LowerVisionMultiplier = new FloatOptionItem(id++, "DoomTag.LowerVisionMultiplier", new(0f, 10f, 0.5f), 0.5f, tab)
.SetParent(PunishmentMode)
.SetGameMode(gameMode)
.SetColor(color)
.SetValueFormat(OptionFormat.Multiplier);
CarnivalPlayerCount = new IntegerOptionItem(id++, "LoopWanted.CarnivalPlayerCount", new(1, 127, 1), 3, tab)
CarnivalPlayerCount = new IntegerOptionItem(id++, "DoomTag.CarnivalPlayerCount", new(1, 127, 1), 3, tab)
.SetGameMode(gameMode)
.SetColor(color)
.SetValueFormat(OptionFormat.Players);
CarnivalKillCooldown = new FloatOptionItem(id++, "LoopWanted.CarnivalKillCooldown", new(2.5f, 60f, 2.5f), 5f, tab)
CarnivalKillCooldown = new FloatOptionItem(id++, "DoomTag.CarnivalKillCooldown", new(2.5f, 60f, 2.5f), 5f, tab)
.SetGameMode(gameMode)
.SetColor(color)
.SetValueFormat(OptionFormat.Seconds);
CarnivalSpeedMultiplier = new FloatOptionItem(id++, "LoopWanted.CarnivalSpeedMultiplier", new(0.25f, 10f, 0.25f), 2.0f, tab)
CarnivalSpeedMultiplier = new FloatOptionItem(id++, "DoomTag.CarnivalSpeedMultiplier", new(0.25f, 10f, 0.25f), 2.0f, tab)
.SetGameMode(gameMode)
.SetColor(color)
.SetValueFormat(OptionFormat.Multiplier);
ShowTargetArrow = new BooleanOptionItem(id, "LoopWanted.ShowTargetArrow", false, tab)
ShowTargetArrow = new BooleanOptionItem(id, "DoomTag.ShowTargetArrow", false, tab)
.SetGameMode(gameMode)
.SetColor(color);
}
@@ -75,16 +75,16 @@ internal static class LoopWanted
LowerVisionList = [];
CarnivalMode = false;
if (Options.CurrentGameMode != CustomGameMode.LoopWanted) return;
if (Options.CurrentGameMode != CustomGameMode.DoomTag) return;
DefaultSpeed = Main.RealOptionsData.GetFloat(FloatOptionNames.PlayerSpeedMod);
Utils.SendRPC(CustomRPC.LoopWantedSync, 1, false);
Utils.SendRPC(CustomRPC.DoomTagSync, 1, false);
}
public static void OnGameStart()
{
if (Options.CurrentGameMode != CustomGameMode.LoopWanted) return;
if (Options.CurrentGameMode != CustomGameMode.DoomTag) return;
AssignTargets();
}
@@ -102,7 +102,7 @@ internal static class LoopWanted
if (playerIds.Count < 2)
{
Logger.Warn("Not enough players for LoopWanted", "LoopWanted");
Logger.Warn("Not enough players for DoomTag", "DoomTag");
return;
}
@@ -115,7 +115,7 @@ internal static class LoopWanted
TargetMap.Remove(TargetMap.GetKeyByValue(targetId));
TargetMap[hunterId] = targetId;
if (ShowTargetArrow.GetBool()) TargetArrow.Add(hunterId, targetId);
Logger.Info($"{hunterId.ColoredPlayerName()} 2 targets 2 {targetId.ColoredPlayerName()}", "LoopWanted");
Logger.Info($"{hunterId.ColoredPlayerName()} 2 targets 2 {targetId.ColoredPlayerName()}", "DoomTag");
}
SyncTargetMapRPC();
@@ -138,7 +138,7 @@ internal static class LoopWanted
if (expectedTarget == targetId)
{
Logger.Info($"{killer.GetRealName()} correctly killed their target {target.GetRealName()}", "LoopWanted");
Logger.Info($"{killer.GetRealName()} correctly killed their target {target.GetRealName()}", "DoomTag");
byte nextTarget = GetTarget(targetId);
@@ -151,7 +151,7 @@ internal static class LoopWanted
TargetMap.Remove(TargetMap.GetKeyByValue(nextTarget));
TargetMap[killerId] = nextTarget;
if (ShowTargetArrow.GetBool()) TargetArrow.Add(killerId, nextTarget);
Logger.Info($"{killer.GetRealName()}'s new target is {nextTarget.ColoredPlayerName()}", "LoopWanted");
Logger.Info($"{killer.GetRealName()}'s new target is {nextTarget.ColoredPlayerName()}", "DoomTag");
}
else
{
@@ -165,13 +165,13 @@ internal static class LoopWanted
Utils.NotifyRoles(SpecifySeer: killer, SpecifyTarget: killer);
SyncTargetMapRPC();
Utils.SendRPC(CustomRPC.LoopWantedSync, 1, CarnivalMode);
Utils.SendRPC(CustomRPC.DoomTagSync, 1, CarnivalMode);
killer.Kill(target);
}
else
{
Logger.Info($"{killer.GetRealName()} killed wrong target {target.GetRealName()} (expected: {expectedTarget.ColoredPlayerName()})", "LoopWanted");
Logger.Info($"{killer.GetRealName()} killed wrong target {target.GetRealName()} (expected: {expectedTarget.ColoredPlayerName()})", "DoomTag");
if (PunishmentMode.GetInt() == 0)
killer.Kill(target);
@@ -194,21 +194,21 @@ internal static class LoopWanted
switch (PunishmentMode.GetInt())
{
case 0:
Logger.Info($"{killer.GetRealName()} is committing suicide for wrong kill", "LoopWanted");
killer.Notify(GetString("LoopWanted.WrongKillSuicide"));
Logger.Info($"{killer.GetRealName()} is committing suicide for wrong kill", "DoomTag");
killer.Notify(GetString("DoomTag.WrongKillSuicide"));
LateTask.New(() =>
{
if (!killer || !killer.IsAlive() || GameStates.IsEnded) return;
killer.Suicide();
HandleDeadPlayer(killer.PlayerId);
}, 0.5f, "LoopWanted Suicide Punishment");
}, 0.5f, "DoomTag Suicide Punishment");
break;
case 1:
float visionMultiplier = LowerVisionMultiplier.GetFloat();
LowerVisionList[killer.PlayerId] = Utils.TimeStamp;
killer.MarkDirtySettings();
killer.Notify(string.Format(GetString("LoopWanted.WrongKillLowerVision"), visionMultiplier));
killer.Notify(string.Format(GetString("DoomTag.WrongKillLowerVision"), visionMultiplier));
break;
}
}
@@ -232,11 +232,8 @@ internal static class LoopWanted
TargetMap[hunterId] = nextTarget;
if (ShowTargetArrow.GetBool()) TargetArrow.Add(hunterId, nextTarget);
LateTask.New(() =>
{
PlayerControl hunter = Utils.GetPlayerById(hunterId);
if (hunter) Utils.NotifyRoles(SpecifySeer: hunter, SpecifyTarget: hunter);
}, 0.2f);
PlayerControl hunter = Utils.GetPlayerById(hunterId);
if (hunter) Utils.NotifyRoles(SpecifySeer: hunter, SpecifyTarget: hunter);
}
else if (hunterId != byte.MaxValue)
{
@@ -256,7 +253,7 @@ internal static class LoopWanted
if (!CarnivalMode && aliveCount <= threshold && aliveCount > 1)
{
CarnivalMode = true;
Utils.SendRPC(CustomRPC.LoopWantedSync, 1, true);
Utils.SendRPC(CustomRPC.DoomTagSync, 1, true);
foreach (PlayerControl pc in Main.CachedAlivePlayerControls())
{
@@ -264,12 +261,12 @@ internal static class LoopWanted
Main.AllPlayerKillCooldown[pc.PlayerId] = CarnivalKillCooldown.GetFloat();
if (!pc.AmOwner) pc.ReactorFlash();
pc.MarkDirtySettings();
pc.Notify(GetString("LoopWanted.CarnivalModeActivated"));
pc.Notify(GetString("DoomTag.CarnivalModeActivated"));
}
SoundManager.Instance.PlaySound(HudManager.Instance.LobbyTimerExtensionUI.lobbyTimerPopUpSound, false);
Utils.FlashColor(new(1f, 0.5f, 0f, 0.4f), 1.4f);
Logger.Info($"Carnival Mode activated! {aliveCount} players remaining.", "LoopWanted");
Logger.Info($"Carnival Mode activated! {aliveCount} players remaining.", "DoomTag");
}
}
@@ -286,11 +283,11 @@ internal static class LoopWanted
case 1:
PlayerControl winner = alivePlayers[0];
CustomWinnerHolder.WinnerIds = [winner.PlayerId];
Logger.Info($"LoopWanted Winner: {winner.GetRealName()}", "LoopWanted");
Logger.Info($"DoomTag Winner: {winner.GetRealName()}", "DoomTag");
return true;
case 0:
CustomWinnerHolder.ResetAndSetWinner(CustomWinner.None);
Logger.Info("No players alive, force ending the game", "LoopWanted");
Logger.Info("No players alive, force ending the game", "DoomTag");
return true;
default:
return false;
@@ -301,7 +298,7 @@ internal static class LoopWanted
public static string GetSuffix(PlayerControl seer, PlayerControl target, bool hud = false)
{
if (seer.PlayerId != target.PlayerId || GameStates.IsMeeting || (seer.IsModdedClient() && !hud)) return string.Empty;
if (seer.PlayerId != target.PlayerId || GameStates.IsMeeting) return string.Empty;
byte targetId = GetTarget(seer.PlayerId);
if (targetId == byte.MaxValue) return string.Empty;
@@ -309,7 +306,7 @@ internal static class LoopWanted
Suffix.Clear();
Suffix.Append("<#D9BAA5>");
Suffix.Append(hud ? GetString("LoopWanted.CurrentTarget") : GetString("Target"));
Suffix.Append(hud ? GetString("DoomTag.CurrentTarget") : GetString("Target"));
Suffix.Append(": <b>");
Suffix.Append(targetId.ColoredPlayerName());
Suffix.Append("</b>");
@@ -325,7 +322,7 @@ internal static class LoopWanted
if (CarnivalMode)
{
Suffix.Append("\n<#ff6600>");
Suffix.Append(GetString("LoopWanted.CarnivalModeHUD"));
Suffix.Append(GetString("DoomTag.CarnivalModeHUD"));
Suffix.Append("</color>");
}
@@ -336,8 +333,8 @@ internal static class LoopWanted
{
if (!AmongUsClient.Instance.AmHost) return;
var writer = Utils.CreateRPC(CustomRPC.LoopWantedSync);
writer.WritePacked(2);
var writer = Utils.CreateRPC(CustomRPC.DoomTagSync);
writer.Write(2);
writer.Write(TargetMap.Count);
foreach (var kvp in TargetMap)
{
@@ -391,7 +388,7 @@ internal static class LoopWanted
public static void Postfix()
{
if (!Main.IntroDestroyed || !GameStates.IsInTask || ExileController.Instance || Options.CurrentGameMode != CustomGameMode.LoopWanted || !AmongUsClient.Instance.AmHost) return;
if (!Main.IntroDestroyed || !GameStates.IsInTask || ExileController.Instance || Options.CurrentGameMode != CustomGameMode.DoomTag || !AmongUsClient.Instance.AmHost) return;
long now = Utils.TimeStamp;
if (IntroCutsceneDestroyPatch.IntroDestroyTS + 10 > now || LastFixedUpdate == now) return;
+3 -3
View File
@@ -148,7 +148,7 @@ public class Main : BasePlugin
[CustomGameMode.CaptureTheFlag] = [],
[CustomGameMode.NaturalDisasters] = [],
[CustomGameMode.Snowdown] = [],
[CustomGameMode.LoopWanted] = []
[CustomGameMode.DoomTag] = []
};
public static Dictionary<CustomGameMode, Color> GameModeColors = [];
@@ -885,7 +885,7 @@ public class Main : BasePlugin
// Snowdown
{ CustomRoles.SnowdownPlayer, "#e4fdff" },
// Loop Wanted
{ CustomRoles.LoopHunter, "#D9BAA5" },
{ CustomRoles.Tagger, "#D9BAA5" },
// Hide And Seek
{ CustomRoles.Seeker, "#ff1919" },
{ CustomRoles.Hider, "#345eeb" },
@@ -976,7 +976,7 @@ public class Main : BasePlugin
[CustomGameMode.Deathrace] = Utils.GetRoleColor(CustomRoles.Racer),
[CustomGameMode.Mingle] = Utils.GetRoleColor(CustomRoles.MinglePlayer),
[CustomGameMode.Snowdown] = Utils.GetRoleColor(CustomRoles.SnowdownPlayer),
[CustomGameMode.LoopWanted] = Utils.GetRoleColor(CustomRoles.LoopHunter)
[CustomGameMode.DoomTag] = Utils.GetRoleColor(CustomRoles.Tagger)
};
IL2CPPChainloader.Instance.Finished += () =>
+1 -1
View File
@@ -37,7 +37,7 @@ internal static class CustomRoleSelector
{ CustomGameMode.Deathrace, CustomRoles.Racer },
{ CustomGameMode.Mingle, CustomRoles.MinglePlayer },
{ CustomGameMode.Snowdown, CustomRoles.SnowdownPlayer },
{ CustomGameMode.LoopWanted, CustomRoles.LoopHunter }
{ CustomGameMode.DoomTag, CustomRoles.Tagger }
};
public static void SelectCustomRoles()
+3 -4
View File
@@ -75,7 +75,7 @@ internal static class CustomRolesHelper
CustomRoles.Racer or
CustomRoles.MinglePlayer or
CustomRoles.SnowdownPlayer or
CustomRoles.LoopHunter;
CustomRoles.Tagger;
}
public RoleBase GetRoleClass()
@@ -435,7 +435,6 @@ internal static class CustomRolesHelper
CustomRoles.TMGPlayer => CustomRoles.Crewmate,
// Mingle
CustomRoles.MinglePlayer => CustomRoles.Crewmate,
_ => role.IsImpostor() ? CustomRoles.Impostor : CustomRoles.Crewmate
};
}
@@ -487,8 +486,8 @@ internal static class CustomRolesHelper
CustomRoles.Racer => RoleTypes.Phantom,
// Snowdown
CustomRoles.SnowdownPlayer => RoleTypes.Phantom,
// LoopWanted
CustomRoles.LoopHunter => RoleTypes.Impostor,
// DoomTag
CustomRoles.Tagger => RoleTypes.Impostor,
// Standard
CustomRoles.Sheriff => UsePets && Sheriff.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
CustomRoles.Crusader => UsePets && Crusader.UsePet.GetBool() ? RoleTypes.GuardianAngel : RoleTypes.Impostor,
+4 -4
View File
@@ -373,7 +373,7 @@ internal static class ExtendedPlayerControl
RoleTypes newRoleType = state.MainRole.GetRoleTypes();
CustomGameMode gameMode = Options.CurrentGameMode;
if (gameMode is CustomGameMode.SoloPVP or CustomGameMode.FFA or CustomGameMode.CaptureTheFlag or CustomGameMode.KingOfTheZones or CustomGameMode.BedWars or CustomGameMode.Snowdown or CustomGameMode.LoopWanted)
if (gameMode is CustomGameMode.SoloPVP or CustomGameMode.FFA or CustomGameMode.CaptureTheFlag or CustomGameMode.KingOfTheZones or CustomGameMode.BedWars or CustomGameMode.Snowdown or CustomGameMode.DoomTag)
hasValue |= sender.RpcSetRole(player, newRoleType, player.OwnerId);
player.ResetKillCooldown();
@@ -1339,7 +1339,7 @@ internal static class ExtendedPlayerControl
case CustomGameMode.BedWars:
case CustomGameMode.Deathrace:
case CustomGameMode.Snowdown:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
return true;
}
@@ -1400,7 +1400,7 @@ internal static class ExtendedPlayerControl
CustomGameMode.TheMindGame => false,
CustomGameMode.Mingle => false,
CustomGameMode.Snowdown => true,
CustomGameMode.LoopWanted => false,
CustomGameMode.DoomTag => false,
CustomGameMode.Deathrace => Deathrace.CanUseVent(player, player.GetClosestVent().Id),
CustomGameMode.Standard when CopyCat.PlayerIdList.Contains(player.PlayerId) => true,
@@ -1786,7 +1786,7 @@ internal static class ExtendedPlayerControl
CustomRoles.BedWarsPlayer => 1f,
CustomRoles.Racer => 3f,
CustomRoles.SnowdownPlayer => 10f,
CustomRoles.LoopHunter => LoopWanted.BaseKillCooldown.GetFloat(),
CustomRoles.Tagger => DoomTag.BaseKillCooldown.GetFloat(),
_ when player.Is(CustomRoles.Underdog) => Main.AllAlivePlayerControlsCount <= Underdog.UnderdogMaximumPlayersNeededToKill.GetInt() ? Underdog.UnderdogKillCooldownWithLessPlayersAlive.GetInt() : Underdog.UnderdogKillCooldownWithMorePlayersAlive.GetInt(),
_ => Main.AllPlayerKillCooldown[player.PlayerId]
};
+2 -2
View File
@@ -199,8 +199,8 @@ public static class FixedUpdateCaller
case CustomGameMode.Mingle:
Mingle.FixedUpdatePatch.Postfix();
goto default;
case CustomGameMode.LoopWanted:
LoopWanted.FixedUpdatePatch.Postfix();
case CustomGameMode.DoomTag:
DoomTag.FixedUpdatePatch.Postfix();
goto default;
default:
if (Options.IntegrateNaturalDisasters.GetBool()) goto case CustomGameMode.NaturalDisasters;
@@ -391,9 +391,9 @@ public sealed class PlayerGameOptionsSender(PlayerControl player) : GameOptionsS
Snowdown.ApplyGameOptions();
goto case CustomGameMode.RoomRush;
}
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
{
LoopWanted.ApplyGameOptions(opt, player.PlayerId);
DoomTag.ApplyGameOptions(opt, player.PlayerId);
break;
}
case CustomGameMode.NaturalDisasters:
+1 -1
View File
@@ -43,7 +43,7 @@ public static class NameColorManager
color = FreeForAll.TeamColors.GetValueOrDefault(team, "#00ffff");
return true;
case CustomGameMode.Snowdown:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
case CustomGameMode.Mingle:
case CustomGameMode.RoomRush:
case CustomGameMode.NaturalDisasters:
+5 -5
View File
@@ -35,7 +35,7 @@ public enum CustomGameMode
Deathrace = 0x0F,
Mingle = 0x10,
Snowdown = 0x11,
LoopWanted = 0x12,
DoomTag = 0x12,
All = int.MaxValue
}
@@ -91,7 +91,7 @@ public static class Options
"Deathrace",
"Mingle",
"Snowdown",
"LoopWanted"
"DoomTag"
];
private static Dictionary<CustomRoles, int> roleCounts;
@@ -931,7 +931,7 @@ public static class Options
14 => CustomGameMode.Deathrace,
15 => CustomGameMode.Mingle,
16 => CustomGameMode.Snowdown,
17 => CustomGameMode.LoopWanted,
17 => CustomGameMode.DoomTag,
_ => CustomGameMode.Standard
};
@@ -1862,8 +1862,8 @@ public static class Options
Mingle.SetupCustomOption();
// Snowdown
Snowdown.SetupCustomOption();
// LoopWanted
LoopWanted.SetupCustomOption();
// DoomTag
DoomTag.SetupCustomOption();
yield return null;
+3 -3
View File
@@ -180,7 +180,7 @@ public enum CustomRPC
TMGSync,
BedWarsSync,
DeathraceSync,
LoopWantedSync
DoomTagSync
// The total number of RPCs must not exceed 255
// Because HandleRpc accepts Rpc in byte (max 255) system, and it will be impossible to use int
@@ -1275,9 +1275,9 @@ internal static class RPCHandlerPatch
break;
}
case CustomRPC.LoopWantedSync:
case CustomRPC.DoomTagSync:
{
LoopWanted.ReceiveRPC(reader);
DoomTag.ReceiveRPC(reader);
break;
}
case CustomRPC.InspectorCommand:
+9 -9
View File
@@ -849,7 +849,7 @@ public static class Utils
case CustomGameMode.Deathrace:
case CustomGameMode.Mingle:
case CustomGameMode.Snowdown:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
return false;
case CustomGameMode.HideAndSeek:
return CustomHnS.HasTasks(p);
@@ -1517,7 +1517,7 @@ public static class Utils
break;
case CustomGameMode.Snowdown:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
case CustomGameMode.Mingle:
case CustomGameMode.Deathrace:
case CustomGameMode.BedWars:
@@ -2546,7 +2546,7 @@ public static class Utils
CustomGameMode.Deathrace => CustomRoles.Racer.ColoredTextByRole($"{modeText}\r\n") + name,
CustomGameMode.Mingle => CustomRoles.MinglePlayer.ColoredTextByRole($"{modeText}\r\n") + name,
CustomGameMode.Snowdown => CustomRoles.SnowdownPlayer.ColoredTextByRole($"{modeText}\r\n") + name,
CustomGameMode.LoopWanted => CustomRoles.LoopHunter.ColoredTextByRole($"{modeText}\r\n") + name,
CustomGameMode.DoomTag => CustomRoles.Tagger.ColoredTextByRole($"{modeText}\r\n") + name,
_ => name
};
}
@@ -3045,8 +3045,8 @@ public static class Utils
case CustomGameMode.Snowdown:
AdditionalSuffixes.Add(Snowdown.GetSuffix(seer, seer));
break;
case CustomGameMode.LoopWanted:
AdditionalSuffixes.Add(LoopWanted.GetSuffix(seer, seer));
case CustomGameMode.DoomTag:
AdditionalSuffixes.Add(DoomTag.GetSuffix(seer, seer));
break;
}
@@ -3115,7 +3115,7 @@ public static class Utils
SelfSuffix.Append($"\n\n<#ffffff>{GetString($"GameModeTutorial.{Options.CurrentGameMode}")}</color>\n");
}
bool noRoleText = GameStates.IsLobby || Options.CurrentGameMode is CustomGameMode.CaptureTheFlag or CustomGameMode.NaturalDisasters or CustomGameMode.RoomRush or CustomGameMode.KingOfTheZones or CustomGameMode.Quiz or CustomGameMode.TheMindGame or CustomGameMode.BedWars or CustomGameMode.Deathrace or CustomGameMode.Mingle or CustomGameMode.Snowdown or CustomGameMode.LoopWanted;
bool noRoleText = GameStates.IsLobby || Options.CurrentGameMode is CustomGameMode.CaptureTheFlag or CustomGameMode.NaturalDisasters or CustomGameMode.RoomRush or CustomGameMode.KingOfTheZones or CustomGameMode.Quiz or CustomGameMode.TheMindGame or CustomGameMode.BedWars or CustomGameMode.Deathrace or CustomGameMode.Mingle or CustomGameMode.Snowdown or CustomGameMode.DoomTag;
// Combine the seer's job title and SelfTaskText with the seer's player name and SelfMark
string selfRoleName = noRoleText ? string.Empty : $"<size={fontSize}>{seer.GetDisplayRoleName()}{selfTaskText}</size>";
@@ -3207,7 +3207,7 @@ public static class Utils
CustomGameMode.Quiz => true,
CustomGameMode.Deathrace => true,
CustomGameMode.Mingle => true,
CustomGameMode.LoopWanted => true,
CustomGameMode.DoomTag => true,
_ => false
};
@@ -3315,7 +3315,7 @@ public static class Utils
if (IsRevivingRoleAlive() && Main.DiedThisRound.Contains(seer.PlayerId))
targetRoleText = string.Empty;
if (Options.CurrentGameMode is CustomGameMode.CaptureTheFlag or CustomGameMode.NaturalDisasters or CustomGameMode.RoomRush or CustomGameMode.KingOfTheZones or CustomGameMode.Quiz or CustomGameMode.TheMindGame or CustomGameMode.BedWars or CustomGameMode.Deathrace or CustomGameMode.Mingle or CustomGameMode.Snowdown or CustomGameMode.LoopWanted)
if (Options.CurrentGameMode is CustomGameMode.CaptureTheFlag or CustomGameMode.NaturalDisasters or CustomGameMode.RoomRush or CustomGameMode.KingOfTheZones or CustomGameMode.Quiz or CustomGameMode.TheMindGame or CustomGameMode.BedWars or CustomGameMode.Deathrace or CustomGameMode.Mingle or CustomGameMode.Snowdown or CustomGameMode.DoomTag)
targetRoleText = string.Empty;
if (!GameStates.IsLobby)
@@ -3651,7 +3651,7 @@ public static class Utils
case CustomGameMode.Deathrace:
case CustomGameMode.Mingle:
case CustomGameMode.Snowdown:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
return local.Is(CustomRoles.GM);
case CustomGameMode.Standard:
+4 -4
View File
@@ -605,9 +605,9 @@ internal static class GameEndChecker
Predicate = new SnowdownGameEndPredicate();
}
public static void SetPredicateToLoopWanted()
public static void SetPredicateToDoomTag()
{
Predicate = new LoopWantedGameEndPredicate();
Predicate = new DoomTagGameEndPredicate();
}
private class NormalGameEndPredicate : GameEndPredicate
@@ -1386,7 +1386,7 @@ internal static class GameEndChecker
}
}
private class LoopWantedGameEndPredicate : GameEndPredicate
private class DoomTagGameEndPredicate : GameEndPredicate
{
public override bool CheckForGameEnd(out GameOverReason reason)
{
@@ -1396,7 +1396,7 @@ internal static class GameEndChecker
private static bool CheckGameEndByLivingPlayers(out GameOverReason reason)
{
return LoopWanted.CheckForGameEnd(out reason);
return DoomTag.CheckForGameEnd(out reason);
}
}
+2 -2
View File
@@ -332,7 +332,7 @@ internal static class HudManagerPatch
CustomGameMode.NaturalDisasters when AmongUsClient.Instance.AmHost => NaturalDisasters.SuffixText,
CustomGameMode.Deathrace => Deathrace.GetSuffix(player, player, true),
CustomGameMode.Snowdown => Snowdown.GetHudText(),
CustomGameMode.LoopWanted => LoopWanted.GetSuffix(player, player, true),
CustomGameMode.DoomTag => DoomTag.GetSuffix(player, player, true),
CustomGameMode.Standard => state.Role.GetSuffix(player, player, true, GameStates.IsMeeting) + GetAddonSuffixes(),
_ => string.Empty
};
@@ -705,7 +705,7 @@ internal static class SetHudActivePatch
case CustomGameMode.RoomRush:
__instance.ImpostorVentButton?.ToggleVisible(false);
goto case CustomGameMode.HideAndSeek;
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
case CustomGameMode.KingOfTheZones:
__instance.ReportButton?.ToggleVisible(false);
__instance.SabotageButton?.ToggleVisible(false);
+8 -8
View File
@@ -310,11 +310,11 @@ internal static class SetUpRoleTextPatch
__instance.RoleBlurbText.text = GetString("SnowdownPlayerInfo");
break;
}
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
{
Color color = Utils.GetRoleColor(CustomRoles.LoopHunter);
Color color = Utils.GetRoleColor(CustomRoles.Tagger);
__instance.YouAreText.transform.gameObject.SetActive(false);
__instance.RoleText.text = GetString("LoopHunter");
__instance.RoleText.text = GetString("Tagger");
__instance.RoleText.color = color;
__instance.RoleBlurbText.color = color;
__instance.RoleBlurbText.text = GetString("LoopHunterInfo");
@@ -1027,10 +1027,10 @@ internal static class BeginCrewmatePatch
__instance.ImpostorText.text = GetString("SnowdownPlayerInfo");
break;
}
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
{
__instance.TeamTitle.text = GetString("LoopHunter");
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = Utils.GetRoleColor(CustomRoles.LoopHunter);
__instance.TeamTitle.text = GetString("Tagger");
__instance.TeamTitle.color = __instance.BackgroundBar.material.color = Utils.GetRoleColor(CustomRoles.Tagger);
PlayerControl.LocalPlayer.Data.Role.IntroSound = GetIntroSound(RoleTypes.Impostor);
__instance.ImpostorText.gameObject.SetActive(true);
__instance.ImpostorText.text = GetString("LoopHunterInfo");
@@ -1388,8 +1388,8 @@ internal static class IntroCutsceneDestroyPatch
case CustomGameMode.Snowdown:
Snowdown.GameStart();
break;
case CustomGameMode.LoopWanted:
LoopWanted.OnGameStart();
case CustomGameMode.DoomTag:
DoomTag.OnGameStart();
break;
}
+5 -5
View File
@@ -316,7 +316,7 @@ internal static class ChangeRoleSettings
HotPotato.Init();
CustomHnS.Init();
Speedrun.Init();
LoopWanted.Init();
DoomTag.Init();
}
catch (Exception e) { Utils.ThrowException(e); }
@@ -952,8 +952,8 @@ internal static class StartGameHostPatch
case CustomGameMode.Snowdown:
Snowdown.Init();
goto default;
case CustomGameMode.LoopWanted:
LoopWanted.OnGameStart();
case CustomGameMode.DoomTag:
DoomTag.OnGameStart();
goto default;
default:
if (Options.IntegrateNaturalDisasters.GetBool()) goto case CustomGameMode.NaturalDisasters;
@@ -1027,8 +1027,8 @@ internal static class StartGameHostPatch
case CustomGameMode.Snowdown:
GameEndChecker.SetPredicateToSnowdown();
break;
case CustomGameMode.LoopWanted:
GameEndChecker.SetPredicateToLoopWanted();
case CustomGameMode.DoomTag:
GameEndChecker.SetPredicateToDoomTag();
break;
}
+2 -2
View File
@@ -67,7 +67,7 @@ internal static class EndGamePatch
long secondsIn = new DateTimeOffset(date.ToUniversalTime()).ToUnixTimeSeconds() - IntroCutsceneDestroyPatch.IntroDestroyTS;
byte killerId = value.GetRealKiller();
bool gmIsFm = Options.CurrentGameMode is CustomGameMode.FFA or CustomGameMode.StopAndGo;
bool gmIsFmhh = gmIsFm || Options.CurrentGameMode is CustomGameMode.HotPotato or CustomGameMode.HideAndSeek or CustomGameMode.Speedrun or CustomGameMode.CaptureTheFlag or CustomGameMode.NaturalDisasters or CustomGameMode.RoomRush or CustomGameMode.KingOfTheZones or CustomGameMode.Quiz or CustomGameMode.TheMindGame or CustomGameMode.BedWars or CustomGameMode.Deathrace or CustomGameMode.Mingle or CustomGameMode.Snowdown or CustomGameMode.LoopWanted;
bool gmIsFmhh = gmIsFm || Options.CurrentGameMode is CustomGameMode.HotPotato or CustomGameMode.HideAndSeek or CustomGameMode.Speedrun or CustomGameMode.CaptureTheFlag or CustomGameMode.NaturalDisasters or CustomGameMode.RoomRush or CustomGameMode.KingOfTheZones or CustomGameMode.Quiz or CustomGameMode.TheMindGame or CustomGameMode.BedWars or CustomGameMode.Deathrace or CustomGameMode.Mingle or CustomGameMode.Snowdown or CustomGameMode.DoomTag;
sb.Append($"\n{secondsIn / 60:00}:{secondsIn % 60:00} {Main.AllPlayerNames[key]} ({(gmIsFmhh ? string.Empty : Utils.GetDisplayRoleName(key, pure: true))}{(gmIsFm ? string.Empty : Utils.GetSubRolesText(key, summary: true))}) [{Utils.GetVitalText(key)}]");
if (killerId != byte.MaxValue && killerId != key) sb.Append($"\n\t⇐ {Main.AllPlayerNames[killerId]} ({(gmIsFmhh ? string.Empty : Utils.GetDisplayRoleName(killerId, pure: true))}{(gmIsFm ? string.Empty : Utils.GetSubRolesText(killerId, summary: true))})");
}
@@ -601,7 +601,7 @@ internal static class SetEverythingUpPatch
case CustomGameMode.Deathrace:
case CustomGameMode.BedWars:
case CustomGameMode.Quiz:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
{
foreach (byte id in cloneRoles.Where(EndGamePatch.SummaryText.ContainsKey))
sb.Append('\n').Append(EndGamePatch.SummaryText[id]);
+3 -3
View File
@@ -258,8 +258,8 @@ internal static class CheckMurderPatch
case CustomGameMode.Snowdown:
Snowdown.OnCheckMurder(killer, target);
return false;
case CustomGameMode.LoopWanted:
LoopWanted.OnCheckMurder(killer, target);
case CustomGameMode.DoomTag:
DoomTag.OnCheckMurder(killer, target);
return false;
}
@@ -2311,7 +2311,7 @@ internal static class EnterVentPatch
case CustomGameMode.TheMindGame:
case CustomGameMode.Quiz:
case CustomGameMode.SoloPVP when !SoloPVP.CanVent:
case CustomGameMode.LoopWanted:
case CustomGameMode.DoomTag:
pc.MyPhysics?.RpcBootFromVent(__instance.Id);
break;
}
+1 -1
View File
@@ -260,7 +260,7 @@ internal static class CloseDoorsPatch
{
public static bool Prefix(ShipStatus __instance, [HarmonyArgument(0)] SystemTypes room)
{
bool allow = !AntiBlackout.SkipTasks && Options.CurrentGameMode is not CustomGameMode.SoloPVP and not CustomGameMode.FFA and not CustomGameMode.StopAndGo and not CustomGameMode.HotPotato and not CustomGameMode.Speedrun and not CustomGameMode.CaptureTheFlag and not CustomGameMode.NaturalDisasters and not CustomGameMode.RoomRush and not CustomGameMode.KingOfTheZones and not CustomGameMode.Quiz and not CustomGameMode.TheMindGame and not CustomGameMode.BedWars and not CustomGameMode.Deathrace and not CustomGameMode.Mingle and not CustomGameMode.Snowdown and not CustomGameMode.LoopWanted;
bool allow = !AntiBlackout.SkipTasks && Options.CurrentGameMode is not CustomGameMode.SoloPVP and not CustomGameMode.FFA and not CustomGameMode.StopAndGo and not CustomGameMode.HotPotato and not CustomGameMode.Speedrun and not CustomGameMode.CaptureTheFlag and not CustomGameMode.NaturalDisasters and not CustomGameMode.RoomRush and not CustomGameMode.KingOfTheZones and not CustomGameMode.Quiz and not CustomGameMode.TheMindGame and not CustomGameMode.BedWars and not CustomGameMode.Deathrace and not CustomGameMode.Mingle and not CustomGameMode.Snowdown and not CustomGameMode.DoomTag;
if (Doorjammer.JammedRooms.Contains(room)) allow = false;
if (SecurityGuard.BlockSabo.Count > 0) allow = false;
+21 -21
View File
@@ -4090,9 +4090,9 @@
"SnowdownPlayer": "SNOWDOWN",
"SnowdownPlayerInfo": "THROW SNOWBALLS AT PLAYERS",
"SnowdownPlayerInfoLong": "THROW SNOWBALLS AT PLAYERS",
"LoopHunter": "LOOP HUNTER",
"LoopHunterInfo": "KILL YOUR ASSIGNED TARGET AND SURVIVE",
"LoopHunterInfoLong": "KILL YOUR ASSIGNED TARGET AND SURVIVE",
"Tagger": "TAGGER",
"TaggerInfo": "KILL YOUR ASSIGNED TARGET AND SURVIVE",
"TaggerInfoLong": "KILL YOUR ASSIGNED TARGET AND SURVIVE",
"TMGPlayer": "THE MIND GAME",
"TMGPlayerInfo": "THINK WITH OTHERS' BRAINS TO WIN",
"TMGPlayerInfoLong": "THINK WITH OTHERS' BRAINS TO WIN",
@@ -8164,24 +8164,24 @@
"Snowdown.SnowballThrowSpeedOption": "Snowball Throwing Speed",
"SnowdownButtonText": "THROW",
"LoopWanted": "LOOP WANTED",
"ModeLoopWanted": "Gamemode: Loop Wanted",
"ModeDescribe.LoopWanted": "In the Loop Wanted gamemode, every player has an assigned assassination target marked with an arrow. You can ONLY kill your designated target. Killing the wrong target results in a punishment (suicide / lower vision). When you kill your target, you inherit their target. When only a few players remain, Carnival Mode activates: everyone gets a speed boost and reduced kill cooldown. Last player alive wins!",
"GameModeTutorial.LoopWanted": "<size=90%>The current game mode is <#D9BAA5>Loop Wanted</color>.</size>\\n<size=80%>Each player has a target marked with an arrow.\\nYou can ONLY kill your target.\\nKilling the wrong target will punish you.\\nYour target transfers when you kill correctly.\\nCarnival mode activates when few remain!</size>",
"LoopWanted.BaseKillCooldown": "Base Kill Cooldown",
"LoopWanted.PunishmentMode": "Wrong Kill Punishment",
"LoopWanted.PunishSuicide": "Suicide",
"LoopWanted.PunishLowerVision": "Lower Vision",
"LoopWanted.LowerVisionMultiplier": "Lowered Vision Multiplier",
"LoopWanted.CarnivalPlayerCount": "Players to Trigger Carnival Mode",
"LoopWanted.CarnivalKillCooldown": "Carnival Mode Kill Cooldown",
"LoopWanted.CarnivalSpeedMultiplier": "Carnival Mode Speed Multiplier",
"LoopWanted.ShowTargetArrow": "Show Target Arrow",
"LoopWanted.CurrentTarget": "Current Target",
"LoopWanted.CarnivalModeActivated": "<color=#ff6600>Carnival Mode! Speed up and kill faster!</color>",
"LoopWanted.CarnivalModeHUD": "CARNIVAL",
"LoopWanted.WrongKillSuicide": "<color=#ff0000>Wrong target! You committed suicide.</color>",
"LoopWanted.WrongKillLowerVision": "<color=#ff0000>Wrong target! Your vision has been reduced.</color>",
"DoomTag": "DOOM TAG",
"ModeDoomTag": "Gamemode: Doom Tag",
"ModeDescribe.DoomTag": "In the Doom Tag gamemode, every player has an assigned assassination target marked with an arrow. You can ONLY kill your designated target. Killing the wrong target results in a punishment (suicide / lower vision). When you kill your target, you inherit their target. When only a few players remain, Carnival Mode activates: everyone gets a speed boost and reduced kill cooldown. Last player alive wins!",
"GameModeTutorial.DoomTag": "<size=90%>The current game mode is <#D9BAA5>Doom Tag</color>.</size>\\n<size=80%>Each player has a target marked with an arrow.\\nYou can ONLY kill your target.\\nKilling the wrong target will punish you.\\nYour target transfers when you kill correctly.\\nCarnival mode activates when few remain!</size>",
"DoomTag.BaseKillCooldown": "Base Kill Cooldown",
"DoomTag.PunishmentMode": "Wrong Kill Punishment",
"DoomTag.PunishSuicide": "Suicide",
"DoomTag.PunishLowerVision": "Lower Vision",
"DoomTag.LowerVisionMultiplier": "Lowered Vision Multiplier",
"DoomTag.CarnivalPlayerCount": "Players to Trigger Carnival Mode",
"DoomTag.CarnivalKillCooldown": "Carnival Mode Kill Cooldown",
"DoomTag.CarnivalSpeedMultiplier": "Carnival Mode Speed Multiplier",
"DoomTag.ShowTargetArrow": "Show Target Arrow",
"DoomTag.CurrentTarget": "Current Target",
"DoomTag.CarnivalModeActivated": "<color=#ff6600>Carnival Mode! Speed up and kill faster!</color>",
"DoomTag.CarnivalModeHUD": "CARNIVAL",
"DoomTag.WrongKillSuicide": "<color=#ff0000>Wrong target! You committed suicide.</color>",
"DoomTag.WrongKillLowerVision": "<color=#ff0000>Wrong target! Your vision has been reduced.</color>",
"SoloPVP": "SOLO PVP",
"ModeSoloPVP": "Gamemode: Solo PVP",
+19 -19
View File
@@ -4089,7 +4089,7 @@
"SnowdownPlayer": "大雪纷飞",
"SnowdownPlayerInfo": "吃我一记雪球",
"SnowdownPlayerInfoLong": "吃我一记雪球",
"LoopHunter": "循环追猎者",
"Tagger": "循环追猎者",
"LoopHunterInfo": "追杀你的指定目标并活到最后",
"LoopHunterInfoLong": "追杀你的指定目标并活到最后",
"TMGPlayer": "心理游戏",
@@ -8163,24 +8163,24 @@
"Snowdown.SnowballThrowSpeedOption": "丢雪球的速度",
"SnowdownButtonText": "丢",
"LoopWanted": "循环追捕令",
"ModeLoopWanted": "游戏模式:循环追捕令",
"ModeDescribe.LoopWanted": "在循环追捕令游戏模式中,每个玩家都有一个带有箭头的追杀目标。你只能击杀你被指定的目标。击杀错误目标会受到惩罚(自杀 / 冷却增加 / 视野降低)。当你击杀目标后,目标的追杀对象将转移到你身上。当剩余人数足够少时,将进入狂欢状态——全员加速且击杀冷却减少。活到最后的人获胜!",
"GameModeTutorial.LoopWanted": "<size=90%>当前游戏模式为:<#ffb432>循环追捕令</color>。</size>\\n<size=80%>每个玩家都有一个带箭头的追杀目标。\\n你只能击杀你所指定目标!\\n击杀错误目标会受到惩罚。\\n击杀正确目标后目标转移。\\n剩余人数过少时将进入狂欢状态!</size>",
"LoopWanted.BaseKillCooldown": "基础击杀冷却",
"LoopWanted.PunishmentMode": "击杀错误后的惩罚",
"LoopWanted.PunishSuicide": "自杀",
"LoopWanted.PunishLowerVision": "视野降低",
"LoopWanted.LowerVisionMultiplier": "降低视野倍率",
"LoopWanted.CarnivalPlayerCount": "进入狂欢模式的人数",
"LoopWanted.CarnivalKillCooldown": "狂欢状态击杀冷却",
"LoopWanted.CarnivalSpeedMultiplier": "狂欢状态下加速倍率",
"LoopWanted.ShowTargetArrow": "显示目标箭头",
"LoopWanted.CurrentTarget": "当前目标",
"LoopWanted.CarnivalModeActivated": "<color=#ff6600>进入狂欢状态!全速前进,击杀加速!</color>",
"LoopWanted.CarnivalModeHUD": "狂欢中",
"LoopWanted.WrongKillSuicide": "<color=#ff0000>目标是错误的!你自杀了。</color>",
"LoopWanted.WrongKillLowerVision": "<color=#ff0000>目标是错误的!你的视野降低了。</color>",
"DoomTag": "循环追捕令",
"ModeDoomTag": "游戏模式:循环追捕令",
"ModeDescribe.DoomTag": "在循环追捕令游戏模式中,每个玩家都有一个带有箭头的追杀目标。你只能击杀你被指定的目标。击杀错误目标会受到惩罚(自杀 / 冷却增加 / 视野降低)。当你击杀目标后,目标的追杀对象将转移到你身上。当剩余人数足够少时,将进入狂欢状态——全员加速且击杀冷却减少。活到最后的人获胜!",
"GameModeTutorial.DoomTag": "<size=90%>当前游戏模式为:<#ffb432>循环追捕令</color>。</size>\\n<size=80%>每个玩家都有一个带箭头的追杀目标。\\n你只能击杀你所指定目标!\\n击杀错误目标会受到惩罚。\\n击杀正确目标后目标转移。\\n剩余人数过少时将进入狂欢状态!</size>",
"DoomTag.BaseKillCooldown": "基础击杀冷却",
"DoomTag.PunishmentMode": "击杀错误后的惩罚",
"DoomTag.PunishSuicide": "自杀",
"DoomTag.PunishLowerVision": "视野降低",
"DoomTag.LowerVisionMultiplier": "降低视野倍率",
"DoomTag.CarnivalPlayerCount": "进入狂欢模式的人数",
"DoomTag.CarnivalKillCooldown": "狂欢状态击杀冷却",
"DoomTag.CarnivalSpeedMultiplier": "狂欢状态下加速倍率",
"DoomTag.ShowTargetArrow": "显示目标箭头",
"DoomTag.CurrentTarget": "当前目标",
"DoomTag.CarnivalModeActivated": "<color=#ff6600>进入狂欢状态!全速前进,击杀加速!</color>",
"DoomTag.CarnivalModeHUD": "狂欢中",
"DoomTag.WrongKillSuicide": "<color=#ff0000>目标是错误的!你自杀了。</color>",
"DoomTag.WrongKillLowerVision": "<color=#ff0000>目标是错误的!你的视野降低了。</color>",
"SoloPVP": "角逐竞技",
"ModeSoloPVP": "游戏模式:角逐竞技",