Skip to content

Commit eba7bb7

Browse files
committed
Merge branch 'codex/signal-quest' into codex/narrative-progress
2 parents 32cdb95 + a5da72c commit eba7bb7

2 files changed

Lines changed: 28 additions & 4 deletions

File tree

index.html

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -244,12 +244,13 @@ <h2 id="journal-title">SIGNAL LOG</h2>
244244

245245
// Interaction targets reserve their tile so the player stops facing them.
246246
const npcOnTile = isTileOccupiedByNPC(tx, ty, null);
247-
const fragmentOnTile = getUncollectedFragmentAt(tx, ty);
247+
const fragmentOnTile = getActiveFragmentAt(tx, ty);
248248
if (npcOnTile || fragmentOnTile || !isWalkable(tx, ty)) {
249249
// BLOCKED
250250
player.state = 'BLOCKED';
251251
player.bumpDir = dir;
252252
player.bumpProgress = 0;
253+
if (fragmentOnTile && !fragmentOnTile.discovered) showStatus('SIGNAL INTERFERENCE · SCAN');
253254
return;
254255
}
255256

@@ -839,7 +840,7 @@ <h2 id="journal-title">SIGNAL LOG</h2>
839840
// PATHFINDING
840841
// ══════════════════════════════════════════════════════
841842
function findPath(sx,sy,ex,ey){
842-
const isPlayerWalkable = (x, y) => isWalkable(x, y) && !getUncollectedFragmentAt(x, y);
843+
const isPlayerWalkable = (x, y) => isWalkable(x, y) && !getActiveFragmentAt(x, y);
843844
return findWorldPath(sx, sy, ex, ey, isPlayerWalkable, { allowNearest: false });
844845
}
845846

@@ -1009,6 +1010,14 @@ <h2 id="journal-title">SIGNAL LOG</h2>
10091010
}
10101011

10111012
function resetQuest() {
1013+
const occupiedSignalSite = signalFragments.some(fragment => (
1014+
entityOccupiesTile(player, fragment.x, fragment.y) ||
1015+
isTileReserved(npcs, fragment.x, fragment.y, null)
1016+
));
1017+
if (occupiedSignalSite) {
1018+
showStatus('CLEAR SIGNAL SITES BEFORE RESTART', 2.5);
1019+
return false;
1020+
}
10121021
for (const fragment of signalFragments) {
10131022
fragment.discovered = false;
10141023
fragment.collected = false;
@@ -1020,6 +1029,7 @@ <h2 id="journal-title">SIGNAL LOG</h2>
10201029
updateQuestUI();
10211030
updateJournal();
10221031
showStatus('SIGNAL SEARCH RESTARTED', 2);
1032+
return true;
10231033
}
10241034

10251035
function requestQuestReset(confirmReset) {

tests/runtime-smoke.test.cjs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -102,17 +102,20 @@ test('runtime initializes and renders a frame', () => {
102102
player.tileY = fragment.y - 1;
103103
player.renderX = player.tileX;
104104
player.renderY = player.tileY;
105+
playerStartMove('south');
106+
const hiddenBlocked = player.state;
107+
player.state = 'IDLE';
105108
triggerScanPulse();
106109
updateScanPulse(1);
107110
playerStartMove('south');
108111
const blocked = player.state;
109112
player.state = 'IDLE';
110113
performAction();
111-
({ discovered: fragment.discovered, blocked, collected: fragment.collected });
114+
({ discovered: fragment.discovered, hiddenBlocked, blocked, collected: fragment.collected });
112115
`, sandbox);
113116
assert.deepEqual(
114117
{ ...retrieval },
115-
{ discovered: true, blocked: 'BLOCKED', collected: true },
118+
{ discovered: true, hiddenBlocked: 'BLOCKED', blocked: 'BLOCKED', collected: true },
116119
);
117120

118121
const resetBehavior = vm.runInContext(`
@@ -136,6 +139,17 @@ test('runtime initializes and renders a frame', () => {
136139
`, sandbox);
137140
assert.deepEqual({ ...completion }, { complete: true, collected: 3 });
138141
assert.equal(elements.quest.textContent, 'FACTORY ONLINE');
142+
143+
const replay = vm.runInContext(`
144+
player.tileX = signalFragments[0].x;
145+
player.tileY = signalFragments[0].y;
146+
const refused = resetQuest();
147+
player.tileX = 4;
148+
player.tileY = 6;
149+
const accepted = resetQuest();
150+
({ refused, accepted, collected: signalFragments.filter(fragment => fragment.collected).length });
151+
`, sandbox);
152+
assert.deepEqual({ ...replay }, { refused: false, accepted: true, collected: 0 });
139153
});
140154

141155
test('NPC movement rejects a destination reserved earlier in the frame', () => {

0 commit comments

Comments
 (0)