Ludo-3D/Assets/Scripts/Tile/SafeTile.cs

90 lines
3.6 KiB
C#

using UnityEngine;
using System.Linq;
using System.Collections.Generic;
public class SafeTile : Tile
{
[SerializeField] private Transform[] placementPoints;
protected Queue<Transform> placementQueue = new Queue<Transform>();
protected Dictionary<PlayerType, PlayerTileData> playerTypesDict = new Dictionary<PlayerType, PlayerTileData>();
public int PlayerTypesCount => playerTypesDict.Count;
public bool HasMoreThanOnePlayerType => playerTypesDict.Count > 1;
public List<PlayerPawn> GetPlayerPawns(PlayerType playerType) => playerTypesDict[playerType].playerPawns.Values.ToList();
public bool ContainsPlayerType(PlayerType playerType) => playerTypesDict.ContainsKey(playerType);
private void Awake()
{
foreach (var placement in placementPoints)
{
placementQueue.Enqueue(placement);
}
}
public override void InitPlayerPawn(PlayerPawn playerPawn, PlayerType playerType)
{
// PlayerPawn = playerPawn;
if (!playerTypesDict.ContainsKey(playerType))
{
playerTypesDict.Add(
playerType,
new PlayerTileData { playerCount = 1,
playerPawns = new Dictionary<int, PlayerPawn>()
});
Debug.Log($"targetSafeTile. tileName: {name}, playerPawn.PlayerId: {playerPawn.PlayerId}");
playerTypesDict[playerType].playerPawns.Add(playerPawn.PlayerId, playerPawn);
playerTypesDict[playerType].commonPlacementTransform = placementQueue.Dequeue();
Debug.Log($"targetSafeTile. tileName: {name} Adding player {playerType} {playerTypesDict[playerType].playerCount} tileName: {name}");
}
else
{
Debug.Log($"tileName: {name}, playerPawn.PlayerId: {playerPawn.PlayerId}");
playerTypesDict[playerType].playerCount++;
Debug.Log($"targetSafeTile. tileName: {name} Adding player {playerType} {playerTypesDict[playerType].playerCount}, tileName: {name}");
playerTypesDict[playerType].playerPawns.Add(playerPawn.PlayerId, playerPawn);
}
}
public void UpdateSafeZonePlayerData(PlayerType playerType, PlayerPawn playerPawn)
{
if (playerTypesDict.ContainsKey(playerType))
{
if (playerTypesDict[playerType].playerCount > 0)
{
Debug.Log($"targetSafeTile. tileName: {name} Removing player {playerType} {playerTypesDict[playerType].playerCount}, tileName: {name}");
playerTypesDict[playerType].playerCount--;
Debug.Log($"targetSafeTile. tileName: {name} Removing player {playerType} after: {playerTypesDict[playerType].playerCount}");
playerTypesDict[playerType].playerPawns.Remove(playerPawn.PlayerId);
if (playerTypesDict[playerType].playerCount == 0)
{
placementQueue.Enqueue(playerTypesDict[playerType].commonPlacementTransform);
playerTypesDict.Remove(playerType);
Debug.Log($"targetSafeTile. tileName: {name} Removing player {playerType}");
}
}
}
}
public PlayerType GetFirstPlayerType() => playerTypesDict.Keys.FirstOrDefault();
public int GetPlayerPawnsCountInTile(PlayerType playerType)
{
return playerTypesDict[playerType].playerPawns.Count;
}
public PlayerPawn IterateAndGetPlayerPawn(PlayerType playerType, int index)
{
return playerTypesDict[playerType].playerPawns[index + 1];
}
public Transform GetPlacementPoint(PlayerType playerType)
{
return playerTypesDict[playerType].commonPlacementTransform;
}
}