@@ -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
166184test ( 'interaction waits for a moving NPC to finish its tile step' , ( ) => {
0 commit comments