308 lines
12 KiB
C#
Raw Permalink Normal View History

2026-01-05 12:16:58 +05:30
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using Unity.VisualScripting;
using UnityEngine;
public class NodeManager : MonoBehaviour, IBase, IBootLoader
{
[SerializeField] private HexData[] m_HexDatas;
[SerializeField] private GoodsPlacementManager goodsPlacementManager;
[SerializeField] private GoodsHandler goodsHandler;
private GoodsManager m_GoodsManager;
private LevelManager levelManager;
private InputManager inputManager;
private PopupManager popupManager;
private ScreenManager screenManager;
private TrucksLoaderManager trucksLoaderManager;
private SoundManager soundManager;
public List<string> randomNodeKeys = new List<string>();
private List<string> availableNodeKeys = new List<string>();
private Dictionary<string, Node> nodesData = new Dictionary<string, Node>();
private int totalNodesInGrid = 0;
private HashSet<string> occupiedNodes = new HashSet<string>();
public List<string> AvailableNodeKeys => availableNodeKeys;
public void Initialize()
{
InterfaceManager.Instance?.RegisterInterface<NodeManager>(this);
SetLevelManager();
totalNodesInGrid = nodesData.Count;
}
private HashSet<string> lastOccupiedNodes = new HashSet<string>();
public void UpdateOccupiedNodes(bool toAdd, string nodePos = "")
{
// Debug.Log($"NodeData :: before occupiedNodes.Length: {occupiedNodes.Count}");
// Debug.Log($"NodeData :: before Occupied nodes: {JsonConvert.SerializeObject(occupiedNodes)}");
// Debug.Log($"NodeData :: before nodePos: {nodePos}");
if (toAdd)
{
Debug.Log($"nodeData :: adding nodePos");
occupiedNodes.Add(nodePos);
}
else if (occupiedNodes.Contains(nodePos))
{
Debug.Log($"nodeData :: Removing nodePos");
occupiedNodes.Remove(nodePos);
}
Debug.Log($"Updating occupied nodes :: occupiedNodes.Count: {occupiedNodes.Count}");
// Debug.Log($"NodeData :: after Occupied nodes: {JsonConvert.SerializeObject(occupiedNodes)}");
// Debug.Log($"NodeData :: after nodePos: {nodePos}, {nodesData[nodePos].GetItemBaseCount()}, {nodesData[nodePos].name}");
// Debug.Log($"NodeData :: after occupiedNodes.Length: {occupiedNodes.Count}");
// Debug.Log($"NodeData :: after GetItemBaseCount: {nodesData[nodePos].GetItemBaseCount()}");
// Debug.Log($"NodeData :: after GetTotalSlotsInNode: {nodesData[nodePos].GetTotalSlotsInNode()}");
// Debug.Log($"NodeData :: after equality check: {nodesData[nodePos].GetItemBaseCount() == nodesData[nodePos].GetTotalSlotsInNode()}");
// Debug.Log($"NodeData :: after GetSetKeysCount: {nodesData[nodePos].GetSetKeysCount()}");
GoodsSortingManager goodsSortingManager = InterfaceManager.Instance.GetInterfaceInstance<GoodsSortingManager>();
Debug.Log($"NodeDatas0 equality check: {occupiedNodes.Count == totalNodesInGrid}");
Debug.Log($"NodeDatas0 occupiedCount: {occupiedNodes.Count}");
Debug.Log($"NodeDatas0 occupiedCount: {lastOccupiedNodes.Count()}");
Debug.Log($"NodeDatas0 totalNodesInGrid: {totalNodesInGrid}");
if (occupiedNodes.Count == totalNodesInGrid)
{
lastOccupiedNodes.Add(nodePos);
var addDelay = 1.5f;
Debug.Log($"LastOccupiedNodes: occupiedCount: {occupiedNodes.Count}");
Debug.Log($"LastOccupiedNodes: {JsonConvert.SerializeObject(lastOccupiedNodes)}");
SearchLastOccupiedNodes();
// Invoke(nameof(SearchLastOccupiedNodes), addDelay);
// StartCoroutine(SearchLastOccupiedNodes());
}
}
private void SearchLastOccupiedNodes()
{
// return;
// Debug.Log($"NodeDatas1 :: lastOccupiedNodes.Count: {lastOccupiedNodes.Count}");
// foreach (var pos in lastOccupiedNodes)
// {
// Debug.Log($"NodeDatas1 :: Node name: {nodesData[pos].name}");
// Debug.Log($"NodeDatas1 :: nodesData[pos].GetItemBaseCount(): {nodesData[pos].GetItemBaseCount()}");
// Debug.Log($"NodeDatas1 :: nodesData[pos].GetTotalSlotsInNode(): {nodesData[pos].GetTotalSlotsInNode()}");
// Debug.Log($"NodeDatas1 :: nodesData[pos].GetSetKeysCount(): {nodesData[pos].GetSetKeysCount()}");
// }
// if (lastOccupiedNodes.Any(pos => nodesData[pos].GetItemBaseCount() == 0 ||
// nodesData[pos].GetItemBaseCount() == nodesData[pos].GetTotalSlotsInNode() && nodesData[pos].GetSetKeysCount() == 1))
// {
// lastOccupiedNodes.Clear();
// return;
// }
// Debug.Log($"LastOccupiedNodes: {lastOccupiedNodes.Count}");
// foreach (var pos in lastOccupiedNodes)
// {
// Debug.Log($"NodeDatas2 :: Node name: {nodesData[pos].name}");
// Debug.Log($"NodeDatas2 :: nodesData[pos].GetItemBaseCount(): {nodesData[pos].GetItemBaseCount()}");
// Debug.Log($"NodeDatas2 :: nodesData[pos].GetTotalSlotsInNode(): {nodesData[pos].GetTotalSlotsInNode()}");
// Debug.Log($"NodeDatas2 :: nodesData[pos].GetSetKeysCount(): {nodesData[pos].GetSetKeysCount()}");
// }
GoodsSortingManager goodsSortingManager = InterfaceManager.Instance.GetInterfaceInstance<GoodsSortingManager>();
goodsSortingManager.isSortingInProgress = IsAnyNodeFullWhileGridsFull();
goodsSortingManager.CheckGameOverCondition("NodeManager");
// lastOccupiedNodes.Clear();
}
public void ResetOccupiedNodesList()
{
occupiedNodes.Clear();
}
private void SetLevelManager()
{
levelManager = levelManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<LevelManager>() : levelManager;
}
public bool IsNodeAvailableInGrid(string pos, out Node node)
{
node = nodesData.ContainsKey(pos) ? nodesData[pos] : null;
return nodesData.ContainsKey(pos) && nodesData[pos].gameObject.activeInHierarchy;
}
public List<string> GetRandomNodeKeys(int count, int startIndex = 0)
{
if (startIndex == 0 && randomNodeKeys.Count > 0) randomNodeKeys.Clear();
for (int i = availableNodeKeys.Count - 1; i >= 0; i--)
{
var randIndex = UnityEngine.Random.Range(0, i + 1);
var temp = availableNodeKeys[i];
availableNodeKeys[i] = availableNodeKeys[randIndex];
availableNodeKeys[randIndex] = temp;
}
return availableNodeKeys.GetRange(0, count);
}
public void AddNodeInstance(GameObject instance, int row, int col)
{
var nodeInst = instance.GetComponent<Node>();
nodeInst.InitNodeManager(this);
nodesData.Add($"{instance.transform.position}", nodeInst);
if (instance.activeInHierarchy)
availableNodeKeys.Add($"{instance.transform.position}");
if (instance.gameObject.activeInHierarchy)
totalNodesInGrid++;
}
public Vector3 IterateAndRetreiveNodeInstance(int startIndex, int endIndex)
{
var nodes = nodesData.Values.ToList();
for (int indexI = startIndex; indexI < endIndex; indexI++)
{
Debug.Log($"GetGridCenterPoint: {indexI}");
if (indexI == endIndex - 1)
{
Debug.Log($"nodes[indexI].transform.position: {nodes[indexI].transform.position}");
return nodes[indexI].transform.position;
}
}
return Vector3.zero;
}
public void InitNeighborsToNodes()
{
Vector3 tempHexOffset = Vector3.zero;
Vector3 addedHexOffset = Vector3.zero;
Node node = null;
foreach (var nodeData in nodesData)
{
node = nodeData.Value;
foreach (var hexData in m_HexDatas)
{
tempHexOffset.x = hexData.offset.x;
tempHexOffset.z = hexData.offset.z;
addedHexOffset = node.transform.position + tempHexOffset;
// check if node is available at the addedHexOffset position
if (nodesData.ContainsKey(addedHexOffset.ToString())) // to only the add the nodes that are present in the grid, blocked ones aren't added
{
node.AddNeighborsData(addedHexOffset);
}
}
}
}
public void OnNodeClickedOrFound(Node selectedNode)
{
SetGoodsPlacementManager();
inputManager = inputManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<InputManager>() : inputManager;
popupManager = popupManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<PopupManager>() : popupManager;
screenManager = screenManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<ScreenManager>() : screenManager;
if (goodsPlacementManager && !goodsPlacementManager.CanPlaceGoods || !levelManager.CanPlayLevel || popupManager.GetActivePU())
{
return;
}
selectedNode.SetNodeOccupiedState(true);
soundManager = soundManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<SoundManager>() : soundManager;
soundManager.PlayPrimaryGameSoundClip(SoundType.Node_Click);
goodsPlacementManager.PlaceGoodsInsideNode(selectedNode);
SetGoodsManager();
m_GoodsManager.GoodsHandler.UpdateGoodsInputPlatform();
}
public void OnNodeBeingOccupied(Node currentNode)
{
if (!levelManager.CanPlayLevel || popupManager.GetActivePU())
return;
Debug.Log($"goodsHandler.CanClearGoodsUsingPowerup: {goodsHandler.CanClearGoodsUsingPowerup}");
if (goodsHandler.CanClearGoodsUsingPowerup)
{
if (IsNodeAvailableInGrid(currentNode.GetNodePos(), out Node node))
{
goodsHandler.SetClearPowerupState(false);
node.ClearOrResetGoodsDataAndView();
}
return;
}
}
public void OnNodeFilled(Node filledNode, ItemType filledKey)
{
SetTrucksLoaderManager();
soundManager.PlayPrimaryGameSoundClip(SoundType.Node_Filled);
trucksLoaderManager.LoadOrStoreNextGoods(filledNode.GetSpecificItems(filledKey), filledKey);
}
private void SetTrucksLoaderManager()
{
trucksLoaderManager = trucksLoaderManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<TrucksLoaderManager>() : trucksLoaderManager;
}
private void SetGoodsPlacementManager()
{
goodsPlacementManager = goodsPlacementManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<GoodsPlacementManager>() : goodsPlacementManager;
}
private void SetGoodsManager()
{
m_GoodsManager = m_GoodsManager == null ? InterfaceManager.Instance?.GetInterfaceInstance<GoodsManager>() : m_GoodsManager;
}
public void LogNodeValue()
{
Debug.Log($"totalNodesInGrid {totalNodesInGrid} == totalOccupiedNodes {occupiedNodes.Count}");
}
public bool AreAllNodesOccupied() => totalNodesInGrid == occupiedNodes.Count;
public bool IsAnyNodeFullWhileGridsFull()
{
foreach (var pair in nodesData)
{
if (IsNodeAvailableInGrid(pair.Key, out Node node))
{
if (node.GetItemBaseCount() == node.GetTotalSlotsInNode())
return true;
}
}
return false;
}
public void ShowGameOverEmojis()
{
foreach (var node in nodesData.Values)
{
node.SetGameOverEmoji(true);
}
}
}