# Proactive ramming: a negative result (do not re-attempt straight-line pursuit) **Question.** The bot declined visible ram opportunities ("it could jump over the enemy and shred it"). The proactive `opportunity` gate was relaxed to fire from a closable range (`dist < 200`, energy lead `> 15`, was `dist < 50`). Did it convert? **No** — a log-replay diagnosis (no new battles), 49 rounds/arm: it fires, never reaches contact. ## The five measurements | # | Diagnostic | Result | |---|---|---| | 1 | **opportunity -> contact** | **0/6** (base), **0/40** (ring), **0/12** (ringhot), **0/1** (nopower) | | 2 | **abort reasons** | `triggerGone` **94/108 (87%)**, `duration` 14, `stuck` **0**, `bulletRain` **0** | | 3 | **closest approach in an opportunity episode** | never below ~80 px; base closest **median 126 px** | | 4 | **ticks spent during ram** | `<40: 10, 40-80: 16, 80-120: 60, 120-200: 165, >=200: 85` | | 5 | **A/B, `oldram` vs `base`** | p=**0.69**, damage **279 vs 284**, survival **17/49 vs 16/49** (p=1.0) | The only proactive conversion in the corpus came from a **finisher** (enemy at 16 -> 1 energy), not an opportunity. Two smoking guns: a base episode ran the FULL 60-tick `duration` cap and closed only **198 -> 171 px**; a perfectly aligned (`delta ~= 0 deg`), full-speed-8 episode closed **195 -> 114 px** then PLATEAUED. ## Why it cannot work (the geometric reason) Both bots have `MAX_SPEED = 8`. A straight-line pursuit can **never** catch an evading equal-speed opponent: every turn spent turning is a turn the evader pulls away, and any juke re-opens the gap. Closing requires **interception** (cutting off the escape path) or **cornering**, not chasing. That is a *movement* problem, and it is disproportionate to **0.6 damage per contact** (one-shot; NOT 0.6/turn). Corroboration: cornering was independently refuted (wall-adjacent enemies are *less* predictable; closest approach to DrussGT in 15 rounds was 118.7 px). Both routes to point-blank have now failed for the same underlying reason. ## The one exception: the finisher The finisher (`enemy < 20 energy`, `dist < 300`, we are healthier) DOES convert, because a **<20-energy DrussGT stops fleeing**: that episode closed at 6-8 px/tick and reached contact. It is kept and is now the **default** gate. The rare `desperation` case (both < 5 energy, `dist < 150`) is kept as a cheap last-ditch play. `opportunity` and `plan` are OFF by default. **Re-enable for re-testing:** `TR_RAM_OPPORTUNITY=1` (with `TR_RAM_OPP_DIST`, `TR_RAM_OPP_MARGIN`) restores the proactive gate; `TR_RAM_PLAN=1` restores the change-of-plan trigger. Verified live: the same ModularBot-vs-RamFire battle logs **0 opportunity ON** by default and **4 opportunity ON** with `TR_RAM_OPPORTUNITY=1`. ## The two dead code paths, dealt with 1. **`bulletRain` abort — units fixed.** `onHitByBullet` accumulated bullet **firepower**, while `TR_RAM_ABORT_DMG = 0.5`/turn implied a *damage* rate. The server's damage is `calcBulletDamage(p) = 4p` (plus `2*(p-1)` above 1), so the abort was ~4x too insensitive and never fired (max observed `dmgRate` 0.27 in all 108 OFF lines). It now accumulates **real energy** via `bulletDamage()` and the threshold is `TR_RAM_ABORT_DMG = 2.0` **energy/turn** over 15 turns (~30 HP) — the same effective bar for normal firepower, now in correct units. The live run reports `dmgRate=1.07/turn` (was 0.27) and does not abort the finisher. 2. **`ramStuckTicks` — removed.** It required `dist < 5 px` on consecutive ticks, but two 18 px radii make contact occur at ~36 px and collision resolution rewinds positions — so the closest approach is ~36 px and the counter could never increment (diagnostic: `stuck 0`). Removed rather than documented as protection it cannot provide; the 60-tick `duration` cap is the only self-abort. ## Do not re-attempt a proactive straight-line ram Do **not** re-relax the opportunity gate, add "get closer" logic to satisfy it, or add a new chase trigger. Any future attempt at forcing point-blank must be an **interception/cornering** movement problem (predict the escape path and occupy it), and must clear the same `opportunity -> contact` bar above. Proactive ramming is worth at most 0.6 damage per contact and measured **zero** outcome change.