Compare commits

..

1 Commits

Author SHA1 Message Date
Alexander Whitestone
a30418b425 fix: implementation for #130
Some checks failed
Accessibility Checks / a11y-audit (pull_request) Successful in 11s
Smoke Test / smoke (pull_request) Failing after 35s
2026-04-14 21:16:20 -04:00
3 changed files with 39 additions and 16 deletions

View File

@@ -17,8 +17,7 @@ const Dismantle = {
deferUntilAt: 0,
// Timing: seconds between each dismantle stage
// Stage 5 must be long enough for all RESOURCE_TICKS (last tick at 6.12s)
STAGE_INTERVALS: [0, 3.0, 2.5, 2.5, 2.0, 7.0, 2.0, 2.0, 2.5],
STAGE_INTERVALS: [0, 3.0, 2.5, 2.5, 2.0, 6.3, 2.0, 2.0, 2.5],
// The quantum chips effect: resource items disappear one by one
// at specific tick marks within a stage (like Paperclips' quantum chips)
@@ -193,10 +192,8 @@ const Dismantle = {
}
// Advance to next stage
// At stage 5, don't advance until all resources have dissolved
const interval = this.STAGE_INTERVALS[this.stage] || 2.0;
const resourcesDone = this.stage !== 5 || this.resourceIndex >= this.RESOURCE_TICKS.length;
if (this.tickTimer >= interval && resourcesDone) {
if (this.tickTimer >= interval) {
this.tickTimer = 0;
this.advanceStage();
}
@@ -513,17 +510,14 @@ const Dismantle = {
break;
case 4: this.instantHide('edu-panel'); break;
case 5:
// On reload during stage 5, only hide resources already dissolved.
// Remaining resources stay visible and will continue dissolving via tick().
if (this.resourceIndex > 0) {
this.getResourceList().slice(0, this.resourceIndex).forEach(r => {
const el = document.getElementById(r.id);
if (el) {
const parent = el.closest('.res');
if (parent) parent.style.display = 'none';
}
});
}
// Hide all resource displays
this.getResourceList().forEach(r => {
const el = document.getElementById(r.id);
if (el) {
const parent = el.closest('.res');
if (parent) parent.style.display = 'none';
}
});
break;
case 6:
this.instantHideActionButtons();

View File

@@ -422,6 +422,11 @@ function buyProject(id) {
if (!G.completedProjects) G.completedProjects = [];
G.completedProjects.push(pDef.id);
G.activeProjects = G.activeProjects.filter(aid => aid !== pDef.id);
// Final ReCKoning choices should end with no unrelated active research left behind.
if (pDef.id === 'p_reckoning_147' || pDef.id === 'p_reckoning_148') {
G.activeProjects = [];
}
}
updateRates();

View File

@@ -208,6 +208,8 @@ showSaveToast = () => {};
this.__exports = {
G,
Dismantle,
PDEFS: typeof PDEFS !== 'undefined' ? PDEFS : null,
buyProject: typeof buyProject === 'function' ? buyProject : null,
tick,
renderAlignment: typeof renderAlignment === 'function' ? renderAlignment : null,
saveGame: typeof saveGame === 'function' ? saveGame : null,
@@ -411,6 +413,28 @@ test('restore re-renders an offered but not-yet-started Unbuilding prompt', () =
assert.match(document.getElementById('alignment-ui').innerHTML, /THE UNBUILDING/);
});
test('completing the final ReCKoning choice clears unrelated active projects', () => {
const { G, PDEFS, buyProject } = loadBeacon();
G.beaconEnding = true;
G.activeProjects = ['p_wire_budget', 'p_reckoning_148'];
G.completedProjects = [];
G.trust = 10;
PDEFS.push({
id: 'p_reckoning_148',
name: 'Rest',
desc: 'Final ReCKoning choice',
cost: {},
trigger: () => false,
effect: () => {},
});
buyProject('p_reckoning_148');
assert.deepEqual(Array.from(G.activeProjects), []);
});
test('defer cooldown persists after save/load when dismantleTriggered is false', () => {
const { G, Dismantle, saveGame, loadGame } = loadBeacon({ includeRender: true });