From 2dfa4588b3b5bba2a84dab239d62b1c285478870 Mon Sep 17 00:00:00 2001
From: miepzerino <o.skotnik@gmail.com>
Date: Wed, 02 Apr 2025 22:31:45 +0000
Subject: [PATCH] inventory scrollbar autohide
---
Assets/Scripts/FogOfWar.cs | 203 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 203 insertions(+), 0 deletions(-)
diff --git a/Assets/Scripts/FogOfWar.cs b/Assets/Scripts/FogOfWar.cs
new file mode 100644
index 0000000..251c3ce
--- /dev/null
+++ b/Assets/Scripts/FogOfWar.cs
@@ -0,0 +1,203 @@
+using UnityEngine;
+using UnityEngine.Tilemaps;
+
+public class FogOfWar : MonoBehaviour
+{
+ public Tilemap fogTilemap;
+ public TileBase fogTile;
+ public Transform player;
+ public int viewRadius = 5;
+ public Camera mainCamera;
+
+ private Vector3Int lastPlayerCell;
+ private const float UpdateInterval = 0.1f; // Update every 100ms
+ private float updateTimer;
+ private TileBase[,] discoveredFog; // Store the lowest opacity fog level for each tile
+
+ [System.Serializable]
+ public class FogLevel
+ {
+ public TileBase tile;
+ public float opacity;
+ }
+ public FogLevel[] fogLevels;
+
+ private void Start()
+ {
+ if (mainCamera == null)
+ mainCamera = Camera.main;
+ // Initialize the discovered fog array
+ int fogDepth = GenerateTileMap.groundDepth - 1; // Subtract 2 to account for array starting at y=-3
+ discoveredFog = new TileBase[GenerateTileMap.maxWidth + 1, fogDepth];
+ // Initialize fog using GenerateTileMap bounds
+ for (int x = 0; x <= GenerateTileMap.maxWidth; x++)
+ {
+ // Clear surface tiles (0 to -1)
+ for (int y = 0; y >= -1; y--)
+ {
+ Vector3Int tilePosition = new Vector3Int(x, y, 0);
+ fogTilemap.SetTile(tilePosition, null);
+ }
+
+ // Set fog for underground tiles (-2 and below)
+ for (int y = -2; y >= -GenerateTileMap.groundDepth; y--)
+ {
+ Vector3Int tilePosition = new Vector3Int(x, y, 0);
+ fogTilemap.SetTile(tilePosition, fogTile);
+
+ // Convert to array index (y=-2 maps to array index 0)
+ int arrayY = Mathf.Abs(y + 2);
+ discoveredFog[x, arrayY] = fogTile;
+ }
+ }
+
+ // Position the fog tilemap at the same position as the main tilemap
+ fogTilemap.transform.position = new Vector3(
+ (GenerateTileMap.maxWidth / 2) * -1,
+ -1,
+ transform.position.z
+ );
+ lastPlayerCell = fogTilemap.WorldToCell(player.position);
+
+ if (SaveSystem.isGameLoaded)
+ {
+ SaveDataMap mapState = SaveSystem.LoadMapState();
+ if (mapState != null && mapState.fogOfWarData != null)
+ {
+ GetComponent<FogOfWar>().LoadFromSaveData(mapState.fogOfWarData);
+ }
+ }
+ }
+
+ private void Update()
+ {
+ updateTimer += Time.deltaTime;
+ if (updateTimer < UpdateInterval)
+ return;
+ updateTimer = 0;
+ Vector3Int playerCell = fogTilemap.WorldToCell(player.position);
+
+ // Only update if player moved to a new cell
+ if (playerCell == lastPlayerCell)
+ return;
+
+ lastPlayerCell = playerCell;
+
+ // Get camera bounds in world space
+ Vector2 cameraMin = mainCamera.ViewportToWorldPoint(new Vector3(0, 0));
+ Vector2 cameraMax = mainCamera.ViewportToWorldPoint(new Vector3(1, 1));
+ // Convert to tile coordinates
+ Vector3Int tileMin = fogTilemap.WorldToCell(cameraMin);
+ Vector3Int tileMax = fogTilemap.WorldToCell(cameraMax);
+ // Clamp to map bounds
+ tileMin.x = Mathf.Max(0, tileMin.x - viewRadius);
+ tileMin.y = Mathf.Max(-GenerateTileMap.groundDepth, tileMin.y - viewRadius);
+ tileMax.x = Mathf.Min(GenerateTileMap.maxWidth, tileMax.x + viewRadius);
+ tileMax.y = Mathf.Min(-2, tileMax.y + viewRadius);
+
+ // Clear fog around player
+ // Only check tiles within camera view
+ for (int x = tileMin.x; x <= tileMax.x; x++)
+ {
+ for (int y = tileMin.y; y <= tileMax.y; y++)
+ {
+ Vector3Int tilePosition = new Vector3Int(x, y, 0);
+ float distance = Vector2.Distance(((Vector2Int)playerCell), (Vector2Int)tilePosition);
+
+ if (distance <= viewRadius)
+ {
+ int fogIndex = Mathf.FloorToInt((distance / viewRadius) * (fogLevels.Length - 1));
+ fogIndex = Mathf.Clamp(fogIndex, 0, fogLevels.Length - 1);
+
+ TileBase newFogTile = distance <= 1 ? null : fogLevels[fogIndex].tile;
+
+ // Update the discovered state with the lowest opacity (null or lower fog index)
+ int arrayY = Mathf.Abs(y + 2); // y=-2 maps to array index 0
+ if (x >= 0 && x < discoveredFog.GetLength(0) &&
+ arrayY >= 0 && arrayY < discoveredFog.GetLength(1))
+ {
+ if (newFogTile == null)
+ {
+ discoveredFog[x, arrayY] = null;
+ }
+ else if (discoveredFog[x, arrayY] != null)
+ {
+ // Find the index of the current and new fog tiles
+ int currentIndex = System.Array.FindIndex(fogLevels, f => f.tile == discoveredFog[x, arrayY]);
+ int newIndex = System.Array.FindIndex(fogLevels, f => f.tile == newFogTile);
+
+ // Keep the lower opacity version
+ if (newIndex < currentIndex)
+ {
+ discoveredFog[x, arrayY] = newFogTile;
+ }
+ }
+
+ // Always use the discovered state
+ fogTilemap.SetTile(tilePosition, discoveredFog[x, arrayY]);
+ }
+ }
+ }
+ }
+ }
+
+ public FogOfWarData GetSaveData()
+ {
+ 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;
+ }
+
+ public void LoadFromSaveData(FogOfWarData saveData)
+ {
+ if (saveData == null || saveData.discoveredTiles == null)
+ return;
+
+ // Reset fog to full opacity
+ for (int x = 0; x < discoveredFog.GetLength(0); x++)
+ {
+ // Reset underground tiles only (-2 and below)
+ for (int y = -2; y >= -GenerateTileMap.groundDepth; y--)
+ {
+ Vector3Int tilePosition = new Vector3Int(x, y, 0);
+ fogTilemap.SetTile(tilePosition, fogTile);
+
+ int arrayY = Mathf.Abs(y + 2);
+ discoveredFog[x, arrayY] = fogTile;
+ }
+ }
+
+ // Apply saved fog states
+ foreach (FogTileData tileData in saveData.discoveredTiles)
+ {
+ if (tileData.x >= 0 && tileData.x < discoveredFog.GetLength(0) &&
+ tileData.y >= 0 && tileData.y < discoveredFog.GetLength(1))
+ {
+ TileBase tileToUse = tileData.fogLevelIndex == -1 ? null : fogLevels[tileData.fogLevelIndex].tile;
+ discoveredFog[tileData.x, tileData.y] = tileToUse;
+
+ // Convert array Y coordinate back to world Y coordinate
+ int worldY = -(tileData.y + 2); // Convert array index back to world coordinates
+ fogTilemap.SetTile(new Vector3Int(tileData.x, worldY, 0), tileToUse);
+ }
+ }
+ }
+}
--
Gitblit v1.10.0