Skip to content

Commit 48a2420

Browse files
author
DavidQ
committed
Phase 08.10 — Wave 3 normalization (final wave)
1 parent 8959043 commit 48a2420

31 files changed

Lines changed: 416 additions & 40 deletions

docs/dev/CODEX_COMMANDS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
MODEL: GPT-5.4
22
REASONING: high
33

4-
Normalize Wave 2 games:
5-
Orbit, MultiBallChaos, PaddleIntercept, Thruster, SpaceDuel, SolarSystem
4+
Normalize Wave 3 games:
5+
PacmanLite, PacmanFullAI, AITargetDummy, vector-arcade-sample
66

7-
Same constraints as Wave 1.
7+
Same constraints as previous waves.
88
Return ZIP to <project folder>/tmp/

docs/dev/COMMIT_COMMENT.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
build(games): normalize wave-2 repo-wide game boundaries (orbit/multiballchaos/paddleintercept/thruster/spaceduel/solarsystem)
1+
build(games): normalize wave-3 repo-wide game boundaries (pacmanlite/pacmanfullai/aitargetdummy/vector-arcade-sample)
Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,18 @@
1-
Wave 2 Change Summary
1+
Wave 3 Change Summary
22

33
What changed
4-
- Added real rules modules and required flow files for six Wave 2 targets.
5-
- Removed placeholder-only rules condition for Wave 2 targets by adding rules/gameFlowRules.js.
4+
- Added real rules modules and required flow files for all four Wave 3 targets.
5+
- Converted rules-placeholder-only condition to real rules JS presence.
6+
- Added missing required boundary dirs for vector-arcade-sample.
67

7-
Wave 2 targets normalized
8-
- Orbit
9-
- MultiBallChaos
10-
- PaddleIntercept
11-
- Thruster
12-
- SpaceDuel
13-
- SolarSystem
8+
Wave 3 targets normalized
9+
- PacmanLite
10+
- PacmanFullAI
11+
- AITargetDummy
12+
- vector-arcade-sample
1413

1514
What did not change
1615
- No engine files
1716
- No launcher/bootstrap work
17+
- No cross-wave normalization edits
1818
- No status inflation edits
19-
- Existing compliant games (Asteroids, Puckman, SpaceInvaders) preserved

docs/dev/reports/file_tree.txt

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
1-
Wave 2 Normalization Tree
1+
Wave 3 Normalization Tree
22

33
games/
4-
Orbit/
4+
PacmanLite/
55
rules/gameFlowRules.js
66
flow/attract.js
77
flow/intro.js
88
flow/highscore.js
9-
MultiBallChaos/
9+
PacmanFullAI/
1010
rules/gameFlowRules.js
1111
flow/attract.js
1212
flow/intro.js
1313
flow/highscore.js
14-
PaddleIntercept/
14+
AITargetDummy/
1515
rules/gameFlowRules.js
1616
flow/attract.js
1717
flow/intro.js
1818
flow/highscore.js
19-
Thruster/
20-
rules/gameFlowRules.js
21-
flow/attract.js
22-
flow/intro.js
23-
flow/highscore.js
24-
SpaceDuel/
25-
rules/gameFlowRules.js
19+
vector-arcade-sample/
20+
debug/.gitkeep
21+
entities/.gitkeep
2622
flow/attract.js
2723
flow/intro.js
2824
flow/highscore.js
29-
SolarSystem/
25+
game/.gitkeep
26+
levels/.gitkeep
3027
rules/gameFlowRules.js
31-
flow/attract.js
32-
flow/intro.js
33-
flow/highscore.js
28+
systems/.gitkeep
29+
ui/.gitkeep
30+
utils/.gitkeep
Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
Wave 2 Validation Checklist
1+
Wave 3 Validation Checklist
22

33
Scope guard
4-
- [x] Wave 2 targets only
4+
- [x] Wave 3 targets only
55
- [x] No engine modifications
66
- [x] No launch/bootstrap normalization
7-
- [x] Existing compliant games preserved
7+
- [x] Same constraints as prior waves applied
88

