package behavior import ( "strings" ) 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 = "cleaning" TypeCook ActionType = "cook" TypeSmelt ActionType = "smelting" 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 TicksPerCycle 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 TicksPerCycle float64 } type FletchData struct { ItemID string Phase int TicksPerCycle 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"` }