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.

216 lines
6.5 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 all environmentblocks have taken their turn
  63. /// </summary>
  64. /// <param name="allPlayers">All players in scene</param>
  65. protected virtual void OnEnvironmentTurn(PlayerData[] allPlayers) { }
  66. /// <summary>
  67. /// Called after one round has finished
  68. /// </summary>
  69. /// <param name="allPlayers">all players in game</param>
  70. protected virtual void OnRoundEnd(PlayerData[] allPlayers) { }
  71. /// <summary>
  72. /// Called once at end of game
  73. /// </summary>
  74. /// <param name="allPlayers">All players in game</param>
  75. protected virtual void OnGameOver(PlayerData[] allPlayers) { }
  76. /// <summary>
  77. /// Called to check if victory condition has been met
  78. /// </summary>
  79. /// <param name="allPlayers">All players in game</param>
  80. /// <returns>returns true if victory condition has been met</returns>
  81. public abstract bool isGameOver(PlayerData[] allPlayers);
  82. public float GetRoundTime()
  83. {
  84. float retVal = gameTimes[0];
  85. if (gameTimes.Count > 1)
  86. gameTimes.RemoveAt(0);
  87. return retVal;
  88. }
  89. #region Public functions
  90. public void PreGameStart()
  91. {
  92. OnPreGameStart();
  93. }
  94. public void GameStart(PlayerData[] allPlayers)
  95. {
  96. gameTimes = new List<float>(RoundTimes);
  97. if (!String.IsNullOrEmpty(GameModeScene))
  98. UnityEngine.SceneManagement.SceneManager.LoadScene(GameModeScene, UnityEngine.SceneManagement.LoadSceneMode.Additive);
  99. for (int i = 0; i < allPlayers.Length; i++)
  100. {
  101. allPlayers[i].client.Lives = 3;
  102. }
  103. OnGameStart(allPlayers);
  104. GameStartEvent?.Invoke();
  105. }
  106. public void InputStart(PlayerData[] AllPlayers)
  107. {
  108. OnInputStart(AllPlayers);
  109. InputStartEvent?.Invoke();
  110. }
  111. public void RecievedPlayerInput(PlayerData player)
  112. {
  113. OnRecievedPlayerInput(player);
  114. }
  115. public void InputEnd(PlayerData[] AllPlayers)
  116. {
  117. }
  118. public void RoundStart(PlayerData[] allPlayers)
  119. {
  120. OnRoundStart(allPlayers);
  121. RoundStartEvent?.Invoke();
  122. }
  123. public void PlayerMoved(PlayerData player)
  124. {
  125. OnPlayerMoved(player.character, player.client, player.character.CurrentBlock);
  126. }
  127. public void AllPlayersMoved(PlayerData[] allPlayers)
  128. {
  129. OnAllPlayersMoved(allPlayers);
  130. AllPlayersMovedEvent?.Invoke();
  131. }
  132. public void EnvironmentTurn(PlayerData[] allPlayers)
  133. {
  134. OnEnvironmentTurn(allPlayers);
  135. }
  136. public void RoundEnd(PlayerData[] allPlayers)
  137. {
  138. OnRoundEnd(allPlayers);
  139. RoundEndEvent?.Invoke();
  140. }
  141. public void GameEnd(PlayerData[] allPlayers)
  142. {
  143. OnGameOver(allPlayers);
  144. OnGameOverEvent?.Invoke();
  145. }
  146. }
  147. #endregion Public Functions
  148. /* --- Calls we need ---
  149. *
  150. * PreGameSetup(); - //Called once before the game actually starts
  151. * GameStart(PlayerData[] AllPlayers); //Called once after players have Spawned
  152. *
  153. * OnInputStart(PlayerData[] AllPlayers) //Called when players enter input mode
  154. * OnRecievedPlayerInput(PlayerData Player) //Called when a specific player has sent their input
  155. * OnInputEnd(PlayerData[] AllPlayers) //Called when player input mode has finished
  156. *
  157. * OnRoundStart(PlayerData[] AllPlayers) //Just before Players start moving
  158. *
  159. * ------- Start Round Loop -------
  160. *
  161. * OnPlayerMoved(PlayerData player) //Called after each player moves
  162. * IsGameOver(PlayerData[] AllPlayers) //Called after each player moves
  163. *
  164. * AllPlayersMoved(PlayerData[] AllPlayers) //Called after all players have moved
  165. * EnvironmentTurn() //Also called after all players have moved but should be kept specialised to environment stuff
  166. * IsGameOver(PlayerData[] AllPlayers) //We need to check if the environment terminated the game
  167. *
  168. * --------- End Game Loop ---------
  169. *
  170. * OnRoundEnd(PlayerData[] AllPlayers) //Called after movements are made
  171. * IsGameOver(PlayerData[] AllPlayers) //This needs to be checked again
  172. *
  173. * GameEnd(PlayerData[] AllPlayers)
  174. *
  175. *
  176. *
  177. *
  178. *
  179. */