aboutsummaryrefslogtreecommitdiff
path: root/internal/world/trigger.go
blob: e31a5f93d7bb91fdb57a7cc3e32b8a02672cd673 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package world

import (
	"gopkg.in/yaml.v3"
)

type TriggerDef struct {
	ID           string        `yaml:"id"`
	OnPlayerFlag string        `yaml:"on_player_flag"`
	OnGlobalFlag string        `yaml:"on_global_flag"`
	Value        any           `yaml:"value"`
	Room         int           `yaml:"room"`
	Steps        []TriggerStep `yaml:"steps"`
}

func (t *TriggerDef) IsPlayerFlagTrigger() bool { return t.OnPlayerFlag != "" }

func (t *TriggerDef) IsGlobalFlagTrigger() bool { return t.OnGlobalFlag != "" }

type TriggerStep struct {
	Delay           int             `yaml:"delay"`
	Message         string          `yaml:"message"`
	Broadcast       string          `yaml:"broadcast"`
	BroadcastGlobal string          `yaml:"broadcast_global"`
	SetGlobalFlags  map[string]any  `yaml:"set_global_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.SetGlobalFlags) > 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 != ""
}