using Godot; using System.Collections.Generic; using System.Text.Json; public partial class CreatureRegistry : Node { public record CreatureDef( string id, string name, List types, List biomes, List time_windows, int base_hp, int base_atk, int base_def, int capture_difficulty ); public record CreatureFile(int schema, List creatures); private readonly Dictionary _byId = new(); public CreatureDef Get(string id) { if (_byId.TryGetValue(id, out var def)) return def; throw new KeyNotFoundException($"Unknown creature id: {id}"); } public bool TryGet(string id, out CreatureDef def) => _byId.TryGetValue(id, out def!); [Export] public NodePath PackManagerPath { get; set; } private PackManager? _packs; public override void _Ready() { _packs = GetNodeOrNull(PackManagerPath); if (_packs == null) { GD.PrintErr("CreatureRegistry: PackManagerPath not set."); return; } var path = _packs.Resolve("data/creatures/creatures.json"); if (path == null) { GD.PrintErr("CreatureRegistry: Could not resolve data/creatures/creatures.json"); return; } var json = FileAccess.GetFileAsString(path); var file = JsonSerializer.Deserialize(json); if (file?.creatures == null) { GD.PrintErr("CreatureRegistry: Failed to parse creatures.json"); return; } _byId.Clear(); foreach (var c in file.creatures) _byId[c.id] = c; GD.Print($"CreatureRegistry: loaded {_byId.Count} creatures"); } }