using System; namespace Jovian.EncounterSystem { /// /// Marker interface for the polymorphic payload of an . /// Each concrete kind carries its own designer-facing data. Behaviour lives in resolvers /// and play modes — kinds are pure data. Add new kinds by creating a new /// implementation; the SubclassSelector drawer will surface it automatically. /// public interface IEncounterKind { } /// Combat encounter: triggers combat play mode with the specified enemy group. [Serializable] public class CombatKind : IEncounterKind { public string enemyGroupId; public string rewardTableId; } /// Quest encounter: a step in a quest chain. The link is what /// walks to build the gated progression graph. [Serializable] public class QuestKind : IEncounterKind { public EncounterLink nextEncounter; public string questTitle; } /// Dialogue-driven encounter with an NPC and optional faction reputation impact. [Serializable] public class SocialKind : IEncounterKind { public string npcId; public string factionId; public int reputationDelta; } /// Puzzle encounter gated by a skill check against . [Serializable] public class PuzzleKind : IEncounterKind { public string puzzleId; public int difficultyClass; } /// Exploration/discovery encounter gated by a perception check (). [Serializable] public class ExplorationKind : IEncounterKind { public int perceptionDC; } /// Tutorial encounter driving a tutorial subsystem by id. [Serializable] public class TutorialKind : IEncounterKind { public string tutorialId; } /// Environmental hazard that applies damage or a status without player choice. [Serializable] public class HazardKind : IEncounterKind { public int damageAmount; } /// Catch-all with no kind-specific data — useful while prototyping. [Serializable] public class OtherKind : IEncounterKind { } }