using System; using System.Collections; using Photon.Pun; using UnityEngine; public class GM_ArmsRace : MonoBehaviour { private int playersNeededToStart = 2; private int pointsToWinRound = 2; public int roundsToWinGame = 5; public int p1Points; public int p2Points; public int p1Rounds; public int p2Rounds; private PhotonView view; public static GM_ArmsRace instance; private bool isWaiting; public Action StartGameAction; public bool pickPhase = true; [HideInInspector] public bool isPicking; private bool waitingForOtherPlayer = true; private int currentWinningTeamID = -1; public Action pointOverAction; private bool isTransitioning; private void Awake() { instance = this; } private void Start() { view = GetComponent(); PlayerManager.instance.SetPlayersSimulated(simulated: false); PlayerAssigner.instance.maxPlayers = playersNeededToStart; PlayerAssigner.instance.SetPlayersCanJoin(canJoin: true); PlayerManager.instance.AddPlayerDiedAction(PlayerDied); PlayerManager playerManager = PlayerManager.instance; playerManager.PlayerJoinedAction = (Action)Delegate.Combine(playerManager.PlayerJoinedAction, new Action(PlayerJoined)); ArtHandler.instance.NextArt(); playersNeededToStart = 2; UIHandler.instance.SetNumberOfRounds(roundsToWinGame); PlayerAssigner.instance.maxPlayers = playersNeededToStart; if (!PhotonNetwork.OfflineMode) { UIHandler.instance.ShowJoinGameText("PRESS JUMP\n TO JOIN", PlayerSkinBank.GetPlayerSkinColors(0).winText); } } private void Update() { if (Input.GetKey(KeyCode.Alpha4)) { playersNeededToStart = 4; PlayerAssigner.instance.maxPlayers = playersNeededToStart; } if (Input.GetKey(KeyCode.Alpha2)) { playersNeededToStart = 2; PlayerAssigner.instance.maxPlayers = playersNeededToStart; } } public void PlayerJoined(Player player) { if (PhotonNetwork.OfflineMode) { return; } if (!PhotonNetwork.OfflineMode) { if (player.data.view.IsMine) { UIHandler.instance.ShowJoinGameText("WAITING", PlayerSkinBank.GetPlayerSkinColors(1).winText); } else { UIHandler.instance.ShowJoinGameText("PRESS JUMP\n TO JOIN", PlayerSkinBank.GetPlayerSkinColors(1).winText); } } player.data.isPlaying = false; int count = PlayerManager.instance.players.Count; if (count >= playersNeededToStart) { StartGame(); } else if (PhotonNetwork.OfflineMode) { if (playersNeededToStart - count == 3) { UIHandler.instance.ShowJoinGameText("ADD THREE MORE PLAYER TO START", PlayerSkinBank.GetPlayerSkinColors(count).winText); } if (playersNeededToStart - count == 2) { UIHandler.instance.ShowJoinGameText("ADD TWO MORE PLAYER TO START", PlayerSkinBank.GetPlayerSkinColors(count).winText); } if (playersNeededToStart - count == 1) { UIHandler.instance.ShowJoinGameText("ADD ONE MORE PLAYER TO START", PlayerSkinBank.GetPlayerSkinColors(count).winText); } } } [PunRPC] private void RPCO_RequestSyncUp() { view.RPC("RPCM_ReturnSyncUp", RpcTarget.Others); } [PunRPC] private void RPCM_ReturnSyncUp() { isWaiting = false; } private IEnumerator WaitForSyncUp() { if (!PhotonNetwork.OfflineMode) { isWaiting = true; view.RPC("RPCO_RequestSyncUp", RpcTarget.Others); while (isWaiting) { yield return null; } } } public void StartGame() { if (!GameManager.instance.isPlaying) { StartGameAction?.Invoke(); GameManager.instance.isPlaying = true; StartCoroutine(DoStartGame()); } } private IEnumerator DoStartGame() { GameManager.instance.battleOngoing = false; UIHandler.instance.ShowJoinGameText("LETS GOO!", PlayerSkinBank.GetPlayerSkinColors(1).winText); yield return new WaitForSeconds(0.25f); UIHandler.instance.HideJoinGameText(); PlayerManager.instance.SetPlayersSimulated(simulated: false); PlayerManager.instance.SetPlayersVisible(visible: false); MapManager.instance.LoadNextLevel(); TimeHandler.instance.DoSpeedUp(); yield return new WaitForSecondsRealtime(1f); if (pickPhase) { for (int i = 0; i < PlayerManager.instance.players.Count; i++) { yield return StartCoroutine(WaitForSyncUp()); CardChoiceVisuals.instance.Show(i, animateIn: true); yield return CardChoice.instance.DoPick(1, PlayerManager.instance.players[i].playerID, PickerType.Player); yield return new WaitForSecondsRealtime(0.1f); } yield return StartCoroutine(WaitForSyncUp()); CardChoiceVisuals.instance.Hide(); } MapManager.instance.CallInNewMapAndMovePlayers(MapManager.instance.currentLevelID); TimeHandler.instance.DoSpeedUp(); TimeHandler.instance.StartGame(); GameManager.instance.battleOngoing = true; UIHandler.instance.ShowRoundCounterSmall(p1Rounds, p2Rounds, p1Points, p2Points); PlayerManager.instance.SetPlayersVisible(visible: true); } private IEnumerator PointTransition(int winningTeamID, string winTextBefore, string winText) { StartCoroutine(PointVisualizer.instance.DoSequence(p1Points, p2Points, winningTeamID == 0)); yield return new WaitForSecondsRealtime(1f); MapManager.instance.LoadNextLevel(); yield return new WaitForSecondsRealtime(0.5f); yield return StartCoroutine(WaitForSyncUp()); MapManager.instance.CallInNewMapAndMovePlayers(MapManager.instance.currentLevelID); PlayerManager.instance.RevivePlayers(); yield return new WaitForSecondsRealtime(0.3f); TimeHandler.instance.DoSpeedUp(); GameManager.instance.battleOngoing = true; isTransitioning = false; } private void PointOver(int winningTeamID) { int num = p1Points; int num2 = p2Points; if (winningTeamID == 0) { num--; } else { num2--; } string winTextBefore = num + " - " + num2; string winText = p1Points + " - " + p2Points; StartCoroutine(PointTransition(winningTeamID, winTextBefore, winText)); UIHandler.instance.ShowRoundCounterSmall(p1Rounds, p2Rounds, p1Points, p2Points); } private IEnumerator RoundTransition(int winningTeamID, int killedTeamID) { StartCoroutine(PointVisualizer.instance.DoWinSequence(p1Points, p2Points, p1Rounds, p2Rounds, winningTeamID == 0)); yield return new WaitForSecondsRealtime(1f); MapManager.instance.LoadNextLevel(); yield return new WaitForSecondsRealtime(0.3f); yield return new WaitForSecondsRealtime(1f); TimeHandler.instance.DoSpeedUp(); if (pickPhase) { Debug.Log("PICK PHASE"); PlayerManager.instance.SetPlayersVisible(visible: false); Player[] players = PlayerManager.instance.GetPlayersInTeam(killedTeamID); for (int i = 0; i < players.Length; i++) { yield return StartCoroutine(WaitForSyncUp()); yield return CardChoice.instance.DoPick(1, players[i].playerID, PickerType.Player); yield return new WaitForSecondsRealtime(0.1f); } PlayerManager.instance.SetPlayersVisible(visible: true); } yield return StartCoroutine(WaitForSyncUp()); TimeHandler.instance.DoSlowDown(); MapManager.instance.CallInNewMapAndMovePlayers(MapManager.instance.currentLevelID); PlayerManager.instance.RevivePlayers(); yield return new WaitForSecondsRealtime(0.3f); TimeHandler.instance.DoSpeedUp(); isTransitioning = false; GameManager.instance.battleOngoing = true; UIHandler.instance.ShowRoundCounterSmall(p1Rounds, p2Rounds, p1Points, p2Points); } private void RoundOver(int winningTeamID, int losingTeamID) { currentWinningTeamID = winningTeamID; StartCoroutine(RoundTransition(winningTeamID, losingTeamID)); p1Points = 0; p2Points = 0; } private IEnumerator GameOverTransition(int winningTeamID) { UIHandler.instance.ShowRoundCounterSmall(p1Rounds, p2Rounds, p1Points, p2Points); UIHandler.instance.DisplayScreenText(PlayerManager.instance.GetColorFromTeam(winningTeamID).winText, "VICTORY!", 1f); yield return new WaitForSecondsRealtime(2f); GameOverRematch(winningTeamID); } private void GameOverRematch(int winningTeamID) { UIHandler.instance.DisplayScreenTextLoop(PlayerManager.instance.GetColorFromTeam(winningTeamID).winText, "REMATCH?"); UIHandler.instance.DisplayYesNoLoop(PlayerManager.instance.GetFirstPlayerInTeam(winningTeamID), GetRematchYesNo); MapManager.instance.LoadNextLevel(); } private void GetRematchYesNo(PopUpHandler.YesNo yesNo) { if (yesNo == PopUpHandler.YesNo.Yes) { StartCoroutine(IDoRematch()); } else { DoRestart(); } } [PunRPC] public void RPCA_PlayAgain() { waitingForOtherPlayer = false; } private IEnumerator IDoRematch() { if (!PhotonNetwork.OfflineMode) { GetComponent().RPC("RPCA_PlayAgain", RpcTarget.Others); UIHandler.instance.DisplayScreenTextLoop("WAITING"); float c = 0f; while (waitingForOtherPlayer) { c += Time.unscaledDeltaTime; if (c > 10f) { DoRestart(); yield break; } yield return null; } } yield return null; UIHandler.instance.StopScreenTextLoop(); PlayerManager.instance.ResetCharacters(); ResetMatch(); StartCoroutine(DoStartGame()); waitingForOtherPlayer = true; } private void ResetMatch() { p1Points = 0; p1Rounds = 0; p2Points = 0; p2Rounds = 0; isTransitioning = false; waitingForOtherPlayer = false; UIHandler.instance.ShowRoundCounterSmall(p1Rounds, p2Rounds, p1Points, p2Points); CardBarHandler.instance.ResetCardBards(); PointVisualizer.instance.ResetPoints(); } private void GameOverContinue(int winningTeamID) { UIHandler.instance.DisplayScreenTextLoop(PlayerManager.instance.GetColorFromTeam(winningTeamID).winText, "CONTINUE?"); UIHandler.instance.DisplayYesNoLoop(PlayerManager.instance.GetFirstPlayerInTeam(winningTeamID), GetContinueYesNo); MapManager.instance.LoadNextLevel(); } private void GetContinueYesNo(PopUpHandler.YesNo yesNo) { if (yesNo == PopUpHandler.YesNo.Yes) { DoContinue(); } else { DoRestart(); } } private void DoContinue() { UIHandler.instance.StopScreenTextLoop(); roundsToWinGame += 2; UIHandler.instance.SetNumberOfRounds(roundsToWinGame); RoundOver(currentWinningTeamID, PlayerManager.instance.GetOtherTeam(currentWinningTeamID)); } private void DoRestart() { GameManager.instance.battleOngoing = false; if (PhotonNetwork.OfflineMode) { Application.LoadLevel(Application.loadedLevel); } else { NetworkConnectionHandler.instance.NetworkRestart(); } } private void GameOver(int winningTeamID) { currentWinningTeamID = winningTeamID; StartCoroutine(GameOverTransition(winningTeamID)); } public void PlayerDied(Player killedPlayer, int playersAlive) { if (!PhotonNetwork.OfflineMode) { Debug.Log("PlayerDied: " + killedPlayer.data.view.Owner.NickName); } if (PlayerManager.instance.TeamsAlive() < 2) { TimeHandler.instance.DoSlowDown(); if (PhotonNetwork.IsMasterClient) { view.RPC("RPCA_NextRound", RpcTarget.All, PlayerManager.instance.GetOtherTeam(PlayerManager.instance.GetLastTeamAlive()), PlayerManager.instance.GetLastTeamAlive(), p1Points, p2Points, p1Rounds, p2Rounds); } } } [PunRPC] public void RPCA_NextRound(int losingTeamID, int winningTeamID, int p1PointsSet, int p2PointsSet, int p1RoundsSet, int p2RoundsSet) { if (isTransitioning) { return; } GameManager.instance.battleOngoing = false; p1Points = p1PointsSet; p2Points = p2PointsSet; p1Rounds = p1RoundsSet; p2Rounds = p2RoundsSet; Debug.Log("Winning team: " + winningTeamID); Debug.Log("Losing team: " + losingTeamID); isTransitioning = true; GameManager.instance.GameOver(winningTeamID, losingTeamID); PlayerManager.instance.SetPlayersSimulated(simulated: false); switch (winningTeamID) { case 0: p1Points++; if (p1Points >= pointsToWinRound) { p1Rounds++; if (p1Rounds >= roundsToWinGame) { Debug.Log("Game over, winning team: " + winningTeamID); GameOver(winningTeamID); pointOverAction(); } else { Debug.Log("Round over, winning team: " + winningTeamID); RoundOver(winningTeamID, losingTeamID); pointOverAction(); } } else { Debug.Log("Point over, winning team: " + winningTeamID); PointOver(winningTeamID); pointOverAction(); } break; case 1: p2Points++; if (p2Points >= pointsToWinRound) { p2Rounds++; if (p2Rounds >= roundsToWinGame) { Debug.Log("Game over, winning team: " + winningTeamID); GameOver(winningTeamID); pointOverAction(); } else { Debug.Log("Round over, winning team: " + winningTeamID); RoundOver(winningTeamID, losingTeamID); pointOverAction(); } } else { Debug.Log("Point over, winning team: " + winningTeamID); PointOver(winningTeamID); pointOverAction(); } break; } } }