Skip to content

Commit 6fabefd

Browse files
committed
Merge branch 'codex/feedback-polish' into codex/daily-engagement
2 parents 5267dcc + 455f4df commit 6fabefd

2 files changed

Lines changed: 39 additions & 4 deletions

File tree

index.html

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@ <h2 id="journal-title">SIGNAL LOG</h2>
414414
if (entityOccupiesTile(player, tx, ty)) return false;
415415
// Check other NPCs
416416
if (isTileReserved(npcs, tx, ty, npc)) return false;
417+
if (getActiveFragmentAt(tx, ty)) return false;
417418
npc.facing = dir;
418419
npc.moveFromX = npc.tileX; npc.moveFromY = npc.tileY;
419420
npc.moveToX = tx; npc.moveToY = ty;
@@ -975,6 +976,12 @@ <h2 id="journal-title">SIGNAL LOG</h2>
975976
)) || null;
976977
}
977978

979+
function getActiveFragmentAt(x, y) {
980+
return signalFragments.find(fragment => (
981+
!fragment.collected && fragment.x === x && fragment.y === y
982+
)) || null;
983+
}
984+
978985
function updateQuestUI() {
979986
const collected = signalFragments.filter(fragment => fragment.collected).length;
980987
questEl.textContent = quest.complete ? `FACTORY ONLINE · ${dailyChallenge.code}` : `SIGNALS ${collected}/${signalFragments.length} · ${dailyChallenge.code}`;
@@ -1053,6 +1060,16 @@ <h2 id="journal-title">SIGNAL LOG</h2>
10531060
metrics.increment('replays');
10541061
}
10551062

1063+
function requestQuestReset(confirmReset) {
1064+
const message = 'Restart the journey? Recovered signals and the resident log will be cleared.';
1065+
const confirmed = typeof confirmReset === 'function' ?
1066+
confirmReset(message) :
1067+
typeof window.confirm === 'function' && window.confirm(message);
1068+
if (!confirmed) return false;
1069+
resetQuest();
1070+
return true;
1071+
}
1072+
10561073
function performAction() {
10571074
if (player.state !== 'IDLE') return;
10581075
const adjacentFragment = getFacingFragment();
@@ -1069,7 +1086,7 @@ <h2 id="journal-title">SIGNAL LOG</h2>
10691086
canvas.focus({ preventScroll: true });
10701087
performAction();
10711088
});
1072-
questResetButton.addEventListener('click', resetQuest);
1089+
questResetButton.addEventListener('click', () => requestQuestReset());
10731090
journalButton.addEventListener('click', () => {
10741091
updateJournal();
10751092
journalDialog.showModal();

tests/runtime-smoke.test.cjs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,18 @@ test('runtime initializes and renders a frame', () => {
121121
{ discovered: true, blocked: 'BLOCKED', collected: true },
122122
);
123123

124+
const resetBehavior = vm.runInContext(`
125+
discoveredNPCs.add('OVERSEER');
126+
const cancelled = requestQuestReset(() => false);
127+
const retained = fragment.collected && discoveredNPCs.has('OVERSEER');
128+
const accepted = requestQuestReset(() => true);
129+
({ cancelled, retained, accepted, cleared: !fragment.collected && discoveredNPCs.size === 0 });
130+
`, sandbox);
131+
assert.deepEqual(
132+
{ ...resetBehavior },
133+
{ cancelled: false, retained: true, accepted: true, cleared: true },
134+
);
135+
124136
const completion = vm.runInContext(`
125137
for (const fragment of signalFragments) {
126138
fragment.discovered = true;
@@ -157,10 +169,16 @@ test('NPC movement rejects a destination reserved earlier in the frame', () => {
157169
npcs.length = 0;
158170
const first = makeNPC('worker', 9, 11, 'east');
159171
const second = makeNPC('worker', 11, 11, 'west');
160-
npcs.push(first, second);
161-
({ first: npcStartMove(first, 'east', 200), second: npcStartMove(second, 'west', 200) });
172+
const fragment = signalFragments[0];
173+
const fragmentSeeker = makeNPC('worker', fragment.x - 1, fragment.y, 'east');
174+
npcs.push(first, second, fragmentSeeker);
175+
({
176+
first: npcStartMove(first, 'east', 200),
177+
second: npcStartMove(second, 'west', 200),
178+
fragment: npcStartMove(fragmentSeeker, 'east', 200),
179+
});
162180
`, sandbox);
163-
assert.deepEqual({ ...result }, { first: true, second: false });
181+
assert.deepEqual({ ...result }, { first: true, second: false, fragment: false });
164182
});
165183

166184
test('interaction waits for a moving NPC to finish its tile step', () => {

0 commit comments

Comments
 (0)