99
Per-target checks
1010
For each target game:
@@ -15,13 +15,11 @@ For each target game:
1515
- flow/highscore.js present
1616

1717
Results
18-
- [x] Orbit
19-
- [x] MultiBallChaos
20-
- [x] PaddleIntercept
21-
- [x] Thruster
22-
- [x] SpaceDuel
23-
- [x] SolarSystem
18+
- [x] PacmanLite
19+
- [x] PacmanFullAI
20+
- [x] AITargetDummy
21+
- [x] vector-arcade-sample
2422

2523
Command evidence
26-
- node --check on all 24 Wave 2 files: PASS
24+
- node --check on all 16 Wave 3 files: PASS
2725
- per-target structural checks: PASS
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# BUILD_PR — LEVEL 08.10 REPO-WIDE GAME NORMALIZATION WAVE 3
2+
3+
## Purpose
4+
Continue repo-wide normalization (Option A) with final remaining non-compliant games.
5+
6+
## Wave 3 target set
7+
- PacmanLite
8+
- PacmanFullAI
9+
- AITargetDummy
10+
- vector-arcade-sample
11+
12+
## Required structure
13+
Same as previous waves.
14+
15+
## Acceptance criteria
16+
Same as previous waves.
17+
18+
## Scope
19+
Docs-only, Wave 3 only.
20+
21+
## Out of scope
22+
No engine, no launcher, no cross-wave changes.
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import {
2+
AI_TARGET_DUMMY_FLOW_IDS,
3+
AI_TARGET_DUMMY_FLOW_LABELS,
4+
AI_TARGET_DUMMY_GAME_OVER_RETURN_MODE,
5+
AI_TARGET_DUMMY_GAME_OVER_RETURN_RESET_IDLE,
6+
AI_TARGET_DUMMY_GAME_OVER_RETURN_STATUS,
7+
createAITARGETDUMMYFlowDescriptor
8+
} from "../rules/gameFlowRules.js";
9+
10+
export const AI_TARGET_DUMMY_ATTRACT_FLOW_NEXT_ID = AI_TARGET_DUMMY_FLOW_IDS.intro;
11+
12+
export const attractFlow = createAITARGETDUMMYFlowDescriptor(AI_TARGET_DUMMY_FLOW_IDS.attract, {
13+
label: AI_TARGET_DUMMY_FLOW_LABELS.attract,
14+
nextFlowId: AI_TARGET_DUMMY_ATTRACT_FLOW_NEXT_ID,
15+
autoAdvanceSeconds: null,
16+
statusText: AI_TARGET_DUMMY_GAME_OVER_RETURN_STATUS,
17+
returnMode: AI_TARGET_DUMMY_GAME_OVER_RETURN_MODE,
18+
resetIdleOnReturn: AI_TARGET_DUMMY_GAME_OVER_RETURN_RESET_IDLE
19+
});
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import {
2+
AI_TARGET_DUMMY_FLOW_IDS,
3+
AI_TARGET_DUMMY_FLOW_LABELS,
4+
AI_TARGET_DUMMY_HIGHSCORE_AUTO_EXIT_SECONDS,
5+
AI_TARGET_DUMMY_HIGHSCORE_STATUS,
6+
createAITARGETDUMMYFlowDescriptor
7+
} from "../rules/gameFlowRules.js";
8+
9+
export const AI_TARGET_DUMMY_HIGHSCORE_FLOW_NEXT_ID = AI_TARGET_DUMMY_FLOW_IDS.attract;
10+
11+
export const highscoreFlow = createAITARGETDUMMYFlowDescriptor(AI_TARGET_DUMMY_FLOW_IDS.highscore, {
12+
label: AI_TARGET_DUMMY_FLOW_LABELS.highscore,
13+
nextFlowId: AI_TARGET_DUMMY_HIGHSCORE_FLOW_NEXT_ID,
14+
autoAdvanceSeconds: AI_TARGET_DUMMY_HIGHSCORE_AUTO_EXIT_SECONDS,
15+
statusText: AI_TARGET_DUMMY_HIGHSCORE_STATUS
16+
});

