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 {
}
}