diff options
Diffstat (limited to 'internal/item')
| -rw-r--r-- | internal/item/item.go | 58 | ||||
| -rw-r--r-- | internal/item/store.go | 21 |
2 files changed, 48 insertions, 31 deletions
diff --git a/internal/item/item.go b/internal/item/item.go index 8edae92..77f462a 100644 --- a/internal/item/item.go +++ b/internal/item/item.go @@ -91,25 +91,25 @@ type ItemDef struct { Tool *ToolDef `yaml:"tool,omitempty"` Requirements map[string]int `yaml:"requirements,omitempty"` - Quality int `yaml:"quality"` - MaxQuality int `yaml:"max_quality"` + Quality int `yaml:"quality"` + MaxQuality int `yaml:"max_quality"` Craft CraftList `yaml:"craft,omitempty"` - SearchTable string `yaml:"search_table"` - SearchTicks float64 `yaml:"search_ticks"` - SearchMessage string `yaml:"search_message"` + SearchTable string `yaml:"search_table"` + SearchTicks float64 `yaml:"search_ticks"` + SearchMessage string `yaml:"search_message"` HealValue int `yaml:"heal_value"` EatMessage string `yaml:"eat_message"` - FarmPatchType string `yaml:"farm_patch_type"` - FarmLevel int `yaml:"farm_level"` - FarmPlantXP int `yaml:"farm_plant_xp"` - FarmHarvestXP int `yaml:"farm_harvest_xp"` - FarmStages int `yaml:"farm_stages"` - FarmProduct string `yaml:"farm_product"` - FarmMinYield int `yaml:"farm_min_yield"` - FarmMaxYield int `yaml:"farm_max_yield"` + FarmPatchType string `yaml:"farm_patch_type"` + FarmLevel int `yaml:"farm_level"` + FarmPlantXP int `yaml:"farm_plant_xp"` + FarmHarvestXP int `yaml:"farm_harvest_xp"` + FarmStages int `yaml:"farm_stages"` + FarmProduct string `yaml:"farm_product"` + FarmMinYield int `yaml:"farm_min_yield"` + FarmMaxYield int `yaml:"farm_max_yield"` PotionEffect string `yaml:"potion_effect"` PotionBonus int `yaml:"potion_bonus"` @@ -276,22 +276,22 @@ type SuccessFormula struct { } type CraftDef struct { - Type string `yaml:"type"` - Subtype string `yaml:"subtype,omitempty"` - Level int `yaml:"level"` - XP int `yaml:"xp"` - TicksPerCycle float64 `yaml:"ticks_per_cycle"` - Station []string `yaml:"station"` - Tool string `yaml:"tool"` - Ingredients []IngredientEntry `yaml:"ingredients"` - OutputQty int `yaml:"output_qty"` - Fail string `yaml:"fail"` - SuccessMessage string `yaml:"success_message"` - FailMessage string `yaml:"fail_message"` - StartMessage string `yaml:"start_message"` - EndMessage string `yaml:"end_message"` - Steps []CraftStep `yaml:"steps"` - Success *SuccessFormula `yaml:"success"` + Type string `yaml:"type"` + Subtype string `yaml:"subtype,omitempty"` + Level int `yaml:"level"` + XP int `yaml:"xp"` + TicksPerCycle float64 `yaml:"ticks_per_cycle"` + Station []string `yaml:"station"` + Tool string `yaml:"tool"` + Ingredients []IngredientEntry `yaml:"ingredients"` + OutputQty int `yaml:"output_qty"` + Fail string `yaml:"fail"` + SuccessMessage string `yaml:"success_message"` + FailMessage string `yaml:"fail_message"` + StartMessage string `yaml:"start_message"` + EndMessage string `yaml:"end_message"` + Steps []CraftStep `yaml:"steps"` + Success *SuccessFormula `yaml:"success"` } func (c *CraftDef) EffectiveSkill() string { diff --git a/internal/item/store.go b/internal/item/store.go index b6e5567..e50e6e9 100644 --- a/internal/item/store.go +++ b/internal/item/store.go @@ -4,12 +4,14 @@ import ( "fmt" "os" "path/filepath" + "sync" "gopkg.in/yaml.v3" "thehouseoficarus/internal/behavior" ) type ItemStore struct { + mu sync.Mutex dataDir string pathIndex map[string]string cache map[string]*ItemDef @@ -25,6 +27,8 @@ func NewItemStore(dataDir string) *ItemStore { } func (s *ItemStore) Load(id string) (*ItemDef, error) { + s.mu.Lock() + defer s.mu.Unlock() if def, ok := s.cache[id]; ok { return def, nil } @@ -46,6 +50,8 @@ func (s *ItemStore) Load(id string) (*ItemDef, error) { } func (s *ItemStore) LoadAll() ([]*ItemDef, error) { + s.mu.Lock() + defer s.mu.Unlock() dir := filepath.Join(s.dataDir, "items") var defs []*ItemDef err := behavior.WalkYAMLDir(dir, func(path, id string, data []byte) error { @@ -65,12 +71,21 @@ func (s *ItemStore) LoadAll() ([]*ItemDef, error) { return defs, err } +// PathIndex returns a copy of the id→path index, safe to iterate concurrently. func (s *ItemStore) PathIndex() map[string]string { - return s.pathIndex + s.mu.Lock() + defer s.mu.Unlock() + out := make(map[string]string, len(s.pathIndex)) + for id, p := range s.pathIndex { + out[id] = p + } + return out } func (s *ItemStore) IDSet() map[string]bool { - ids := make(map[string]bool) + s.mu.Lock() + defer s.mu.Unlock() + ids := make(map[string]bool, len(s.pathIndex)) for id := range s.pathIndex { ids[id] = true } @@ -78,6 +93,8 @@ func (s *ItemStore) IDSet() map[string]bool { } func (s *ItemStore) Reload(dataDir string) { + s.mu.Lock() + defer s.mu.Unlock() s.cache = make(map[string]*ItemDef) s.pathIndex = behavior.BuildPathIndex(filepath.Join(dataDir, "items")) } |
