From 6b1abe7afb9350a7890f6b893f59f72a3988aaab Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Mon, 07 Apr 2025 16:15:36 +0000
Subject: [PATCH] #50 added saveDataManager

---
 Assets/Scripts/Controls/PlayerController.cs       |    2 
 Assets/Scripts/Inventory/Inventory.cs             |    2 
 Assets/Scripts/Managers/GameManager.cs            |   10 +-
 Assets/Scripts/Managers/SaveSystemManager.cs      |  102 +++++++++++++++++++++++++
 Assets/Scenes/GameplayScene.unity                 |   24 +++++
 Assets/Scripts/Managers/SaveSystemManager.cs.meta |   11 ++
 Assets/Scripts/GenerateTileMap.cs                 |   10 +-
 Assets/Scripts/Saving/SaveData.cs                 |    3 
 Assets/Scripts/UI/PauseMenu.cs                    |    6 -
 Assets/Scripts/FogOfWar.cs                        |   28 +------
 10 files changed, 153 insertions(+), 45 deletions(-)

diff --git a/Assets/Scenes/GameplayScene.unity b/Assets/Scenes/GameplayScene.unity
index 88982ad..1d75531 100644
--- a/Assets/Scenes/GameplayScene.unity
+++ b/Assets/Scenes/GameplayScene.unity
@@ -5473,19 +5473,39 @@
     m_RemovedComponents: []
     m_RemovedGameObjects: []
     m_AddedGameObjects: []
-    m_AddedComponents: []
+    m_AddedComponents:
+    - targetCorrespondingSourceObject: {fileID: 8598998496262044661, guid: 7296d9a2424531f4ba42c0c75e9c48a0, type: 3}
+      insertIndex: -1
+      addedObject: {fileID: 75655679957548993}
   m_SourcePrefab: {fileID: 100100000, guid: 7296d9a2424531f4ba42c0c75e9c48a0, type: 3}
 --- !u!114 &75655679957548991 stripped
 MonoBehaviour:
   m_CorrespondingSourceObject: {fileID: 6908574976455911116, guid: 7296d9a2424531f4ba42c0c75e9c48a0, type: 3}
   m_PrefabInstance: {fileID: 75655679957548990}
   m_PrefabAsset: {fileID: 0}
-  m_GameObject: {fileID: 0}
+  m_GameObject: {fileID: 75655679957548992}
   m_Enabled: 1
   m_EditorHideFlags: 0
   m_Script: {fileID: 11500000, guid: ee189283a861cae42b728253b8229316, type: 3}
   m_Name: 
   m_EditorClassIdentifier: 
+--- !u!1 &75655679957548992 stripped
+GameObject:
+  m_CorrespondingSourceObject: {fileID: 8598998496262044661, guid: 7296d9a2424531f4ba42c0c75e9c48a0, type: 3}
+  m_PrefabInstance: {fileID: 75655679957548990}
+  m_PrefabAsset: {fileID: 0}
+--- !u!114 &75655679957548993
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 75655679957548992}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 00c47706c533aee4890c37a8bd5ea5f8, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
 --- !u!223 &90387968388784992
 Canvas:
   m_ObjectHideFlags: 0
diff --git a/Assets/Scripts/Controls/PlayerController.cs b/Assets/Scripts/Controls/PlayerController.cs
index 2b3b2db..58a9e21 100644
--- a/Assets/Scripts/Controls/PlayerController.cs
+++ b/Assets/Scripts/Controls/PlayerController.cs
@@ -172,7 +172,7 @@
 
     private void LoadPlayer()
     {
-        SaveDataPlayer save = SaveSystem.LoadPlayer();
+        SaveDataPlayer save = SaveSystemManager.Instance.GetPlayerStateFromSave();
         health.MaxHealth = save.maxHealth;
         health.Health = save.health;
         transform.position = VectorHelper.ConvertToVector3(save.position);
diff --git a/Assets/Scripts/FogOfWar.cs b/Assets/Scripts/FogOfWar.cs
index 251c3ce..4080304 100644
--- a/Assets/Scripts/FogOfWar.cs
+++ b/Assets/Scripts/FogOfWar.cs
@@ -61,10 +61,10 @@
 
         if (SaveSystem.isGameLoaded)
         {
-            SaveDataMap mapState = SaveSystem.LoadMapState();
+            SaveDataMap mapState = GetComponent<SaveSystemManager>().GetMapStateFromSave();
             if (mapState != null && mapState.fogOfWarData != null)
             {
-                GetComponent<FogOfWar>().LoadFromSaveData(mapState.fogOfWarData);
+                LoadFromSaveData(mapState.fogOfWarData);
             }
         }
     }
