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.

125 lines
3.6 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 RoundStartEvent;
  16. public Action AllPlayersMovedEvent;
  17. public Action RoundEndEvent;
  18. public Action OnGameOverEvent;
  19. private List<float> gameTimes;
  20. protected abstract void OnGameStart(PlayerData[] allPlayers);
  21. /// <summary>
  22. /// Called at the beginning of a new Round
  23. /// </summary>
  24. protected abstract void OnRoundStart(PlayerData[] allPlayers);
  25. /// <summary>
  26. /// Called for each player after they finished one move. Even if they didn't move!
  27. /// </summary>
  28. /// <param name="character">Character which moved</param>
  29. /// <param name="client">Client which controls character</param>
  30. /// <param name="currentBlock">Block which the character finished on</param>
  31. protected abstract void OnPlayerFinishedMove(Character character, ClientData client, Block currentBlock);
  32. /// <summary>
  33. /// Called once after every player has finished one move
  34. /// </summary>
  35. /// <param name="allCharacters">List of all player Info</param>
  36. protected abstract void OnAllPlayersFinishedMove(PlayerData[] allPlayers);
  37. public abstract bool isGameOver(PlayerData[] allPlayers);
  38. protected abstract void OnRoundEnd(PlayerData[] allPlayers);
  39. protected abstract void OnGameOver(PlayerData[] allPlayers);
  40. public float GetRoundTime()
  41. {
  42. float retVal = gameTimes[0];
  43. if (gameTimes.Count > 1)
  44. gameTimes.RemoveAt(0);
  45. return retVal;
  46. }
  47. public void GameStart(PlayerData[] allPlayers)
  48. {
  49. gameTimes = new List<float>(RoundTimes);
  50. if (!String.IsNullOrEmpty(GameModeScene))
  51. UnityEngine.SceneManagement.SceneManager.LoadScene(GameModeScene,UnityEngine.SceneManagement.LoadSceneMode.Additive);
  52. for(int i = 0; i < allPlayers.Length; i++)
  53. {
  54. allPlayers[i].client.SceneScore = 0;
  55. }
  56. OnGameStart(allPlayers);
  57. }
  58. public void RoundStart(PlayerData[] allPlayers)
  59. {
  60. OnRoundStart(allPlayers);
  61. RoundStartEvent?.Invoke();
  62. }
  63. public void FinishedMove(PlayerData[] allPlayers)
  64. {
  65. OnAllPlayersFinishedMove(allPlayers);
  66. AllPlayersMovedEvent?.Invoke();
  67. }
  68. public void OnePlayerMoved(PlayerData player)
  69. {
  70. OnPlayerFinishedMove(player.character, player.client, player.character.CurrentBlock);
  71. }
  72. public void RoundEnd(PlayerData[] allPlayers)
  73. {
  74. OnRoundEnd(allPlayers);
  75. RoundEndEvent?.Invoke();
  76. }
  77. public void GameOver(PlayerData[] allPlayers)
  78. {
  79. OnGameOver(allPlayers);
  80. OnGameOverEvent?.Invoke();
  81. }
  82. }
  83. /* --- Calls we need ---
  84. *
  85. * PreGameSetup(); - //Called once before the game actually starts
  86. * GameStart(PlayerData[] AllPlayers); //Called once after players have Spawned
  87. *
  88. * OnInputStart(PlayerData[] AllPlayers) //Called when players enter input mode
  89. * OnInputEnd(PlayerData[] AllPlayers) //Called when player input mode has finished
  90. *
  91. * OnRoundStart(PlayerData[] AllPlayers) //Just before Players start moving
  92. *
  93. * OnPlayerMoved(PlayerData player) //Called after each player moves
  94. * IsGameOver(PlayerData[] AllPlayers) //Called after each player moves
  95. *
  96. * AllPlayersMoved();
  97. *
  98. *
  99. *
  100. *
  101. *
  102. */