aboutsummaryrefslogtreecommitdiff
path: root/internal/behavior/types.go
blob: f8e65f7f52e798ccb9686a03e8ad780bd57d9d52 (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
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"
)

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
	EffectiveWait float64
	DepleteTimer  bool
	Step          int
	Verb          string
	ToolName      string
}

type ProductionData struct {
	ItemID                string
	Phase                 int
	Wait                  float64
	StartMsg              string
	EndMsg                string
	Remaining             int
	NextStepIndex         int
	StepsAccumulatedTicks float64
}

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
	EstateDirectory bool
	StealGuard      bool
}

type UseData struct {
	Cfg  *UseConfig
	Step int
}

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 FletchData struct {
	ItemID    string
	Phase     int
	Wait      float64
	Remaining int
}

type CleanData struct {
	Phase  int
	Filter string
}

type DropEntry struct {
	ItemID   string `yaml:"item_id"`
	Table    string `yaml:"table"`
	Weight   int    `yaml:"weight"`
	Quantity int    `yaml:"quantity"`
	Depletes bool   `yaml:"depletes"`
	Message  string `yaml:"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))]
}