@@ -141,29 +141,9 @@
         }
     }
 
-    public FogOfWarData GetSaveData()
+    public (TileBase[,] discoveredFog, TileBase fogTile, FogLevel[] fogLevels) GetSaveValues()
     {
-        FogOfWarData saveData = new FogOfWarData();
-
-        for (int x = 0; x < discoveredFog.GetLength(0); x++)
-        {
-            for (int y = 0; y < discoveredFog.GetLength(1); y++)
-            {
-                TileBase currentTile = discoveredFog[x, y];
-                if (currentTile == null || currentTile != fogTile) // Only save revealed tiles
-                {
-                    FogTileData tileData = new FogTileData
-                    {
-                        x = x,
-                        y = y,
-                        fogLevelIndex = currentTile == null ? -1 : System.Array.FindIndex(fogLevels, f => f.tile == currentTile)
-                    };
-                    saveData.discoveredTiles.Add(tileData);
-                }
-            }
-        }
-
-        return saveData;
+        return (discoveredFog,fogTile, fogLevels);
     }
 
     public void LoadFromSaveData(FogOfWarData saveData)
diff --git a/Assets/Scripts/GenerateTileMap.cs b/Assets/Scripts/GenerateTileMap.cs
index 8870c8e..d2ea3a2 100644
--- a/Assets/Scripts/GenerateTileMap.cs
+++ b/Assets/Scripts/GenerateTileMap.cs
@@ -28,6 +28,8 @@
     private const int CACHE_CLEAR_DISTANCE = 8; // Distance in chunks before clearing cache (should be > LOAD_DISTANCE)
     private Vector2Int lastCacheClearPosition; // Track position where cache was last cleared
 
+    [NonSerialized]
+    public List<Vector3Int> destroyedTiles = new List<Vector3Int>();
     private Dictionary<Vector2Int, bool> loadedChunks = new Dictionary<Vector2Int, bool>();
     private Dictionary<Vector2Int, TileBase[]> chunkCache = new Dictionary<Vector2Int, TileBase[]>();
     private Transform playerTransform; // Reference to player/camera
@@ -62,16 +64,16 @@
         //Debug.Log($"Current Chunk: {currentChunk}");
         if (currentChunk != lastLoadedChunk)
         {
-            StartCoroutine(UpdateLoadedChunks(currentChunk, gameManager.destroyedTiles));
+            StartCoroutine(UpdateLoadedChunks(currentChunk, destroyedTiles));
             lastLoadedChunk = currentChunk;
             // Check if we need to clear the cache
             ClearDistantChunks(currentChunk);
         }
     }
 
-    public Dictionary<Vector2Int, TileBase[]> GetSaveData()
+    public (int seed, Dictionary<Vector2Int, TileBase[]> chunkCache, List<Vector3Int> destroyedTiles) GetSaveValues()
     {
-        return chunkCache;
+        return (seed.Value, chunkCache, destroyedTiles);
     }
     public void LoadChunkDataFromSave(List<SerializedChunkData> serializedChunks)
     {
@@ -268,7 +270,7 @@
             //        tilemap.SetTile(tilePos, cachedTiles[i]);
             //    }
             //}
-            BatchSetTiles(chunk, cachedTiles, gameManager.destroyedTiles);
+            BatchSetTiles(chunk, cachedTiles, destroyedTiles);
         }
         yield return null;
     }
