|
|
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- using Networking.Server;
- using TMPro;
- using UnityEngine.UI;
-
- [CreateAssetMenu(menuName = "Major Project/GameModes/Color Collide", order = 201)]
- public class ColorGameMode : GameMode
- {
-
- public int MaxRound = 5;
- public string nextScene = "ServerTestScene";
- List<ClientData> ConnectedClients;
- public Material OverlayMaterial;
-
-
- public int RoundCount { get; private set; }
- private Dictionary<ClientData, List<Block>> BlocksOwned;
-
- /// <summary>
- /// Called once all players have finished their moves but before the Objective is checked
- /// </summary>
- protected override void OnRoundEnd(PlayerData[] allPlayers)
- {
- RoundCount++;
- }
-
-
- /// <summary>
- /// Checks if the Game is finished
- /// </summary>
- /// <returns>returns if game is finished</returns>
- public override bool isGameOver(PlayerData[] allPlayers)
- {
- return (RoundCount >= MaxRound -1);
- }
-
-
- /// <summary>
- /// Called once per player after they have moved onto a block
- /// </summary>
- /// <param name="character">Character which moved</param>
- /// <param name="client">Client of the character</param>
- /// <param name="currentBlock">Block moved onto</param>
- protected override void OnPlayerFinishedMove(Character character, ClientData client, Block currentBlock)
- {
- ClientData OwnedClient;
- Material overlay = null;
- if (isOwned(currentBlock, out OwnedClient))
- {
- if (OwnedClient == client)
- return;
-
- BlocksOwned[OwnedClient].Remove(currentBlock);
-
- foreach (Material mat in currentBlock.GetComponent<Renderer>().materials)
- {
- if (mat.name == OverlayMaterial.name + " (Instance)")
- overlay = mat;
- }
- }
-
- if (overlay == null)
- {
- overlay = new Material(OverlayMaterial);
- List<Material> mats = new List<Material>(currentBlock.GetComponent<Renderer>().materials);
- mats.Add(overlay);
- currentBlock.GetComponent<Renderer>().materials = mats.ToArray();
- }
-
- overlay.SetColor("_NewColor", client.Color);
-
- if (!BlocksOwned.ContainsKey(client))
- BlocksOwned.Add(client, new List<Block>());
-
- BlocksOwned[client].Add(currentBlock);
-
- if (overlay != null)
- currentBlock.StartCoroutine(AnimateBlock(overlay, 0.25f));
- }
-
- protected override void OnRoundStart(PlayerData[] allPlayers)
- {
-
- }
-
- protected override void OnAllPlayersFinishedMove(PlayerData[] allPlayers)
- {
- foreach (PlayerData player in allPlayers)
- {
- if (BlocksOwned.ContainsKey(player.client))
- player.client.SceneScore = BlocksOwned[player.client].Count;
- else
- player.client.SceneScore = 0;
- }
- }
-
- protected override void OnGameOver(PlayerData[] allPlayers)
- {
- throw new System.NotImplementedException();
- }
-
- private bool isOwned(Block block, out ClientData client)
- {
- client = null;
-
- foreach (KeyValuePair<ClientData, List<Block>> ownedList in BlocksOwned)
- {
- if (ownedList.Value.Contains(block))
- {
- client = ownedList.Key;
- return true;
- }
- }
-
- return false;
- }
-
- private IEnumerator AnimateBlock(Material mat, float time)
- {
-
- float timeElasped = 0;
-
- while (timeElasped < time)
- {
- mat.SetFloat("_Multiplier", (timeElasped / time));
- yield return new WaitForEndOfFrame();
-
- timeElasped += Time.deltaTime;
- }
-
- mat.SetFloat("_Multiplier", 1);
- }
-
- protected override void OnGameStart(PlayerData[] allPlayers)
- {
- BlocksOwned = new Dictionary<ClientData, List<Block>>();
- RoundCount = 0;
- for(int i = 0; i < allPlayers.Length; i++)
- {
- OnPlayerFinishedMove(allPlayers[i].character, allPlayers[i].client, allPlayers[i].character.CurrentBlock);
- }
- }
- }
|