aboutsummaryrefslogtreecommitdiff
path: root/internal/world/trigger.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/world/trigger.go')
-rw-r--r--internal/world/trigger.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/internal/world/trigger.go b/internal/world/trigger.go
new file mode 100644
index 0000000..7c06be4
--- /dev/null
+++ b/internal/world/trigger.go
@@ -0,0 +1,61 @@
+package world
+
+import (
+ "gopkg.in/yaml.v3"
+)
+
+type TriggerDef struct {
+ ID string `yaml:"id"`
+ OnPlayerFlag string `yaml:"on_player_flag"`
+ OnFlag string `yaml:"on_flag"`
+ Value any `yaml:"value"`
+ Room int `yaml:"room"`
+ Steps []TriggerStep `yaml:"steps"`
+}
+
+func (t *TriggerDef) IsPlayerFlagTrigger() bool { return t.OnPlayerFlag != "" }
+
+func (t *TriggerDef) IsWorldFlagTrigger() bool { return t.OnFlag != "" }
+
+type TriggerStep struct {
+ Delay int `yaml:"delay"`
+ Message string `yaml:"message"`
+ Broadcast string `yaml:"broadcast"`
+ BroadcastGlobal string `yaml:"broadcast_global"`
+ SetFlags map[string]any `yaml:"set_flags"`
+ SetPlayerFlags map[string]any `yaml:"set_player_flags"`
+ SpawnMob *SpawnMobConfig `yaml:"spawn_mob"`
+ GiveItem string `yaml:"give_item"`
+ TakeItem string `yaml:"take_item"`
+ Teleport int `yaml:"teleport"`
+ Heal int `yaml:"heal"`
+ DespawnMob string `yaml:"despawn_mob"`
+}
+
+type SpawnMobConfig struct {
+ ID string `yaml:"id"`
+ OwnerOnly bool `yaml:"owner_only"`
+ DespawnOnLeave bool `yaml:"despawn_on_leave"`
+ DespawnRooms []int `yaml:"despawn_rooms"`
+ DespawnTicks float64 `yaml:"despawn_ticks"`
+}
+
+func (s *SpawnMobConfig) UnmarshalYAML(value *yaml.Node) error {
+ if value.Kind == yaml.ScalarNode {
+ var id string
+ if err := value.Decode(&id); err != nil {
+ return err
+ }
+ s.ID = id
+ return nil
+ }
+ type raw SpawnMobConfig
+ return value.Decode((*raw)(s))
+}
+
+func (t TriggerStep) IsTimed() bool {
+ return t.Delay > 0 || len(t.SetFlags) > 0 || len(t.SetPlayerFlags) > 0 ||
+ t.Message != "" || t.Broadcast != "" || t.BroadcastGlobal != "" ||
+ t.SpawnMob != nil || t.GiveItem != "" || t.TakeItem != "" ||
+ t.Teleport != 0 || t.Heal != 0 || t.DespawnMob != ""
+}