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) { encounters?.TryAdd(encounter?.EncounterDefinition?.internalId, encounter); } public void UnregisterEncounter(IEncounter encounter) { encounters.Remove(encounter.EncounterDefinition.internalId); } public void ClearEncounters() { encounters.Clear(); } public void PopulateEncounters() { foreach(var collection in encounterCollections) { foreach(var encounter in collection.encounterTables) { foreach(var encounterInstance in encounter.encounters) { RegisterEncounter(encounterInstance); } } } } } #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 }