You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
6.1 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using Networking.Server;
  6. public abstract class GameMode : ScriptableObject
  7. {
  8. [SerializeField]
  9. [Tooltip("Scene to load which contains Gamemode UI")]
  10. private string GameModeScene;
  11. [SerializeField]
  12. [Tooltip("Round Times are acessed from the top down")]
  13. private List<float> RoundTimes;
  14. public Action GameStartEvent;
  15. public Action InputStartEvent;
  16. public Action RoundStartEvent;
  17. public Action AllPlayersMovedEvent;
  18. public Action RoundEndEvent;
  19. public Action OnGameOverEvent;
  20. private List<float> gameTimes;
  21. /// <summary>
  22. /// Called once before any players have spawned
  23. /// </summary>
  24. protected virtual void OnPreGameStart() { }
  25. /// <summary>
  26. /// Called once after players have spawned
  27. /// </summary>
  28. /// <param name="allPlayers">All players in game</param>
  29. protected virtual void OnGameStart(PlayerData[] allPlayers) { }
  30. /// <summary>
  31. /// Called every time players are moved to the input scene
  32. /// </summary>
  33. /// <param name="allPlayers">All players in game</param>
  34. protected virtual void OnInputStart(PlayerData[] allPlayers) { }
  35. /// <summary>
  36. /// Called for each player when we recieve their input
  37. /// </summary>
  38. /// <param name="player">Player who's input we recieved</param>
  39. protected virtual void OnRecievedPlayerInput(PlayerData player) { }
  40. /// <summary>
  41. /// Called after we have recieved all player input
  42. /// </summary>
  43. /// <param name="allPlayers">All players in game</param>
  44. protected virtual void OnInputEnd(PlayerData[] allPlayers) { }
  45. /// <summary>
  46. /// Called at the beginning of a new Round
  47. /// </summary>
  48. protected virtual void OnRoundStart(PlayerData[] allPlayers) { }
  49. /// <summary>
  50. /// Called for each player after they finished one move. Even if they didn't move!
  51. /// </summary>
  52. /// <param name="character">Character which moved</param>
  53. /// <param name="client">Client which controls character</param>
  54. /// <param name="currentBlock">Block which the character finished on</param>
  55. protected virtual void OnPlayerMoved(Character character, ClientData client, Block currentBlock) { }
  56. /// <summary>
  57. /// Called once after every player has finished one move
  58. /// </summary>
  59. /// <param name="allCharacters">List of all player Info</param>
  60. protected virtual void OnAllPlayersMoved(PlayerData[] allPlayers) { }
  61. /// <summary>
  62. /// Called after one round has finished
  63. /// </summary>
  64. /// <param name="allPlayers">all players in game</param>
  65. protected virtual void OnRoundEnd(PlayerData[] allPlayers) { }
  66. /// <summary>
  67. /// Called once at end of game
  68. /// </summary>
  69. /// <param name="allPlayers">All players in game</param>
  70. protected virtual void OnGameOver(PlayerData[] allPlayers) { }
  71. /// <summary>
  72. /// Called to check if victory condition has been met
  73. /// </summary>
  74. /// <param name="allPlayers">All players in game</param>
  75. /// <returns>returns true if victory condition has been met</returns>
  76. public abstract bool isGameOver(PlayerData[] allPlayers);
  77. public float GetRoundTime()
  78. {
  79. float retVal = gameTimes[0];
  80. if (gameTimes.Count > 1)
  81. gameTimes.RemoveAt(0);
  82. return retVal;
  83. }
  84. #region Public functions
  85. public void PreGameStart()
  86. {
  87. OnPreGameStart();
  88. }
  89. public void GameStart(PlayerData[] allPlayers)
  90. {
  91. gameTimes = new List<float>(RoundTimes);
  92. if (!String.IsNullOrEmpty(GameModeScene))
  93. UnityEngine.SceneManagement.SceneManager.LoadScene(GameModeScene, UnityEngine.SceneManagement.LoadSceneMode.Additive);
  94. for (int i = 0; i < allPlayers.Length; i++)
  95. {
  96. allPlayers[i].client.Lives = 3;
  97. }
  98. OnGameStart(allPlayers);
  99. GameStartEvent?.Invoke();
  100. }
  101. public void InputStart(PlayerData[] AllPlayers)
  102. {
  103. OnInputStart(AllPlayers);
  104. InputStartEvent?.Invoke();
  105. }
  106. public void RecievedPlayerInput(PlayerData player)
  107. {
  108. OnRecievedPlayerInput(player);
  109. }
  110. public void InputEnd(PlayerData[] AllPlayers)
  111. {
  112. }
  113. public void RoundStart(PlayerData[] allPlayers)
  114. {
  115. OnRoundStart(allPlayers);
  116. RoundStartEvent?.Invoke();
  117. }
  118. public void PlayerMoved(PlayerData player)
  119. {
  120. OnPlayerMoved(player.character, player.client, player.character.CurrentBlock);
  121. }
  122. public void AllPlayersMoved(PlayerData[] allPlayers)
  123. {
  124. OnAllPlayersMoved(allPlayers);
  125. AllPlayersMovedEvent?.Invoke();
  126. }
  127. public void RoundEnd(PlayerData[] allPlayers)
  128. {
  129. OnRoundEnd(allPlayers);
  130. RoundEndEvent?.Invoke();
  131. }
  132. public void GameEnd(PlayerData[] allPlayers)
  133. {
  134. OnGameOver(allPlayers);
  135. OnGameOverEvent?.Invoke();
  136. }
  137. }
  138. #endregion Public Functions
  139. /* --- Calls we need ---
  140. *
  141. * PreGameSetup(); - //Called once before the game actually starts
  142. * GameStart(PlayerData[] AllPlayers); //Called once after players have Spawned
  143. *
  144. * OnInputStart(PlayerData[] AllPlayers) //Called when players enter input mode
  145. * OnRecievedPlayerInput(PlayerData Player) //Called when a specific player has sent their input
  146. * OnInputEnd(PlayerData[] AllPlayers) //Called when player input mode has finished
  147. *
  148. * OnRoundStart(PlayerData[] AllPlayers) //Just before Players start moving
  149. *
  150. * ------- Start Round Loop -------
  151. *
  152. * OnPlayerMoved(PlayerData player) //Called after each player moves
  153. * IsGameOver(PlayerData[] AllPlayers) //Called after each player moves
  154. *
  155. * AllPlayersMoved(PlayerData[] AllPlayers) //Called after all players have moved
  156. * EnvironmentTurn() //Also called after all players have moved but should be kept specialised to environment stuff
  157. * IsGameOver(PlayerData[] AllPlayers) //We need to check if the environment terminated the game
  158. *
  159. * --------- End Game Loop ---------
  160. *
  161. * OnRoundEnd(PlayerData[] AllPlayers) //Called after movements are made
  162. * IsGameOver(PlayerData[] AllPlayers) //This needs to be checked again
  163. *
  164. * GameEnd(PlayerData[] AllPlayers)
  165. *
  166. *
  167. *
  168. *
  169. *
  170. */