diff --git a/Assets/Scripts/GameMode/ColorGameMode/ColorGameMode.cs b/Assets/Scripts/GameMode/ColorGameMode/ColorGameMode.cs index fccf28f..5f71c3c 100644 --- a/Assets/Scripts/GameMode/ColorGameMode/ColorGameMode.cs +++ b/Assets/Scripts/GameMode/ColorGameMode/ColorGameMode.cs @@ -66,7 +66,7 @@ public class ColorGameMode : GameMode /// Character which moved /// Client of the character /// Block moved onto - protected override void OnPlayerFinishedMove(Character character, ClientData client, Block currentBlock) + protected override void OnPlayerMoved(Character character, ClientData client, Block currentBlock) { handleFalling(character, client, currentBlock, character.justMoved); @@ -127,7 +127,7 @@ public class ColorGameMode : GameMode } - protected override void OnAllPlayersFinishedMove(PlayerData[] allPlayers) + protected override void OnAllPlayersMoved(PlayerData[] allPlayers) { foreach (PlayerData player in allPlayers) { @@ -207,7 +207,7 @@ public class ColorGameMode : GameMode RoundCount = 0; for(int i = 0; i < allPlayers.Length; i++) { - OnPlayerFinishedMove(allPlayers[i].character, allPlayers[i].client, allPlayers[i].character.CurrentBlock); + OnPlayerMoved(allPlayers[i].character, allPlayers[i].client, allPlayers[i].character.CurrentBlock); } } } diff --git a/Assets/Scripts/GameMode/GameMode.cs b/Assets/Scripts/GameMode/GameMode.cs index bc569d3..41d89e1 100644 --- a/Assets/Scripts/GameMode/GameMode.cs +++ b/Assets/Scripts/GameMode/GameMode.cs @@ -37,13 +37,13 @@ public abstract class GameMode : ScriptableObject /// Character which moved /// Client which controls character /// Block which the character finished on - protected abstract void OnPlayerFinishedMove(Character character, ClientData client, Block currentBlock); + protected abstract void OnPlayerMoved(Character character, ClientData client, Block currentBlock); /// /// Called once after every player has finished one move /// /// List of all player Info - protected abstract void OnAllPlayersFinishedMove(PlayerData[] allPlayers); + protected abstract void OnAllPlayersMoved(PlayerData[] allPlayers); public abstract bool isGameOver(PlayerData[] allPlayers); @@ -59,6 +59,12 @@ public abstract class GameMode : ScriptableObject return retVal; } + public void PreGameStart() + { + + } + + public void GameStart(PlayerData[] allPlayers) { gameTimes = new List(RoundTimes); @@ -73,21 +79,31 @@ public abstract class GameMode : ScriptableObject OnGameStart(allPlayers); } + public void InputStart(PlayerData[] AllPlayers) + { + + } + + public void InputEnd(PlayerData[] AllPlayers) + { + + } + public void RoundStart(PlayerData[] allPlayers) { OnRoundStart(allPlayers); RoundStartEvent?.Invoke(); } - public void FinishedMove(PlayerData[] allPlayers) + public void AllPlayersMoved(PlayerData[] allPlayers) { - OnAllPlayersFinishedMove(allPlayers); + OnAllPlayersMoved(allPlayers); AllPlayersMovedEvent?.Invoke(); } - public void OnePlayerMoved(PlayerData player) + public void PlayerMoved(PlayerData player) { - OnPlayerFinishedMove(player.character, player.client, player.character.CurrentBlock); + OnPlayerMoved(player.character, player.client, player.character.CurrentBlock); } public void RoundEnd(PlayerData[] allPlayers) @@ -96,7 +112,7 @@ public abstract class GameMode : ScriptableObject RoundEndEvent?.Invoke(); } - public void GameOver(PlayerData[] allPlayers) + public void GameEnd(PlayerData[] allPlayers) { OnGameOver(allPlayers); OnGameOverEvent?.Invoke(); @@ -110,17 +126,29 @@ public abstract class GameMode : ScriptableObject * GameStart(PlayerData[] AllPlayers); //Called once after players have Spawned * * OnInputStart(PlayerData[] AllPlayers) //Called when players enter input mode + * OnRecievedPlayerInput(PlayerData Player) //Called when a specific player has sent their input * OnInputEnd(PlayerData[] AllPlayers) //Called when player input mode has finished * * OnRoundStart(PlayerData[] AllPlayers) //Just before Players start moving * + * ------- Start Round Loop ------- + * * OnPlayerMoved(PlayerData player) //Called after each player moves * IsGameOver(PlayerData[] AllPlayers) //Called after each player moves * - * AllPlayersMoved(); + * AllPlayersMoved(PlayerData[] AllPlayers) //Called after all players have moved + * EnvironmentTurn() //Also called after all players have moved but should be kept specialised to environment stuff + * IsGameOver(PlayerData[] AllPlayers) //We need to check if the environment terminated the game + * + * --------- End Game Loop --------- + * + * OnRoundEnd(PlayerData[] AllPlayers) //Called after movements are made + * IsGameOver(PlayerData[] AllPlayers) //This needs to be checked again + * + * GameEnd(PlayerData[] AllPlayers) * * * * * - */ \ No newline at end of file + */ diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs index e1edeac..424d3e9 100644 --- a/Assets/Scripts/Managers/GameManager.cs +++ b/Assets/Scripts/Managers/GameManager.cs @@ -40,7 +40,7 @@ public class GameManager : MonoBehaviour /// /// Easy access to IEnumerable in playerData so we can Enumerate through it /// - private IEnumerable playerDataAsArray { get { return playerData.Values; } } + private PlayerData[] playerDataAsArray { get { return playerData.Values.ToArray(); } } /// /// Easy access to GameMode value in CurrentGameMode reference @@ -80,6 +80,34 @@ public class GameManager : MonoBehaviour } #endregion Unity Functions + private IEnumerator GameRoutine() + { + + //Allows game mode to instantiate anything it might need; + gameMode.PreGameStart(); + + //Spawn Characters and tell let the GameMode do anything with the characters it might want + SpawnCharacters(); + gameMode.GameStart(playerDataAsArray); + + //Loop until the GameMode lets us know the game is over + while (!gameMode.isGameOver(playerDataAsArray)) + { + + //wait until we have recieved all player input + yield return StartCoroutine(WaitForPlayerInput()); + + //Routine for players movement + yield return StartCoroutine(RoundRoutine()); //it's pretty long so it gets it's own coroutine; + } + + //Let the gamemode know that the game is over + gameMode.GameEnd(playerDataAsArray); + } + + + + IEnumerator displayforSeconds(GameObject display, float time) { display.SetActive (true); @@ -87,63 +115,58 @@ public class GameManager : MonoBehaviour display.SetActive (false); } - private void DoRoundRoutine() - { - Debug.Log("Starting Round"); - StartCoroutine(RoundRoutine()); - } - - private void StartRound() + private IEnumerator WaitForPlayerInput() { - gameMode.RoundStart(playerDataAsArray.ToArray()); - LogicProtocols.FloatMsg RoundTime = new LogicProtocols.FloatMsg( gameMode.GetRoundTime()); - bspawn.Spawn(); + LogicProtocols.FloatMsg RoundTime = new LogicProtocols.FloatMsg(gameMode.GetRoundTime()); playerDataAsArray.ForEach(p => p.client.conn.Send(LogicProtocols.SendRoundTime, RoundTime)); + + ClientList.ForEach(p => p.ChangeScene("ClientScene")); + + gameMode.InputStart(playerDataAsArray); + yield return new WaitUntil(() => playerData.All(p => p.Value.recievedList)); + + //reset + playerDataAsArray.ForEach(p => p.recievedList = false); //reset all players list + + + gameMode.InputEnd(playerDataAsArray); } private IEnumerator RoundRoutine() { - playerDataAsArray.ForEach(p => p.recievedList = false); - - //Debug.Log("Doing Round Routine"); + //Tell the gamemode that we are starting a round + gameMode.RoundStart(playerDataAsArray); + //Loop until all players have finished moving while (playerDataAsArray.Any(p => !p.blockReader.Finished)) { - //Debug.Log("One Move"); + + //Loop through all players foreach (PlayerData player in playerDataAsArray) { - Debug.Log(player.client.Name); - StartCoroutine(RunOnce(player)); - yield return new WaitUntil(() => player.waiting); + yield return StartCoroutine(MoveRoutine(player));//Move Player + gameMode.PlayerMoved(player);//LetGameModeKnow } + //Let Gamemode know all players have moved + gameMode.AllPlayersMoved(playerDataAsArray.ToArray()); + playerDataAsArray.ForEach(p => p.client.SendScore()); //Update the players score - //wait until all players have finished - //yield return new WaitUntil(() => playerArray.All(p => p.waiting)); - - gameMode.FinishedMove(playerDataAsArray.ToArray()); - playerDataAsArray.ForEach(p => p.client.SendScore()); - + //if Game is over break out of loop + if (gameMode.isGameOver(playerDataAsArray)) + break; } - - if (gameMode.isGameOver(playerDataAsArray.ToArray())) - { - Debug.Log("Game Over"); - SceneManager.LoadScene("ScoreBoards"); - } - + + //Let GameMode know that Round is Over gameMode.RoundEnd(playerDataAsArray.ToArray()); + //Reset some player Data foreach (PlayerData player in playerDataAsArray) { player.blockReader.Reset(); - player.waiting = false; player.client.SendInventory(); - player.client.ChangeScene("ClientScene"); } - //Debug.Log("Finished Moving"); - - StartRound(); + } private void SpawnCharacters() @@ -223,28 +246,30 @@ public class GameManager : MonoBehaviour #endregion Networking Functions - private IEnumerator RunOnce(PlayerData data) + private IEnumerator MoveRoutine(PlayerData data) { - data.waiting = false; bool blockFinished = false; float waitTime; + + //Loop until the current block indicates or the reader indicates it has finished while (!blockFinished && !data.blockReader.Finished) { - //Debug.Log(data.client + "Moving once"); + //If the current block hasn't already been removed, remove it from the player inventory + //We need to check if it has already been removed so loops don't eat an entire stack if (data.blockReader.CurrentBlock != null && !data.blockReader.CurrentBlock.hasBeenRemoved) { data.client.Inventory.Remove(data.blockReader.CurrentBlock); data.blockReader.CurrentBlock.hasBeenRemoved = true; } + //Process the move blockFinished = data.blockReader.Read(data.character, AnimationTime,out waitTime); - //Debug.Log("Waiting: " + waitTime); + //Wait for the animation to finish yield return new WaitForSeconds(waitTime); - gameMode.OnePlayerMoved(data); + } - data.waiting = true; } } @@ -255,7 +280,6 @@ public class PlayerData public ClientData client; public bool recievedList; - public bool waiting; public PlayerData(Character character, ClientData client) { diff --git a/Assets/Scripts/Managers/GameManagerRacetrack.cs b/Assets/Scripts/Managers/GameManagerRacetrack.cs index 72c35ba..82b3759 100644 --- a/Assets/Scripts/Managers/GameManagerRacetrack.cs +++ b/Assets/Scripts/Managers/GameManagerRacetrack.cs @@ -182,7 +182,7 @@ public class GameManagerRacetrack : MonoBehaviour //Debug.Log("Waiting: " + waitTime); yield return new WaitForSeconds(waitTime); - gamemode.OnePlayerMoved(data); + gamemode.PlayerMoved(data); } data.waiting = true; }