aboutsummaryrefslogtreecommitdiff
path: root/internal/item
diff options
context:
space:
mode:
Diffstat (limited to 'internal/item')
-rw-r--r--internal/item/item.go58
-rw-r--r--internal/item/store.go21
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"))
}