From 835df7791246b873314fbdcb469b1e932a990066 Mon Sep 17 00:00:00 2001 From: Eisbison Date: Sat, 27 Mar 2021 15:57:38 +0100 Subject: [PATCH] Update source code --- Source Code/Buttons.cs | 82 ++++- Source Code/CredentialsPatch.cs | 7 +- Source Code/CustomButton.cs | 5 +- Source Code/EndGamePatch.cs | 347 ++++++++++++++------- Source Code/GameOptionsPatch.cs | 4 +- Source Code/Helpers.cs | 159 ++-------- Source Code/IntroPatch.cs | 167 +--------- Source Code/Main.cs | 41 ++- Source Code/MeetingPatch.cs | 12 +- Source Code/PlayerControlPatch.cs | 95 +++++- Source Code/RPC.cs | 135 +++++++- Source Code/Resources/Arrow.png | Bin 0 -> 10300 bytes Source Code/Resources/Garlic.png | Bin 0 -> 16611 bytes Source Code/Resources/GarlicBackground.png | Bin 0 -> 4781 bytes Source Code/Resources/GarlicButton.png | Bin 0 -> 18581 bytes Source Code/Resources/SidekickButton.png | Bin 0 -> 34174 bytes Source Code/Resources/TrackerButton.png | Bin 0 -> 18700 bytes Source Code/Resources/VampireButton.png | Bin 0 -> 17626 bytes Source Code/RoleAssignmentPatch.cs | 7 +- Source Code/RoleInfo.cs | 225 +++++++++++++ Source Code/ShipStatusPatch.cs | 15 +- Source Code/TheOtherRoles.cs | 79 ++++- Source Code/TheOtherRoles.csproj | 2 + Source Code/UpdatePatch.cs | 70 +++-- Source Code/UsablesPatch.cs | 4 + 25 files changed, 986 insertions(+), 470 deletions(-) create mode 100644 Source Code/Resources/Arrow.png create mode 100644 Source Code/Resources/Garlic.png create mode 100644 Source Code/Resources/GarlicBackground.png create mode 100644 Source Code/Resources/GarlicButton.png create mode 100644 Source Code/Resources/SidekickButton.png create mode 100644 Source Code/Resources/TrackerButton.png create mode 100644 Source Code/Resources/VampireButton.png create mode 100644 Source Code/RoleInfo.cs diff --git a/Source Code/Buttons.cs b/Source Code/Buttons.cs index fc16fec..3f59c9b 100644 --- a/Source Code/Buttons.cs +++ b/Source Code/Buttons.cs @@ -28,6 +28,9 @@ namespace TheOtherRoles private static CustomButton trackerButton; private static CustomButton vampireKillButton; private static CustomButton garlicButton; + private static CustomButton jackalKillButton; + private static CustomButton sidekickKillButton; + private static CustomButton jackalSidekickButton; public static void setCustomButtonCooldowns() { engineerRepairButton.MaxTimer = 0f; @@ -40,12 +43,16 @@ namespace TheOtherRoles morphlingButton.MaxTimer = Morphling.cooldown; camouflagerButton.MaxTimer = Camouflager.cooldown; spyButton.MaxTimer = Spy.cooldown; - vampireKillButton.MaxTimer = PlayerControl.GameOptions.KillCooldown; + vampireKillButton.MaxTimer = Vampire.cooldown; trackerButton.MaxTimer = 0f; garlicButton.MaxTimer = 0f; spyButton.EffectDuration = Spy.duration; vampireKillButton.EffectDuration= Vampire.delay; + + jackalKillButton.MaxTimer = Jackal.cooldown; + sidekickKillButton.MaxTimer = Sidekick.cooldown; + jackalSidekickButton.MaxTimer = Jackal.createSidekickCooldown; } public static void Postfix(HudManager __instance) @@ -133,16 +140,19 @@ namespace TheOtherRoles MessageWriter attemptWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.ShieldedMurderAttempt, Hazel.SendOption.None, -1); AmongUsClient.Instance.FinishRpcImmediately(attemptWriter); RPCProcedure.shieldedMurderAttempt(); - return; } byte targetId = 0; - if (Sheriff.currentTarget.Data.IsImpostor || (Sheriff.jesterCanDieToSheriff && Jester.jester != null && Jester.jester == Sheriff.currentTarget)) + if (Sheriff.currentTarget.Data.IsImpostor || + Sheriff.currentTarget == Jackal.jackal || + Sheriff.currentTarget == Sidekick.sidekick || + (Sheriff.jesterCanDieToSheriff && Jester.jester != null && Jester.jester == Sheriff.currentTarget)) { targetId = Sheriff.currentTarget.PlayerId; - else + } + else { targetId = PlayerControl.LocalPlayer.PlayerId; - + } MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SheriffKill, Hazel.SendOption.None, -1); killWriter.Write(targetId); AmongUsClient.Instance.FinishRpcImmediately(killWriter); @@ -361,11 +371,11 @@ namespace TheOtherRoles }, () => { return Vampire.vampire != null && Vampire.vampire == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; }, () => { - if (Vampire.targetNearGarlic) + if (Vampire.targetNearGarlic && Vampire.canKillNearGarlics) vampireKillButton.killButtonManager.renderer.sprite = __instance.KillButton.renderer.sprite; else vampireKillButton.killButtonManager.renderer.sprite = Vampire.getButtonSprite(); - return Vampire.currentTarget != null && PlayerControl.LocalPlayer.CanMove; + return Vampire.currentTarget != null && PlayerControl.LocalPlayer.CanMove && (!Vampire.targetNearGarlic || Vampire.canKillNearGarlics); }, () => { vampireKillButton.Timer = vampireKillButton.MaxTimer; @@ -403,6 +413,64 @@ namespace TheOtherRoles __instance, true ); + + + // Jackal Sidekick Button + jackalSidekickButton = new CustomButton( + () => { + MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalCreatesSidekick, Hazel.SendOption.None, -1); + writer.Write(Jackal.currentTarget.PlayerId); + AmongUsClient.Instance.FinishRpcImmediately(writer); + RPCProcedure.jackalCreatesSidekick(Jackal.currentTarget.PlayerId); + }, + () => { return Jackal.canCreateSidekick && Sidekick.sidekick == null && Jackal.fakeSidekick == null && Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; }, + () => { return Sidekick.sidekick == null && Jackal.fakeSidekick == null && Jackal.currentTarget != null && PlayerControl.LocalPlayer.CanMove; }, + () => { jackalSidekickButton.Timer = jackalSidekickButton.MaxTimer;}, + Jackal.getSidekickButtonSprite(), + new Vector3(-1.3f, 1.3f, 0f), + __instance + ); + + // Jackal Kill + jackalKillButton = new CustomButton( + () => { + if (!Helpers.handleMurderAttempt(Jackal.currentTarget)) return; + byte targetId = Jackal.currentTarget.PlayerId; + MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.JackalKill, Hazel.SendOption.None, -1); + killWriter.Write(targetId); + AmongUsClient.Instance.FinishRpcImmediately(killWriter); + RPCProcedure.jackalKill(targetId); + jackalKillButton.Timer = jackalKillButton.MaxTimer; + Jackal.currentTarget = null; + }, + () => { return Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; }, + () => { return Jackal.currentTarget && PlayerControl.LocalPlayer.CanMove; }, + () => { jackalKillButton.Timer = jackalKillButton.MaxTimer;}, + __instance.KillButton.renderer.sprite, + new Vector3(-1.3f, 0, 0), + __instance + ); + + // Sidekick Kill + sidekickKillButton = new CustomButton( + () => { + if (!Helpers.handleMurderAttempt(Sidekick.currentTarget)) return; + byte targetId = Sidekick.currentTarget.PlayerId; + MessageWriter killWriter = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickKill, Hazel.SendOption.None, -1); + killWriter.Write(targetId); + AmongUsClient.Instance.FinishRpcImmediately(killWriter); + RPCProcedure.sidekickKill(targetId); + + sidekickKillButton.Timer = sidekickKillButton.MaxTimer; + Sidekick.currentTarget = null; + }, + () => { return Sidekick.canKill && Sidekick.sidekick != null && Sidekick.sidekick == PlayerControl.LocalPlayer && !PlayerControl.LocalPlayer.Data.IsDead; }, + () => { return Sidekick.currentTarget && PlayerControl.LocalPlayer.CanMove; }, + () => { sidekickKillButton.Timer = sidekickKillButton.MaxTimer;}, + __instance.KillButton.renderer.sprite, + new Vector3(-1.3f, 0, 0), + __instance + ); } } } \ No newline at end of file diff --git a/Source Code/CredentialsPatch.cs b/Source Code/CredentialsPatch.cs index 9b4394f..28edb41 100644 --- a/Source Code/CredentialsPatch.cs +++ b/Source Code/CredentialsPatch.cs @@ -12,10 +12,11 @@ namespace TheOtherRoles { static void Postfix(VersionShower __instance) { string spacer = new String('\n', 15); + string text = "[FCCE03FF]TheOtherRoles[] v1.8.1:\n- Modded by [FCCE03FF]Eisbison[] and [FFEB91FF]Thunderstorm584[]\n- Balanced with [FFEB91FF]Dhalucard"; if (__instance.text.Text.Contains(spacer)) - __instance.text.Text += "\n[FFFFFFFF]- Loaded [FCCE03FF]TheOtherRoles[FFFFFFFF] v1.7\n by [FCCE03FF]Eisbison"; + __instance.text.Text += "\n" + text; else - __instance.text.Text += spacer + "[FFFFFFFF]- Loaded [FCCE03FF]TheOtherRoles[FFFFFFFF] v1.7\n by [FCCE03FF]Eisbison"; + __instance.text.Text += spacer + text; } } @@ -25,7 +26,7 @@ namespace TheOtherRoles static void Postfix(VersionShower __instance) { __instance.text.Text += "\n[FCCE03FF]TheOtherRoles[FFFFFFFF]"; - __instance.text.Text += "\nModded by [FCCE03FF]Eisbison"; + __instance.text.Text += "\nModded by [FCCE03FF]Eisbison[FFFFFFFF]"; } } } diff --git a/Source Code/CustomButton.cs b/Source Code/CustomButton.cs index 7f1b7c0..65f9af8 100644 --- a/Source Code/CustomButton.cs +++ b/Source Code/CustomButton.cs @@ -149,7 +149,10 @@ public class CustomButton } if (Timer >= 0) { - Timer -= Time.deltaTime; + if (HasEffect && isEffectActive) + Timer -= Time.deltaTime; + else if (!PlayerControl.LocalPlayer.inVent) + Timer -= Time.deltaTime; } if (Timer <= 0 && HasEffect && isEffectActive) { diff --git a/Source Code/EndGamePatch.cs b/Source Code/EndGamePatch.cs index 1118476..4e84313 100644 --- a/Source Code/EndGamePatch.cs +++ b/Source Code/EndGamePatch.cs @@ -12,13 +12,19 @@ using System; using System.Text; namespace TheOtherRoles { + enum CustomGameOverReason { + LoversWin = 10, + TeamJackalWin = 11 + } + enum WinCondition { Default, LoversTeamWin, LoversSoloWin, JesterWin, BountyHunterWin, - JesterAndBountyHunterWin + JesterAndBountyHunterWin, + JackalWin } static class AdditionalTempData { @@ -36,6 +42,12 @@ namespace TheOtherRoles { [HarmonyPatch(typeof(AmongUsClient), nameof(AmongUsClient.OnGameEnd))] public class OnGameEndPatch { + private static GameOverReason gameOverReason; + public static void Prefix(AmongUsClient __instance, ref GameOverReason OFLKLGMHBEL, bool JFFPAKGPNJA) { + gameOverReason = OFLKLGMHBEL; + if ((int)OFLKLGMHBEL >= 10) OFLKLGMHBEL = GameOverReason.ImpostorByKill; + } + public static void Postfix(AmongUsClient __instance, GameOverReason OFLKLGMHBEL, bool JFFPAKGPNJA) { AdditionalTempData.clear(); @@ -55,6 +67,23 @@ namespace TheOtherRoles { if (jesterWinner != null) TempData.winners.Remove(jesterWinner); } + // Remove Jackal and Sidekick from winners (on Jackal win he will be added again, see below) + if (Jackal.jackal != null || Sidekick.sidekick != null) { + List winnersToRemove = new List(); + foreach (WinningPlayerData winner in TempData.winners) { + if (winner.Name == Jackal.jackal?.Data?.PlayerName) winnersToRemove.Add(winner); + if (winner.Name == Sidekick.sidekick?.Data?.PlayerName) winnersToRemove.Add(winner); + foreach(var player in Jackal.formerJackals) { + if (winner.Name == player.Data.PlayerName) { + winnersToRemove.Add(winner); + } + } + } + + foreach (var winner in winnersToRemove) { + TempData.winners.Remove(winner); + } + } // Jester and Bounty Hunter win condition (should be implemented using a proper GameOverReason in the future) bool jesterWin = Jester.jester != null && Jester.jester.Data.IsImpostor; @@ -79,22 +108,51 @@ namespace TheOtherRoles { } // Lovers win conditions (should be implemented using a proper GameOverReason in the future) - else if (Lovers.existingAndAlive()) { + else if (Lovers.existingAndAlive() && gameOverReason == (GameOverReason)CustomGameOverReason.LoversWin) { AdditionalTempData.localIsLover = (PlayerControl.LocalPlayer == Lovers.lover1 || PlayerControl.LocalPlayer == Lovers.lover2); // Double win for lovers, crewmates also win - if (TempData.DidHumansWin(OFLKLGMHBEL)) { + if (!Lovers.existingWithImpLover()) { AdditionalTempData.winCondition = WinCondition.LoversTeamWin; + TempData.winners = new Il2CppSystem.Collections.Generic.List(); + foreach (PlayerControl p in PlayerControl.AllPlayerControls) { + if (p == null) continue; + if (p == Lovers.lover1 || p == Lovers.lover2) + TempData.winners.Add(new WinningPlayerData(p.Data)); + else if (p != Shifter.shifter && p != Jester.jester && p != Jackal.jackal && p != Sidekick.sidekick && !p.Data.IsImpostor) + TempData.winners.Add(new WinningPlayerData(p.Data)); + } } // Lovers solo win - else if (Lovers.existingWithImpLover()){ + else { AdditionalTempData.winCondition = WinCondition.LoversSoloWin; TempData.winners = new Il2CppSystem.Collections.Generic.List(); TempData.winners.Add(new WinningPlayerData(Lovers.lover1.Data)); TempData.winners.Add(new WinningPlayerData(Lovers.lover2.Data)); } } + + // Jackal win condition (should be implemented using a proper GameOverReason in the future) + else if (gameOverReason == (GameOverReason)CustomGameOverReason.TeamJackalWin && (Jackal.jackal != null && !Jackal.jackal.Data.IsDead || Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead)) { + // Jackal wins if nobody except jackal is alive + AdditionalTempData.winCondition = WinCondition.JackalWin; + TempData.winners = new Il2CppSystem.Collections.Generic.List(); + WinningPlayerData wpd = new WinningPlayerData(Jackal.jackal.Data); + wpd.IsImpostor = false; + TempData.winners.Add(wpd); + // If there is a sidekick. The sidekick also wins + if (Sidekick.sidekick != null) { + WinningPlayerData wpdSidekick = new WinningPlayerData(Sidekick.sidekick.Data); + wpdSidekick.IsImpostor = false; + TempData.winners.Add(wpdSidekick); + } + foreach(var player in Jackal.formerJackals) { + WinningPlayerData wpdFormerJackal = new WinningPlayerData(player.Data); + wpdFormerJackal.IsImpostor = false; + TempData.winners.Add(wpdFormerJackal); + } + } - // Reset Bonus Roles Settings + // Reset Role Settings clearAndReloadRoles(); clearGameHistory(); } @@ -128,11 +186,16 @@ namespace TheOtherRoles { textRenderer.Text = "Lovers And Crewmates Win"; textRenderer.Color = Lovers.color; __instance.BackgroundBar.material.SetColor("_Color", Lovers.color); - } else if (AdditionalTempData.winCondition == WinCondition.LoversSoloWin) { + } + else if (AdditionalTempData.winCondition == WinCondition.LoversSoloWin) { textRenderer.Text = "Lovers Win"; textRenderer.Color = Lovers.color; __instance.BackgroundBar.material.SetColor("_Color", Lovers.color); } + else if (AdditionalTempData.winCondition == WinCondition.JackalWin) { + textRenderer.Text = "Team Jackal Wins"; + textRenderer.Color = Jackal.color; + } AdditionalTempData.clear(); } @@ -140,144 +203,216 @@ namespace TheOtherRoles { [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.CheckEndCriteria))] class CheckEndCriteriaPatch{ - private static void ReviveEveryone() { - for (int i = 0; i < GameData.Instance.PlayerCount; i++) - GameData.Instance.AllPlayers[i].Object.Revive(); - DeadBody[] array = UnityEngine.Object.FindObjectsOfType(); - for (int i = 0; i < array.Length; i++) UnityEngine.Object.Destroy(array[i].gameObject); - } - private static void EndGameForSabotage(ShipStatus __instance) - { - if (!DestroyableSingleton.InstanceExists) - { - __instance.enabled = false; - ShipStatus.RpcEndGame(GameOverReason.ImpostorBySabotage, false); - return; - } - DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverSabotage, new Il2CppReferenceArray(0))); + public static bool Prefix(ShipStatus __instance) { + if (!GameData.Instance) return false; + var statistics = new PlayerStatistics(__instance); + if(CheckAndEndGameForSabotageWin(__instance)) return false; + if(CheckAndEndGameForTaskWin(__instance)) return false; + if(CheckAndEndGameForLoverWin(__instance, statistics)) return false; + if(CheckAndEndGameForJackalWin(__instance, statistics)) return false; + if(CheckAndEndGameForImpostorWin(__instance, statistics)) return false; + if(CheckAndEndGameForCrewmateWin(__instance, statistics)) return false; + return false; } - public static bool Prefix(ShipStatus __instance) { - if (!GameData.Instance) - { - return false; - } + private static bool CheckAndEndGameForSabotageWin(ShipStatus __instance) { ISystemType systemType = __instance.Systems.ContainsKey(SystemTypes.LifeSupp) ? __instance.Systems[SystemTypes.LifeSupp] : null; - if (systemType != null) - { + if (systemType != null) { LifeSuppSystemType lifeSuppSystemType = systemType.TryCast(); - if (lifeSuppSystemType.Countdown < 0f) - { + if (lifeSuppSystemType.Countdown < 0f) { EndGameForSabotage(__instance); lifeSuppSystemType.Countdown = 10000f; + return true; } } ISystemType systemType2 = __instance.Systems.ContainsKey(SystemTypes.Reactor) ? __instance.Systems[SystemTypes.Reactor] : null; - if (systemType2 == null) systemType2 = __instance.Systems.ContainsKey(SystemTypes.Laboratory) ? __instance.Systems[SystemTypes.Laboratory] : null; - if (systemType2 != null) - { + if (systemType2 == null) { + systemType2 = __instance.Systems.ContainsKey(SystemTypes.Laboratory) ? __instance.Systems[SystemTypes.Laboratory] : null; + } + if (systemType2 != null) { ReactorSystemType reactorSystemType = systemType2.TryCast(); - if (reactorSystemType.Countdown < 0f) - { + if (reactorSystemType.Countdown < 0f) { EndGameForSabotage(__instance); reactorSystemType.Countdown = 10000f; + return true; } } - int num = 0; - int num2 = 0; - int num3 = 0; - for (int i = 0; i < GameData.Instance.PlayerCount; i++) + return false; + } + + private static bool CheckAndEndGameForTaskWin(ShipStatus __instance) { + bool localCompletedAllTasks = true; + foreach (PlayerTask t in PlayerControl.LocalPlayer.myTasks) { + localCompletedAllTasks = localCompletedAllTasks && t.IsComplete; + } + + if (!DestroyableSingleton.InstanceExists) { - GameData.PlayerInfo playerInfo = GameData.Instance.AllPlayers[i]; - if (!playerInfo.Disconnected) + if (GameData.Instance.TotalTasks <= GameData.Instance.CompletedTasks) { - if (playerInfo.IsImpostor) - { - num3++; - } - if (!playerInfo.IsDead) - { - if (playerInfo.IsImpostor) - { - num2++; - } - else - { - num++; - } - } + __instance.enabled = false; + ShipStatus.RpcEndGame(GameOverReason.HumansByTask, false); + return true; } } - if (num2 <= 0 && (!DestroyableSingleton.InstanceExists || num3 > 0)) + else if (localCompletedAllTasks) { + DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverTaskWin, new Il2CppReferenceArray(0))); + __instance.Begin(); + } + return false; + } + + private static bool CheckAndEndGameForLoverWin(ShipStatus __instance, PlayerStatistics statistics) { + if (statistics.TeamLoversAlive == 2 && statistics.TotalAlive <= 3) { if (!DestroyableSingleton.InstanceExists) { __instance.enabled = false; - ShipStatus.RpcEndGame(GameOverReason.HumansByVote, false); - return false; + ShipStatus.RpcEndGame((GameOverReason)CustomGameOverReason.LoversWin, false); // should be implemented using a proper GameOverReason in the future + return true; } DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverImpostorDead, new Il2CppReferenceArray(0))); ReviveEveryone(); - return false; + return true; } - else - { - if (num > num2) - { - bool localCompletedAllTasks = true; - foreach (PlayerTask t in PlayerControl.LocalPlayer.myTasks) { - localCompletedAllTasks = localCompletedAllTasks && t.IsComplete; - } + return false; + } - if (!DestroyableSingleton.InstanceExists) - { - if (GameData.Instance.TotalTasks <= GameData.Instance.CompletedTasks) - { - __instance.enabled = false; - ShipStatus.RpcEndGame(GameOverReason.HumansByTask, false); - return false; - } - } - else if (localCompletedAllTasks) - { - DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverTaskWin, new Il2CppReferenceArray(0))); - __instance.Begin(); - } - if (num + num2 == 3 && Lovers.existingAndAlive()) { // 3 players with 2 lovers is always a lover win (either shared with crewmates or solo for lovers, marked as impostor win) - __instance.enabled = false; - ShipStatus.RpcEndGame(Lovers.existingWithImpLover() ? GameOverReason.ImpostorByKill : GameOverReason.HumansByVote, false); // should be implemented using a proper GameOverReason in the future - return false; - } - return false; - } - if (num == num2 && Lovers.existingAndAlive() && Lovers.existingWithImpLover()) { // 3 vs 3 or 2 vs 2 is not win if both lovers are alive and one is an impostor - return false; - } + private static bool CheckAndEndGameForJackalWin(ShipStatus __instance, PlayerStatistics statistics) { + if (statistics.TeamJackalAlive >= statistics.TotalAlive - statistics.TeamJackalAlive && statistics.TeamImpostorsAlive == 0 && !(statistics.TeamJackalHasAliveLover)) { if (!DestroyableSingleton.InstanceExists) { + __instance.enabled = false; + ShipStatus.RpcEndGame((GameOverReason)CustomGameOverReason.TeamJackalWin, false); + return true; + } + DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverImpostorKills, new Il2CppReferenceArray(0))); + ReviveEveryone(); + return true; + } + return false; + } + + private static bool CheckAndEndGameForImpostorWin(ShipStatus __instance, PlayerStatistics statistics) { + if (statistics.TeamImpostorsAlive >= statistics.TotalAlive - statistics.TeamImpostorsAlive && statistics.TeamJackalAlive == 0 && !(statistics.TeamImpostorHasAliveLover)) { + if (!DestroyableSingleton.InstanceExists) { __instance.enabled = false; GameOverReason endReason; - switch (TempData.LastDeathReason) - { - case DeathReason.Exile: - endReason = GameOverReason.ImpostorByVote; - break; - case DeathReason.Kill: - endReason = GameOverReason.ImpostorByKill; - break; - default: - endReason = GameOverReason.ImpostorByVote; - break; + switch (TempData.LastDeathReason) { + case DeathReason.Exile: + endReason = GameOverReason.ImpostorByVote; + break; + case DeathReason.Kill: + endReason = GameOverReason.ImpostorByKill; + break; + default: + endReason = GameOverReason.ImpostorByVote; + break; } ShipStatus.RpcEndGame(endReason, false); - return false; + return true; } DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverImpostorKills, new Il2CppReferenceArray(0))); - ReviveEveryone(); - return false; + return true; + } + return false; + } + + private static bool CheckAndEndGameForCrewmateWin(ShipStatus __instance, PlayerStatistics statistics) { + if (statistics.TeamImpostorsAlive == 0 && statistics.TeamJackalAlive == 0) { + if (!DestroyableSingleton.InstanceExists) { + __instance.enabled = false; + ShipStatus.RpcEndGame(GameOverReason.HumansByVote, false); + return true; + } + DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverImpostorDead, new Il2CppReferenceArray(0))); + ReviveEveryone(); + return true; } + return false; + } + + private static void ReviveEveryone() { + for (int i = 0; i < GameData.Instance.PlayerCount; i++) + GameData.Instance.AllPlayers[i].Object.Revive(); + DeadBody[] array = UnityEngine.Object.FindObjectsOfType(); + for (int i = 0; i < array.Length; i++) UnityEngine.Object.Destroy(array[i].gameObject); + } + + private static void EndGameForSabotage(ShipStatus __instance) + { + if (!DestroyableSingleton.InstanceExists) + { + __instance.enabled = false; + ShipStatus.RpcEndGame(GameOverReason.ImpostorBySabotage, false); + return; + } + DestroyableSingleton.Instance.ShowPopUp(DestroyableSingleton.Instance.GetString(StringNames.GameOverSabotage, new Il2CppReferenceArray(0))); + ReviveEveryone(); + } + + } + + internal class PlayerStatistics { + public int TeamImpostorsAlive {get;set;} + public int TeamJackalAlive {get;set;} + public int TeamLoversAlive {get;set;} + public int TotalAlive {get;set;} + public bool TeamImpostorHasAliveLover {get;set;} + public bool TeamJackalHasAliveLover {get;set;} + + public PlayerStatistics(ShipStatus __instance) { + GetPlayerCounts(); + } + + private bool isLover(GameData.PlayerInfo p) { + return (Lovers.lover1 != null && Lovers.lover1.PlayerId == p.PlayerId) || (Lovers.lover2 != null && Lovers.lover2.PlayerId == p.PlayerId); + } + + private void GetPlayerCounts() { + int numJackalAlive = 0; + int numImpostorsAlive = 0; + int numLoversAlive = 0; + int numTotalAlive = 0; + bool impLover = false; + bool jackalLover = false; + + for (int i = 0; i < GameData.Instance.PlayerCount; i++) + { + GameData.PlayerInfo playerInfo = GameData.Instance.AllPlayers[i]; + if (!playerInfo.Disconnected) + { + if (!playerInfo.IsDead) + { + numTotalAlive++; + + bool lover = isLover(playerInfo); + if (lover) numLoversAlive++; + + if (playerInfo.IsImpostor) { + numImpostorsAlive++; + if (lover) impLover = true; + } + if (Jackal.jackal != null && Jackal.jackal.PlayerId == playerInfo.PlayerId) { + numJackalAlive++; + if (lover) jackalLover = true; + } + if (Sidekick.sidekick != null && Sidekick.sidekick.PlayerId == playerInfo.PlayerId) { + numJackalAlive++; + if (lover) jackalLover = true; + } + } + } + } + + TeamJackalAlive = numJackalAlive; + TeamImpostorsAlive = numImpostorsAlive; + TeamLoversAlive = numLoversAlive; + TotalAlive = numTotalAlive; + TeamImpostorHasAliveLover = impLover; + TeamJackalHasAliveLover = jackalLover; } } } \ No newline at end of file diff --git a/Source Code/GameOptionsPatch.cs b/Source Code/GameOptionsPatch.cs index 046762b..1e88320 100644 --- a/Source Code/GameOptionsPatch.cs +++ b/Source Code/GameOptionsPatch.cs @@ -50,7 +50,7 @@ namespace TheOtherRoles var hudString = stringBuilder.ToString(); int defaultSettingsLines = 19; - int roleSettingsLines = 19 + 22; + int roleSettingsLines = 19 + 23; int end1 = hudString.TakeWhile(c => (defaultSettingsLines -= (c == '\n' ? 1 : 0)) > 0).Count(); int end2 = hudString.TakeWhile(c => (roleSettingsLines -= (c == '\n' ? 1 : 0)) > 0).Count(); int counter = TheOtherRolesPlugin.optionsPage; @@ -71,7 +71,7 @@ namespace TheOtherRoles } else if (counter == 2) { hudString = hudString.Substring(end2 + 1); } - hudString += "\n Press tab for more..."; + hudString += "\n Press tab for more...\n\n\n"; __result = hudString; } } diff --git a/Source Code/Helpers.cs b/Source Code/Helpers.cs index 590473d..0e9e96d 100644 --- a/Source Code/Helpers.cs +++ b/Source Code/Helpers.cs @@ -128,6 +128,25 @@ namespace TheOtherRoles { return true; } + public static void removeTasksFromPlayer(PlayerControl player, bool removeImportantTextTasks = false) { + if (player == null) return; + var toRemove = new List(); + foreach (PlayerTask task in player.myTasks) { + if (!removeImportantTextTasks && task.gameObject.GetComponent() != null) + continue; + if (task.TaskType != TaskTypes.FixComms && + task.TaskType != TaskTypes.FixLights && + task.TaskType != TaskTypes.ResetReactor && + task.TaskType != TaskTypes.ResetSeismic && + task.TaskType != TaskTypes.RestoreOxy) { + toRemove.Add(task); + } + } + foreach (PlayerTask task in toRemove) { + player.RemoveTask(task); + } + } + public static IEnumerator Slide2D(Transform target, Vector2 source, Vector2 dest, float duration = 0.75f) { Vector3 temp = default(Vector3); @@ -145,145 +164,5 @@ namespace TheOtherRoles { target.localPosition = temp; yield break; } - - public static string colorToHex(Color c) { - return string.Format("[{0:X2}{1:X2}{2:X2}{3:X2}]", (int)c.r, (int)c.g, (int)c.b, (int)c.a); - } - } - - public class SeerInfo { - public Color color; - public string roleName; - public bool isGood; - - public static SeerInfo getSeerInfoForPlayer(PlayerControl p) { - string r = ""; - bool g = true; - Color c = Color.white; - - if (Jester.jester != null && p == Jester.jester) { - r = "Jester"; - c = Jester.color; - g = false; - } - else if (Mayor.mayor != null && p == Mayor.mayor) { - r = "Mayor"; - c = Mayor.color; - } - else if (Engineer.engineer != null && p == Engineer.engineer) { - r = "Engineer"; - c = Engineer.color; - } - else if (Sheriff.sheriff != null && p == Sheriff.sheriff) { - r = "Sheriff"; - c = Sheriff.color; - } - else if (Lighter.lighter != null && p == Lighter.lighter) { - r = "Lighter"; - c = Lighter.color; - } - else if (Godfather.godfather != null && p == Godfather.godfather) { - r = "Godfather"; - c = Godfather.color; - g = false; - } - else if (Mafioso.mafioso != null && p == Mafioso.mafioso) { - r = "Mafioso"; - c = Mafioso.color; - g = false; - } - else if (Janitor.janitor != null && p == Janitor.janitor) { - r = "Janitor"; - c = Janitor.color; - g = false; - } - else if (Morphling.morphling != null && p == Morphling.morphling) { - r = "Morphling"; - c = Morphling.color; - g = false; - } - else if (Camouflager.camouflager != null && p == Camouflager.camouflager) { - r = "Camouflager"; - c = Camouflager.color; - g = false; - } - else if (Vampire.vampire != null && p == Vampire.vampire) { - r = "Vampire"; - c = Vampire.color; - g = false; - } - else if (Detective.detective != null && p == Detective.detective) { - r = "Detective"; - c = Detective.color; - } - else if (TimeMaster.timeMaster != null && p == TimeMaster.timeMaster) { - r = "Time Master"; - c = TimeMaster.color; - } - else if (Medic.medic != null && p == Medic.medic) { - r = "Medic"; - c = Medic.color; - } - else if (Shifter.shifter != null && p == Shifter.shifter) { - r = "Shifter"; - c = Shifter.color; - g = false; - } - else if (Swapper.swapper != null && p == Swapper.swapper) { - r = "Swapper"; - c = Swapper.color; - } - else if (Lovers.lover1 != null && p == Lovers.lover1) { - r = Lovers.lover1.Data.IsImpostor ? "ImpLover" : "Lover"; - c = Lovers.lover1.Data.IsImpostor ? Palette.ImpostorRed : Lovers.color; - g = !Lovers.lover1.Data.IsImpostor; - } - else if (Lovers.lover2 != null && p == Lovers.lover2) { - r = Lovers.lover2.Data.IsImpostor ? "ImpLover" : "Lover"; - c = Lovers.lover2.Data.IsImpostor ? Palette.ImpostorRed : Lovers.color; - g = !Lovers.lover2.Data.IsImpostor; - } - else if (Seer.seer != null && p == Seer.seer) { - r = "Seer"; - c = Seer.color; - } - else if (Spy.spy != null && p == Spy.spy) { - r = "Spy"; - c = Spy.color; - } - else if (Child.child != null && p == Child.child) { - r = "Child"; - c = Child.color; - } - else if (BountyHunter.bountyHunter != null && p == BountyHunter.bountyHunter) { - r = "Bounty Hunter"; - c = BountyHunter.color; - g = false; - } - else if (Tracker.tracker != null && p == Tracker.tracker) { - r = "Tracker"; - c = Tracker.color; - } - else if (Snitch.snitch != null && p == Snitch.snitch) { - r = "Snitch"; - c = Snitch.color; - } - else if (p.Data.IsImpostor) { // Just Impostor - r = "Impostor"; - c = Palette.ImpostorRed; - g = false; - } - else if (!p.Data.IsImpostor) { // Just Crewmate - r = "Crewmate"; - c = Color.white; - } - - SeerInfo result = new SeerInfo(); - result.roleName = r; - result.color = c; - result.isGood = g; - - return result; - } } } \ No newline at end of file diff --git a/Source Code/IntroPatch.cs b/Source Code/IntroPatch.cs index 42495f3..0418beb 100644 --- a/Source Code/IntroPatch.cs +++ b/Source Code/IntroPatch.cs @@ -21,131 +21,19 @@ namespace TheOtherRoles var shifterTeam = new Il2CppSystem.Collections.Generic.List(); shifterTeam.Add(PlayerControl.LocalPlayer); __instance.yourTeam = shifterTeam; + } else if (PlayerControl.LocalPlayer == Jackal.jackal) { + var jackalTeam = new Il2CppSystem.Collections.Generic.List(); + jackalTeam.Add(PlayerControl.LocalPlayer); + __instance.yourTeam = jackalTeam; } } // Intro display role static void Postfix(IntroCutscene.CoBegin__d __instance) { - if (PlayerControl.LocalPlayer == Jester.jester) - { - __instance.__this.Title.Text = "Jester"; - __instance.__this.Title.Color = Jester.color; - __instance.__this.ImpostorText.Text = "Get voted off of the ship to win"; - __instance.__this.BackgroundBar.material.color = Jester.color; - } - else if (PlayerControl.LocalPlayer == Mayor.mayor) - { - __instance.__this.Title.Text = "Mayor"; - __instance.__this.Title.Color = Mayor.color; - __instance.__this.ImpostorText.Text = "Your vote counts twice"; - __instance.__this.BackgroundBar.material.color = Mayor.color; - } - else if (PlayerControl.LocalPlayer == Engineer.engineer) - { - __instance.__this.Title.Text = "Engineer"; - __instance.__this.Title.Color = Engineer.color; - __instance.__this.ImpostorText.Text = "Maintain important systems on the ship"; - __instance.__this.BackgroundBar.material.color = Engineer.color; - } - else if (PlayerControl.LocalPlayer == Godfather.godfather) - { - __instance.__this.ImpostorText.gameObject.SetActive(true); - __instance.__this.Title.Text = "Godfather"; - __instance.__this.Title.Color = Godfather.color; - __instance.__this.ImpostorText.Text = "Kill all crewmates"; - __instance.__this.BackgroundBar.material.color = Godfather.color; - } - else if (PlayerControl.LocalPlayer == Mafioso.mafioso) - { - __instance.__this.ImpostorText.gameObject.SetActive(true); - __instance.__this.Title.Text = "Mafioso"; - __instance.__this.Title.Color = Mafioso.color; - __instance.__this.ImpostorText.Text = "Work with the [FF1919FF]Mafia[FFFFFFFF] to kill the crewmates"; - __instance.__this.BackgroundBar.material.color = Mafioso.color; - } - else if (PlayerControl.LocalPlayer == Janitor.janitor) - { - __instance.__this.ImpostorText.gameObject.SetActive(true); - __instance.__this.Title.Text = "Janitor"; - __instance.__this.Title.Color = Janitor.color; - __instance.__this.ImpostorText.Text = "Work with the [FF1919FF]Mafia[FFFFFFFF] by hiding dead bodies"; - __instance.__this.BackgroundBar.material.color = Janitor.color; - } - else if (PlayerControl.LocalPlayer == Morphling.morphling) - { - __instance.__this.ImpostorText.gameObject.SetActive(true); - __instance.__this.Title.Text = "Morphling"; - __instance.__this.Title.Color = Morphling.color; - __instance.__this.ImpostorText.Text = "Change your look to not get caught"; - __instance.__this.BackgroundBar.material.color = Morphling.color; - } - else if (PlayerControl.LocalPlayer == Camouflager.camouflager) - { - __instance.__this.ImpostorText.gameObject.SetActive(true); - __instance.__this.Title.Text = "Camouflager"; - __instance.__this.Title.Color = Camouflager.color; - __instance.__this.ImpostorText.Text = "Camouflage and kill the crewmates"; - __instance.__this.BackgroundBar.material.color = Camouflager.color; - } - else if (PlayerControl.LocalPlayer == Vampire.vampire) - { - __instance.__this.ImpostorText.gameObject.SetActive(true); - __instance.__this.Title.Text = "Vampire"; - __instance.__this.Title.Color = Vampire.color; - __instance.__this.ImpostorText.Text = "Kill the crewmates with your bites"; - __instance.__this.BackgroundBar.material.color = Vampire.color; - } - else if (PlayerControl.LocalPlayer == Sheriff.sheriff) - { - __instance.__this.Title.Text = "Sheriff"; - __instance.__this.Title.Color = Sheriff.color; - __instance.__this.ImpostorText.Text = "Shoot the [FF1919FF]Impostors"; - __instance.__this.BackgroundBar.material.color = Sheriff.color; - } - else if (PlayerControl.LocalPlayer == Lighter.lighter) - { - __instance.__this.Title.Text = "Lighter"; - __instance.__this.Title.Color = Lighter.color; - __instance.__this.ImpostorText.Text = "Your light never goes out"; - __instance.__this.BackgroundBar.material.color = Lighter.color; - } - else if (PlayerControl.LocalPlayer == Detective.detective) - { - __instance.__this.Title.Text = "Detective"; - __instance.__this.Title.Color = Detective.color; - __instance.__this.ImpostorText.Text = "Find the [FF1919FF]Impostors[FFFFFFFF] by examining footprints"; - __instance.__this.BackgroundBar.material.color = Detective.color; - } - else if (PlayerControl.LocalPlayer == TimeMaster.timeMaster) - { - __instance.__this.Title.Text = "Time Master"; - __instance.__this.Title.Color = TimeMaster.color; - __instance.__this.ImpostorText.Text = "Rewind time to find the [FF1919FF]Impostors"; - __instance.__this.BackgroundBar.material.color = TimeMaster.color; - } - else if (PlayerControl.LocalPlayer == Medic.medic) - { - __instance.__this.Title.Text = "Medic"; - __instance.__this.Title.Color = Medic.color; - __instance.__this.ImpostorText.Text = "Create a shield to protect a person"; - __instance.__this.BackgroundBar.material.color = Medic.color; - } - else if (PlayerControl.LocalPlayer == Shifter.shifter) - { - __instance.__this.Title.Text = "Shifter"; - __instance.__this.Title.Color = Shifter.color; - __instance.__this.ImpostorText.Text = "Shift your role before the game ends"; - __instance.__this.BackgroundBar.material.color = Shifter.color; - } - else if (PlayerControl.LocalPlayer == Swapper.swapper) - { - __instance.__this.Title.Text = "Swapper"; - __instance.__this.Title.Color = Swapper.color; - __instance.__this.ImpostorText.Text = "Swap votes to exile the [FF1919FF]Impostors"; - __instance.__this.BackgroundBar.material.color = Swapper.color; - } - else if (PlayerControl.LocalPlayer == Lovers.lover1 || PlayerControl.LocalPlayer == Lovers.lover2) + RoleInfo roleInfo = RoleInfo.getRoleInfoForPlayer(PlayerControl.LocalPlayer); + + if (PlayerControl.LocalPlayer == Lovers.lover1 || PlayerControl.LocalPlayer == Lovers.lover2) { PlayerControl otherLover = PlayerControl.LocalPlayer == Lovers.lover1 ? Lovers.lover2 : Lovers.lover1; __instance.__this.Title.Text = PlayerControl.LocalPlayer.Data.IsImpostor ? "[FF1919FF]Imp[FC03BEFF]Lover" : "Lover"; @@ -154,27 +42,6 @@ namespace TheOtherRoles __instance.__this.ImpostorText.gameObject.SetActive(true); __instance.__this.BackgroundBar.material.color = Lovers.color; } - else if (PlayerControl.LocalPlayer == Seer.seer) - { - __instance.__this.Title.Text = "Seer"; - __instance.__this.Title.Color = Seer.color; - __instance.__this.ImpostorText.Text = "Reveal the intentions of everyone on the ship"; - __instance.__this.BackgroundBar.material.color = Seer.color; - } - else if (PlayerControl.LocalPlayer == Spy.spy) - { - __instance.__this.Title.Text = "Spy"; - __instance.__this.Title.Color = Spy.color; - __instance.__this.ImpostorText.Text = "Spy on everyone to find the [FF1919FF]Impostors"; - __instance.__this.BackgroundBar.material.color = Spy.color; - } - else if (PlayerControl.LocalPlayer == Child.child) - { - __instance.__this.Title.Text = "Child"; - __instance.__this.Title.Color = Child.color; - __instance.__this.ImpostorText.Text = "No one will harm you until you grow up"; - __instance.__this.BackgroundBar.material.color = Child.color; - } else if (PlayerControl.LocalPlayer == BountyHunter.bountyHunter) { __instance.__this.Title.Text = "Bounty Hunter"; @@ -182,19 +49,13 @@ namespace TheOtherRoles __instance.__this.ImpostorText.Text = "Hunt [ED653BFF]" + BountyHunter.target?.Data?.PlayerName + "[FFFFFFFF] down"; __instance.__this.BackgroundBar.material.color = BountyHunter.color; } - else if (PlayerControl.LocalPlayer == Tracker.tracker) - { - __instance.__this.Title.Text = "Tracker"; - __instance.__this.Title.Color = Tracker.color; - __instance.__this.ImpostorText.Text = "Track the [FF1919FF]Impostors[FFFFFFFF] down"; - __instance.__this.BackgroundBar.material.color = Tracker.color; - } - else if (PlayerControl.LocalPlayer == Snitch.snitch) - { - __instance.__this.Title.Text = "Snitch"; - __instance.__this.Title.Color = Snitch.color; - __instance.__this.ImpostorText.Text = "Finish your tasks to find the [FF1919FF]Impostors[FFFFFFFF]"; - __instance.__this.BackgroundBar.material.color = Snitch.color; + else if (roleInfo.name == "Crewmate" || roleInfo.name == "Impostor") {} + else { + __instance.__this.Title.Text = roleInfo.name; + __instance.__this.Title.Color = roleInfo.color; + __instance.__this.ImpostorText.gameObject.SetActive(true); + __instance.__this.ImpostorText.Text = roleInfo.introDescription; + __instance.__this.BackgroundBar.material.color = roleInfo.color; } } } diff --git a/Source Code/Main.cs b/Source Code/Main.cs index f1b189c..06e5e9c 100644 --- a/Source Code/Main.cs +++ b/Source Code/Main.cs @@ -24,13 +24,17 @@ namespace TheOtherRoles { public const string Id = "me.eisbison.theotherroles"; public Harmony Harmony { get; } = new Harmony(Id); + public static TheOtherRolesPlugin Instance { get { return PluginSingleton.Instance; } } + internal static BepInEx.Logging.ManualLogSource Logger { get { return Instance.Log; } } // Roles public static int num = 0; public static string[] rates = new string[]{"0%", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%"}; + public static string[] crewmateRoleCaps = new string[]{"0", "0-1", "1", "1-2", "2", "2-3", "3", "3-4", "4", "4-5", "5", "5-6", "6", "6-7", "7", "7-8", "8", "8-9", "9", "9-10", "10"}; + public static string[] impostorRoleCaps = new string[]{"0", "0-1", "1", "1-2", "2", "2-3", "3"}; - public static CustomNumberOption crewmateRolesCount = CustomOption.AddNumber(num++.ToString(), "[CCCC00FF]Number Of Crewmate/Neutral Roles", 10, 0, 10, 0.5f); - public static CustomNumberOption impostorRolesCount = CustomOption.AddNumber(num++.ToString(), "[CCCC00FF]Number Of Impostor Roles", 3, 0, 3, 0.5f); + public static CustomStringOption crewmateRolesCount = CustomOption.AddString(num++.ToString(), "[CCCC00FF]Number Of Crewmate/Neutral Roles", crewmateRoleCaps); + public static CustomStringOption impostorRolesCount = CustomOption.AddString(num++.ToString(), "[CCCC00FF]Number Of Impostor Roles", impostorRoleCaps); public static CustomStringOption mafiaSpawnRate = CustomOption.AddString(num++.ToString(), cs(Janitor.color) + "Mafia", rates); public static CustomStringOption morphlingSpawnRate = CustomOption.AddString(num++.ToString(), cs(Morphling.color) + "Morphling", rates); @@ -55,13 +59,17 @@ namespace TheOtherRoles // public static CustomStringOption bountyHunterSpawnRate = CustomOption.AddString(num++.ToString(), cs(BountyHunter.color) + "Bounty Hunter", rates); public static CustomStringOption trackerSpawnRate = CustomOption.AddString(num++.ToString(), cs(Tracker.color) + "Tracker", rates); public static CustomStringOption snitchSpawnRate = CustomOption.AddString(num++.ToString(), cs(Snitch.color) + "Snitch", rates); + public static CustomStringOption jackalSpawnRate = CustomOption.AddString(num++.ToString(), cs(Jackal.color) + "Jackal", rates); // Role settings public static CustomNumberOption janitorCooldown = CustomOption.AddNumber(num++.ToString(), "Janitor Cooldown", 30f, 10f, 60f, 2.5f); public static CustomNumberOption morphlingCooldown = CustomOption.AddNumber(num++.ToString(), "Morphling Cooldown", 30f, 10f, 60f, 2.5f); public static CustomNumberOption camouflagerCooldown = CustomOption.AddNumber(num++.ToString(), "Camouflager Cooldown", 30f, 10f, 60f, 2.5f); - public static CustomNumberOption vampireKillDelay = CustomOption.AddNumber(num++.ToString(), "Vampire Kill Delay", 10f, 2.5f, 30f, 2.5f); + public static CustomNumberOption vampireKillDelay = CustomOption.AddNumber(num++.ToString(), "Vampire Kill Delay", 10f, 1f, 20f, 1f); + public static CustomNumberOption vampireCooldown = CustomOption.AddNumber(num++.ToString(), "Vampire Cooldown", 30f, 10f, 60f, 2.5f); + public static CustomToggleOption vampireCanKillNearGarlics = CustomOption.AddToggle(num++.ToString(), "Vampire Can Kill Near Garlics", true); + public static CustomNumberOption loversImpLoverRate = CustomOption.AddNumber(num++.ToString(), "Chance That One Lover Is Impostor", 30f, 0f, 100f, 10f); public static CustomToggleOption loversBothDie = CustomOption.AddToggle(num++.ToString(), "Both Lovers Die", true); public static CustomNumberOption shifterCooldown = CustomOption.AddNumber(num++.ToString(), "Shifter Cooldown", 30f, 10f, 60f, 2.5f); @@ -89,6 +97,17 @@ namespace TheOtherRoles public static CustomNumberOption trackerUpdateIntervall = CustomOption.AddNumber(num++.ToString(), "Tracker Update Intervall", 5f, 2.5f, 30f, 2.5f); public static CustomNumberOption snitchLeftTasksForImpostors = CustomOption.AddNumber(num++.ToString(), "Task Count Where Impostors See Snitch", 1f, 0f, 5f, 1f); + public static CustomNumberOption jackalKillCooldown = CustomOption.AddNumber(num++.ToString(), "Jackal/Sidekick Kill Cooldown", 30f, 10f, 60f, 2.5f); + public static CustomNumberOption jackalCreateSidekickCooldown = CustomOption.AddNumber(num++.ToString(), "Jackal Create Sidekick Cooldown", 30f, 10f, 60f, 2.5f); + public static CustomToggleOption jackalCanUseVents = CustomOption.AddToggle(num++.ToString(), "Jackal can use vents", true); + public static CustomToggleOption jackalCanCreateSidekick = CustomOption.AddToggle(num++.ToString(), "Jackal can create a sidekick", false); + public static CustomToggleOption sidekickPromotesToJackal = CustomOption.AddToggle(num++.ToString(), "Sidekick gets promoted to Jackal on Jackal death", false); + public static CustomToggleOption sidekickCanKill = CustomOption.AddToggle(num++.ToString(), "Sidekick can kill", false); + public static CustomToggleOption sidekickCanUseVents = CustomOption.AddToggle(num++.ToString(), "Sidekick can use vents", true); + public static CustomToggleOption jackalPromotedFromSidekickCanCreateSidekick = CustomOption.AddToggle(num++.ToString(), "Jackals promoted from Sidekick can create a Sidekick", true); + public static CustomToggleOption jackalCanCreateSidekickFromImpostor = CustomOption.AddToggle(num++.ToString(), "Jackals can make an Impostor to his Sidekick", true); + + public static List options = new List(); public static int optionsPage = 1; @@ -138,12 +157,16 @@ namespace TheOtherRoles // bountyHunterSpawnRate, trackerSpawnRate, snitchSpawnRate, + jackalSpawnRate, janitorCooldown, morphlingCooldown, camouflagerCooldown, vampireKillDelay, + vampireCooldown, + vampireCanKillNearGarlics, + loversImpLoverRate, loversBothDie, shifterCooldown, @@ -169,7 +192,17 @@ namespace TheOtherRoles childGrowingUpDuration, // bountyHunterNotifyBounty, trackerUpdateIntervall, - snitchLeftTasksForImpostors + snitchLeftTasksForImpostors, + + jackalKillCooldown, + jackalCreateSidekickCooldown, + jackalCanUseVents, + jackalCanCreateSidekick, + sidekickPromotesToJackal, + sidekickCanKill, + sidekickCanUseVents, + jackalPromotedFromSidekickCanCreateSidekick, + jackalCanCreateSidekickFromImpostor }; } } diff --git a/Source Code/MeetingPatch.cs b/Source Code/MeetingPatch.cs index 152c01c..52eb0d0 100644 --- a/Source Code/MeetingPatch.cs +++ b/Source Code/MeetingPatch.cs @@ -158,13 +158,16 @@ namespace TheOtherRoles Swapper.playerId2 = Byte.MaxValue; // Lovers save next to be exiled, because RPC of ending game comes before RPC of exiled - Lovers.notAckedExiledIsLover = ((Lovers.lover1 != null && Lovers.lover1.PlayerId == IHDMFDEEDEL.PlayerId) || (Lovers.lover2 != null && Lovers.lover2.PlayerId == IHDMFDEEDEL.PlayerId)); + Lovers.notAckedExiledIsLover = false; + if (IHDMFDEEDEL != null) + Lovers.notAckedExiledIsLover = ((Lovers.lover1 != null && Lovers.lover1.PlayerId == IHDMFDEEDEL.PlayerId) || (Lovers.lover2 != null && Lovers.lover2.PlayerId == IHDMFDEEDEL.PlayerId)); } } static void onClick(int i, MeetingHud __instance) { + if (Swapper.swapper == null || PlayerControl.LocalPlayer != Swapper.swapper || Swapper.swapper.Data.IsDead) return; if (__instance.state == MeetingHud.VoteStates.Results) return; if (__instance.playerStates[i].isDead) return; @@ -260,6 +263,7 @@ namespace TheOtherRoles [HarmonyPatch(typeof(ExileController), "Begin")] class ExileBeginPatch { + public static void Prefix(ref GameData.PlayerInfo IHDMFDEEDEL, bool DCHFIBODGIL) { // Prevent growing Child exile if (Child.child != null && IHDMFDEEDEL != null && IHDMFDEEDEL.PlayerId == Child.child.PlayerId && !Child.isGrownUp()) { @@ -339,6 +343,10 @@ namespace TheOtherRoles __result = ExileController.Instance.exiled.PlayerName + " was The Tracker."; else if(Snitch.snitch != null && ExileController.Instance.exiled.Object.PlayerId == Snitch.snitch.PlayerId) __result = ExileController.Instance.exiled.PlayerName + " was The Snitch."; + else if(Jackal.jackal != null && ExileController.Instance.exiled.Object.PlayerId == Jackal.jackal.PlayerId) + __result = ExileController.Instance.exiled.PlayerName + " was The Jackal."; + else if(Sidekick.sidekick != null && ExileController.Instance.exiled.Object.PlayerId == Sidekick.sidekick.PlayerId) + __result = ExileController.Instance.exiled.PlayerName + " was The Sidekick."; else __result = ExileController.Instance.exiled.PlayerName + " was not The Impostor."; } @@ -359,7 +367,7 @@ namespace TheOtherRoles else if(Lovers.lover2 != null && ExileController.Instance.exiled.Object.PlayerId == Lovers.lover2.PlayerId) __result = ExileController.Instance.exiled.PlayerName + " was The ImpLover."; else if(Vampire.vampire != null && ExileController.Instance.exiled.Object.PlayerId == Vampire.vampire.PlayerId) - __result = ExileController.Instance.exiled.PlayerName + " was The Vamipre."; + __result = ExileController.Instance.exiled.PlayerName + " was The Vampire."; } // Hide number of remaining impostors on Jester win diff --git a/Source Code/PlayerControlPatch.cs b/Source Code/PlayerControlPatch.cs index ba58753..4eeae4a 100644 --- a/Source Code/PlayerControlPatch.cs +++ b/Source Code/PlayerControlPatch.cs @@ -44,7 +44,7 @@ namespace TheOtherRoles { } } - static PlayerControl setTarget(bool onlyCrewmates = false, bool targetPlayersInVents = false) { + static PlayerControl setTarget(bool onlyCrewmates = false, bool targetPlayersInVents = false, List untargetablePlayers = null) { PlayerControl result = null; float num = GameOptionsData.KillDistances[Mathf.Clamp(PlayerControl.GameOptions.KillDistance, 0, 2)]; if (!ShipStatus.Instance) return result; @@ -57,6 +57,11 @@ namespace TheOtherRoles { if (!playerInfo.Disconnected && playerInfo.PlayerId != PlayerControl.LocalPlayer.PlayerId && !playerInfo.IsDead && (!onlyCrewmates || !playerInfo.IsImpostor)) { PlayerControl @object = playerInfo.Object; + if(untargetablePlayers != null && untargetablePlayers.Any(x => x == @object)) { + // if that player is not targetable: skip check + continue; + } + if (@object && (!@object.inVent || targetPlayersInVents)) { Vector2 vector = @object.GetTruePosition() - truePosition; @@ -133,6 +138,25 @@ namespace TheOtherRoles { Vampire.currentTarget = target; } + static void jackalSetTarget() { + if (Jackal.jackal == null || Jackal.jackal != PlayerControl.LocalPlayer) return; + var untargetablePlayers = new List(); + if(Jackal.canCreateSidekickFromImpostor) { + // Only exclude sidekick from beeing targeted if the jackal can create sidekicks from impostors + if(Sidekick.sidekick != null) untargetablePlayers.Add(Sidekick.sidekick); + } + if(Child.child != null && !Child.isGrownUp()) untargetablePlayers.Add(Child.child); // Exclude Jackal from targeting the Child unless it has grown up + Jackal.currentTarget = setTarget(untargetablePlayers : untargetablePlayers); + } + + static void sidekickSetTarget() { + if (Sidekick.sidekick == null || Sidekick.sidekick != PlayerControl.LocalPlayer) return; + var untargetablePlayers = new List(); + if(Jackal.jackal != null) untargetablePlayers.Add(Jackal.jackal); + if(Child.child != null && !Child.isGrownUp()) untargetablePlayers.Add(Child.child); // Exclude Sidekick from targeting the Child unless it has grown up + Sidekick.currentTarget = setTarget(untargetablePlayers : untargetablePlayers); + } + static void engineerUpdate() { if (PlayerControl.LocalPlayer.Data.IsImpostor && Engineer.engineer != null) { foreach (Vent vent in ShipStatus.Instance.AllVents) { @@ -208,6 +232,10 @@ namespace TheOtherRoles { engineerUpdate(); // Tracker trackerUpdate(); + // Jackal + jackalSetTarget(); + // Sidekick + sidekickSetTarget(); } } } @@ -295,12 +323,15 @@ namespace TheOtherRoles { public static class MurderPlayerPatch { public static bool resetToCrewmate = false; + public static bool resetToDead = false; public static void Prefix(PlayerControl __instance, PlayerControl PAIBDFDMIGK) { // Allow everyone to murder players resetToCrewmate = !__instance.Data.IsImpostor; + resetToDead = __instance.Data.IsDead; __instance.Data.IsImpostor = true; + __instance.Data.IsDead = false; } public static void Postfix(PlayerControl __instance, PlayerControl PAIBDFDMIGK) @@ -311,6 +342,7 @@ namespace TheOtherRoles { // Reset killer to crewmate if resetToCrewmate if (resetToCrewmate) __instance.Data.IsImpostor = false; + if (resetToDead) __instance.Data.IsDead = true; // Lover suicide trigger on murder if ((Lovers.lover1 != null && PAIBDFDMIGK == Lovers.lover1) || (Lovers.lover2 != null && PAIBDFDMIGK == Lovers.lover2)) { @@ -322,10 +354,23 @@ namespace TheOtherRoles { RPCProcedure.loverSuicide(otherLover.PlayerId); } } + + // Sidekick promotion trigger on murder + if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && PAIBDFDMIGK == Jackal.jackal) { + MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.None, -1); + AmongUsClient.Instance.FinishRpcImmediately(writer); + RPCProcedure.sidekickPromotes(); + } } } - + [HarmonyPatch(typeof(KillAnimation),nameof(KillAnimation.CoPerformKill))] + class Test { + public static void Prefix(KillAnimation __instance, ref PlayerControl CPKODPCJPOO, ref PlayerControl PAIBDFDMIGK) { + if (Vampire.vampire != null && Vampire.vampire == CPKODPCJPOO && Vampire.bitten != null && Vampire.bitten == PAIBDFDMIGK) + CPKODPCJPOO = PAIBDFDMIGK; + } + } [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.Exiled))] public static class ExilePlayerPatch @@ -339,13 +384,49 @@ namespace TheOtherRoles { // Lover suicide trigger on exile if ((Lovers.lover1 != null && __instance == Lovers.lover1) || (Lovers.lover2 != null && __instance == Lovers.lover2)) { PlayerControl otherLover = __instance == Lovers.lover1 ? Lovers.lover2 : Lovers.lover1; - if (PlayerControl.LocalPlayer == __instance && otherLover != null && !otherLover.Data.IsDead && Lovers.bothDie) { // Only the dead lover sends the rpc - MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.LoverSuicide, Hazel.SendOption.None, -1); - writer.Write(otherLover.PlayerId); - AmongUsClient.Instance.FinishRpcImmediately(writer); - RPCProcedure.loverSuicide(otherLover.PlayerId); + if (otherLover != null && !otherLover.Data.IsDead && Lovers.bothDie) + otherLover.Exiled(); + } + + // Sidekick promotion trigger on exile + if (Sidekick.promotesToJackal && Sidekick.sidekick != null && !Sidekick.sidekick.Data.IsDead && __instance == Jackal.jackal) { + MessageWriter writer = AmongUsClient.Instance.StartRpcImmediately(PlayerControl.LocalPlayer.NetId, (byte)CustomRPC.SidekickPromotes, Hazel.SendOption.None, -1); + AmongUsClient.Instance.FinishRpcImmediately(writer); + RPCProcedure.sidekickPromotes(); + } + } + } + + [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.SetTasks))] + public static class Role + { + public static void Postfix(PlayerControl __instance) + { + if (PlayerControl.LocalPlayer == null) return; + + // Remove default ImportantTextTasks + var toRemove = new List(); + foreach (PlayerTask t in __instance.myTasks) { + if (t.gameObject.GetComponent() != null) { + toRemove.Add(t); } + } + foreach (PlayerTask t in toRemove) + __instance.RemoveTask(t); + + // Add description + RoleInfo roleInfo = RoleInfo.getRoleInfoForPlayer(__instance); + var task = new GameObject("RoleTask").AddComponent(); + task.transform.SetParent(__instance.transform, false); + + if (__instance == Jackal.jackal) { + var getSidekickText = Jackal.canCreateSidekick ? " and recruit a Sidekick" : ""; + task.Text = $"{roleInfo.colorHexString()}{roleInfo.name}: Kill everyone{getSidekickText}"; + } else { + task.Text = $"{roleInfo.colorHexString()}{roleInfo.name}: {roleInfo.shortDescription}"; } + + __instance.myTasks.Insert(0, task); } } } diff --git a/Source Code/RPC.cs b/Source Code/RPC.cs index 49c8898..ea20c46 100644 --- a/Source Code/RPC.cs +++ b/Source Code/RPC.cs @@ -35,7 +35,9 @@ namespace TheOtherRoles BountyHunter, Tracker, Vampire, - Snitch + Snitch, + Jackal, + Sidekick } enum CustomRPC @@ -68,6 +70,10 @@ namespace TheOtherRoles VampireBiteNotification = 97, VampireTryKill = 98, PlaceGarlic = 99, + JackalKill = 100, + SidekickKill = 101, + JackalCreatesSidekick = 102, + SidekickPromotes = 103 } public static class RPCProcedure { @@ -87,7 +93,7 @@ namespace TheOtherRoles if (!player.Data.IsImpostor) { player.RemoveInfected(); - player.Die(DeathReason.Exile); + player.MurderPlayer(player); player.Data.IsDead = true; } } @@ -169,6 +175,12 @@ namespace TheOtherRoles case RoleId.Snitch: Snitch.snitch = player; break; + case RoleId.Jackal: + Jackal.jackal = player; + break; + case RoleId.Sidekick: + Sidekick.sidekick = player; + break; } } } @@ -312,7 +324,7 @@ namespace TheOtherRoles if (player.PlayerId == targetId && Shifter.shifter != null) { // Suicide when impostor or impostor variants - if (player.Data.IsImpostor) { + if (player.Data.IsImpostor || player == Jackal.jackal || player == Sidekick.sidekick) { Shifter.shifter.MurderPlayer(Shifter.shifter); return; } @@ -396,7 +408,7 @@ namespace TheOtherRoles Seer.revealedPlayers.Add(target, targetOrMistake); if (PlayerControl.LocalPlayer == target && HudManager.Instance?.FullScreen != null) { - SeerInfo si = SeerInfo.getSeerInfoForPlayer(target); // Use SeerInfo for target here, because we need the isGood of the targets role + RoleInfo si = RoleInfo.getRoleInfoForPlayer(target); // Use RoleInfo of target here, because we need the isGood of the targets role bool showNotification = false; if (Seer.playersWithNotification == 0 ) showNotification = true; else if (Seer.playersWithNotification == 1 && si.isGood) showNotification = true; @@ -457,7 +469,7 @@ namespace TheOtherRoles if (Vampire.vampire == null || Vampire.bitten == null) return; if (!Vampire.bitten.Data.IsDead && Helpers.handleMurderAttempt(Vampire.bitten, false)) { - Vampire.bitten.MurderPlayer(Vampire.bitten); // Suicide because of the kill animation teleport + Vampire.vampire.MurderPlayer(Vampire.bitten); } Vampire.bitten = null; } @@ -475,6 +487,107 @@ namespace TheOtherRoles if (player.PlayerId == targetId) Tracker.tracked = player; } + + public static void jackalKill(byte targetId) { + foreach (PlayerControl player in PlayerControl.AllPlayerControls) + { + if (player.PlayerId == targetId) + { + Jackal.jackal.MurderPlayer(player); + return; + } + } + } + + public static void sidekickKill(byte targetId) { + foreach (PlayerControl player in PlayerControl.AllPlayerControls) + { + if (player.PlayerId == targetId) + { + Sidekick.sidekick.MurderPlayer(player); + return; + } + } + } + + public static void jackalCreatesSidekick(byte targetId) { + foreach (PlayerControl player in PlayerControl.AllPlayerControls) + { + if (player.PlayerId == targetId) + { + if(!Jackal.canCreateSidekickFromImpostor && player.Data.IsImpostor) { + Jackal.fakeSidekick = player; + return; + } + Sidekick.sidekick = player; + player.RemoveInfected(); + + // Crewmate roles + if(player == Jester.jester) Jester.clearAndReload(); + if(player == Mayor.mayor) Mayor.clearAndReload(); + if(player == Engineer.engineer) Engineer.clearAndReload(); + if(player == Sheriff.sheriff) Sheriff.clearAndReload(); + if(player == Lighter.lighter) Lighter.clearAndReload(); + if(player == Detective.detective) Detective.clearAndReload(); + if(player == TimeMaster.timeMaster) TimeMaster.clearAndReload(); + if(player == Medic.medic) { + if (Medic.shielded != null) Medic.shielded.myRend.material.SetFloat("_Outline", 0f); + Medic.clearAndReload(); + } + if(player == Shifter.shifter) Shifter.clearAndReload(); + if(player == Seer.seer) Seer.clearAndReload(); + if(player == Spy.spy) Spy.clearAndReload(); + if(player == Child.child) Child.clearAndReload(); + if(player == Tracker.tracker) Tracker.clearAndReload(); + if(player == BountyHunter.bountyHunter) BountyHunter.clearAndReload(); + if(player == Snitch.snitch) Snitch.clearAndReload(); + if(player == Swapper.swapper) Swapper.clearAndReload(); + + // Impostor roles + if(player == Morphling.morphling) Morphling.clearAndReload(); + if(player == Camouflager.camouflager) Camouflager.clearAndReload(); + if(player == Godfather.godfather) Godfather.clearAndReload(); + if(player == Mafioso.mafioso) Mafioso.clearAndReload(); + if(player == Janitor.janitor) Janitor.clearAndReload(); + if(player == Vampire.vampire) Vampire.clearAndReload(); + + // The Sidekick stays a part of the lover couple! + + if (PlayerControl.LocalPlayer == null) return; + if (PlayerControl.LocalPlayer == player) { + //Only the Lover keeps his ImportantTextTask + Helpers.removeTasksFromPlayer(player, player != Lovers.lover1 && player != Lovers.lover2); + + var task = new GameObject("RoleTask").AddComponent(); + task.transform.SetParent(player.transform, false); + task.Text = "[00B4EBFF]Sidekick: Help your Jackal to kill everyone"; + player.myTasks.Insert(0, task); + } + + return; + } + } + } + + public static void sidekickPromotes() { + var player = Sidekick.sidekick; + Jackal.removeCurrentJackal(); + Jackal.jackal = player; + if (Jackal.jackalPromotedFromSidekickCanCreateSidekick == false) { + Jackal.canCreateSidekick = false; + } + Sidekick.clearAndReload(); + if (PlayerControl.LocalPlayer == null) return; + if (PlayerControl.LocalPlayer == player) { + Helpers.removeTasksFromPlayer(player, true); + var textTask = new GameObject("RoleTask").AddComponent(); + textTask.transform.SetParent(player.transform, false); + var getSidekickText = Jackal.canCreateSidekick ? " and recruit a Sidekick" : ""; + textTask.Text = $"[00B4EBFF]Jackal: Kill everyone{getSidekickText}"; + player.myTasks.Insert(0, textTask); + } + return; + } } [HarmonyPatch(typeof(PlayerControl), nameof(PlayerControl.HandleRpc))] @@ -567,6 +680,18 @@ namespace TheOtherRoles case (byte)CustomRPC.TrackerUsedTracker: RPCProcedure.trackerUsedTracker(HFPCBBHJIPJ.ReadByte()); break; + case (byte)CustomRPC.JackalKill: + RPCProcedure.jackalKill(HFPCBBHJIPJ.ReadByte()); + break; + case (byte)CustomRPC.SidekickKill: + RPCProcedure.sidekickKill(HFPCBBHJIPJ.ReadByte()); + break; + case (byte)CustomRPC.JackalCreatesSidekick: + RPCProcedure.jackalCreatesSidekick(HFPCBBHJIPJ.ReadByte()); + break; + case (byte)CustomRPC.SidekickPromotes: + RPCProcedure.sidekickPromotes(); + break; } } } diff --git a/Source Code/Resources/Arrow.png b/Source Code/Resources/Arrow.png new file mode 100644 index 0000000000000000000000000000000000000000..5be952aeecf37d68e53e443b2f7e9b7a1adf2cc9 GIT binary patch literal 10300 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 F{|AMKj?w@C literal 0 HcmV?d00001 diff --git a/Source Code/Resources/Garlic.png b/Source Code/Resources/Garlic.png new file mode 100644 index 0000000000000000000000000000000000000000..87f5c0a6ffa1260ab3654a0603e7be636e6ba7e0 GIT binary patch literal 16611 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 literal 0 HcmV?d00001 diff --git a/Source Code/Resources/GarlicBackground.png b/Source Code/Resources/GarlicBackground.png new file mode 100644 index 0000000000000000000000000000000000000000..0a3c8d358818abbcdd69c551114e4e47b64744bb GIT binary patch literal 4781 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 Hu0mjfEqhfu literal 0 HcmV?d00001 diff --git a/Source Code/Resources/GarlicButton.png b/Source Code/Resources/GarlicButton.png new file mode 100644 index 0000000000000000000000000000000000000000..6f11b529ef54ec4c15a061d07dee12ca7f9a3b3d GIT binary patch literal 18581 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 literal 0 HcmV?d00001 diff --git a/Source Code/Resources/TrackerButton.png b/Source Code/Resources/TrackerButton.png new file mode 100644 index 0000000000000000000000000000000000000000..20bd5caf11f998cbaa5bc8b69e0962c9bfb2e676 GIT binary patch literal 18700 zcmbSzgI8wV|8|;e+Y=_cCfl}c+jdRXWY=WdO}1@gvi&>Hcdhpyc&ocsXVt;RXJ7lm z9jPEEjsS}b3jzXyASofD1pG|>?*$DBeCGjm+yemt4Y3p!R*)1HCU$VLH?y=c1p%Q- z@J-;A_$z=vsIOf7BL&e7*>OZcw~_eA9+fI>Q0SbR#bV#V9D~JNd{HYWZ1p!Ne#{C) z`l@3F|f*$)i45!v}71@k*gc!*dC!o zBq6iWOp)ncq+P!QkDuGa<7(U$a}Iqkr)O&pWFenL_P9#$FmE7lCQ6E(w3`B*Pt+zzPNIcJ4jMs?6HG{jN%6?yE2_lYhE|Tl9@9-(6%T1W z9WcNjHKnjFTOyLhekYF)fyQA=RtyZKs=}qFP--N)yGG*rByTfuO6eP^3;3ZT5li%r zqbgok2k8$^LtRdKB}!0SBR6 zBxOaR4#APoF;JztmX3i#I4+_ZF2eSfh*%&X z#2}I)f+`+s|FYeGqpLnX@wb%U$;gA5K?~zzs)(qdi=qfl7!GFXVKAPPR<}dyIBU2* znX9>^xgz|==!3sJ13L?X`G$h>JCH;+mN&cN((~)jWeyHDvaWy&*R=AqjJvA(=5>|x z6z^%j+?ph}CFMm?c4Ly;-2c}vuiK9&`Q2|W5Bi`aRWKyK@!W1zd5kPcV(|1e5-~q3b1jY1%12% zp|XveR7CdRTa-WD(SZ8bkn*+<23dT`&ARCKRg>YZov#?SL)^&P^z>cEF~pn zG7y2nY_n3^d{HLp*dW(y+S?QG1(FMv3mymdg#>Nma7DXQb?*xc2WQ$F0LpC83xdPx zkOvXmcmF{X_|Yt+55E(yvW^+R)IjomW<15UCRx zE+E17(qH*?qewEzWHN&dHBy8eHBy2VH$`2~vzV^6Th4JRS4y-Ojat=6`J&=m>`N2q zIfg(OJPs)w7Cm}Zla0i#gNB~p%VBeH7vxD#OrIUN)0XG4q^+%O$D>8n;imhxEgU`Q z!AW6UYB-Uf28DbM?SH5Kh0RoO@q)Rdl85{U>|josAw_|zQPJOaJ=Hwdm;IvydghMu zo&;J4sZy@R5NMX$F`Al@deiZu#zvJAx$L!OB#d6W9twjl*pW$&?G2JYYlx4(a9GxY z&cTW8@tRJ#1i}#TC{$Hd37W;N>7p^|5|4BJ^>X|_Jzt*p|WYssywL@1Lky1!n}YYu@1 zPIlZM8U=cc4g&+DDoIQVG)fU#a5G)bZ%vZN;n)*_UVpD8@e2C?W|&&@6Cpr zKEuzFY&@+6Z(f|pm-Qpd6X=x9EVJbX^JzPb?=dm;w|^9s)}S=qk8Lj~%B!p8rug3e zHSfIMsX;E|1@K(=f>$N!tA00yf=`{}lUVHrFS?B!MSZmj4C(&-;k+Q{t*S=oUzAM1 zsIjEu-ZVf%vmQKEPo6FlWxIaSUE}pi1e~0@$06$k9cx}|{9#!?_i{gr=p+|LCy9A- zA6tQEw@5tFB;Dpj>bN8ouMkn2E>_k|6=D zS=5N6^wIB}-l8c|R9~+&#kv2hdB+QSWK+sE193!EUHAJadR~=-hFXq;O9`*GQ*y3% z*xya|?-aJ$8GP9crf*0S?-W~MNxUxyNwyeYx*W!sZFC6bX!1OYYBhSBIg+A*O=b|;JTI(5nLWmTS62QhzXa#W{>MfK7*3^2b;)JU;0 zgk+}rSORXfrE1-EI~%QTP4dIzoLRf~0$a7PS&PQ1Jwizw@0KVwH}U+Tg+7jLpLwfd zT3R6tq*0&LHPZz>H^j+YUszHQm(#gWC?cPD%lQ%}kL#UA$2(MfeeGTUU4%UUuTKx2 zsRHFn@__>WwqT_u2-H0Ad9<2Jm)9#d7P}43sOV_Pwgx?U%_n^*KJZxZ z->jCXNIcgdyk7Ss8>ObRLgfqu;cQRE6Yiewd?7XRxf93#UC#6N;C{HLB>71nqqaOS z1q2S0wzr1vuHw&r~u-;AZsC&!Vp7?6!FLQ1ho%Rq=7qdQ}sU5tf)IVxQO@<4)d!bQw z50d05kfHNrl1!W7 zVX>J_pn;mp=l?pN%efapcI`zF7iS?mzrnSj>k3oha2=mpRaRsYZXAx-@HUY-!U@OV1C|#fZ#d(7a2?LlvRAyQgoy zjfE<7{LtvC>#5|=pNOX|Z=@{7ES3O5PQRfrA`cel0Pet`zlhwwf|2+4ikV2x7f zAP})*PoD~tNjW&ux}LT&_v83;{(F5qZRftf`y@Nvd)CpNZF@!!jmw9ZuwB@tdEW^` zJQ1ZDS@Z+l(FXLL#Hrd7m~xBRT?_%d2Ao6Z%S7h#k0YNhFJnY5n|b>uZvVp94YWU= zH=g9_E-T&3=mm9Zm5gk+MbSsZ*t=z0Jg8V3wpmiT89@ zR;VEBn6CTgAOHX)#xCx@Rv`OAxC==B*%(+cVjnb2^BFJe5@Z_uH#A}hnnXE9GVVEb zhhm4Xo5eCTQbj#Ix$cgqkAWUKx@g%pyI6}IZfI@&9f?Ni)b|a`1l@=R-DtCwr4Fm} z?k?sRcf{D)oZc+bvduvLnq!4vxbpi(1KBr*9!4@tc+rDg&cF=8+0`d=A*O{9bQ zEie}m_~URsQ1@LoLwIfbvD{fqwiX7H@j*n(ZByXTSsV!)`?167I`HMb?oCS)R+70( zx(krYd2BIXpYg9W!@?(6n0}WGMeEvMecRKX)IBdpnT^?T$s^llB+T5T!%_R3I&bXk z?9D+3l$~Ho9lx$~DUm(Rn7fsS6M3yzySu-)-rWh7xxrqG^(du^1%nY<#zg?{+aFIa;c~sL1m0UzEh|?3lS5)u~PjG#FIUsaI zH)CwwO(D0ol3ZFu&AGELn3nw%1^Xe}$3&SgV;*&WcINT8YCd1O1+ny111epIz~X3f z=%aP{TmCr#_1gX&+p;pm;sFr>Tf0{wbJ_S;VBzSN`}V}~H2+uDcj?sl`fXX+)tb-J z0Mo=VDQa5U4Kt*Kq55R=+cZJPz%gitj|O&M-^XWZhr^$W>vbBxj&r=} zeXY2zXPfP=VxcR+h>0vJEQ~_6p7jeu1Vm9WMR)fhDo2zKjxtrEMt6puOEmqq4G&`N zCXZf$?)BUa#hN3^1u6K7?)`~Pd0mrT%BNZP=?^KBBB^21_WO9!C_PGHLz9J3nsb6x zGh1asH_ha$*UY6NnsSfcL2V{dB*_1r3~jL!l2ShLi_O3kTpbi1kNuaf+iI~YdL{kW zVi0w?p)YDGIYRfusIhKN+9jxA%RlmA7sdO3#)+G&leg15oASoLW;5PpC$h$9NX%U- z-mLqAzS#yoK+7Q>e4*EZaZ;;8fxKV3_mFXzuFOY5Bs^_xRmaQ<#1vD>bLxnIvPlN3 zO7+43%W)h_4bxvxL=j+JGh@6+zXyJlh%THIC;lxFF~sLXZ?igvY@j| z_*@S_ySwA9jaur*!X4&tCjb`Cit6?#CgUNKUn#qyaCLkcb(;dJ#?)J|)Oye~V@-MF z7`*X%64b-=A*8A$A_+C<;jI{C4Iy10GmCV1p3jB2OXLQDrpz2PnE><_un!h~72e*X z+Jv?B;mYG-r^3S{LFXu|ZYtBS*3hHD&qjvjC~Q2=aX|fHnoGmLaGdSVycLAy;1k@# zY4Cwb`NO~&riil1)6x>0*8Mf;zp`;R$$=)b`rCz6aKAy`c8RE&t&G;t!8*IIvq(%N z7%T-m#|B9Y&TT=AmJwM*05xbuC>Xkia_0f!-a4cqC~Ds+FX`09RdQp8Xf?F*(x~=H zVA39H{r+7xq}r4IeT$RW!jy#SxSNz!99MJz<74o5Ez(W8G_qJSO63-oQv%-rAhR*joV;T`*+4cN54kPR#wA z{Dhr}S5jovf)(}~bThOpiKuTdWEHeJb!xSJ z0)AFM(fT5G8{3I}Zz%B5`Mej6?{nSPs&m1VDM20~R@mq|&&tL|LV9p;prD`-KU+4J zXZ4#cDXe117Ax3PX(!SvSiBz=o(gw0a;MubF%VnJQm2`l?FF$z7AXsR3X6VSgu^le zQ_S)=mQW%t!aWND;YsD{BISa1Eo=UB98Gj_cEjlDsaeY=t=kn*iMhP2oInWZtl8v)leaXQFMG<}1w+wWCByZDixkg9I!ibJZiYCld^uif#cS+8FXm&r41mIga}5@m~Qg~y}d}j?om}a z6q7fd?bxcUQ3spiVa`cH6J~|hG~_;fRfffvEG%to8#u}5%bKS-#7lDuX#J_OHna@w zd$+ImEVt(K)D7KqZ^CXgCkT_`7ncY_-%fd1t;r9~$z)<`75~JvZ?VHE_663lQ{|N2 ziHk1Ob*>@``c?_tPM!4kn&VhPpgs#f;~OO=ik6 zRuea6C@LI;k+zt%vMM)Jr*n;Ce8v6~lk;Qg^46w8m&#PBbW_v=HP)4!m>j|S`tw(T zntFC+WhB$SJDraWj&k)O4X$!98cSJIGo8r>*Ny|Brd#A)|H=scsjti1T9QURO~~T! zYULPgVl|8`_U|AK}6<8)wU-GEk5buFzP0w`Cehqe2EH zr{`cp`+Fr|BrT0I960g8D!v_wz<=frUosMQ_J(XIWR)mj8ZD5Js;Kv$vC+%1p=CD3 zl@)w?bhz1O|B~mE{L)TizIitad?0mzaJU3E<+5>vysZa`(u}fb^H-%7dnqb7kh7yn zZk!6128J>uQVxf$Ox)iXHymk|8QCm~nS}Yux2=iqbw?EcqzIuyM-lqIDJrbQ6!3MO zu61F-2A4;{E~U~Hn{8U1EmwhO1@u!2Me+RI`I9%)0IJ{vc^@5SX>l2pa=)Wg>r$MS zIEMN9B|yi&*hcmDgKm6poT1021Gnk2H>$xNHV%q+Iq-$1&>C9j7+NcfTkK zoxXOq3d!z=XT)!n@d&wt1oZnC=mXa@jpLAxy(Nv&Gkef<(#8===q?viB*Qr}xw=pZ z%Uw`yqN1%ne7E3!?ItgdnUFB!1=Q#z-OZ_US82D08%V!Drq&k*|Gwv=Bo=TowRC|l zf_R1FYRoHzU?{VS$fWum?>bcw#(9sw8EazRcnk@4C08W}ygK7bXa`6Kx(nqijHa9C zMB1)r`MsXvIAF-NM@G$E%}TrBr(-Y4!8U{GwDDc9Sj>wR2ZVl;rO`rW{mjyNB=m$J zljFkj*8^={iU^{eHxv1~bb0hdE}jXX%V=Fpd-a8Kd`1apz8x|4I6UpSn|yEML1o51 znE$tDTVwygOq-EOhbs(8qvmm{NobgNCB7DyY=x({S(ELv72DW!2b%^ao;3D{7oZ|M z_hUGiDZ4h?XHSbcWkRYrI%^AjV3)|Kh4e^1pSD{Ve(=<)^mq@`^A%NMK@sqW*vNbc?n5o zcJ~2`G@k0k$-ec=U79u~(u0Cvd;g{u08k~<_)z!{&cDu^M`$X+x4>f|elqBF{su?n z46vidi!RmXp!Fw=P`n`!sF5z0NT_gO%3I>gHS7xKE@}yd~gW31hB_lJF zxA%q`!;~wwN6oLS7i@U74T7_*q-1Cvs6`PdWFu2kV$`86+xE~ke+1I#Hth1O8h2yN zf``xGKT(xB@iDey`gddA0 zk{*|&fC5t4*mjZzLhJBjSR|0F`{PkNB|Cc(6bgUmL|c!cT$&`o@@s`Y&uS^k+gg?o z2Cf2yR@e}mf+{8-0~))H5Nz{~(aA=K%XV&+4r?;H;3PtJdFwlb(;aelQFnFNC9l`6 zlegjzQ=UN(CS-JWSZQG)VI6KWC{xNZovy^t-1p4aa##GbU_aa5!T_-B0ezxjJx)<&Tz{Be zu+o1!_5pps9)GtN9I43Pzm&D3LmI2!bnyfOu9>Tr51RV3MpS{S-pge6VrI%^iy4(V@=&dt!@06Qcsr!HG4*z)ICd?8;}>rD zbE6Py%yK-a6gV&_NF1{&+M*AyY$`Q+qfh$&lB;{7m7kw@{Rj{E$Ki6oTgVmjKRMCe(Ga2&1sOyw}IJOHMTRzN!3y?jl-+Z zWjoB5;-bvfm6Lj9>>(Wl;dUO#%`cZ%^i5mO!6+(hlQXqcQp|ml?;R+b;R;Ai~AD%KZoDc*@h;MORAn5;@R?Pk{r7Yl*~XwDj&5R{O_h~07XSwWkIVWe z#k#6ejN!{^omXe44l?*>ulheSa}D-p>B8hdDJm=e8u3tcvwS4`Qk&%Qp-rySPUkTg zG*{6L#AT@g6qI(C^GlhG-{~nNM#0SqDsD{?1`&Z&WTwiC8VQWj-S5dq8L;&b^wU^Q z&A0F;82Yofj~xR^J3r2%Xea>^`rN7Q`t8Hzd@06mv%L;rSe&l=pyq4z`T3rAzyVo; zP!4(_Ss$zxWGvusKu$_Z3c&UcQI{V%3A!Q9;>g=KKn=6;U@5WYUq4=>ZqNl7cJw+K zhHS90f0--vW!Vv}iMQGfzxMC&+R$UVa?BDkv-iIpr912-iLy)k8@MLL zzvISJM5Wu(OmvK`1)Ioc6u(Io!lNk$HDipiqp(DxDqu_G$d-OM|H)Z|F3@c9AVE+) zr(X4CYzx)BdG*G7{XB zVkD~U$cElU<{`*V5w4P-gVTp z&xlHQLgK1EZDJ*bjfIzukRZrFe5^h> z1r-y8-=#0IazRJ&M;%w42XvZ)(DtOJY!1XGUcZ)PGVg=u`Xa-GXedb+n&Ff4nQW3& zf)GnCzVAx!tc%aO3#jk0!R)0tqCQ|oN}!@Ryz#U;pGU76ML2dwlcb!jA7I%m6;{{j~G-+l_A(6MknH#WqIV# zrP$pyI>N?$$qbleXsxWPCe%d7(d*HNRHq4~b;}uEN?G!!O6QR+=Ng&hGTU{YkNf!z zpq8DE162L7agT@r+pdV9OLbM1EsG`O7299^2HtLFQ~Ezbm4AE-apn-L zFZ%=kAW}Ky48yI9NLdsk)D{-sUVQwRWVZ)@Yv{_!Uk&Xr!7q{wOI=+SImm#+hQ{JW znA$jDiLB3Xc1kn4STV(W#jDBnBsaDQpNHVhU-W~Of75Ct-QH*xnspsn#S1KNZ_mJC zF}n`ue-Bikf{^14zjLtax|9B5G{LpdvvB$I>0tag#5PfuI3VFUAWULjE6W(!sFw{r6 zLN#2Msi30T@%u^BUCmc@n9cS4&zh?}**JA%jA>TmtBaS~l2}oo z;)4C8I>8)e!`O8ppy(w{Cvn;K%&$M#BNhz+1 zDhZkuY+Wp-)+giPXGjZWfhZh;8yjFm=fgUH$YWdEv)zS^ZmV5*dnk6l|g8uM-hgCi6bo;cX5oel_;_B{CUQt0I zqC409-5iOT4XQ@evc^7j>|)*7{R@Q^H|Dm+|AQvDuF6vBxh-%Jtrf)J{rM(6n*uq1 zHwNcq@N1($4Dr4X!HuP_=I{IdAV}`y6KdQW)re~Hy-dAC$4_+n9F@=9xiOe2E4ZKY zBaCzj2+7Zly$IegRW4{WNb!~TMjW2Aj{HX6`1WygI3MFPuq>y65xF8MxkpO;sEW|I zv$%VRwHy;ut4j+*X04lZh0PCOgK#pCKTF$Gz5W)8xU$hDUA-xCobLri$1r}qQ}o|W zzEoN=WAo~)m|{iC^Nmts*7WuCRV3P%9~H(#_Q`zDEm^EYP>(<)Pl!kp5h=Ff zSTW!f)0#hb{nZpEv>v-;M2Vj0knCD|77QvS+%L3>*fajc01yH4JCL?NzD(>H3~Z%i zivuD#NowAAk^Bv6x*o0A`g-`$%ARj%baO$6Awy}FmhT4P`lT751b9?1f2)vl*Ye=? zD}0k;RWpW|r)~)ZlYuy7SI)&JTL`P*?{gfrC??2@46K)RnUJj?74BRT?_86vpOUU0 zjgIx|b>k}Wb1YC$jEC38>DySoo99$Z`Q{&eTu)JFdamTKSEa<=P%_Eet!nCatvH20>4dE{|MaTAhu>e&8GW0O7t2qM6QSYuzC_p(_nP!alE3*O$|DoHh#7``^<4pgxhkz&11p&hms zH%Uk+9*(YA%*lQeKjKub62hE}UNWjeFkBjtSZdBAlSIemPIwkvPXvPsXdap|h_JdE z*;@EwC&%j#5X?7xFLF4zGQPgr`sUF^r}EX?cxp<7@>$L%c^CkWC}DqMx$|$lb<*|R z79}GKyc6R72R;4KVVb_(c$DR*1-)$2)Vagop9xqqsZ59&vAdB+ zqR1uwqDXK+Rc7_b{%5g=Nw=+D*tjQAlO%9sj2Q|OIDBCvCH8Wr zn!A%9UZ_J476=j(6LZR2-?6JwYWMk_`bseCtn&@*{Z!uH3aWhM)|7R_bzY4@#TulG zCzC@{M=kI4l*zMAv~FxEy$UDG$T7-)%b44M;CvNt`DYSGSZ0YUIb$ko88gN2RV7&>iyfnx;%2G2S%Vu zyKZ~4H5K~U;A+(;>Po@$SgtO*S@BkgF{oYVjhNie)1rwb+d5U6vK$9cuT}Q#p<-ip ztA5QkcI7CW92#`JGg6*JhI={LSOVz+cJpX8A!ZcmbSze11X&K@!jy|j^pv58Or83$ zhavsM=nF|Y7DWv@m|w}k9hq;#)R&X&oyp7T;Ng~DPm+7%amb^tD62u()7PCc*|d-d zxC7tQbP_)~*_*VUE>C)y9Um>Y2zLPI&T;#BH5tt~wM6y4{h|5rMG3AzodECT_S0N7&`0 zxKkZ?#H3D+)|?Dr7`ct|q&t6MZv`!9lTTj_xp1jE`9)~ucm#<2$eX)xbKZ1acAOQ( zDh@Z|xmNG(Ap^H&b%5lg&&0E94gB}-pPK1Mc1uK0v+?4f6wPB7ZyB48lJMNtKPh=7 znqi;s=xwaJoBamzQt*(S*z`%UKAUc|ps;R=Cg|?kS!<=E$)0rd$n$cXZX&|cR>x7N zgPU9jy_~$TNdfWuv(F!pliCWlfFAvH7CijoyXtY`d5DY~*ZIO$eoq)Vpi zvI~J7V&AE1Yr1m+I4m>+m>`7{i z>VCDunExeH9_95QrxNw^<7?S)g8O=1?pgbBN7;aJ$J1<9CIPIr6mC3PdUE@&SeMsX zV=1s8GH2w=9Lh;R<1s@w(TA<%c3@wbly0=O;C^P2&*Fb4?w<)5 z>UBKbSZNF@J!{ZlszsL16???b>NU0+koj4s(+p`EPk?Omy;TX3V%{|Icu5721tQmd>z5?Y=NhwS9$7BOc6IE-F#GNA*A$gz)iI}VW!jUEa(jmwQSX>x ziWUP)XDDiynwQ+qNId+_x}mX)$D_ zEitHKDEaX^?UKPTmP2T8BU6@$sldjH{4-A=a_4lC%@r)uCuB7woKZ#Vv-x~Fw+FA_ zST)0JO!T?g#ZS~#`}T>BZrxHccZGTHsTF^lq1vtl6yz(8Jko5y$_OVNTkXQd<(ec; zg3&lU2p{D7{KzRNn20sNt9EHgfiklOt$^I=e!DCLXuK@9HA@Jv3z{vO`GMsMtZu!o z5j7JZki_4U85<}c6_aqc6)8|x}B;i)7{l)ap5gELcfh0Jc5Jjq)cM)4-u&vx>g}m(0GGlp z(i9XTG?@LWzNUb`=jf|5PG_ys4XUNgoY-5z=SUm&BOE?HztV{@b5D zP!&&CJS@zYO1Nqo9b-`}p)iBd1mz$shW0gPvG2-7NpKiOwDl+XmUP*>+`_P96W`>p zE7bkG2M4q)cZqD~(0}HlEsNfM7`!hp>$vl!f=x%a-)p9S-w?4G16Zbcl7x|XlSzcb zOyEmLU%i&HJ^QEaIAxWE;D68#;*Oh$0*xu;j&<*5EwzymP~RfWEwz9B`;cUbd&Cc1 z=pXaKfbMVd--RaxteP(cN3l=4?Giz}+>G|^VmYF5!=GX4DWOXl%X;216*b)%P1ehH z9%bKj;CM#Vrrx(Rq_h#H5HTv0NS9>V;5S@dUH{WVOLM%UG-!tamD!<9=QkhGjYQVL z@YO$JNM({~bgwqs$6Kv``wcidb=0h`;W}2Ck>*(V25SrI1J8NiC2V99r^4V^{=htc z(=2}WX)Ezpac`Z>Qmm(J>mdksYJ(2{yWu!Y-~-U!JO3b>`5vBxvuaByS0N9{o15p< z;`Z0LaLw_yK&jtGlFAU7OvjS%t8=HAw~vh}ZDqJ9eodp%SJ;{;mKiNoa++TKC{Ode z#bzu@EiW~Xn4w@9^`>c~aMnciHpKhQ}8jtm>RR=j*wH0h{- zorCZs1#et@bTMtq=SeShNSf)B*0(0BT5ZYF4Vd-7k$4zCZbb5sDa#Er>vt~FYk$J$ z)z&%`V(iPU@nCrGl*l<~WKVKepgS*VQkmAymHhRQdRu3ZP*LODVV#tD5Xpj0CR{I^ zTu0LYn`v`4hn-(M5UI5;cPBN6qcZ5#{N@n6;#0SE1gBlMl)`Lp!#UG5Zt+Q+bej^n zB}-R6p^sO~%Gsf83hyjs2;uBja3n6XGz0SfT^qZTqK{sSUDJG^y2e`fwWUV0PWQ;i z8}pkan2L%@t=q+#jGtjC%T)hj6<$7dQVZ4a^|DC02lOSlSV5;Ac>?jvY)>;4R$c{O z^#!>`KLrP_MP^n9XzhPj`~+XgR~X6SuqW*JR}Uvet<%=#^79kI35ihj!g(6C?JA0> zTe%k7dD++DiVLD44-FeOl2U^91=3m#YW+`Z@XolXr*eC?DalQ0uFV6-5iP_^(;}z{A0j zb(?>!RWJyT@w-#VaY6MNIobPyxI4-xS})JIoTngbt;+?fOBMf3^iRRJ#$ZI^JOS`f zDc}v8EfhC*>vTUnRP@*#tkmsf1V>!7WfW`4`TYU8^EnB^)8)N?x{7E2WcQn^4ezCA zp#G2NBZ$^zE3)y9MQ1ocjQ^GI_2XG6AWz8n_fo&xuao29MOJCZ?JFzSe!kqNK9Oq3 z%zp6(^%N03JUmQ=fnn(nt8^5zU$g=B!0>#$tt~rDfm# z%}lX0*6rhZZl$2Nf}=TTqXRnp5z`QybNKE1Wj48L-nDBufQ{j5;d^LzZ zR@T{dU}Rr#Eo!@#)m~`Fa;MdQilgPF7a7-k=Z6 z6QJM^0q=5Je}8{Wb&Yr5OQoDA3@}uG1FySC79Rn6h!rN7kJ_rtzQAh}I z8Jn-b%un5~yoIihl87bXj0dNsxv2(>Q~`kSAO=Jbez@ep;zJ^IWNm^LY`G zgD^ZhWP$%~$uf(Z(s_CfrzYBh4!H5^o=-1OlZ8Kub1I4?fDvE%5G{#iUsF|evH5HG zbB$9igRhrb-h(hUwEGQkiS`1fpI=KE0Gf>h9IbJH9Zo@avkuYa^X1ril5KgWLY*O~ zkC-&bRP*5I=ypL_{syot)cL$P@qNADP1r*s5l*bs8K2G;LIJg$2RQcrGVNc|*qB^4 z%@=*96;!#=IfcRbCFR5Gt)!^fR~W|!%lW-(5Lhz(z;?aq&o#WZ?xDYl6G_t&9y9pA zzyXG3mha!c|97TegnU_*K|wO2zg^Fl`Ury+%7i-Iq>5b67GNs!w{|l)cm(?#hm#s< z3B688F58X?fn3Xf{WB}w6Fj4}!OOx8WQo+pS#duWqxumrUcPqFK|2&n+1cx9qiecf zqgETtm34F`0LAuXt%=6>_1=1XMvBZvJtXN4aKrTR3F zi8)QN=IzRWyvOxmntuIuemF|E`Tn-&RBM=AX?9>STO9u<=YJ0lgdPq@d%m)BT$@6G ztwUwqzGj=#cMx9h$AQ=oMM4JB#8plnWN6|9OdqUG!8GUL{6JuuWc;@U+S@ZS>wY5a zLUpvNX@v&Sm+X7yu9@_XR_Z&*Tdimz9W(J^om&#I||921h~BY_>@Uq*^IQ$2wqAN`kZj zrjmiE!J_vKmbH%(VBDi>H;9RdZ28>Df)=&5YGC?(G^zAlXC*%(jjd_hquOfT-V76s z1CWIb;qXw&?-FP3dKbz_GgZfF^gGxH03C{7#u)};#YC;?=1b+LBkqBjB98m{A=qIq zuAXWtvJ2Q|Q@fjSD3w3dO^G*)W?3ieKsv(&@9W{930#R?#V^H80vir>GK7KKG-6}5 zaVZ=)M`}14C}iw@{*{=BN;`ft!_;EnUlW4&@rvG`1RbEly38;!~dr>r005JlDMa*qYziU!vtzEjWrs>DE zwEn)mb@~Jtau7z(TNAIA5a>+@c5>l?-0t9vvT4SZb3>WjE!J%pf~Ac#{Pk1`u@Fxl z!XV*C(713wP04hg=1ntT9J!n3pN`lw!maLfNV>4!577(Q|NGx){}t#VYyc|3oUn>8 zF)=M}J-Ig+&C(vGyL>~DSMS7UMqELF3E6>|DT7UCY?F-KU3qsS@HdcHynOH9`_ALsQ(<(A-jJq zouIP4zeSJozDqPN{rA_j+ReYD8M=~Z-!7#ezPQUaS+wi`v-&FghF#;52&vp6cG|co z75d()d9G=H2n^5z%%)@LVh^XX7gs~}ZcmNukaKj@sdwiG8q|NK&j*fhVg@6Q4-}NuhYv=RxQ>1sbDrb{dz_6@-uSSltthv+ z`>^-c6>=i7u7K z8XF&PJ51Gvh78tm==&D3?FpyJ^%d^=vjq<&zj!ckqto*a8)ybJ3Yndjo)5YPv&p^q zoWTWM7tDIM{foGDMDz9)f~i=y%P;EKMLUJ{m8yw<#Q6@tU%kvllQWZob?f}*3C5-i zi;F`6sS&8O?whVyEM^mV*2~ocMofU=u?;B8T=xGo?!B*&+b`Z_w`h)+!lB_;LIF$X zgdC!BiA=tHF5gPCtgkQc2A#E^OLJvaxVWi=qv!QSDIRX zm&5G0Ol&6YX`H_416NC5y!g*B59B{$>undd^~hQ82#jj@!&T@kS?a4G=ccl`&5N92 zH6r!7YhAn~H7c>SisYUlzsnrf4QTkr>9_Ghyx%) zEKrs2fPk3EuS^gk|92*1V6h&W0(Zc`$Zt9Vqv(p;)zm?0o%+;!{h_!p(B zE`2gpp-7KKD)blf^`JmB8k@(15oidu(kv%f01HrVLduhRZiNo0r5Quk*J=x`?5gc% z(EEP&h^T`xd)-?^ijb0$8V&E)pDi#=m7m2M8nJPV|2Ju9@?P72Qgd5KgwwR73=>hi z@z4ViKU4uZ-Uk%`$0WSIdI8y$RCFvXIO1VK?@FK7(^8}LW^ya*;@6k5`rDb^s*1J* z;qUEUO%V~DACKzwwvEu>n}5fMvT<+-^(5-`S#i;KVCRRWtVS+!~%>Z|UzY8{W=(DbV~ zo?D6ZpRVPVI&Dg{w7A_HlL0e;-eR=2s{OoU3eWcX2^7|2AP%^n?Y?DrxzVNrz=B^y{5gc? zpZu_LJn0&zum#fHgYyko-8sB3pKn)fXXOSRns7$aQvh zb^u^A%>U&;E7YqJSJs;5-UpBWm%Mu_`t0W1{GL6w9TK#SvLjQM1pm2K}tx@LsD4|lnUvwS5k@ujbq76bKtk=?pth9lb8^N3x zVR1Ankc`Q&L@iCp5Hl9TW0A@rK|6)dh@5AIU9dDhOO}LXos5t4l=x*S)M$n7iY(+9 zr~r@aIT}d-Ncun-Ji(SmYzS+WzCWviN+pfaD$?6&7;RC^=xt znOj@?q1|kQB5?23h0pCKL+^j%Ir4M*&?Ks&MV%HidLox!A7r)8IK1`sZSdG}99Xi! z4v!BHfxK`P;0zy4AQLb8^G8C4A_=74abK)$W{W=UQ;*)Z0a@F(i!)mez%H6QTlt@U zmYLQHXE{k!So%{~=cBkcD;La+jKl!s|1YKrPJlJIHHR-%duF##>B@2%#;qtk@eRtx z$<=kQ;!EYlup{D52d}KG%x0}IQZyPf0U0a&N=g2NAutxs!-josetvXfV!(uX7Y`qC zVCUuCwq1QI{BV-vH@ELk`^!~fSy=>NssoYkz^p8MW@hGk%7YD9u%{x=b408Grsz<#>vb@bv)2suy?@hT-pFTb>Bx zNq246Ghmh9J0v)DCX>(n=Q`Zj_8vDDo_txBH^KwuQPI#|fGx44oE#*OgB;fJ^m}oT zH=!rBeA18j&4d=d8T+QdwuD7U)G+fqZOdS-X4$A|J<{#xDc#8MovEip?2n)BXmwAU zadty8{iI|lxp5J#oYn1{KwqH{5lthJl0hD}rvUFdF!A5}0-XBVU9e?aJ=CPKJls&W zF*6D*%pm)&!#b#|GoL;%|6c&T215BJKl}(ieSOr_)X?1AOk`vvX=!N~jYbSprrxLtVbzZ}VuN9qYn%LZLk5C^0K zoep2;g@DE7^&&iHB@-WhR5_VtXb7Lf0jhdPL>T&4HPUavcj>%hsTq9losU3NbfDhw zyOt3?^M^#tn90PPyNOInLVP~N?ZMM$!BJm_^TSGfZC{Nctp;K?yhK=B9L|#`aPQxv zv^U)Z5yL#EueENZHLTu1%7=%Upemv(Dk{j$%|+c~8E=GO-OR5-?=VX|%wg$%JZIDi z6=L}YuVu7SKH~n>#I1Rn*gNkcEHWZ6Rt8&|vF>}1A^(Xsk$QA1))Bk(XWXV*tRjN_ ztD`vI-8(`+yeB_kpuL5-mtG^4m@SagT zy2I~UMqK_U#4Ws!@b9_0c?N9Y^%0elLPSCWx*w%sulfl07w?W%E7>k$|HE^`?S1HJ z;(zrtF#p!P(>#}i|`orJ{?VmJQ=d(Bt4+y0}}GhqViAz8}U zFw9`eFLMbGL3YMwWf5aEa^O!|-b|#TocADGwrmlX z%Qb94`pq}uwpwKrd_Hk@bcn6)jJPlNkGSM?I>qU9ir4EM&hGKZPfMsmAE(>7l;99uZ;o?AgqkHS7DXQKRy|_~MI{mzSg0>q$>fN2k-V zWXTdzQ&U;GbSbH+V>=et*Vj{6SV(PcZ9re>KTSG2JDaq$G_ta?NJvN+_c=x^r5+De zRaKOgmEm+cS+QaTxw*Mxs%;z&2kY0br=p?)pb~iURv<`c0T#ddrKhK7#Aq8F9F$Y1 zPRY@uN5yP5i^t;`H6l-(I5C2Y0%ZI4?P3oiAw@)*o1109f(3y*85tQ;RaGTduU;KB zgV<~~X=rGWRjXEwsm=jp@#4kO+1VL#mZ+<%3#fC(OD2;^_U_#)X0ur=7K>Oc7O~sy z;&eKtySrPuy1Jydw^uwKkJ#;YDK9S{RYqZ9p|rHLNON)^ zPSw$+s(Z_HH3c?edcB@$)20DnG#ZJHj^^OOg8-zYq%d#ZJgio$KOPRic~$qf=sNqk z5yg?>!mXm#i3Z*Z9)aJVfl$mm#vA!|Ug1&vk8i|<+czXIbp!x zuH$|ON(6{etOkmS@Cso6HQMJ3@xSj>K1vUKfO2|_Cn&jtk_$Mct`6KvGZw1;YCG_h z+Tmep2ik!5fxRfPUy{|1_II`yu&Vd^Pj8zHyoPdQ&%~gYaRKPt7N^`-!G)W5rd24I0I+&;A(AE7t^ z`-R-7UiSvIBe*@Cs*vAuf)!u@P+~|&sw1yM6&xSKK_G%hF5`SYPg4cfFN9Y9_kp&< z)nzd(NTB>Lx64ndXwaZRg9Z&6G-%MEL4yVj8Z>Coph1HM4H`6P(4aws1`QfCXwaZR jg9Z&6G-%N9|BwFyv7Y{$cYKTr00000NkvXXu0mjfK0~1l literal 0 HcmV?d00001 diff --git a/Source Code/Resources/VampireButton.png b/Source Code/Resources/VampireButton.png new file mode 100644 index 0000000000000000000000000000000000000000..db104d110c4d696edf377308e7243dee01bcbd26 GIT binary patch literal 17626 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 impostors = PlayerControl.AllPlayerControls.ToArray().ToList().OrderBy(x => Guid.NewGuid()).ToList(); impostors.RemoveAll(x => !x.Data.IsImpostor); - float crewCountSettings = TheOtherRolesPlugin.crewmateRolesCount.GetValue(); - float impCountSettings = TheOtherRolesPlugin.impostorRolesCount.GetValue(); + float crewCountSettings = (float)TheOtherRolesPlugin.crewmateRolesCount.GetValue() / 2; + float impCountSettings = (float)TheOtherRolesPlugin.impostorRolesCount.GetValue() / 2; if (crewCountSettings % 1 == 0.5f) crewCountSettings += 0.5f * (rnd.Next(2) * 2 - 1); if (impCountSettings % 1 == 0.5f) impCountSettings += 0.5f * (rnd.Next(2) * 2 - 1); @@ -71,6 +71,7 @@ namespace TheOtherRoles crewSettings.Add((byte)RoleId.Child, TheOtherRolesPlugin.childSpawnRate.GetValue()); crewSettings.Add((byte)RoleId.Tracker, TheOtherRolesPlugin.trackerSpawnRate.GetValue()); crewSettings.Add((byte)RoleId.Snitch, TheOtherRolesPlugin.snitchSpawnRate.GetValue()); + crewSettings.Add((byte)RoleId.Jackal, TheOtherRolesPlugin.jackalSpawnRate.GetValue()); // crewSettings.Add((byte)RoleId.BountyHunter, TheOtherRolesPlugin.bountyHunterSpawnRate.GetValue()); BOUNTY HUNTER // Set multiple player roles @@ -82,7 +83,7 @@ namespace TheOtherRoles } if (rnd.Next(1, 101) <= TheOtherRolesPlugin.loversSpawnRate.GetValue() * 10) { - if (impostors.Count > 0 && crewmates.Count > 0 && maxCrewmateRoles > 0 && maxImpostorRoles > 0 && rnd.Next(1, 101) <= 33) { + if (impostors.Count > 0 && crewmates.Count > 0 && maxCrewmateRoles > 0 && maxImpostorRoles > 0 && rnd.Next(1, 101) <= TheOtherRolesPlugin.loversImpLoverRate.GetValue()) { setRoleToRandomPlayer((byte)RoleId.Lover1, impostors); setRoleToRandomPlayer((byte)RoleId.Lover2, crewmates); maxCrewmateRoles--; diff --git a/Source Code/RoleInfo.cs b/Source Code/RoleInfo.cs new file mode 100644 index 0000000..860dce9 --- /dev/null +++ b/Source Code/RoleInfo.cs @@ -0,0 +1,225 @@ +using HarmonyLib; +using System; +using static TheOtherRoles.TheOtherRoles; +using UnityEngine; + +namespace TheOtherRoles +{ + public class RoleInfo { + public Color color; + public string name; + public string introDescription; + public string shortDescription; + public bool isGood; + + RoleInfo(Color color, string name, string introDescription, string shortDescription, bool isGood) { + this.color = color; + this.name = name; + this.introDescription = introDescription; + this.shortDescription = shortDescription; + this.isGood = isGood; + } + + public string colorHexString() { + return string.Format("[{0:X2}{1:X2}{2:X2}{3:X2}]", ToByte(color.r), ToByte(color.g), ToByte(color.b), ToByte(color.a)); + } + + private static byte ToByte(float f) { + f = Mathf.Clamp01(f); + return (byte)(f * 255); + } + + + public static RoleInfo getRoleInfoForPlayer(PlayerControl p) { + string name = ""; + string introDescription = ""; + string shortDescription = ""; + bool isGood = true; + Color color = Color.white; + + if (Jester.jester != null && p == Jester.jester) { + name = "Jester"; + color = Jester.color; + introDescription = "Get voted out"; + shortDescription = introDescription; + isGood = false; + } + else if (Mayor.mayor != null && p == Mayor.mayor) { + name = "Mayor"; + color = Mayor.color; + introDescription = "Your vote counts twice"; + shortDescription = introDescription; + } + else if (Engineer.engineer != null && p == Engineer.engineer) { + name = "Engineer"; + color = Engineer.color; + introDescription = "Maintain important systems on the ship"; + shortDescription = "Repair the ship"; + } + else if (Sheriff.sheriff != null && p == Sheriff.sheriff) { + name = "Sheriff"; + color = Sheriff.color; + introDescription = "Shoot the [FF1919FF]Impostors"; + shortDescription = "Shoot the Impostors"; + } + else if (Lighter.lighter != null && p == Lighter.lighter) { + name = "Lighter"; + color = Lighter.color; + introDescription = "Your light never goes out"; + shortDescription = introDescription; + } + else if (Godfather.godfather != null && p == Godfather.godfather) { + name = "Godfather"; + color = Godfather.color; + introDescription = "Kill all Crewmates"; + shortDescription = introDescription; + isGood = false; + } + else if (Mafioso.mafioso != null && p == Mafioso.mafioso) { + name = "Mafioso"; + color = Mafioso.color; + introDescription = "Work with the [FF1919FF]Mafia[] to kill the Crewmates"; + shortDescription = "Kill all Crewmates"; + isGood = false; + } + else if (Janitor.janitor != null && p == Janitor.janitor) { + name = "Janitor"; + color = Janitor.color; + introDescription = "Work with the [FF1919FF]Mafia[] by hiding dead bodies"; + shortDescription = "Hide dead bodies"; + isGood = false; + } + else if (Morphling.morphling != null && p == Morphling.morphling) { + name = "Morphling"; + color = Morphling.color; + introDescription = "Change your look to not get caught"; + shortDescription = "Change your look"; + isGood = false; + } + else if (Camouflager.camouflager != null && p == Camouflager.camouflager) { + name = "Camouflager"; + color = Camouflager.color; + introDescription = "Camouflage and kill the Crewmates"; + shortDescription = "Hide among others"; + isGood = false; + } + else if (Vampire.vampire != null && p == Vampire.vampire) { + name = "Vampire"; + color = Vampire.color; + introDescription = "Kill the Crewmates with your bites"; + shortDescription = "Bite your enemies"; + isGood = false; + } + else if (Detective.detective != null && p == Detective.detective) { + name = "Detective"; + color = Detective.color; + introDescription = "Find the [FF1919FF]Impostors[] by examining footprints"; + shortDescription = "Examine footprints"; + } + else if (TimeMaster.timeMaster != null && p == TimeMaster.timeMaster) { + name = "Time Master"; + color = TimeMaster.color; + introDescription = "Rewind time to find the [FF1919FF]Impostors"; + shortDescription = "Rewind time"; + } + else if (Medic.medic != null && p == Medic.medic) { + name = "Medic"; + color = Medic.color; + introDescription = "Protect someone with your shield"; + shortDescription = "Protect other players"; + } + else if (Shifter.shifter != null && p == Shifter.shifter) { + name = "Shifter"; + color = Shifter.color; + introDescription = "Shift your role before the game ends"; + shortDescription = "Shift your role"; + isGood = false; + } + else if (Swapper.swapper != null && p == Swapper.swapper) { + name = "Swapper"; + color = Swapper.color; + introDescription = "Swap votes to exile the [FF1919FF]Impostors"; + shortDescription = "Swap votes"; + } + else if (Seer.seer != null && p == Seer.seer) { + name = "Seer"; + color = Seer.color; + introDescription = "Reveal the intentions of everyone on the ship"; + shortDescription = "Reveal all roles"; + } + else if (Spy.spy != null && p == Spy.spy) { + name = "Spy"; + color = Spy.color; + introDescription = "Spy on everyone to find the [FF1919FF]Impostors"; + shortDescription = "Spy on everyone"; + } + else if (Child.child != null && p == Child.child) { + name = "Child"; + color = Child.color; + introDescription = "No one will harm you until you grow up"; + shortDescription = "No one will harm you"; + } + else if (BountyHunter.bountyHunter != null && p == BountyHunter.bountyHunter) { + name = "Bounty Hunter"; + color = BountyHunter.color; + introDescription = "Hunt your bounty down"; + shortDescription = "Hunt your bounty"; + isGood = false; + } + else if (Tracker.tracker != null && p == Tracker.tracker) { + name = "Tracker"; + color = Tracker.color; + introDescription = "Track the [FF1919FF]Impostors[] down"; + shortDescription = "Track the Impostors down"; + } + else if (Snitch.snitch != null && p == Snitch.snitch) { + name = "Snitch"; + color = Snitch.color; + introDescription = "Finish your tasks to find the [FF1919FF]Impostors[]"; + shortDescription = "Finish your tasks"; + } + else if (Jackal.jackal != null && p == Jackal.jackal) { + name = "Jackal"; + color = Jackal.color; + introDescription = "Kill all Crewmates and [FF1919FF]Impostors[FFFFFFFF] to win"; + shortDescription = ""; + isGood = false; + } + else if (Sidekick.sidekick != null && p == Sidekick.sidekick) { + name = "Sidekick"; + color = Sidekick.color; + introDescription = ""; + shortDescription = "Help your Jackal to kill everyone"; + isGood = false; + } + else if ((Lovers.lover1 != null && p == Lovers.lover1) || (Lovers.lover2 != null && p == Lovers.lover2)) { + name = p.Data.IsImpostor ? "ImpLover" : "Lover"; + color = p.Data.IsImpostor ? Palette.ImpostorRed : Lovers.color; + introDescription = "You are in [FC03BEFF]Love[]"; + shortDescription = "You are in love"; + isGood = !p.Data.IsImpostor; + } + else if (p.Data.IsImpostor) { // Just Impostor + name = "Impostor"; + color = Palette.ImpostorRed; + introDescription = ""; + shortDescription = "Sabotage and kill everyone"; + isGood = false; + } + else { // Just Crewmate + name = "Crewmate"; + color = Color.white; + introDescription = ""; + shortDescription = "Find the Impostors"; + } + + return new RoleInfo( + color, + name, + introDescription, + shortDescription, + isGood + ); + } + } +} \ No newline at end of file diff --git a/Source Code/ShipStatusPatch.cs b/Source Code/ShipStatusPatch.cs index c6ed7fb..d5db201 100644 --- a/Source Code/ShipStatusPatch.cs +++ b/Source Code/ShipStatusPatch.cs @@ -4,12 +4,23 @@ using static TheOtherRoles.TheOtherRoles; namespace TheOtherRoles { - [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.CalculateLightRadius))] + [HarmonyPatch(typeof(ShipStatus))] public class ShipStatusPatch { - public static void Postfix(ref float __result, ShipStatus __instance, [HarmonyArgument(0)] GameData.PlayerInfo PlayerData) { + + [HarmonyPostfix] + [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.CalculateLightRadius))] + public static void Postfix1(ref float __result, ShipStatus __instance, [HarmonyArgument(0)] GameData.PlayerInfo PlayerData) { if (Lighter.lighter != null && Lighter.lighter.PlayerId == PlayerData.PlayerId) { __result = __instance.MaxLightRadius * Lighter.lighterVision; } } + + [HarmonyPostfix] + [HarmonyPatch(typeof(ShipStatus), nameof(ShipStatus.IsGameOverDueToDeath))] + public static void Postfix2(ShipStatus __instance, ref bool __result) + { + __result = false; + } } + } \ No newline at end of file diff --git a/Source Code/TheOtherRoles.cs b/Source Code/TheOtherRoles.cs index cf70fc2..4b53622 100644 --- a/Source Code/TheOtherRoles.cs +++ b/Source Code/TheOtherRoles.cs @@ -45,6 +45,8 @@ namespace TheOtherRoles Tracker.clearAndReload(); Vampire.clearAndReload(); Snitch.clearAndReload(); + Jackal.clearAndReload(); + Sidekick.clearAndReload(); } public static class Jester { @@ -283,11 +285,11 @@ namespace TheOtherRoles public static bool notAckedExiledIsLover = false; public static bool existingAndAlive() { - return lover1 != null && lover2 != null && !lover1.Data.IsDead && !lover2.Data.IsDead && !notAckedExiledIsLover; // ADD NOT ACKED IS LOVER + return lover1 != null && lover2 != null && !lover1.Data.IsDead && !lover2.Data.IsDead && !lover1.Data.Disconnected && !lover2.Data.Disconnected && !notAckedExiledIsLover; // ADD NOT ACKED IS LOVER } public static bool existingWithImpLover() { - return lover1 != null && lover2 != null && (lover1.Data.IsImpostor || lover2.Data.IsImpostor); + return lover1 != null && lover2 != null && !lover1.Data.Disconnected && !lover2.Data.Disconnected && (lover1.Data.IsImpostor || lover2.Data.IsImpostor); } public static void clearAndReload() { @@ -490,6 +492,8 @@ namespace TheOtherRoles public static Color color = Palette.ImpostorRed; public static float delay = 10f; + public static float cooldown = float.MaxValue; + public static bool canKillNearGarlics = true; public static bool localPlacedGarlic = false; public static bool garlicsActive = true; @@ -526,6 +530,8 @@ namespace TheOtherRoles currentTarget = null; garlicsActive = TheOtherRolesPlugin.vampireSpawnRate.GetValue() > 0; delay = TheOtherRolesPlugin.vampireKillDelay.GetValue(); + cooldown = TheOtherRolesPlugin.vampireCooldown.GetValue(); + canKillNearGarlics = TheOtherRolesPlugin.vampireCanKillNearGarlics.GetValue(); } } @@ -542,4 +548,73 @@ namespace TheOtherRoles snitch = null; } } + + public static class Jackal { + public static PlayerControl jackal; + public static Color color = new Color(0f / 255f, 180f / 255f, 235f / 255f, 1); + public static PlayerControl fakeSidekick; + + public static PlayerControl currentTarget; + public static List formerJackals = new List(); + + public static float cooldown = float.MaxValue; + public static float createSidekickCooldown = float.MaxValue; + public static bool canUseVents = true; + public static bool canCreateSidekick = true; + public static Sprite buttonSprite; + public static bool jackalPromotedFromSidekickCanCreateSidekick = true; + public static bool canCreateSidekickFromImpostor = true; + + public static Sprite getSidekickButtonSprite() { + if (buttonSprite) return buttonSprite; + buttonSprite = Helpers.loadSpriteFromResources("TheOtherRoles.Resources.SidekickButton.png", 100f); + return buttonSprite; + } + + public static void removeCurrentJackal() { + formerJackals.Add(jackal); + jackal = null; + currentTarget = null; + fakeSidekick = null; + cooldown = TheOtherRolesPlugin.jackalKillCooldown.GetValue(); + createSidekickCooldown = TheOtherRolesPlugin.jackalCreateSidekickCooldown.GetValue(); + } + + public static void clearAndReload() { + jackal = null; + currentTarget = null; + fakeSidekick = null; + cooldown = TheOtherRolesPlugin.jackalKillCooldown.GetValue(); + createSidekickCooldown = TheOtherRolesPlugin.jackalCreateSidekickCooldown.GetValue(); + canUseVents = TheOtherRolesPlugin.jackalCanUseVents.GetValue(); + canCreateSidekick = TheOtherRolesPlugin.jackalCanCreateSidekick.GetValue(); + jackalPromotedFromSidekickCanCreateSidekick = TheOtherRolesPlugin.jackalPromotedFromSidekickCanCreateSidekick.GetValue(); + canCreateSidekickFromImpostor = TheOtherRolesPlugin.jackalCanCreateSidekickFromImpostor.GetValue(); + formerJackals.Clear(); + } + + } + + public static class Sidekick { + public static PlayerControl sidekick; + public static Color color = new Color(0f / 255f, 180f / 255f, 235f / 255f, 1); + + public static PlayerControl currentTarget; + + public static float cooldown = float.MaxValue; + public static bool canUseVents = true; + public static bool canKill = true; + public static bool promotesToJackal = true; + + public static void clearAndReload() { + sidekick = null; + currentTarget = null; + cooldown = TheOtherRolesPlugin.jackalKillCooldown.GetValue(); + canUseVents = TheOtherRolesPlugin.sidekickCanUseVents.GetValue(); + canKill = TheOtherRolesPlugin.sidekickCanKill.GetValue(); + promotesToJackal = TheOtherRolesPlugin.sidekickPromotesToJackal.GetValue(); + } + + } + } \ No newline at end of file diff --git a/Source Code/TheOtherRoles.csproj b/Source Code/TheOtherRoles.csproj index c0e534e..efe2bc5 100644 --- a/Source Code/TheOtherRoles.csproj +++ b/Source Code/TheOtherRoles.csproj @@ -50,9 +50,11 @@ + + \ No newline at end of file diff --git a/Source Code/UpdatePatch.cs b/Source Code/UpdatePatch.cs index 6d20ef6..df44591 100644 --- a/Source Code/UpdatePatch.cs +++ b/Source Code/UpdatePatch.cs @@ -24,7 +24,7 @@ namespace TheOtherRoles player.nameText.Color = Color.white; } } - if (MeetingHud.Instance != null) + if (MeetingHud.Instance != null) { foreach (PlayerVoteArea player in MeetingHud.Instance.playerStates) { PlayerControl playerControl = playersById.ContainsKey((byte)player.TargetPlayerId) ? playersById[(byte)player.TargetPlayerId] : null; if (playerControl != null) { @@ -36,7 +36,7 @@ namespace TheOtherRoles } } } - + } if (PlayerControl.LocalPlayer.Data.IsImpostor) { List impostors = PlayerControl.AllPlayerControls.ToArray().ToList(); impostors.RemoveAll(x => !x.Data.IsImpostor); @@ -49,7 +49,7 @@ namespace TheOtherRoles player.NameText.Color = Palette.ImpostorRed; } } - + } static void setPlayerNameColor(PlayerControl p, Color color) { @@ -97,6 +97,25 @@ namespace TheOtherRoles setPlayerNameColor(Tracker.tracker, Tracker.color); else if (Snitch.snitch != null && Snitch.snitch == PlayerControl.LocalPlayer) setPlayerNameColor(Snitch.snitch, Snitch.color); + else if (Jackal.jackal != null && Jackal.jackal == PlayerControl.LocalPlayer) { + // Jackal can see his sidekick + setPlayerNameColor(Jackal.jackal, Jackal.color); + if (Sidekick.sidekick != null) { + setPlayerNameColor(Sidekick.sidekick, Jackal.color); + } + if (Jackal.fakeSidekick != null) { + setPlayerNameColor(Jackal.fakeSidekick, Jackal.color); + } + } + + // No else if here, as a Lover of team Jackal needs the colors + if (Sidekick.sidekick != null && Sidekick.sidekick == PlayerControl.LocalPlayer) { + // Sidekick can see the jackal + setPlayerNameColor(Sidekick.sidekick, Sidekick.color); + if (Jackal.jackal != null) { + setPlayerNameColor(Jackal.jackal, Jackal.color); + } + } // Crewmate roles with no changes: Child // Impostor roles with no changes: Morphling, Camouflager, Vampire, Godfather, Janitor and Mafioso @@ -148,17 +167,6 @@ namespace TheOtherRoles } } - static void jesterClearTasks() { - if (Jester.jester == null) return; - - var toRemove = new List(); - foreach (PlayerTask task in Jester.jester.myTasks) - if (task.TaskType != TaskTypes.FixComms && task.TaskType != TaskTypes.FixLights && task.TaskType != TaskTypes.ResetReactor && task.TaskType != TaskTypes.ResetSeismic && task.TaskType != TaskTypes.RestoreOxy) - toRemove.Add(task); - foreach (PlayerTask task in toRemove) - Jester.jester.RemoveTask(task); - } - static void mafiosoDeactivateKillButtonIfNecessary(HudManager __instance) { if (Mafioso.mafioso == null || Mafioso.mafioso != PlayerControl.LocalPlayer) return; @@ -184,17 +192,6 @@ namespace TheOtherRoles } } - static void shifterClearTasks() { - if (Shifter.shifter == null) return; - - var toRemove = new List(); - foreach (PlayerTask task in Shifter.shifter.myTasks) - if (task.TaskType != TaskTypes.FixComms && task.TaskType != TaskTypes.FixLights && task.TaskType != TaskTypes.ResetReactor && task.TaskType != TaskTypes.ResetSeismic && task.TaskType != TaskTypes.RestoreOxy) - toRemove.Add(task); - foreach (PlayerTask task in toRemove) - Shifter.shifter.RemoveTask(task); - } - static void seerUpdate() { if (Seer.seer == null || Seer.seer != PlayerControl.LocalPlayer) return; @@ -207,9 +204,9 @@ namespace TheOtherRoles // Update color and name regarding settings and given info string result = target.Data.PlayerName; - SeerInfo si = SeerInfo.getSeerInfoForPlayer(targetOrMistake); + RoleInfo si = RoleInfo.getRoleInfoForPlayer(targetOrMistake); if (Seer.kindOfInfo == 0) - result = target.Data.PlayerName + " (" + si.roleName + ")"; + result = target.Data.PlayerName + " (" + si.name + ")"; else if (Seer.kindOfInfo == 1) { si.color = si.isGood ? new Color(250f / 255f, 217f / 255f, 52f / 255f, 1) : new Color (51f / 255f, 61f / 255f, 54f / 255f, 1); } @@ -370,10 +367,13 @@ namespace TheOtherRoles if (Snitch.snitch.Data.IsDead) return; int numberOfTasks = 0; - foreach (PlayerTask t in Snitch.snitch.myTasks) { - if (t.TaskType != TaskTypes.FixComms && t.TaskType != TaskTypes.FixLights && t.TaskType != TaskTypes.ResetReactor && t.TaskType != TaskTypes.ResetSeismic && t.TaskType != TaskTypes.RestoreOxy) - if (!t.IsComplete) numberOfTasks++; - } + GameData.PlayerInfo playerInfo = Snitch.snitch.Data; + if (!playerInfo.Disconnected && playerInfo.Tasks != null) { + for (int i = 0; i < playerInfo.Tasks.Count; i++) { + if (!playerInfo.Tasks[i].Complete) + numberOfTasks++; + } + } if (PlayerControl.LocalPlayer.Data.IsImpostor && numberOfTasks <= Snitch.taskCountForImpostors) { if (Snitch.localArrows.Count == 0) Snitch.localArrows.Add(new Arrow(Color.blue)); @@ -408,13 +408,13 @@ namespace TheOtherRoles // Mafia setMafiaNameTags(); // Jester - jesterClearTasks(); + Helpers.removeTasksFromPlayer(Jester.jester); // Mafioso mafiosoDeactivateKillButtonIfNecessary(__instance); // Janitor janitorDeactivateKillButton(__instance); // Shifter - shifterClearTasks(); + Helpers.removeTasksFromPlayer(Shifter.shifter); // Seer update seerUpdate(); // Spy update(); @@ -429,6 +429,10 @@ namespace TheOtherRoles vampireDeactivateKillButton(__instance); // Snitch snitchUpdate(); + // Jackal + Helpers.removeTasksFromPlayer(Jackal.jackal); + // Sidekick + Helpers.removeTasksFromPlayer(Sidekick.sidekick); } } } \ No newline at end of file diff --git a/Source Code/UsablesPatch.cs b/Source Code/UsablesPatch.cs index fb0415f..babcb11 100644 --- a/Source Code/UsablesPatch.cs +++ b/Source Code/UsablesPatch.cs @@ -24,6 +24,10 @@ namespace TheOtherRoles bool roleCouldUse = false; if (Engineer.engineer != null && Engineer.engineer == @object) roleCouldUse = true; + else if (Jackal.canUseVents && Jackal.jackal != null && Jackal.jackal == @object) + roleCouldUse = true; + else if (Sidekick.canUseVents && Sidekick.sidekick != null && Sidekick.sidekick == @object) + roleCouldUse = true; else if (pc.IsImpostor) { if (Janitor.janitor != null && Janitor.janitor == PlayerControl.LocalPlayer) roleCouldUse = false; -- 2.39.5