namespace Shigure; public sealed class GameState { public GameState(Dictionary values) { Values = values; } public Dictionary Values { get; } public IReadOnlyDictionary Spells => Values.TryGetValue("spells", out var value) && value is IReadOnlyDictionary spells ? spells : new Dictionary(); public IReadOnlyDictionary Auras => Values.TryGetValue("auras", out var value) && value is IReadOnlyDictionary auras ? auras : new Dictionary(); public IReadOnlyDictionary SpellDisplayTypes => Values.TryGetValue("$spellDisplayTypes", out var value) && value is IReadOnlyDictionary displayTypes ? displayTypes : new Dictionary(); public IReadOnlyDictionary ItemIds => Values.TryGetValue("$itemIds", out var value) && value is IReadOnlyDictionary itemIds ? itemIds : new Dictionary(); public IReadOnlyDictionary> Group => Values.TryGetValue("group", out var value) && value is IReadOnlyDictionary> group ? group : new Dictionary>(); public int GetInt(string key, int defaultValue = 0) { var value = GetValue(key); if (value is null) { return defaultValue; } return value switch { int i => i, long l => (int)l, bool b => b ? 1 : 0, string s when int.TryParse(s, out var parsed) => parsed, _ => defaultValue }; } public bool GetBool(string key, bool defaultValue = false) { var value = GetValue(key); if (value is null) { return defaultValue; } return value switch { bool b => b, int i => i != 0, long l => l != 0, string s when int.TryParse(s, out var parsed) => parsed != 0, _ => defaultValue }; } public object? GetValue(string key) { var normalized = key.Trim(); if (normalized.StartsWith("state.", StringComparison.OrdinalIgnoreCase)) { normalized = normalized["state.".Length..]; } if (normalized.StartsWith("spells.", StringComparison.OrdinalIgnoreCase)) { return Spells.TryGetValue(normalized["spells.".Length..], out var value) ? value : null; } if (normalized.StartsWith("spell.", StringComparison.OrdinalIgnoreCase)) { return Spells.TryGetValue(normalized["spell.".Length..], out var value) ? value : null; } if (normalized.StartsWith("auras.", StringComparison.OrdinalIgnoreCase)) { return Auras.TryGetValue(normalized["auras.".Length..], out var value) ? value : null; } if (normalized.StartsWith("aura.", StringComparison.OrdinalIgnoreCase)) { return Auras.TryGetValue(normalized["aura.".Length..], out var value) ? value : null; } return Values.TryGetValue(normalized, out var directValue) ? directValue : null; } }