Partial failures, shared blackout and final-mission beacon choreography
The blackout viewer separates a native timed replay of supplementary record 04_015/7 from static inventories of other mission commands. blackouts.json retains coordinates, commands, messages and native changes.
Shared power-grid failure
Five world records select supplementary record 7 and contain owner-registration commands that can activate it: 04_003/2, 04_003/7, 04_005/2, 04_007/3 and 04_010/2. This is distinct from the Nightmare challenge's script. Activation still depends on their runtime conditions; merely loading one of those missions does not prove it reaches a full grid failure.
Starting with all 225 Delphi towers at FF, the original script and fade updater extinguish 224, leaving (72,126) untouched. The last source-byte change occurs at tick 12,512, approximately 25.024 seconds after the fixture's script entry. Pre-existing failures may change the final count in actual play. The script then remains in its delay loop.
Its nine English messages, consumed natively, read:
- Power is dropping throughout the city.
- Beacon power is failing.
- Our scanners
- are failing.
- Fortunately,
- commun-
- -ications
- are still
- oper---
All 32 configured fade runs target actual type-1 lattice cells. The replay executes C510 before the player interpreter, as the main loop does, at fixed 16-tick steps. Each fade changes output through intermediate values; the previously verified 8450 charging calculation uses that state byte, so the change affects charge capability as well as appearance.
Correction: the mission header's coordinate list is a queue, not necessarily initial darkness
The historical JSON field initial_beacon_sequence is retained for compatibility, now with an explicit semantic note. BD98–BDA2 sets C449 to F004 and skips to the FF terminator before parsing object setup. It does not darken those towers there.
Opcode 11 at C442 consumes the next byte through C449, advances the pointer, sets dimming mode and configures one beacon. This identifies the source previously left unresolved: it is mission data, not a random or executable-byte sequence.
C569 separately reads the entire list and sets those tower state bytes to zero. Its direct call at 3ECB lies in the mission-exit path reached when 3E9A is nonzero, before subsequent outcome/save/continuation handling. Thus calling it an initial-outage loader was incorrect. The full persistence and save/reload consequences still require tracing; the call occurs before the later success/failure branches, not exclusively on successful completion.
Native tests check setup pointer binding, all 118 listed coordinate consumptions across nine records, and C569's exact resulting cells. They force the reads for verification and do not claim each live script necessarily consumes its whole queue.
| Record | Queued coordinates | Decoded individual-failure commands |
|---|---|---|
| 04_005/2 | 4 | 4 |
| 04_006/7 | 2 | 0 |
| 04_007/5 | 5 | 5 |
| 04_008/4 | 4 | 4 |
| 04_009/2 | 5 | 5 |
| 04_010/4 | 2 | 0 |
| 04_011/5 | 9 | 9 |
| 04_012/0 | 64 | 0 |
| 04_015/0 | 23 | 3 |
Nightmare challenge (04_015/0)
The scenario explorer now provides a Beacon sequence panel when Nightmare is selected. Enable Show ordered changes on map, then use Previous/Next, the slider, the event selector or Play. Yellow beacons are powered, dark beacons are off, and white rings identify the current fade. Charging-zone overlays and hover details follow the selected step.
This is a completed-fade walkthrough, not a clock-accurate playback: combat
waits are assumed satisfied and delays are listed beside the next event.
tools/mission_beacons.py follows the decoded player script from its entry,
repeats the checkpoint loop until its world-state condition is satisfied, and
consumes all 23 queued coordinates. Single-beacon commands reset the direction
to dimming, as in C442; later row/column restorations are therefore tracked
independently of the static inventory's direction assumptions. The 85 steps
include 80 fades, direction changes and the two altitude-control changes. All
80 fade footprints match the independent full mission-script replay in order.
The final step restores all 225 towers. Other records retain their existing
outage inventory overlays; the separate blackout page retains its timed shared
blackout replay.
The final beacon pursuit includes an intentional flight-control change:
immediately before the queued beacon at (18,18) is extinguished, opcode
38 00 02 enables scripted altitude hold at height 512. This causes a
persistent nose-down steering demand above the requested height, independently
of the ordinary low-speed response to losing beacon power. It can feel like
successive outages are accumulating a downward force, but the script explicitly
changes the controller at this point.
The release is gated by two groups of three moving ground objectives: equipment carriers, then cargo trucks. This section selects weapon 10 (key 0, Brent Hunter); Brent Ground targets static map objects instead. The accompanying Assassin (object 22) is explicitly uncounted and does not need to be destroyed. After both objective waits finish, script delays total 22,650 ticks and three beacon-command delays add 900 ticks: roughly 47 seconds at the nominal 500 Hz clock, plus frame scheduling, before the forced hold is released.
The native handler C194 toggles bit 7 of 7ED2, consuming the height word into
80AC when enabling it. 8067 selects height control for any nonzero altitude
flag; 80A4 applies the height error plus the pitch-control reference. The A key
only toggles bit 0 and therefore cannot cancel the scripted bit. A later opcode
38 disables the scripted mode before the grid-restoration sequence. In the
controlled retail-script replay, the mode starts at tick 124056, the (18,18)
beacon fade starts at 124456, and the mode ends at 151056. These are replay
checkpoints, not fixed playthrough timings: earlier waits depend on objectives.
The native selection path identifies 04_015/0 as the special Nightmare challenge, not the final campaign mission. It has its own substantial sequence of row/column fades, objective waits, reserve activations and direction reversals. Its row/column command inventory covers all 225 tower positions, but this is not evidence that all are simultaneously off: later commands restore power, and waits separate phases. The viewer marks this as static coverage, with direction derived assuming initial dimming mode, rather than presenting an invented uninterrupted playthrough.
This supports keeping three concepts separate: local scripted failures, the shared power-grid failure triggered by certain mission paths, and the Nightmare challenge's staged beacon choreography. Displayed mission numbering and exact in-game outcomes should not be inferred solely from resource numbering.
Reproduction and limits
PYTHONPATH=/tmp/darker-python python3 tools/trace_blackouts.py
PYTHONPATH=/tmp/darker-python python3 tools/verify_blackout_queues.py
The shared-script replay uses real map type bytes and real English message bytes; sound notification is intercepted. It does not simulate the combat/conditions that trigger the shared script, or prior persistent darkness. Other records are inventoried rather than run to completion. The Nightmare challenge needs explicit objective/event inputs for a faithful controlled timeline.