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 randomNodeKeys = new List(); private List availableNodeKeys = new List(); private Dictionary nodesData = new Dictionary(); private int totalNodesInGrid = 0; private HashSet occupiedNodes = new HashSet(); public List AvailableNodeKeys => availableNodeKeys; public void Initialize() { InterfaceManager.Instance?.RegisterInterface(this); SetLevelManager(); totalNodesInGrid = nodesData.Count; } private HashSet lastOccupiedNodes = new HashSet(); 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(); 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.isSortingInProgress = IsAnyNodeFullWhileGridsFull(); goodsSortingManager.CheckGameOverCondition("NodeManager"); // lastOccupiedNodes.Clear(); } public void ResetOccupiedNodesList() { occupiedNodes.Clear(); } private void SetLevelManager() { levelManager = levelManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : 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 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(); 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; popupManager = popupManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : popupManager; screenManager = screenManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : screenManager; if (goodsPlacementManager && !goodsPlacementManager.CanPlaceGoods || !levelManager.CanPlayLevel || popupManager.GetActivePU()) { return; } selectedNode.SetNodeOccupiedState(true); soundManager = soundManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : 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; } private void SetGoodsPlacementManager() { goodsPlacementManager = goodsPlacementManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : goodsPlacementManager; } private void SetGoodsManager() { m_GoodsManager = m_GoodsManager == null ? InterfaceManager.Instance?.GetInterfaceInstance() : 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); } } }