Close the remaining cold-read gaps: bind, labels, menus and main's shape
Some checks failed
akbasic CI Build / cmake_build (push) Failing after 5m32s
akbasic CI Build / sanitizers (push) Failing after 15m58s
akbasic CI Build / coverage (push) Failing after 20m7s
akbasic CI Build / mutation_test (push) Failing after 4m29s
akbasic CI Build / akgl_build (push) Failing after 12m28s
Some checks failed
akbasic CI Build / cmake_build (push) Failing after 5m32s
akbasic CI Build / sanitizers (push) Failing after 15m58s
akbasic CI Build / coverage (push) Failing after 20m7s
akbasic CI Build / mutation_test (push) Failing after 4m29s
akbasic CI Build / akgl_build (push) Failing after 12m28s
Three more Haiku-class cold reads of the chapters, each against the amended text. What each surfaced is now shown rather than described: the akbasic_host_register_type()/akbasic_host_bind() boot calls, the declare_play() label listing, the akgl_UiMenu static and its handle_event signature, one control-handler pair, and main()'s ATTEMPT/HANDLE_DEFAULT/FINISH_NORETURN shape with the CATCH-inside- ATTEMPT rule stated. By the fourth read the generated player.c and enemies.c compiled untouched and every remaining guess was a tuning value the chapters deliberately leave open. Co-authored-by: andrew <andrew@aklabs.net> Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XiGgpHuXUm2mR4Wzndw3dc
This commit is contained in:
@@ -157,6 +157,24 @@ between the script's decision and the engine's pixel. Null physics
|
||||
(Chapter 20, Step 1) is what makes that safe: nothing else is trying to move
|
||||
the actor.
|
||||
|
||||
Registration and the first binding happen at boot, before the script loads —
|
||||
between `akbasic_runtime_init()` and `akbasic_runtime_load()` in Chapter 20's
|
||||
boot sequence. A binding is **borrowed, never copied**, so the placeholders it
|
||||
points at must be static storage:
|
||||
|
||||
```c wrap=galagacalls requires=akgl
|
||||
CATCH(errctx, akbasic_host_register_type(&SCRIPT, &ENEMY_TYPE));
|
||||
CATCH(errctx, akbasic_host_register_type(&SCRIPT, &ACTOR_TYPE));
|
||||
CATCH(errctx, akbasic_host_register_type(&SCRIPT, &GAME_TYPE));
|
||||
|
||||
CATCH(errctx, akbasic_host_bind(&SCRIPT, "SELF@", "ENEMY", &SCRATCH_ENEMY));
|
||||
CATCH(errctx, akbasic_host_bind(&SCRIPT, "ACTOR@", "ACTOR", &SCRATCH_ACTOR));
|
||||
CATCH(errctx, akbasic_host_bind(&SCRIPT, "GAME@", "GAME", &galaga_shared));
|
||||
```
|
||||
|
||||
`akbasic_host_bind()` takes the script name, the registered type's name, and
|
||||
the instance; after that, `SELF@` and `ACTOR@` are only ever *re*bound.
|
||||
|
||||
The per-frame call binds both names to *this* enemy before dispatching — one
|
||||
binding per name, pointed at forty enemies in turn, which is what
|
||||
`akbasic_host_rebind()` is for:
|
||||
|
||||
Reference in New Issue
Block a user