mission_ember.lua currently implements only the opening landing combat slice. It is not a
complete mission controller. The initial six-squad selection needs an in-game playtest. Bridge
interaction, later encounters, authored checkpoints, dialogue and mission completion remain to
be implemented.
The original installed SDK inspected on 2026-09-04 lacks the opening squad definitions. This controller
intentionally reports the missing binding before publishing any gameplay state. Build this branch
and regenerate the SDK first; the scenario-scoping fix in the squad linker addresses object-key
collisions between campaign and arcade content. Generation must still verify runnable member
counts, actor bindings and anchors. The isolated SDK generated in build/sdk-generated now passes
these checks for the initial six opening squads. Do not remove checks or supply replacement enemies.
After regeneration, copy this directory's contents to Sunrise/scripts beside the generated
Sunrise/sdk/lua directory in the game artifact tree. The runtime selects mission_ember.lua
by the activity name. Enable the existing server.activation.mission_scripting setting.
The controller declares region 64 at startup and waits for the client to hold it before spawning enemies. Enemy clear
requires evidence that every watched squad existed and now has no live members. Duplicate clear
events do not advance twice, and removed squads must be observed alive again. Region transit and
script reload do not reset the encounter. Encounter:reset is available for a future confirmed
checkpoint callback; this version does not infer a wipe from region transit.
Fresh launches declare the opening powerhouse state through initial_state. The installed
state.activity.arrival_overrides must also include mission_ember with bubble: 8 and
slice_set: 64; the arrival router otherwise chooses the first live bubble (the reactor area).
The branch's bundled defaults include this override. Existing settings need the row added
explicitly. Restart the game after changing arrival settings.
The combat-clear callback displays the authored bridge-control directive. It does not move the bridge, complete the activity or silently proceed through unimplemented encounters.
Run local checks from the repository root:
lua5.4 tests/mission_ember_encounter_test.lua
lua5.4 tests/mission_ember_controller_test.lua
python -m unittest discover -s tests -p 'test_*.py'
g++ -std=c++23 -O1 -g -fsanitize=address,undefined -fno-omit-frame-pointer \
tests/squad_reference_scope_test.cpp -lcrypto -o /tmp/ember-squad-reference-test
ASAN_OPTIONS=detect_leaks=0 /tmp/ember-squad-reference-test
Leak detection is disabled in this command because it cannot run under the sandbox's tracing; address and undefined-behavior instrumentation remain enabled. The C++ test uses synthetic identities and exercises the production reference resolver. Lua tests model the context API; they do not substitute for a live mission run.
Generate a local SDK inventory without committing package data:
python tools/inspect_mission_sdk.py /path/to/Sunrise/activity_sdk.pack \
--shard /path/to/Sunrise/sdk/scenarios/80B3C09E-HASH.pack \
--output /tmp/mission-ember-inventory.json
The current landing test places ten SDK squads (the original six and the four available bonus-support squads), using their authored default counts. Bonus-wave timing remains unverified; the missing bonus-anchor and far-side definitions are not substituted. Startup snaps the six bridge devices closed and resets the bridge objective after the initial state is published. The region callback no longer redundantly selects that state. Bridge interaction and extension still need scripting; this test checks its initial state only. Server/client info logging is installed to expose refused spawn and device requests on the next fresh launch.