using System; using System.Collections.Generic; using UnityEngine; using UnityEngine.AddressableAssets; namespace Jovian.EncounterSystem { /// id → encounter cache. Editor auto-repopulates on asset changes; runtime must call . [CreateAssetMenu(fileName = "EncounterRegistry", menuName = "Jovian/Encounter System/Encounter Registry")] public class EncounterRegistry : ScriptableObject { public EncountersCollection[] encounterCollections = Array.Empty(); private readonly Dictionary encounters = new(); public Dictionary GetEncounters() => encounters; public void RegisterEncounter(IEncounter encounter) { var id = encounter?.EncounterDefinition?.internalId; if(string.IsNullOrEmpty(id)) { return; } encounters.TryAdd(id, encounter); } public void UnregisterEncounter(IEncounter encounter) { var id = encounter?.EncounterDefinition?.internalId; if(string.IsNullOrEmpty(id)) { return; } encounters.Remove(id); } public void ClearEncounters() { encounters.Clear(); } public void PopulateEncounters() { if(encounterCollections == null) { return; } for(int c = 0; c < encounterCollections.Length; c++) { var collection = encounterCollections[c]; if(collection?.encounterTables == null) { continue; } for(int t = 0; t < collection.encounterTables.Length; t++) { var table = collection.encounterTables[t]; if(table?.encounters == null) { continue; } for(int i = 0; i < table.encounters.Count; i++) { RegisterEncounter(table.encounters[i]); } } } } } #if UNITY_EDITOR /// Rebuilds the registry (Addressables key "EncounterRegistry") on any asset import/move/delete. public class EncounterRegister : UnityEditor.AssetPostprocessor { private static EncounterRegistry registryCache; private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths) { registryCache ??= Addressables.LoadAssetAsync("EncounterRegistry").WaitForCompletion(); registryCache.ClearEncounters(); registryCache.PopulateEncounters(); } } #endif }