fix: improve endgame clock and gameplay stability
This commit is contained in:
1 parent
ce6aabfc55
commit
658298ee86
46 files changed
+1915
-99
No files matched your search
@@ -157,6 +157,59 @@ func SaveAvatarRank(id, rank uint32) error {
|
||||
return SaveAvatarProgress(id, nil, &rank)
|
||||
}
|
||||
|
||||
// MaxAvatarProgress updates the latest roster under the shared save lock,
|
||||
// preserving unknown fields and all non-avatar data.
|
||||
func MaxAvatarProgress() (int, error) {
|
||||
persistentWriteMu.Lock()
|
||||
defer persistentWriteMu.Unlock()
|
||||
unlock, err := lockPersistentFile()
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
defer unlock()
|
||||
raw, err := os.ReadFile("freesr-data.json")
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
var root map[string]json.RawMessage
|
||||
if err = json.Unmarshal(raw, &root); err != nil || root == nil {
|
||||
return 0, fmt.Errorf("invalid freesr-data object")
|
||||
}
|
||||
var avatars map[string]json.RawMessage
|
||||
if err = json.Unmarshal(root["avatars"], &avatars); err != nil || avatars == nil {
|
||||
return 0, fmt.Errorf("invalid avatar roster")
|
||||
}
|
||||
for id, entry := range avatars {
|
||||
var avatar map[string]json.RawMessage
|
||||
if err = json.Unmarshal(entry, &avatar); err != nil || avatar == nil {
|
||||
return 0, fmt.Errorf("invalid avatar %s", id)
|
||||
}
|
||||
var data map[string]json.RawMessage
|
||||
if err = json.Unmarshal(avatar["data"], &data); err != nil || data == nil {
|
||||
return 0, fmt.Errorf("invalid rank data for avatar %s", id)
|
||||
}
|
||||
avatar["level"] = json.RawMessage("80")
|
||||
avatar["promotion"] = json.RawMessage("6")
|
||||
data["rank"] = json.RawMessage("6")
|
||||
avatar["data"], err = json.Marshal(data)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
avatars[id], err = json.Marshal(avatar)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
}
|
||||
root["avatars"], err = json.Marshal(avatars)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
if err = writeJSONAtomic("freesr-data.json", root); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return len(avatars), nil
|
||||
}
|
||||
|
||||
// SaveAvatarProgress patches only the selected level and/or rank in the latest
|
||||
// import, under the same cross-process lock used by inventory and gacha saves.
|
||||
func SaveAvatarProgress(id uint32, level, rank *uint32) error {
|
||||
|
||||
Reference in new issue
Block a user