package common import ( "encoding/json" "fmt" ) // Patch selected top-level fields against the latest file, under the same lock // used by game saves. Raw JSON retains 64-bit scores and unknown save sections. func PatchPersistentFields(patch map[string]json.RawMessage) error { if patch == nil { return fmt.Errorf("persistent patch must be a JSON object") } for _, raw := range patch { if !json.Valid(raw) { return fmt.Errorf("invalid persistent field JSON") } } persistentWriteMu.Lock() defer persistentWriteMu.Unlock() unlock, err := lockPersistentFile() if err != nil { return err } defer unlock() root, err := readCurrencyWarsPersistentRoot() if err != nil { return err } for key, value := range patch { root[key] = value } return writeJSONAtomic("persistent", root) }