fix: improve endgame clock and gameplay stability

This commit is contained in:
CAtlas0784 committed 2026-11-04 15:59:48 +07:00
1 parent ce6aabfc55
commit 658298ee86
46 files changed
+1915 -99

No files matched your search

+53
View File
@@ -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 {