From 84d74ca4351a97148ad8339676f9df7946bc21fb Mon Sep 17 00:00:00 2001 From: historia <[not public]> Date: Thu, 25 Jun 2026 20:33:47 -0400 Subject: feat: trigger system for scripted events added. --- internal/world/trigger.go | 61 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 internal/world/trigger.go (limited to 'internal/world/trigger.go') 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 != "" +} -- cgit v1.2.3