diff --git a/Assets/Scripts/Inventory/Inventory.cs b/Assets/Scripts/Inventory/Inventory.cs
index f622519..23b1365 100644
--- a/Assets/Scripts/Inventory/Inventory.cs
+++ b/Assets/Scripts/Inventory/Inventory.cs
@@ -27,7 +27,7 @@
 
     private void LoadInventory()
     {
-        SaveDataPlayer save = SaveSystem.LoadPlayer();
+        SaveDataPlayer save = SaveSystemManager.Instance.GetPlayerStateFromSave();
         if (save != null)
         {
             foreach (SaveDataInventorySlot item in save.inventoryItems)
diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs
index cf3a5ab..a759205 100644
--- a/Assets/Scripts/Managers/GameManager.cs
+++ b/Assets/Scripts/Managers/GameManager.cs
@@ -22,8 +22,6 @@
     public Tilemap tilemap;
     [NonSerialized]
     public GenerateTileMap generateTileMap;
-    [NonSerialized]
-    public List<Vector3Int> destroyedTiles = new List<Vector3Int>();
     public GameObject pickups;
     public Tilemap fogTilemap;
     public FogOfWar fogOfWar;
@@ -47,7 +45,7 @@
             LoadMapState();
         }
         Debug.Log("waiting for async map loading");
-        StartCoroutine(generateTileMap.GenerateTiles(LoadTileMapsFinished, destroyedTiles));
+        StartCoroutine(generateTileMap.GenerateTiles(LoadTileMapsFinished, generateTileMap.destroyedTiles));
     }
 
     private void InitializeBackgroundTiles()
@@ -71,7 +69,7 @@
 
     private void LoadMapState()
     {
-        SaveDataMap mapState = SaveSystem.LoadMapState();
+        SaveDataMap mapState = GetComponent<SaveSystemManager>().GetMapStateFromSave();
         if (mapState != null)
         {
             //fogOfWar.LoadFromSaveData(mapState.fogOfWarData);
@@ -82,7 +80,7 @@
                 // TODO rework load map (it's fucky wucky currently as I had to make an extra class for it to jsonify the tiles correctly, as unity does not like lists of arrays or 2d arrays)
                 foreach (DestroyedTile tile in mapState.destroyedTiles)
                 {
-                    destroyedTiles.Add(tile.tileCoord.ConvertToVector3Int());
+                    generateTileMap.destroyedTiles.Add(tile.tileCoord.ConvertToVector3Int());
                 }                //destroyedTiles.AddRange(mapState.destroyedTiles.Select(tile => { return tile.tileCoord; }).ToList().ConvertToVector3Int());
             }
             // Load chunk cache
@@ -206,7 +204,7 @@
                 }
                 // Update tilemap
                 tilemap.SetTile(cellCoord, null);
-                destroyedTiles.Add(cellCoord);
+                generateTileMap.destroyedTiles.Add(cellCoord);
                 generateTileMap.UpdateChunkCache(cellCoord, cellWorldPosition);
                 CharacterEvents.characterDrillingToPosition.Invoke(cellWorldPosition, drillDirection);
             }
