diff options
Diffstat (limited to 'GameCode/GM_ArmsRace.cs')
-rw-r--r-- | GameCode/GM_ArmsRace.cs | 465 |
1 files changed, 465 insertions, 0 deletions
diff --git a/GameCode/GM_ArmsRace.cs b/GameCode/GM_ArmsRace.cs new file mode 100644 index 0000000..3d309ae --- /dev/null +++ b/GameCode/GM_ArmsRace.cs @@ -0,0 +1,465 @@ +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<PhotonView>(); + 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<Player>)Delegate.Combine(playerManager.PlayerJoinedAction, new Action<Player>(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<PhotonView>().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; + } + } +} |