Trigger System Overview
Concept
Triggers are logic units that respond to in-game events. They consist of:
Event type (e.g., ENTER_TILE, ON_DAMAGE)
Condition (e.g., always true, perception check)
Reaction (e.g., apply damage, spawn trap)
Optional Chaining to further triggers
Optional Cooldowns to prevent overfiring
Each trigger listens for events dispatched via the EventBus.
Trigger Flow Diagram
graph TD Event[Game Event: ENTER_TILE] -->|dispatch| Trigger1 Trigger1 -->|Condition| ConditionCheck[PerceptionCheck] ConditionCheck -->|Fails| End1[Do Nothing] ConditionCheck -->|Succeeds| Reaction1[ApplyDamage] Reaction1 --> Reaction2[AlertGamemaster] Reaction2 -->|Optional| NextTrigger
Trigger Structure
Trigger Components:
Event Type: A string identifier (e.g., “ENTER_TILE”).
Condition: A callable, such as: - AlwaysTrue – always passes. - PerceptionCheck – simulates a skill roll using character_stats. - SkillCheck – supports DC, stat-based success/failure.
Reaction: A callable or class with an execute() method. Examples: - ApplyDamage - AlertGamemaster - MoveEntity, RevealArea, SpawnEntity
Chaining: A trigger can define a next_trigger, which is conditionally or automatically fired.
Cooldown: Prevents reactivation for a number of turns (via TurnManager).
Condition Evaluation
Note
For SkillCheck and PerceptionCheck, the logic is inverted:
If the check fails, the reaction is triggered.
This is useful for traps: players failing to notice one may take damage.
Trigger JSON Structure
Note
The trigger system uses a JSON structure to define triggers, making it easy to create, modify, and serialize them. The JSON structure for a trigger includes the event type, label, condition, reaction, and optional chaining and cooldowns. This allows for flexible and dynamic trigger definitions that can be easily modified or extended.
Example:
- ```python
{ “event_type”: “ENTER_TILE”, “label”: “Trap Trigger”, “condition”: {
“type”: “SkillCheck”, “skill”: “Perception”, “dc”: 12
}, “reaction”: {
“type”: “ApplyDamage”, “args”: { “amount”: 5 }
}, “next_trigger”: {
“event_type”: “CHAIN”, “condition”: { “type”: “AlwaysTrue” }, “reaction”: { “type”: “AlertGamemaster”, “args”: {
“message”: “Trap sprung!”