Weapons, collisions and enemy behaviour
Gameplay overview · All tuning tables and handler addresses. Numbers and addresses below refer to the normal 3.42 flight engine. Quality means 1–8, although its stored index is 0–7.
Damage and collision rules
Common scenery/enemy damage is handled at b6c8; similar inline helpers serve
orbs, radar and fuel. An attacking object's live flags select damage:
| Attacker flags | Damage to common hit points |
|---|---|
Neither 40h nor 80h |
1 |
40h |
6 |
80h, including both bits |
25 |
A player-aircraft collision sentinel (DI=ffff) destroys a common target outright.
Individual types can reject an attack before reaching this helper. Player aircraft
use the separate randomized damage channels described in flight dynamics.
For player contact, 7b8c selects 1, 6 or 75 damage events according to the
contacting object's flags. Forcefields rate-limit their repeated damage using the
fast clock, then double the selected count. Consequently, scenery hit points and
hits accumulated by the player are not interchangeable units.
Stored template health includes:
| Object | Hit points |
|---|---|
| Generator orb | 65 |
| Fuel dump / Tet | 13 |
| KLA site / vehicle site | 50 |
| AAA site | 6 |
| Ground vehicle | 5 |
| KLA | 2 |
| Saucer / objective saucer | 50 |
| Saucer site | 100 |
| Mortar | 40 |
| Alien | 3 |
| Mindbender | 1, with weapon restrictions |
| Ground crew | 1 |
| Radar / tower | 10 |
These are initial templates, not promises that a mission cannot alter state or a handler cannot restore health. A quality-5 orb, for example, restores its health and rejects normal weapon damage.
There are several collision paths. The strict axis-aligned box routine at
7586 requires overlap on X, Y and Z; touching exactly at the sum of half-extents
is not enough. Zero X extent disables that test. Native probes cover all axes,
both signs, large signed coordinates and 16-bit carries. Some general contacts
instead use centre distance, and fast bullets/missiles have additional
velocity/dot-product checks (7742 onwards). The subsequent
native reconstruction checks 512 fast and 512 ordinary
projectile contacts against the original routines; this report retains the
higher-level description of the separate paths.
A byte at object +13h is also compared before object-object collision. Equal
collision-group tags are skipped in the relevant paths. Templates distinguish
player shots, friendly objects, hostile objects and installations; launch/effect
code can change the tag. This is not a modern universal allegiance system: blast
fragments, direct projectiles, the person and the aircraft take different paths.
The supplied manual's friendly-fire tactics cannot be reduced to “all projectiles
collide with all other projectiles.”
Player weapons
| Weapon | Native launch/update | Behaviour |
|---|---|---|
| Guns | 08e8; bullets bdef |
Separate 32-record pool; forward launch velocity and alternating muzzle offset; ordinary damage class 1 |
| Shift cannon mode | 4430–4456 |
Changes projectile speed from 4400 to 700 and lifetime from 96 to 48; this is a real projectile-mode difference |
| Missile | b0a9; update ae28 |
Type 21, six-hit flags, 100-frame initial lifetime; accelerates along its existing velocity, not a guided enemy KLA |
| Air-dropped bomb | afeb; update a92b |
Type 20, inherits scaled aircraft motion; decelerates and falls; proximity-armed after clearing the player |
| Pistol | 08e8 on-foot branch |
Uses gun machinery from the person's viewpoint; finite 20-round supply |
| Assassin bomb | 4704–474c; shared type-20 update |
One carried charge; planted stationary, marked special; D arms/releases it |
The missile acceleration multiplies each velocity component by 1000/890, while its remaining lifetime is at least 89 and speed is not above 3000. It therefore accelerates only during the early portion of its flight. It does not search for a target. Native initial velocity uses the aircraft's forward airflow plus 125; this is why the fast black aircraft can initially overtake its own missiles.
Gun launch velocity likewise uses forward airflow plus the selected gun speed. The cannon-mode numbers are raw launch/lifetime coefficients, not a claim that holding Shift changes the common target-damage flag. A complete reconstruction should retain the original separate bullet allocation and collision handling.
Guns and missiles are replenishing weapons, with firing/recovery counters rather than a finite ammunition inventory. Continued firing increases counters; recovery reduces them. Timing includes BIOS-rate interrupt counters and frame processing, so a single “shots per second” number would conceal the original cadence.
Bomb supply is capped at three (4658). Each successful drop consumes one and
restarts the replacement timer. The timer is adjusted for accelerated time; its
threshold comes from DS:0e4f. Aircraft entry resets the available supply to three.
The source's full initial values remain available alongside the code rather than
inventing a timing constant from a rendered recording.
Bomb detonation creates 15 incendiary fragments; one alternate bomb flag cuts that to five. When sufficiently near the ground (Z high word zero and low word at most 10000 cm), the object becomes a type-32 crater at Z=10. Ordinary craters cool through a timer; special ones remain hot. Fragments, blast effects and the crater can harm nearby objects after the initial impact. A bomb is not one radial health subtraction.
The planted bomb does not explode immediately when D is pressed: the native code arms it, clears its planted-state bit, enlarges its collision extent and resumes motion. This confirms the manual's description of the charge dropping into a target. It also explains its warning that a nearby forcefield can intercept the charge before the intended victim does.
The explosion model is a white/yellow/red sequence, with diameters 2500, 4000 and 6000, selected from its five-frame lifetime. The damaging flags of a spawned explosion depend on its cause; visually similar explosions are not necessarily equally dangerous.
KLA deathballs and their launchers
Handler abd2 uses the twelve-word quality table at DS:ec6d.
The deathball aims directly at the current target vector, not a projected intercept.
Angular error is reduced gradually, with separate turn-rate limits. Small enough
error enables the lock colour flash and changes its target speed. A shared speed
helper relaxes current speed toward a target and adds bounded random variation.
The highest-quality rows can turn faster, accelerate to different speeds and spin
at different rates.
Selected table values, in raw engine units:
| Quality | Heading/pitch limits | Normal target speed | Locked target speed | Lock-error threshold |
|---|---|---|---|---|
| 1 | 50 / 50 | 550 | 800 | 1500 |
| 2 | 50 / 50 | 800 | 1100 | 1000 |
| 3 | 70 / 70 | 650 | 800 | 1000 |
| 4 | 90 / 90 | 650 | 800 | 500 |
| 5 | 90 / 90 | 750 | 900 | 500 |
| 6 | 100 / 100 | 800 | 1200 | 500 |
| 7 | 120 / 120 | 750 | 1000 | 200 |
| 8 | 150 / 150 | 825 | 1200 | 500 |
A new KLA has a launch delay before full steering. It can stop/expire when target resolution fails; it also avoids continuing downward near the ground. The warning sound uses distance and quality-dependent state, matching the manual's description of different warning pitches.
The KLA-site handler b6f6 checks its countdown and a local count limit before
spawning. Site quality passes through to the launched deathball. The reset value
is 400 for every quality in this table. Surviving a hit resets the launch timer,
so gunfire can suppress a launcher before destroying it. The timer is not a
wall-clock duration independent of rendering.
AAA
Handler a64c uses six-word rows at DS:ed61. It calculates bearing/elevation,
limits tracking speed, and may add a velocity-based lead to the target vector.
A ground-mounted battery enforces a minimum upward firing angle rather than firing
freely through neighbouring installations.
| Quality | Fire threshold | Shell jitter | Turn limits | Leads target? |
|---|---|---|---|---|
| 1 | 500 | 100 | 30 / 30 | No |
| 2 | 1000 | 50 | 50 / 50 | No |
| 3 | 1000 | 50 | 50 / 50 | No |
| 4 | 1500 | 30 | 50 / 50 | Yes |
| 5 | 1500 | 30 | 50 / 50 | Yes |
| 6 | 2000 | 30 | 70 / 70 | Yes |
| 7 | 3000 | 10 | 120 / 120 | Yes |
| 8 | 4000 | 10 | 500 / 500 | Yes |
The firing threshold is compared against a full 16-bit random result per update. Tracking is time-scaled, but this firing draw is not simply a fixed-rate timer. “Shell jitter” is passed into the shell's motion state; it is not necessarily identical to a one-off launch-cone error.
The Other Worlds manual says the lower four qualities do not lead. The supplied normal 3.42 table enables lead at quality 4. This is a concrete discrepancy, not an assumption that the manual's indexing is authoritative.
Shell handler a8a0 detonates on contact, at the end of its timer and probabilistically
near the player's altitude. It creates a blast and fragments, then clears the
shell. Its collision extent expands to 6000. This is why near misses matter and
why gunfire can protect the aircraft by triggering shells farther away.
Ground vehicles and sites
Handler b2cc is shared by hostile vehicles and the rescue van, with type/tag
checks distinguishing the latter. The nine-word quality table at DS:ee8d sets
body/panel colours, near/far speed, pursuit probability, direction-change frequency
and weaving. Motion alternates between random headings and pursuit. It is not a
route-following road vehicle AI.
When pursuing a person, the vehicle starts pulling the viewpoint toward it at range 256, stops close at 100, and uses 32 for the rescue handoff. These distances use the native range helper's 1/64 position scale, so they represent approximately 163.84 m, 64 m and 20.48 m, respectively—not centimetres. Hostile vehicles can capture; the rescue van marks a safe rescue and ends the sortie.
Special vehicles accept player gun, missile and explosion types in the explicit
collision filter (b306), rejecting several other kinds of collision. Destroyed
vehicles enter a temporary wreck state rather than simply disappearing. Vehicle
sites have a local live-vehicle cap of at least four, or their local site count
if larger. Surviving a hit resets the launch timer to three times the base reset.
Saucers and sites
Handler c102 uses fourteen-word rows at DS:efe7. A saucer maintains a nominal
altitude near 196608 cm, damps vertical velocity, and adds quality-dependent
vertical/horizontal oscillation. Its low state bits select four behaviours:
| Stored state | Handler | Horizontal change |
|---|---|---|
| 0 | c0d6 |
Retreat: subtract normalized base-minus-object vector |
| 2 | c0b8 |
Move sideways using a perpendicular vector |
| 4 | c086 |
Approach using twice that vector |
| 6 | c0f2 |
Coast; no direct horizontal addition in this state routine |
The reference vector is calculated against DS:02a9, the current base/target
location used by this logic (c531), rather than assuming every saucer is a dogfighter
homing on the player's nose. A probabilistic transition advances through these
states in order and wraps. Exit probabilities differ by quality; approach also
changes when damaged or near the reference. Native probes confirm the four vector
operations and transition coefficients.
At close horizontal range the saucer can drop bombs; farther away it may launch KLAs subject to quality/count limits. A separate high byte in the weapons word allows onboard AAA: qualities 2, 4, 6 and 8 enable this path in the extracted table. It reuses the AAA handler through a temporary object, limiting the selected AAA quality to index 5 (display quality 6). The saucer is a combination of movement, bombing, missile and gun systems, not one generic shooting timer.
A fatally hit saucer clears its live collision bit, receives random angular increments and falls with gravity/drag; reaching low altitude produces debris. An objective saucer also marks its objective complete. Other objective-saucer states can repair/reset it according to its flags/timer. Saucer sites regenerate craft when the local site/craft census permits and a random launch check succeeds.
Passive hazards, aliens and special targets
| Type | Recovered behaviour |
|---|---|
| Solid forcefields | Collision wakes their visible geometry; timer hides it again; generator census can remove them (b9bf) |
| Wire/step fields | Remain visible and animate; generator census can remove them (ba05) |
| Balloons | Vertical motion, altitude-dependent reversal and quality-dependent random reversal; ignore ordinary collision destruction (b88a) |
| Bee swarms | Randomized orientation, then shared balloon movement (b875) |
| Mortar | Distance-limited periodic creation of explosive fragments (b91c) |
| Mindbender | Distorts nearby aircraft view; accepts bombs/craters only; special flag additionally requires planted-bomb lineage (c5df) |
| Tet | A separate destructible installation counted with fuel by one orb objective (c673) |
| Alien | Randomized hopping/motion; can capture a person; bullet-only destruction gate (c6cc) |
| Shell | Destruction spawns a quality-selected vehicle site, mortar, KLA site, AAA, balloon, swarm or fuel dump (bea1) |
| Crew/spy | Proximity gesture; black spy completes an objective on approach; ordinary crew can be shot (8cfd) |
Mindbender weapon filtering has been executed for every combination of ordinary / special target, planted flag, and six attacking object types. A bomb-like visual or large damage amount alone does not bypass the filter.
The mindbender's distortion range test is 1000 native range units, approximately
640 m. Its distortion magnitude is quadratic in proximity. Special generator orbs
also attract the aircraft: the attraction is calculated from the relative vector
and an inverse squared-range term with a lower bound (bbe1). Neither is just a
palette animation.
A generator orb powers the local fields through the per-frame census. A field notices that generators existed previously but none remain, then clears itself. This is local active-world logic; there is no individually stored electrical wire link from every field to one specific orb.