diff --git a/Editor/EncounterDrawer.cs b/Editor/EncounterDrawer.cs index 4bc2547..9b74d07 100644 --- a/Editor/EncounterDrawer.cs +++ b/Editor/EncounterDrawer.cs @@ -1,4 +1,3 @@ -using Jovian.EncounterSystem; using UnityEditor; using UnityEngine; diff --git a/Runtime/EncounterReference.cs b/Runtime/EncounterReference.cs index cd4dd89..a1ac382 100644 --- a/Runtime/EncounterReference.cs +++ b/Runtime/EncounterReference.cs @@ -9,6 +9,5 @@ namespace Jovian.EncounterSystem { public TextMeshProUGUI encounterDescription; public Image encounterArt; public Transform encounterOptionsContainer; - public Button submitButton; } } diff --git a/Runtime/EncounterRegistry.cs b/Runtime/EncounterRegistry.cs index 2513130..5d93a71 100644 --- a/Runtime/EncounterRegistry.cs +++ b/Runtime/EncounterRegistry.cs @@ -56,6 +56,73 @@ namespace Jovian.EncounterSystem { } } } + public EncounterTable GetEncounterTable(string id) { + foreach(var collection in encounterCollections) { + foreach(var table in collection.encounterTables) { + if(table.id == id) { + return table; + } + } + } + return null; + } + + public IEncounter GetRandomEncounter(string encounterTableId) { + var table = GetEncounterTable(encounterTableId); + if(!table) { + return null; + } + var ec = table.encounters; + return ec[UnityEngine.Random.Range(0, ec.Count)]; + } + + /// Random pick restricted to encounters whose runtime type matches . + /// Zero-alloc — uses reservoir sampling instead of building an intermediate filtered list. + public IEncounter GetRandomEncounter(string encounterTableId, IEncounterKind encounterKind) { + var table = GetEncounterTable(encounterTableId); + if(!table || encounterKind == null) { + return null; + } + + IEncounter selected = null; + var seen = 0; + for(var i = 0; i < encounters.Count; i++) { + var encounter = table.encounters[i]; + if(encounter == null || encounter.GetType() != encounterKind.GetType()) { + continue; + } + seen++; + if(UnityEngine.Random.Range(0, seen) == 0) { + selected = encounter; + } + } + return selected; + } + + /// Random pick restricted by . Used with + /// to exclude gated encounters. Zero-alloc via reservoir sampling. + public IEncounter GetRandomEncounter(Predicate filter, string encounterTableId) { + var table = GetEncounterTable(encounterTableId); + if(!table) { + return null; + } + if(filter == null) { + return GetRandomEncounter(encounterTableId); + } + + IEncounter selected = null; + var seen = 0; + foreach(var encounter in table.encounters) { + if(encounter == null || !filter(encounter)) { + continue; + } + seen++; + if(UnityEngine.Random.Range(0, seen) == 0) { + selected = encounter; + } + } + return selected; + } } #if UNITY_EDITOR diff --git a/Runtime/EncounterTable.cs b/Runtime/EncounterTable.cs index 1142d3f..f35c1fa 100644 --- a/Runtime/EncounterTable.cs +++ b/Runtime/EncounterTable.cs @@ -26,61 +26,6 @@ namespace Jovian.EncounterSystem { idCache = null; } - public IEncounter GetRandomEncounter() { - if(encounters == null || encounters.Count == 0) { - return null; - } - - return encounters[UnityEngine.Random.Range(0, encounters.Count)]; - } - - /// Random pick restricted to encounters whose runtime type matches . - /// Zero-alloc — uses reservoir sampling instead of building an intermediate filtered list. - public IEncounter GetRandomEncounter(Type type) { - if(encounters == null || encounters.Count == 0 || type == null) { - return null; - } - - IEncounter selected = null; - var seen = 0; - for(var i = 0; i < encounters.Count; i++) { - var encounter = encounters[i]; - if(encounter == null || encounter.GetType() != type) { - continue; - } - seen++; - if(UnityEngine.Random.Range(0, seen) == 0) { - selected = encounter; - } - } - return selected; - } - - /// Random pick restricted by . Used with - /// to exclude gated encounters. Zero-alloc via reservoir sampling. - public IEncounter GetRandomEncounter(Predicate filter) { - if(encounters == null || encounters.Count == 0) { - return null; - } - if(filter == null) { - return GetRandomEncounter(); - } - - IEncounter selected = null; - var seen = 0; - for(var i = 0; i < encounters.Count; i++) { - var encounter = encounters[i]; - if(encounter == null || !filter(encounter)) { - continue; - } - seen++; - if(UnityEngine.Random.Range(0, seen) == 0) { - selected = encounter; - } - } - return selected; - } - private void EnsureCache() { if(idCache != null) { return; diff --git a/Runtime/IEncounterKind.cs b/Runtime/IEncounterKind.cs index d61a30c..a9f37c1 100644 --- a/Runtime/IEncounterKind.cs +++ b/Runtime/IEncounterKind.cs @@ -3,11 +3,10 @@ using System; namespace Jovian.EncounterSystem { /// Polymorphic payload on an . Add a new kind by implementing /// this interface; the SubclassSelector drawer surfaces it automatically. - public interface IEncounterKind { - } + public interface IEncounterKind { } [Serializable] - public partial class QuestKind : IEncounterKind { + public class QuestKind : IEncounterKind { public EncounterLink nextEncounter; } }