Variables and state machines can reset with every scene (#164)
A shared variable or machine used to live either per object or for the
whole run. Levels need a third lifetime: shared like global, but built
fresh from the declarations whenever a scene is loaded.
- New scope `scene` for Variables assets and state machines. A missing
field keeps the old meaning: `global` for assets, `local` for
machines, so existing projects do not change.
- Returning to a scene that was visited before is fresh as well. There
is no memory per scene.
- A `scene` machine announces its start state again after a scene swap,
so `On state entered` in the new scene hears it. A global machine
stays quiet because it never left its state.
- The rule lives in two pure functions in `sharedState.ts`
(`carriedForward`, `restartedAssets`). BehaviorSystem only calls them.
- The inspector shows a Scope dropdown on Variables assets and a third
step on the machine dropdown, with a note on what `scene` means.
Decisions:
- `scene` and `persistent` exclude each other (variant A). The choice
dialog was cancelled, so this is an assumption to revisit. A
scene-scoped asset hides the Persistent switch, and switching to
`scene` drops the flag (undo restores it). The guard sits in
`isPersistent` itself, so no path can save values the scope throws
away anyway.
Findings:
- `clickText('Scene')` hits the Scene tab, not the menu entry. One e2e
check was red because of that, and its partner was falsely green
because it compared `undefined` with `undefined`. Both use `clickLast`
now.
Tests:
- ./check.sh: 144 files, 2142 tests, CHECK EXIT 0 (before 143 / 2133)
- 9 new unit tests in tests/core/scene-scope.test.ts
- e2e 32 fresh: ALL PASSED, 17 checks
- e2e 1-3,17,18,26,32,35 fresh: ALL PASSED, 213 checks
- 3 new e2e checks (35: scene-scoped asset resets on swap, 32h: dropdown,
note, hidden Persistent switch)
- Counter-checks bite: ignoring `restarted` fails 2 unit tests and the
new check in 35, the old announcement rule fails 1, dropping the scope
guard in `isPersistent` fails 1. Originals restored, cmp IDENTICAL.
- Check sum 1307 (1304 + 3) is computed. Last CI measurement: 1293.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
6e3e8d23c5
commit
d7c0b7cfdb
12 files changed
+487
-43
No files matched your search
@@ -244,6 +244,41 @@ export async function scope(t) {
|
||||
JSON.stringify({ play: menuCleared }),
|
||||
);
|
||||
|
||||
// 32h. The third scope (#164): the switch beside Persistent, what it offers, and that the two
|
||||
// cannot both be on – `scene` throws the values away with every scene, so there is nothing
|
||||
// left to keep between runs and the Persistent switch is not even shown.
|
||||
await selectAsset('sc-vars');
|
||||
await sleep(200);
|
||||
const scopeRow = await json(`__gm.inspectorField('Scope')`);
|
||||
await click(scopeRow.x, scopeRow.y);
|
||||
const scopes = await json('__gm.menuRows()');
|
||||
await clickLast('Scene');
|
||||
await sleep(200);
|
||||
const scoped = await asset('sc-vars');
|
||||
const sceneNote = await has('every scene that is loaded.');
|
||||
check(
|
||||
'a Variables asset offers Global and Scene, and taking Scene says what it means',
|
||||
JSON.stringify(scopes) === JSON.stringify(['Global', 'Scene']) && scoped.scope === 'scene' && sceneNote,
|
||||
JSON.stringify({ scopes, scope: scoped.scope, note: sceneNote }),
|
||||
);
|
||||
check(
|
||||
'a scene-scoped asset is not persistent any more, and cannot be switched to it',
|
||||
scoped.persistent === undefined && (await json(`__gm.inspectorField('Persistent')`)) === null,
|
||||
JSON.stringify({ persistent: scoped.persistent, row: await json(`__gm.inspectorField('Persistent')`) }),
|
||||
);
|
||||
await shot('05-scene-scope');
|
||||
|
||||
const backRow = await json(`__gm.inspectorField('Scope')`);
|
||||
await click(backRow.x, backRow.y);
|
||||
await clickLast('Global');
|
||||
await sleep(200);
|
||||
const back = await asset('sc-vars');
|
||||
check(
|
||||
'switching back to Global takes the scope out of the document and brings the switch back',
|
||||
back.scope === undefined && Boolean(await json(`__gm.inspectorField('Persistent')`)),
|
||||
JSON.stringify({ scope: back.scope, persistent: back.persistent }),
|
||||
);
|
||||
|
||||
// 32g. Everything this step added goes again.
|
||||
await mutate(`
|
||||
const p = __gm.state.project;
|
||||
|
||||
Reference in new issue
Block a user