# Weapon identities, firing and impact behaviour

The ten Caero weapon/component slots are now linked to their **in-game names** through mission introductions and the executable's weapon-availability handler. Open the [updated gameplay browser](../analysis/gameplay/index.html) or [structured weapon export](../analysis/gameplay/weapons.json). This is a handler-level investigation, not a complete reimplementation of targeting, spawning, collision or damage.

For a player-facing lookup, see the [Caero number-key reference](flight-controls.md#caero-weapon-number-keys).

## Names and controls

| Slot | Selection ID | Direct key | Identity | Update / firing / impact entries |
| --- | --- | --- | --- | --- |
| 0 | 1 | 1 | Pinner Direct | CC64 / CAC0 / CDB1 |
| 1 | 2 | 2 | Pinner Mimic | CBCE / CAC0 / CDB1 |
| 2 | 3 | 3 | Brent Forbes Dual Launch: primary capsule | CC64 / CA4A / CDB1 |
| 3 | 4 | automatic | Forbes Diffuser: trigger | CC61 / CA69 / CE84 |
| 4 | 5 | 5 | Forbes Diffuser: gas capsule | CC61 / CA69 / CE84 |
| 5 | 6 | 6 | Brent Ground | CC61 / CA5A / CDB1 |
| 6 | 7 | automatic | Brent Forbes Dual Launch: follow-up homing unit | CBE7 / CA99 / CDB1 |
| 7 | 8 | 8 | Caero Weapon | CC61 / CA55 / CF16 |
| 8 | 9 | 9 | Pinner/Forbes Chargeable | CC68 / CA7D / CF0E |
| 9 | 10 | 0 | Brent Hunter | CC61 / CA55 / CDB1 |

Slots are zero-based; selection IDs are one-based. The dispatcher passes scan code minus one, so the number-row **0** selects ID 10. Keys 4 and 7 are not separate active weapon bindings. The component descriptions above are analytical labels; the compound weapon names come from mission text. “Follow-up” does not imply the secondary-fire button: Dual Launch changes the **primary selection byte** internally.

### Brent Ground: vulnerable building regions

A missile touching a visible polygon is not sufficient. Buildings use separate
collision volumes, each carrying a response category. For the ordinary Caero
ground-weapon path (`CDB9–CE1A`), a hit must find a nonzero damage link in the
currently selected model and satisfy the primitive's category:

| Collision category | Brent Ground response |
|---|---|
| 0 | Advances the building damage state only if its `40h` ground-target bit is set |
| 1 | Rejects building damage, even on a marked target |
| 2 | Advances damage without requiring target marking; Delphi streetlights use this |
| 3 | Rejected by ordinary Brent Ground damage; used by the separate Diffuser sequence |

An accepted hit adds `20h` to the cell state (`67C7–67CA`). This is not a
building-health pool: repeatedly striking a rejected wall does not gradually
weaken it. The weapon's numerical impact strength is not the deciding factor
here, unlike ordinary aircraft damage. A marked ruin can still display a
reticule while having no further damage link.

### Offices: aim into the doorway

Delphi **types 86–89** each have one thin category-0 collision volume recessed
inside the entrance, with five category-1 volumes forming the surrounding solid
parts. Their collision streams start at `852E`, `8555`, `857C` and `85A3` in
bank 30's world-data address space. The arrangements are rotated versions of
the same rule. Shooting the outside walls hits category 1 and cannot damage the
building; firing through the doorway can reach the category-0 region and
advance a marked office to its damaged model in one hit.

This matches our playtesting in both retail and the reconstruction. It is a
collision-volume rule, not a test against the rendered triangle mesh.

### Other restricted targets

The base-state bank-30 census also finds mixed category-0/category-1 volumes
on **types 17 and 21**, the corresponding hangar entrance models. They have a
thin vulnerable region and protected surrounding geometry too; eligibility
still requires target marking and a damage link. Their geometry should not be
assumed to use the office doorway's exact aiming point.

The recovered Delphi mission lists do **not** require destroying these entrances
as a building objective. Instead, the eight marked type-21 cells exactly match
the aircraft launch-site table at `8F2A`: (85,3), (112,11), (51,27), (84,55),
(87,55), (106,94), (18,102), (82,112). Scenarios `04_002/1`, `/3`, `/4`,
`04_007/0` and `04_010/2` mark subsets with `40h`, while their building-objective
lists are empty. No recovered embedded `set_world_flags_40` list adds an entrance.

Here marking also enables enemy aircraft launches (`8E3F`), and damage bit
`20h` disables them. Consequently, destroying a marked entrance can shut down
that reinforcement site even though the briefing does not explicitly order it.
This consequence follows from the launch and damage handlers; it is not yet a
separate retail bombing playtest. The late Delphi presentation `04_014/2`
pre-damages three type-17 entrances, rather than making them bombing objectives.

| First marking mission | Scenario | Launch entrance cells | Approximate named location |
|---|---|---|---|
| 18 | `04_002 / 1` | (51,27), (18,102) | Lundy and Wilston Shuttle Stations |
| 20 | `04_002 / 3` | (84,55) | Caero Shuttle Station |
| 21 | `04_002 / 4` | (87,55) | Caero Shuttle Station, second entrance |
| 57 | `04_007 / 0` | (85,3), (112,11) | Sharden and Chepesch Shuttle Bays |
| 83 | `04_010 / 2` | (106,94), (82,112) | Janstead Shuttle Station and Garth Shuttle Bay |

These are **first-marking missions**, not an exhaustive list of missions with
launches: the bit persists into subsequent Delphi missions unless changed, and
destroyed entrances are excluded. A launch also requires nearby player
position, spawning enabled, an expired site timer and an available free-list
aircraft. Mission 18 starts with no free-list aircraft, so its initial marking
alone does not guarantee a launch. Missions 20, 21, 57 and 83 each start with
four free-list aircraft records. Mission 20 is useful for observing launches, but **not for testing bombing with
the normal loadout**: Brent Ground is not unlocked until mission 50
(`04_006 / 1`, opcode `30 60`). Its introduction explicitly says: “All
enemy-occupied Shuttle Stations have already been flagged for destruction.”
Thus the earlier marking enables occupation/spawning before the player obtains
the means to destroy the sites. On normal campaign progression those markings
persist into mission 50. Mission 57 offers newly marked sites after Brent
Ground has been unlocked, avoiding reliance on earlier saved site activation.


**Type 76**, the destructible warehouse roof, uses category 3 throughout its
collision definition. That is a different restriction: the Diffuser gas/trigger
sequence handles it, rather than ordinary Brent Ground impact. Types 75 and 76
have identical collision boxes: a broad lower box and a narrower, taller central
strip. Both boxes on type 76 accept the Diffuser sequence; there is no separate
skylight-only hit test. Retail playtesting confirms that the whole type-76 block
can be hit successfully. Adjacent non-destructible warehouse blocks make the
vulnerable area appear smaller when approaching the assembled building.

Types without a damage link cannot be destroyed by this path regardless of
collision category.
Other base-state Delphi models with damage links have only category 0, except
streetlights (category 2). This census is scoped to base models; alternate and
damaged models may have different collision definitions.

Evidence: [real-model collision-category census](../analysis/flight-physics/player-collision-verification.json),
[damage-link selection](model-colours.md#destruction-confirmed-state-write-and-replacement-model),
and [player collision analysis](player-collision-and-damage.md). The census
checks categories and admitted responses; it is not an exhaustive native
missile trajectory test through every doorway.

## How the names were established

The mission record header contains a relative word at record +8. In each of the eight introduction records below, `record + 8 + word` locates the availability instruction(s). Opcode `30` dispatches through table entry `C4D5` to `C281`, where a packed argument constructs a bit range and XORs it into the availability mask at `C88C`.

| Mission resource / stored record | Availability bytes | Slots enabled from zero | Briefing identity |
| --- | --- | --- | --- |
| 04_000 / 0 | 30 10 | 0 | Pinner Direct |
| 04_000 / 4 | 30 20 | 1 | Pinner Mimic |
| 04_002 / 4 | 30 A0 | 9 | Brent Hunter |
| 04_003 / 5 | 30 90 | 8 | Pinner/Forbes Chargeable |
| 04_006 / 1 | 30 60 | 5 | Brent Ground |
| 04_007 / 0 | 30 30, 30 70 | 2, 6 | Brent Forbes Dual Launch |
| 04_009 / 7 | 30 51 | 3, 4 | Forbes Diffuser |
| 04_010 / 7 | 30 80 | 7 | Caero Weapon |

Original bytecode dispatch and mask mutation were executed for all nine instructions. The export includes source offsets, exact bytes and English briefing runs. These stored record numbers are not asserted to be the displayed mission numbers. This pass does not decompile the entire surrounding mission program.

## Shared firing and damage conventions

`C9C2–C9FB` checks selection, player flags, free projectile capacity and energy, then jumps to the definition's firing handler. Its flags convey trigger and insufficient-energy conditions. At the ordinary launch path, `CAC4` deducts energy and calculates a projectile deadline before spawning through `CB01`. Do not interpret the stored deadline seed as a firing interval.

`CA55` accepts object targets (negative runtime pointers, excluding FFFF); `CA5A` accepts map-cell targets. `CAC0` needs no target lock. These are distinct even where projectile geometry is shared.

Ordinary impact handler `CDB1` distinguishes object collisions, map/building collisions and other outcomes. Object hits obtain a strength byte from definition +8, then enter `CE26`, which compares it with the victim's own definition parameter and updates damage state. Building hits additionally inspect collision category, model links, target flags and mode. These strength values are **not final hit points** or a universal amount of health removed.

## Pinner Direct and Mimic

The Direct uses `CC64`, skipping the homing correction at `CC9C`. The Mimic's `CBCE` instead reads the **player's current pitch and roll** on each update: it copies player pitch into the projectile and feeds the roll difference into a steering helper. An isolated probe verifies those reads. This is continued player-linked steering, not ordinary enemy-seeking homing; the exact resulting trajectory still depends on shared movement code.

## Brent Hunter and Ground

Both use the shared homing path `CC61/CC9C`. The Hunter's `CA55` expects an object target; the Ground's `CA5A` expects a map target. Ground-target selection and building destruction impose further rules; accepting a map coordinate does not mean the missile can flatten any building. This matches the briefing's designated-object restriction and later warning that Brent Ground cannot destroy warehouses.

## Brent Forbes Dual Launch

1. The primary capsule (slot 2) launches through `CA4A`, which changes primary selection to **ID 7**, the follow-up unit.
2. `CA99` inspects the projectile-list **tail at 6FBA**, requires definition `1956` (slot 2), and temporarily substitutes that capsule as the follow-up's target. It resets primary selection to ID 3. This is not a search for an arbitrary nearby enemy.
3. `CBE7` measures separation from its linked capsule. At close proximity, the native path makes area-hit passes over three object lists through `6DB5`, using `CD13` for distance-dependent hit strength, then removes the paired objects through the effect/removal paths.

The second unit therefore homes on the first capsule to make the combined effect. Native probes verify the exact-definition check and temporary target substitution; the complete explosion/removal sequence has been traced statically, not executed as an entire scene.

Its approaching-unit sound is also dynamic: `CC54–CC60` changes the shared pitch word at `19CC` according to the computed separation term. This connects the previously unidentified mutable sound definition to the Dual Launch weapon.

## Forbes Diffuser: a timed, cell-specific combination

The shared firing handler `CA69` alternates secondary selection **5 ↔ 4**. Slot 4 is the gas capsule; slot 3 is the trigger. Invalid target/energy conditions can return selection to the gas stage.

On a suitable building collision, `CE84` requires collision category 3 and target-state bit `40`. A gas hit records:

- the packed building cell at `3DA3`;
- an expiry at `0C4A = current_clock + 2800h`.

A trigger must hit that **same cell**, with the same eligibility checks, when `(current_clock - expiry) mod 65536 >= F000h`. For a fresh gas hit this means elapsed time **6144–10239 timer ticks**, approximately **12.29–20.48 seconds** at the recovered timer rate. The native probes cover both boundaries. Success enters the building-destruction path at `67BF`; other cases take an effect path without that destruction.

The cell/deadline storage is shared, not per gas projectile. A later qualifying gas hit overwrites the previous recorded cell. This is a concrete implementation constraint behind the briefing's instruction to fire the trigger at the right moment. The verification uses synthetic map state and clock values; an in-game timed trial would still be useful.

## Chargeable: holding, release and strength lost in flight

`CA7D` maintains accumulated charge at the self-modifying word `CA80`. Charging and release are separate branches:

- Triggering starts the charge via the energy/trigger path.
- While held and below full charge, `CA09` transfers up to **64 × frame step** from reserve into charge, capped by available energy and saturating at FFFF.
- At full charge, it still drains reserve, but at **2 × frame step**: one thirty-second of the charging rate.
- On release, the stored charge is cleared and shifted right by four. With a valid object target, that becomes the projectile's remaining lifetime/deadline parameter. Maximum lifetime is **4095 ticks**, about **8.19 seconds**.

At object impact, `CF37` subtracts the current clock from that deadline. For a positive high byte it passes `remaining_ticks × 8` to damage handling; the strength byte is the high byte of that result. Consequently, the projectile loses strength as it travels. When 255 ticks or fewer remain, this branch returns without applying that object hit. A full-charge immediate hit would supply strength 127, but that is an input to the shared damage logic, not final health damage.

The appearance also changes: update `CC68` derives a roll-related animation term from the remaining parameter before shared homing/movement. Its exact visual effect has not been reproduced in this pass.

## Caero Weapon: beacon-powered impact, with a baseline

On an object collision, `CF21` invokes the same `8450` energy-tower source routine used by charging, using the impact coordinates/height. It multiplies the returned value by four and adds **45 to its high byte** before shared damage processing.

Native probes at a tower-centre fixture produce these strength inputs:

| Tower state | Strength parameter |
| --- | --- |
| 0 (off) | 45 |
| 128 | 147 |
| 255 (full) | 249 |

Thus beacon output materially affects impact strength, including intermediate tower states. It retains a baseline even with zero beacon contribution; the narrative warning that it is ineffective without beacon power is not an exact zero-damage rule. Distance and altitude feed the same source calculation as charging. Building collisions take a different branch into ordinary building-hit handling.

## Enemy resistance, damage and recovery

Ordinary enemy aircraft have an **effective armour threshold and recovering damage**,
not a fixed number of hit points subtracted directly by each weapon. This is the
shared `CE38–CE69` hit path and the `8AC0–8AD5` normal-update recovery path.
Buildings and special scripted objects such as the Wrecker use other rules; the
following tables must not be applied to them. The player's Caero damage display
and Skimma shields are also separate systems: see [player collision and damage](player-collision-and-damage.md#player-damage-and-the-invulnerability-cheat).

The victim's definition byte +8 supplies resistance **R**. Incoming impact
strength is **S**. The damage word at object +64 starts at zero; overflowing
65,535 triggers the fatal/falling callback `8DAA`. For an undamaged ordinary
victim the damage increment is:

| Strength relative to resistance | Damage increment |
| --- | --- |
| S ≤ R | 1 |
| R < S < 2R | `257 × floor((256 × (S − R) + R) / R) + 1` |
| S ≥ 2R | 65,536: an outright fatal hit |

All divisions here are integer divisions. Consequently, a weapon below or
exactly at the resistance threshold can show an impact effect while doing only
one unit of damage. Ordinary aircraft recover that unit before the next shot:
this is effectively immunity in normal play, rather than a strictly zero-damage
branch. The separate +56 impact/engagement accumulator also receives a hit
impulse; it is not another health pool.

On each normal aircraft update, `8AC6` reads definition byte +13 and subtracts
`frame_ticks << recovery_shift` from +64, clamped at zero. This same field was
labelled **cooldown** in early analysis and remains `actor.awareness.cooldown`
in the C++ representation, but it is also the **recovering damage accumulator**
written by the impact handler. Describing it solely as a firing cooldown hides
this important behaviour. Recovery is automatic; these enemies do not use the
player Skimma's switchable directional-shield system. Once a hit installs the
fatal callback, the ordinary recovery path no longer rescues the aircraft.

### Enemy values

The rates below use the recovered 500-tick-per-second game clock while the
normal aircraft callback is running. Recovery time means removing almost a full
65,536-unit accumulator; it is not a wait that can undo an already fatal hit.
Names follow the [scenario object identities](scenario-object-identities.md).

| Definition slot | Enemy | Resistance | Recovery shift | Damage recovered/second | Almost-full recovery time |
| --- | --- | ---: | ---: | ---: | ---: |
| 19 | Skimma Supa | 40 | 0 | 500 | 131.1 seconds |
| 20 | Oppressor | 45 | 1 | 1,000 | 65.5 seconds |
| 21 | Assassin | 75 | 2 | 2,000 | 32.8 seconds |
| 22 | Stalker | 60 | 1 | 1,000 | 65.5 seconds |
| 23 | Terrablitz (probable identification) | 78 | 1 | 1,000 | 65.5 seconds |

### Player weapon strength inputs

These numbers feed the resistance calculation; they are **not hit points removed**.
Special area and building handlers must be distinguished from ordinary impacts.

| Weapon / effect | Strength input | Qualification |
| --- | ---: | --- |
| Pinner Direct | 52 surface; 59 underground | World-profile patch changes the definition |
| Pinner Mimic | 56 | Ordinary impact |
| Dual Launch primary capsule | 50 | Ordinary direct impact |
| Dual Launch follow-up unit | 52 | Ordinary direct impact, separate from the paired detonation |
| Dual Launch paired explosion | Up to 152 | Distance-dependent area effect; maximum at its centre |
| Forbes Diffuser gas / trigger | 30 / 20 in definitions | Special timed building-destruction sequence, not ordinary aircraft damage |
| Brent Ground | 56 | Building eligibility and damage-state rules are separate |
| Brent Hunter | 59 | Ordinary impact |
| Caero Weapon | 45 without beacon contribution; up to 249 at maximum | Samples beacon power at impact; see the dedicated section above |
| Chargeable | Up to 127 | Full charge and negligible flight time; weakens during flight |
| Skimma primary gun | 50 | Ray-hit path supplies this constant |
| Skimma air missile 1 | 90 | Definition 10 |
| Skimma ground missile 2 | 80 | Definition 11; primarily a building-target weapon |
| Upgraded Skimma air missile 3 | 140 | Definition 12; exact manual name unconfirmed |

### Minimum hits to destroy an enemy

These are **calculated lower bounds from an undamaged enemy, ignoring recovery
between hits**: `ceil(65536 / damage_increment)`. They are not promises of the
number of shots required during flight. Misses, recovery, weaker charge/beacon
conditions and off-centre explosions can all increase the requirement.

| Weapon / effect | Strength | Supa | Oppressor | Assassin | Stalker | Terrablitz |
| --- | ---: | ---: | ---: | ---: | ---: | ---: |
| Pinner Direct, surface | 52 | 4 | 7 | — | — | — |
| Pinner Direct, underground | 59 | 3 | 4 | — | — | — |
| Pinner Mimic | 56 | 3 | 5 | — | — | — |
| Brent Hunter | 59 | 3 | 4 | — | — | — |
| Skimma primary gun | 50 | 4 | 9 | — | — | — |
| Skimma air missile 1 | 90 | 1 | 1 | 5 | 2 | 7 |
| Upgraded Skimma air missile 3 | 140 | 1 | 1 | 2 | 1 | 2 |
| Dual Launch, maximum paired explosion | 152 | 1 | 1 | 1 | 1 | 2 |
| Caero Weapon, maximum beacon power | 249 | 1 | 1 | 1 | 1 | 1 |
| Chargeable, maximum charge | 127 | 1 | 1 | 2 | 1 | 2 |

**—** means effectively ineffective: the one-unit increment would require
65,536 hits without recovery. Dual Launch entries count complete paired
explosions, without adding separate capsule/follow-up direct-impact damage.
Ground weapons and the Diffuser are omitted from this aircraft-target chart.

For example, Pinner Direct against a Supa adds 19,790 damage per hit, while
against an Assassin it adds only one. A maximum Dual Launch blast supplies
strength 152: enough to kill an Assassin outright (twice its resistance is
150), but just short of the Terrablitz's one-hit threshold of 156. The third
Skimma missile therefore makes a substantial difference against tougher craft.

### Evidence and limits

The reconstructed [impact routine](https://github.com/Lost-Engines/darker-cpp/blob/master/src/game/object_impact.cpp),
[recovery routine](https://github.com/Lost-Engines/darker-cpp/blob/master/src/game/actor_awareness.cpp) and
[original definition table](https://github.com/Lost-Engines/darker-cpp/blob/master/src/game/object_definitions.h) preserve
the integer calculations and parameters. Native instructions at `CE38–CE69`
and `8AC0–8AD5` independently establish that both paths touch object +64.
The [angular and impact investigation](flight-angular-and-impact.md) and
[C++ object-impact notes](https://github.com/Lost-Engines/darker-cpp/blob/master/docs/world_primitives.md#object-impacts-and-delayed-destruction)
describe the native arithmetic checks. These charts combine those verified
routines; they are not a new end-to-end retail combat trace. Special object
callbacks, pre-damaged objects and scripted removal remain outside their scope.

## Scope and reproduction

The original manual's weapon-selection section intentionally leaves later weapons blank, so its omissions do not prevent recovery from mission scripts. The Skimma manual describes a standard Supa Rapid Crack-Shot and ATA/ATG upgrades, but exact names for executable slots 10–12 and enemy projectile variants are not promoted to confirmed mappings here.

```
PYTHONPATH=/tmp/darker-python python3 tools/inspect_weapons.py
python3 tools/export_gameplay_data.py
PYTHONPATH=/tmp/darker-python python3 tools/verify_gameplay_data.py
```

[Weapon verification](../analysis/gameplay/weapon-verification.json) contains nine native introduction-dispatch checks and 45 behaviour probes. [Handler disassembly](../analysis/gameplay/weapon-handlers.asm) preserves the traced code. Tests use synthetic state and stop before rendering, spawning or destructive world updates; complete combat simulation remains future work.

## Enemy scripts attacking city buildings

The Delphi script inventory contains explicit attack-enabled cell targets
(`00h`) in missions that enable building attacks with `32h`. Besides the
[radio-mast attacks](small-beacon-radar.md#explicit-scripted-radio-mast-attacks),
the following sequences target other city objects. Counts below describe
unique authored target cells, not guaranteed destroyed buildings.

| Level | Attackers assigned to the sequences | Target area and actual map objects |
| --- | --- | --- |
| 20 | Two definition-23 Terrablitz | Teale-area housing: 23 cells, comprising 16 houses (types 30–33) and seven streetlights (type 11) |
| 27 | Oppressors | Bridfirth Power Site: 18 generator/component cells, types 83–85 |
| 32 | Oppressors | Another attack on the same 18 Bridfirth cells |
| 43 | Oppressors | Sperwent Power Site: 14 component cells, types 83–85 |
| 60 | Terrablitz and Oppressors | The same 14 Sperwent cells |
| 62 | One Terrablitz, object 11 | Five type-11 streetlights at `(58,77)`, `(58,79)`, `(58,81)`, `(58,83)`, `(58,85)` |
| 83 | Terrablitz, objects 21–23 | Gesic Power Site: 12 component cells, types 83–85 |
| 84 | Four Terrablitz | Four type-76 warehouse roofs at Wilston Depot: `(26,102)`, `(29,102)`, `(32,102)`, `(35,102)` |

The mission-20 briefing calls the attackers Skimmas, but the two scripted
building-attack sequences belong to definition-23 objects. This distinction
comes from the object records rather than interpreting the briefing literally.
Mission 62's targets are likewise literal streetlight cells in the extracted
map; whether these were intended as broader aiming points for the bombing run
is not established.

### Terrablitz projectiles and streetlight hits

The mission-20 attackers use **special object / definition 14** for ground
attacks. The dedicated bomb-drop routine at `8BE6` loads definition pointer
`1A76` (slot 14) and forces the new projectile's pitch to `C800`. The ordinary
firing selector at `8AFD` also selects slot 14 for this craft's building targets:
its projectile selector is 13, with one added for ground attacks. **Special
object 13 is the air-target projectile**, not the dropped bomb. In bank 30
these are distinct model records at pool offsets `C819` and `C91A` respectively.

An intact type-11 streetlight accepts a direct bomb hit without a target-unlock
bit. Its collision stream at `8080` defines an extremely narrow column:
horizontal offsets −4 through +3 around the cell centre, within a 256-unit
tile. The projectile collision expansion of two units broadens that to offsets
−6 through +5 on each horizontal axis. A nearby terrain explosion therefore
does not establish a hit on the streetlight.

A controlled comparison used 289 vertical sweeps (a 17×17 grid of offsets,
from altitude 1,000 down to zero) through an isolated real streetlight. Native
`6527` collision results and `CDB9` damage decisions agreed with the C++ sweep
and damage admission in all cases: the central 12×12 paths destroyed the
streetlight; the other 145 struck terrain without destroying it. Native visual
effect spawning was intercepted after the state write. These supplied paths
check collision and damage, not bomb flight, aiming, or a particular observed
mission-20 bombing run.

### Reading the attack markers

`01h` cell orders set flag 02 and suppress building attacks, whereas `00h`
clears it. Thus not every scripted route through a building is an attack.
Actual damage still requires a projectile to hit eligible collision geometry;
its outcome depends on interception, aiming and the runtime scene. Enemy ground
weapons do not require the player's permitted-ground-target state bit.

The [scenario browser](../analysis/missions/index.html) marks these targets,
including radio masts, with **rose diamonds**. The **Enemy ground attacks**
checkbox controls their visibility. Click a diamond or use the target dropdown
for the base-model preview, assigned aircraft and resource offsets of their
attack orders. Aircraft buttons select the existing object inspector. Reserve
attackers are explicitly labelled as requiring activation.

The marker inventory follows each aircraft's decoded script through relative
jumps, stops and loops, and groups reachable `00h` orders by target cell. It is
limited to the audited Delphi aircraft sequences in missions with a nonzero
building-attack command; it does not claim to simulate attack timing, successful
hits, incidental damage or every possible default cell target. Underground
Wrecker demolition remains in the existing vehicle-route event overlay.