games/AITargetDummy/flow/intro.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import {
2+
AI_TARGET_DUMMY_FLOW_IDS,
3+
AI_TARGET_DUMMY_FLOW_LABELS,
4+
AI_TARGET_DUMMY_GAME_OVER_AUTO_EXIT_SECONDS,
5+
AI_TARGET_DUMMY_GAME_OVER_RETURN_MODE,
6+
AI_TARGET_DUMMY_GAME_OVER_RETURN_RESET_IDLE,
7+
AI_TARGET_DUMMY_GAME_OVER_RETURN_STATUS,
8+
createAITARGETDUMMYFlowDescriptor
9+
} from "../rules/gameFlowRules.js";
10+
11+
export const AI_TARGET_DUMMY_INTRO_FLOW_NEXT_ID = AI_TARGET_DUMMY_FLOW_IDS.highscore;
12+
13+
export const introFlow = createAITARGETDUMMYFlowDescriptor(AI_TARGET_DUMMY_FLOW_IDS.intro, {
14+
label: AI_TARGET_DUMMY_FLOW_LABELS.intro,
15+
nextFlowId: AI_TARGET_DUMMY_INTRO_FLOW_NEXT_ID,
16+
autoAdvanceSeconds: AI_TARGET_DUMMY_GAME_OVER_AUTO_EXIT_SECONDS,
17+
statusText: AI_TARGET_DUMMY_GAME_OVER_RETURN_STATUS,
18+
returnMode: AI_TARGET_DUMMY_GAME_OVER_RETURN_MODE,
19+
resetIdleOnReturn: AI_TARGET_DUMMY_GAME_OVER_RETURN_RESET_IDLE
20+
});
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
export const AI_TARGET_DUMMY_FLOW_CONTRACT_VERSION = "1";
2+
3+
export const AI_TARGET_DUMMY_FLOW_IDS = Object.freeze({
4+
attract: "attract",
5+
intro: "intro",
6+
highscore: "highscore"
7+
});
8+
9+
export const AI_TARGET_DUMMY_FLOW_LABELS = Object.freeze({
10+
attract: "Attract",
11+
intro: "Intro",
12+
highscore: "Highscore"
13+
});
14+
15+
export const AI_TARGET_DUMMY_GAME_OVER_AUTO_EXIT_SECONDS = 30;
16+
export const AI_TARGET_DUMMY_GAME_OVER_RETURN_MODE = "menu";
17+
export const AI_TARGET_DUMMY_GAME_OVER_RETURN_STATUS = "Press 1 for one player or 2 for two players.";
18+
export const AI_TARGET_DUMMY_GAME_OVER_RETURN_RESET_IDLE = true;
19+
20+
export const AI_TARGET_DUMMY_HIGHSCORE_AUTO_EXIT_SECONDS = 12;
21+
export const AI_TARGET_DUMMY_HIGHSCORE_STATUS = "AI Target Dummy high scores";
22+
23+
export function createAITARGETDUMMYFlowDescriptor(id, options = {}) {
24+
return Object.freeze({
25+
id,
26+
label: options.label || id,
27+
contractVersion: AI_TARGET_DUMMY_FLOW_CONTRACT_VERSION,
28+
nextFlowId: options.nextFlowId || AI_TARGET_DUMMY_FLOW_IDS.attract,
29+
autoAdvanceSeconds: options.autoAdvanceSeconds ?? null,
30+
statusText: options.statusText || "",
31+
returnMode: options.returnMode || AI_TARGET_DUMMY_GAME_OVER_RETURN_MODE,
32+
resetIdleOnReturn: options.resetIdleOnReturn ?? AI_TARGET_DUMMY_GAME_OVER_RETURN_RESET_IDLE,
33+
debugPluginFactory: options.debugPluginFactory || null
34+
});
35+
}

0 commit comments

Comments
 (0)