diff --git a/scripts/world/ChunkData.cs b/scripts/world/ChunkData.cs new file mode 100644 index 0000000..d58b8d1 --- /dev/null +++ b/scripts/world/ChunkData.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; + +public record ChunkData( + int schema, + string id, + int x, + int y, + string? biome, + List? pickups, + List? gates, + List? npcs, + List? spawn_zones, + List? collision_rects +); + +public record ChunkPickup(string id, string item, int[] pos, int respawn_seconds); +public record ChunkGate(string id, int[] rect, string requires, string? message); +public record ChunkNpc(string id, string kind, int[] pos, string @ref); +public record ChunkSpawnZone(string id, string biome, int[] rect, List? time_windows, List? weather); +public record ChunkCollisionRect(string id, int[] rect); diff --git a/scripts/world/ChunkData.cs.uid b/scripts/world/ChunkData.cs.uid new file mode 100644 index 0000000..03f48b9 --- /dev/null +++ b/scripts/world/ChunkData.cs.uid @@ -0,0 +1 @@ +uid://bxjiroh5ymv1m diff --git a/scripts/world/ChunkManager.cs b/scripts/world/ChunkManager.cs index 97d1677..eec9bbd 100644 --- a/scripts/world/ChunkManager.cs +++ b/scripts/world/ChunkManager.cs @@ -97,12 +97,19 @@ public partial class ChunkManager : Node2D GD.PrintErr($"Chunk missing in packs: {relPath}"); return; } - + var chunkJson = FileAccess.GetFileAsString(chunkPath); - using var doc = JsonDocument.Parse(chunkJson); - var biome = doc.RootElement.TryGetProperty("biome", out var b) ? b.GetString() : "biome:unknown"; + var data = JsonSerializer.Deserialize(chunkJson); + if (data == null) + { + GD.PrintErr($"Failed to parse chunk: {chunkPath}"); + return; + } - var node = CreateDebugChunkNode(x, y, _world!.chunk_size_px, biome ?? "biome:unknown"); + var biome = data.biome ?? "biome:unknown"; + + var node = CreateDebugChunkNode(x, y, _world!.chunk_size_px, biome); + AddChunkMarkers(node, data); AddChild(node); _loaded[key] = node; } @@ -138,4 +145,58 @@ public partial class ChunkManager : Node2D n.AddChild(rect); return n; } + + private static void AddChunkMarkers(Node2D chunkNode, ChunkData data) + { + // Pickups: small green squares + if (data.pickups != null) + { + foreach (var p in data.pickups) + { + var r = new ColorRect + { + Size = new Vector2(10, 10), + Color = new Color(0.2f, 1.0f, 0.2f, 0.9f), + MouseFilter = Control.MouseFilterEnum.Ignore, + Position = new Vector2(p.pos[0] - 5, p.pos[1] - 5) + }; + chunkNode.AddChild(r); + } + } + + // NPCs: blue squares + if (data.npcs != null) + { + foreach (var n in data.npcs) + { + var r = new ColorRect + { + Size = new Vector2(12, 12), + Color = new Color(0.2f, 0.5f, 1.0f, 0.9f), + MouseFilter = Control.MouseFilterEnum.Ignore, + Position = new Vector2(n.pos[0] - 6, n.pos[1] - 6) + }; + chunkNode.AddChild(r); + } + } + + // Gates: red rectangles + if (data.gates != null) + { + foreach (var g in data.gates) + { + var rect = g.rect; // [x,y,w,h] + var r = new ColorRect + { + Size = new Vector2(rect[2], rect[3]), + Color = new Color(1.0f, 0.2f, 0.2f, 0.35f), + MouseFilter = Control.MouseFilterEnum.Ignore, + Position = new Vector2(rect[0], rect[1]) + }; + chunkNode.AddChild(r); + } + } + + // Collision rects: gray outlines (optional later) + } }