aboutsummaryrefslogtreecommitdiff
path: root/internal/behavior/types.go
blob: 571f2c4fef442438bfaff43ad068397928908a68 (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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
package behavior

import (
	"math/rand"
	"strings"

	"gopkg.in/yaml.v3"
)

func WordPrefixMatch(input, name string) bool {
	inputWords := strings.Fields(strings.ToLower(input))
	if len(inputWords) == 0 {
		return false
	}
	nameWords := strings.Fields(strings.ToLower(name))
	for _, iw := range inputWords {
		found := false
		for _, nw := range nameWords {
			if strings.HasPrefix(nw, iw) || strings.HasPrefix(iw, nw) {
				found = true
				break
			}
		}
		if !found {
			return false
		}
	}
	return true
}

type ActionType string

const (
	TypeGather    ActionType = "gather"
	TypeSteal     ActionType = "steal"
	TypeTalk      ActionType = "talk"
	TypeUse       ActionType = "use"
	TypeBurn      ActionType = "burn"
	TypeStoke     ActionType = "stoke"
	TypeSearch    ActionType = "search"
	TypeIdentify  ActionType = "identify"
	TypePlant     ActionType = "plant"
	TypeHarvest   ActionType = "harvest"
	TypeRake      ActionType = "rake"
	TypeWater     ActionType = "water"
	TypeCure      ActionType = "cure"
	TypeObstacle  ActionType = "obstacle"
	TypeFletch    ActionType = "fletch"
	TypeClean     ActionType = "clean"
	TypeCook      ActionType = "cook"
	TypeSmelt     ActionType = "smelt"
	TypeSmith     ActionType = "smith"
	TypeCraft     ActionType = "craft"
	TypeCombine   ActionType = "combine"
	TypeMix       ActionType = "mix"
	TypeConstruct     ActionType = "construct"
	TypeTriggerModule ActionType = "trigger_module"
	TypeUseInteraction ActionType = "use_interaction"
)

type Action struct {
	Type       ActionType
	TargetID   string
	TargetName string
	WaitLeft   int
	Data       any
}

func (a *Action) Advance() bool {
	if a.WaitLeft > 0 {
		a.WaitLeft--
		return false
	}
	return true
}

type GatherData struct {
	ObjDefID      string
	InstanceKey   string
	InstanceIdx   int
	Wait          float64
	DepleteTimer  bool
	Step          int
	Verb          string
	ToolName      string
}

type ProductionData struct {
	ItemID     string
	Phase      int
	Wait       float64
	StartMessage string
	EndMessage   string
	Remaining  int
}

type StealData struct {
	TargetType    string
	StealTable    string
	StealLevel    int
	StealXP       int
	StealSpeed    float64
	TargetName    string
	MobInstanceID string
	ObjDefID      string
	GuardMob      string
	GuardWatching bool
}

type TalkData struct {
	Node            string
	Cfg             *TalkConfig
	SeqIndex        int
	EstateDirectory bool
	StealGuard      bool
	PendingChoice   string
	PendingAction   *NodeAction
	CancelTalk      bool
	PendingSeq      bool
	PendingChosen   bool
}

type UseData struct {
	Cfg  *UseConfig
	Step int
}

type UseInteractionData struct {
	Message string
	Action  *NodeAction
	ObjName string
}

type BurnData struct {
	ItemID    string
	ToolSpeed float64
	Level     int
	XP        int
	BurnTicks float64
	Phase     int
}

type IdentifyData struct {
	JunkID string
	XPPer  int
}

type ObstacleData struct {
	CourseID       string
	Phase          int
	ObstacleIndex  int
	TotalObstacles int
	NextRoom       int
	StartRoom      int
	ObstacleXP     int
	CompletionXP   int
	FailChance     float64
	FailDamageMin  int
	FailDamageMax  int
	Messages       []any
	TicksPerPhase  float64
	RequiredLevel  int
}

type FarmData struct {
	Prefix   string
	SeedID   string
	XP       float64
	Product  string
	MinYield float64
	MaxYield float64
}

type SearchData struct {
	ItemID  string
	SlotIdx int
	Started bool
}

type CombineData struct {
	ItemID       string
	Phase        int
	StepIndex    int
	Remaining    int
	StartMessage string
	EndMessage   string
	Wait         float64
}

type FletchData struct {
	ItemID    string
	Phase     int
	Wait      float64
	Remaining int
}

type CleanData struct {
	Phase  int
	Filter string
}

type ModTriggerStep struct {
	Message string `yaml:"message"`
	Delay   int    `yaml:"delay"`
}

type TriggerModuleData struct {
	ModID     string
	Steps     []ModTriggerStep
	StepIndex int
}

type DropEntry struct {
	ItemID         string `yaml:"item_id"`
	Table          string `yaml:"table"`
	Weight         int    `yaml:"weight"`
	Quantity       int    `yaml:"quantity"`
	Depletes       bool   `yaml:"depletes"`
	SuccessMessage string `yaml:"success_message"`
	Level          int    `yaml:"level"`
	XP             int    `yaml:"xp"`
}

type DropTableDef struct {
	Drops []DropEntry `yaml:"drops"`
}

type MessageList []string

func (ml *MessageList) UnmarshalYAML(value *yaml.Node) error {
	if value.Kind == yaml.ScalarNode {
		var s string
		if err := value.Decode(&s); err != nil {
			return err
		}
		*ml = MessageList{s}
		return nil
	}
	return value.Decode((*[]string)(ml))
}

func (ml MessageList) Pick() string {
	if len(ml) == 0 {
		return ""
	}
	return ml[rand.Intn(len(ml))]
}