diff --git a/js/data.js b/js/data.js index a588205..dc44f79 100644 --- a/js/data.js +++ b/js/data.js @@ -167,6 +167,7 @@ const G = { dismantleStage: 0, dismantleResourceIndex: 0, dismantleResourceTimer: 0, + dismantleDeferUntilAt: 0, dismantleComplete: false }; diff --git a/js/dismantle.js b/js/dismantle.js index 2550c80..7987dd9 100644 --- a/js/dismantle.js +++ b/js/dismantle.js @@ -14,7 +14,7 @@ const Dismantle = { tickTimer: 0, active: false, triggered: false, - deferUntilTick: 0, + deferUntilAt: 0, // Timing: seconds between each dismantle stage STAGE_INTERVALS: [0, 3.0, 2.5, 2.5, 2.0, 6.3, 2.0, 2.0, 2.5], @@ -39,7 +39,8 @@ const Dismantle = { */ checkTrigger() { if (this.triggered || G.dismantleTriggered || this.active || G.dismantleActive || G.dismantleComplete) return; - if ((G.tick || 0) < (this.deferUntilTick || 0)) return; + const deferUntilAt = G.dismantleDeferUntilAt || this.deferUntilAt || 0; + if (Date.now() < deferUntilAt) return; if (!this.isEligible()) return; this.offerChoice(); }, @@ -55,6 +56,7 @@ const Dismantle = { G.dismantleStage = 0; G.dismantleResourceIndex = 0; G.dismantleResourceTimer = 0; + G.dismantleDeferUntilAt = 0; G.beaconEnding = false; G.running = true; @@ -107,7 +109,8 @@ const Dismantle = { this.clearChoice(); this.triggered = false; G.dismantleTriggered = false; - this.deferUntilTick = (G.tick || 0) + 50; + this.deferUntilAt = Date.now() + 5000; + G.dismantleDeferUntilAt = this.deferUntilAt; log('The Beacon waits. It will ask again.'); }, @@ -117,12 +120,14 @@ const Dismantle = { begin() { this.active = true; this.triggered = false; + this.deferUntilAt = 0; this.stage = 1; this.tickTimer = 0; G.dismantleTriggered = false; G.dismantleActive = true; G.dismantleStage = 1; G.dismantleComplete = false; + G.dismantleDeferUntilAt = 0; G.beaconEnding = false; G.running = true; // keep tick running for dismantle @@ -456,6 +461,7 @@ const Dismantle = { this.active = true; this.triggered = false; this.stage = G.dismantleStage || 1; + this.deferUntilAt = G.dismantleDeferUntilAt || 0; G.running = true; this.resourceSequence = this.getResourceList(); this.resourceIndex = G.dismantleResourceIndex || 0; diff --git a/js/render.js b/js/render.js index 078ba53..77049c8 100644 --- a/js/render.js +++ b/js/render.js @@ -232,6 +232,7 @@ function saveGame() { dismantleStage: G.dismantleStage || 0, dismantleResourceIndex: G.dismantleResourceIndex || 0, dismantleResourceTimer: G.dismantleResourceTimer || 0, + dismantleDeferUntilAt: G.dismantleDeferUntilAt || 0, dismantleComplete: G.dismantleComplete || false, savedAt: Date.now() }; @@ -266,7 +267,7 @@ function loadGame() { 'sprintActive', 'sprintTimer', 'sprintCooldown', 'swarmFlag', 'swarmRate', 'strategicFlag', 'projectsCollapsed', 'dismantleTriggered', 'dismantleActive', 'dismantleStage', - 'dismantleResourceIndex', 'dismantleResourceTimer', 'dismantleComplete' + 'dismantleResourceIndex', 'dismantleResourceTimer', 'dismantleDeferUntilAt', 'dismantleComplete' ]; G.isLoading = true; diff --git a/tests/dismantle.test.cjs b/tests/dismantle.test.cjs index fe75aaa..3d14436 100644 --- a/tests/dismantle.test.cjs +++ b/tests/dismantle.test.cjs @@ -329,7 +329,6 @@ test('deferring the Unbuilding clears the prompt and allows it to return later', G.totalCode = 1_000_000_000; G.phase = 6; G.pactFlag = 1; - G.tick = 0; Dismantle.checkTrigger(); assert.equal(G.dismantleTriggered, true); @@ -338,15 +337,44 @@ test('deferring the Unbuilding clears the prompt and allows it to return later', assert.equal(G.dismantleTriggered, false); assert.equal(document.getElementById('alignment-ui').innerHTML, ''); - G.tick = (Dismantle.deferUntilTick || 0) - 0.1; + Dismantle.deferUntilAt = Date.now() + 1000; + G.dismantleDeferUntilAt = Dismantle.deferUntilAt; Dismantle.checkTrigger(); assert.equal(G.dismantleTriggered, false); - G.tick = (Dismantle.deferUntilTick || 0) + 1; + Dismantle.deferUntilAt = Date.now() - 1; + G.dismantleDeferUntilAt = Dismantle.deferUntilAt; Dismantle.checkTrigger(); assert.equal(G.dismantleTriggered, true); }); +test('defer cooldown survives save and reload', () => { + const { G, Dismantle, saveGame, loadGame } = loadBeacon({ includeRender: true }); + + G.startedAt = Date.now(); + G.totalCode = 1_000_000_000; + G.phase = 6; + G.pactFlag = 1; + + Dismantle.checkTrigger(); + Dismantle.defer(); + assert.ok((Dismantle.deferUntilAt || 0) > Date.now()); + + saveGame(); + + G.dismantleTriggered = false; + G.dismantleActive = false; + G.dismantleComplete = false; + G.dismantleDeferUntilAt = 0; + Dismantle.triggered = false; + Dismantle.deferUntilAt = 0; + + assert.equal(loadGame(), true); + Dismantle.checkTrigger(); + + assert.equal(G.dismantleTriggered, false); +}); + test('save and load preserve dismantle progress', () => { const { G, saveGame, loadGame } = loadBeacon({ includeRender: true });