diff --git a/Assets/Scripts/Managers/SaveSystemManager.cs b/Assets/Scripts/Managers/SaveSystemManager.cs
new file mode 100644
index 0000000..c4d19fe
--- /dev/null
+++ b/Assets/Scripts/Managers/SaveSystemManager.cs
@@ -0,0 +1,102 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Tilemaps;
+
+public class SaveSystemManager : MonoBehaviour
+{
+    private FogOfWar fogOfWar;
+    private GenerateTileMap generateTileMap;
+    private PlayerController playerController;
+    private Inventory playerInventory;
+    private SaveDataMap mapState;
+    private SaveDataPlayer playerState;
+    public static SaveSystemManager Instance { get; private set; }
+    private void Awake()
+    {
+        if (Instance == null)
+        {
+            Instance = this;
+            fogOfWar = FindObjectOfType<FogOfWar>();
+            generateTileMap = FindObjectOfType<GenerateTileMap>();
+            playerController = GameObject.Find("Player").GetComponent<PlayerController>();
+            playerInventory = GameObject.Find("Player").GetComponent<Inventory>();
+        }
+        else
+        {
+            Destroy(gameObject);
+        }
+    }
+
+    public void SaveGame()
+    {
+        SaveSystem.SavePlayer(GetSaveDataPlayer());
+        SaveSystem.SaveMapState(GetSaveDataMap());
+    }
+
+    private SaveDataPlayer GetSaveDataPlayer()
+    {
+        return new SaveDataPlayer(playerController, playerInventory);
+    }
+
+    public SaveDataMap GetMapStateFromSave()
+    {
+        if (mapState == null)
+        {
+            mapState = SaveSystem.LoadMapState();
+        }
+        return mapState;
+    }
+
+    public SaveDataPlayer GetPlayerStateFromSave()
+    {
+        if (playerState == null)
+        {
+            playerState = SaveSystem.LoadPlayer();
+            Debug.Log("Player state loaded from save");
+        }
+        return playerState;
+    }
+
+    private SaveDataMap GetSaveDataMap()
+    {
+        var saveDataTileMap = GetSaveDataTileMap();
+        return new SaveDataMap(
+            saveDataTileMap.seed,
+            saveDataTileMap.destroyedTiles,
+            saveDataTileMap.chunkCache,
+            GetSaveDataFogOfWar()
+        );
+    }
+
+    private FogOfWarData GetSaveDataFogOfWar()
+    {
+        var fogSaveValues = fogOfWar.GetSaveValues();
+        FogOfWarData saveData = new FogOfWarData();
+
+        for (int x = 0; x < fogSaveValues.discoveredFog.GetLength(0); x++)
+        {
+            for (int y = 0; y < fogSaveValues.discoveredFog.GetLength(1); y++)
+            {
+                TileBase currentTile = fogSaveValues.discoveredFog[x, y];
+                if (currentTile == null || currentTile != fogSaveValues.fogTile) // Only save revealed tiles
+                {
+                    FogTileData tileData = new FogTileData
+                    {
+                        x = x,
+                        y = y,
+                        fogLevelIndex = currentTile == null ? -1 : System.Array.FindIndex(fogSaveValues.fogLevels, f => f.tile == currentTile)
+                    };
+                    saveData.discoveredTiles.Add(tileData);
+                }
+            }
+        }
+
+        return saveData;
+    }
+
+    public (int seed, Dictionary<Vector2Int, TileBase[]> chunkCache, List<Vector3Int> destroyedTiles) GetSaveDataTileMap()
+    {
+        return generateTileMap.GetSaveValues();
+    }
+}
diff --git a/Assets/Scripts/Managers/SaveSystemManager.cs.meta b/Assets/Scripts/Managers/SaveSystemManager.cs.meta
new file mode 100644
index 0000000..c5c2bc5
--- /dev/null
+++ b/Assets/Scripts/Managers/SaveSystemManager.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 00c47706c533aee4890c37a8bd5ea5f8
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/Assets/Scripts/Saving/SaveData.cs b/Assets/Scripts/Saving/SaveData.cs
index 939850c..4366667 100644
--- a/Assets/Scripts/Saving/SaveData.cs
+++ b/Assets/Scripts/Saving/SaveData.cs
@@ -1,6 +1,5 @@
 using Assets.Scripts.Helpers;
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using UnityEngine;
@@ -55,7 +54,7 @@
     public List<DestroyedTile> destroyedTiles;
     public FogOfWarData fogOfWarData;
     public List<SerializedChunkData> chunkData; // New field
-    public SaveDataMap(List<Vector3Int> destroyedTiles, int seed, FogOfWarData fogOfWarData, Dictionary<Vector2Int, TileBase[]> chunkCache)
+    public SaveDataMap(int seed, List<Vector3Int> destroyedTiles, Dictionary<Vector2Int, TileBase[]> chunkCache, FogOfWarData fogOfWarData)
     {
         this.seed = seed;
         this.destroyedTiles = new List<DestroyedTile>();
diff --git a/Assets/Scripts/UI/PauseMenu.cs b/Assets/Scripts/UI/PauseMenu.cs
index 3a4d141..7310c13 100644
--- a/Assets/Scripts/UI/PauseMenu.cs
+++ b/Assets/Scripts/UI/PauseMenu.cs
@@ -61,11 +61,7 @@
 
     public void OnGameSaveClicked()
     {
-        PlayerController playerController = GameObject.Find("Player").GetComponent<PlayerController>();
-        Inventory playerInventory = GameObject.Find("Player").GetComponent<Inventory>();
-        SaveSystem.SavePlayer(new SaveDataPlayer(playerController, playerInventory));
-        GameManager gameManager= GameObject.Find("GameManager").GetComponent<GameManager>();
-        SaveSystem.SaveMapState(new SaveDataMap(gameManager.destroyedTiles, gameManager.generateTileMap.seed.Value, gameManager.GetComponent<FogOfWar>().GetSaveData(),gameManager.generateTileMap.GetSaveData()));
+        SaveSystemManager.Instance.SaveGame();
         animator.SetTrigger("GameSaved");
     }
 

--
Gitblit v1.9.3