generated from nhcarrigan/template
fix: resolve all 8 open bug tickets (#242–#249) (#250)
## Summary - **#242** — Crystals in the resource bar now use `formatNumber` to respect the player's notation setting (suffix/scientific/engineering) - **#243** — Companion unlock progress includes current-run gold (`totalGoldEarned`) on both client and server, so companions unlock at the correct threshold - **#244** — Empty green reward bubbles no longer render for quest crystal rewards with a zero amount - **#245/#248** — Auto-save skips when `isAutoPrestigingReference.current` is true, preventing it from racing with an in-flight prestige and breaking the optimistic lock - **#246** — Generated and uploaded CDN images for `crystal_pulse`, `crystal_surge`, and `crystal_tempest` upgrades - **#247** — `validateAndSanitize` merges daily challenge progress by taking the max of client vs. server progress per challenge, so stale auto-saves can no longer roll back server-side completions - **#249** — Cached save signature is cleared after `buyPrestigeUpgrade` succeeds, preventing a stale-signature mismatch on the next auto-save ## Test plan - [ ] Lint passes (`pnpm lint`) - [ ] Build passes (`pnpm build`) - [ ] Tests pass with 100% coverage (`pnpm test`) - [ ] Crystals display in resource bar respects notation setting - [ ] No empty reward bubbles on quests that don't award crystals - [ ] Companion progress bar shows correct value including current-run gold - [ ] Auto-prestige no longer causes save errors - [ ] Crafting a recipe updates daily challenge progress persistently (not rolled back by next auto-save) - [ ] Buying a prestige upgrade does not cause a signature mismatch error on next save - [ ] Crystal upgrade images display correctly in-game ✨ This PR was created with help from Hikari~ 🌸 Reviewed-on: #250 Co-authored-by: Hikari <hikari@nhcarrigan.com> Co-committed-by: Hikari <hikari@nhcarrigan.com>
This commit was merged in pull request #250.
This commit is contained in:
@@ -1356,10 +1356,11 @@ export const GameProvider = ({
|
||||
newlyFailedQuestsReference.current = [];
|
||||
}
|
||||
|
||||
// Auto-save every 30 seconds (skip if a force sync is in-flight to avoid signature collisions)
|
||||
// Auto-save every 30 seconds (skip if a force sync or auto-prestige is in-flight to avoid signature collisions)
|
||||
if (Date.now() - lastSaveReference.current >= autoSaveIntervalMs) {
|
||||
lastSaveReference.current = Date.now();
|
||||
if (stateReference.current !== null && !isSyncingReference.current) {
|
||||
// eslint-disable-next-line stylistic/max-len -- Long condition; splitting would reduce readability
|
||||
if (stateReference.current !== null && !isSyncingReference.current && !isAutoPrestigingReference.current) {
|
||||
void saveGame({
|
||||
state: stateReference.current,
|
||||
...signatureReference.current === null
|
||||
@@ -1856,6 +1857,13 @@ export const GameProvider = ({
|
||||
},
|
||||
};
|
||||
});
|
||||
|
||||
/*
|
||||
* Buying a prestige upgrade mutates DB state; clear the cached signature
|
||||
* so the next auto-save doesn't collide with a stale one.
|
||||
*/
|
||||
signatureReference.current = null;
|
||||
localStorage.removeItem("elysium_save_signature");
|
||||
} catch (error_: unknown) {
|
||||
logError("buy_prestige_upgrade", error_);
|
||||
// Silently ignore — server errors shouldn't crash the UI
|
||||
|
||||
Reference in New Issue
Block a user