ModularBot — Modular multi-gun bot with pluggable harnesses #165

Open
opened 2026-09-19 14:38:56 +02:00 by SirStone · 0 comments
Owner

Destination

A battle-ready Robocode Tank Royale bot (Nim) with a pluggable architecture: gun harness, movement harness, and radar harness — each loading interchangeable modules. First version ships with 4 guns (head-on, linear, circular, Tsetlin Machine), 1 movement module (oscillator), and 1 radar module (radar_lock). Virtual bullet fitness tracking selects the best gun automatically.

Notes

  • Domain: Robocode Tank Royale, Nim language
  • All modules live in common_libs/, bot in ModularBot_garage/
  • Existing shared lib: common_libs/radar_lock
  • Skills: consult ponytail (laziest working solution), domain-modeling (CONTEXT.md)

Decisions so far

  • [D1] Gun output: predict(worldState, bulletSpeed) → (x, y) absolute world coordinates. Gun is a black box.
  • [D2] Gun feedback: onResult(tick, predicted, actual, bulletPower) callback from harness. Guns manage own eligibility traces internally, keyed by tick.
  • [D3] Fitness tracking: rolling window (tunable size), per-gun × per-power (3-5 bins).
  • [D4] Gun selection: every tick when gun turn remaining ≈ 0, pick best fitness gun, commit to turning.
  • [D5] Firing: when gun turn done + heat 0 → fire at prediction power.
  • [D6] Initial guns: head-on, linear, circular, Tsetlin Machine.
  • [D7] Movement harness: same plug pattern as gun harness, oscillator first, no fitness selector yet.
  • [D8] Radar harness: same plug pattern, radar_lock first, no selector yet.
  • [D9] Mode detection: 1v1 vs melee from game type / enemy count → swap module racks.
  • [D10] Module location: common_libs/.
  • [D11] Registration: static at compile time.
  • [D12] WorldState: all available data per tick, guns manage own history internally.
  • [D13] TM persistence: future scope — cross-battle learning.
  • [D14] Garage: new ModularBot_garage/, Nim.
  • [D15] Bot name: ModularBot (working name).
  • [D16] Power selection: harness picks highest power with acceptable hit rate for selected gun.
  • [D17] Virtual bullet ownership: harness owns all virtual tracking, guns never spawn their own bullets.
  • [D18] History buffers: each gun/movement module maintains its own if needed.
  • [D19] 1v1 vs melee: both supported, mode detected at runtime, different racks loaded per mode.
  • [D20] Movement fitness selector: deferred — build the plug, skip the selector until 2+ modules exist.
  • Old tickets #166–#178 superseded by vertical-slice tickets: #179 (Gun harness + head-on + skeleton), #180 (Linear gun), #181 (Circular gun), #182 (Movement harness + oscillator), #183 (Radar harness + radar_lock), #184 (TM gun), #185 (Battle test)

Not yet specified

  • Melee gun/movement strategies: what modules to build for melee mode, how multi-enemy tracking works per-gun
  • Firing economy module: smart power selection beyond "highest that hits" — energy management, risk assessment
  • TM persistence: serialization format, when to save/load, how to handle different enemy types
  • Movement fitness: what signal measures movement quality (damage taken? survival time?) — deferred until 2+ movement modules
  • Advanced radar strategies: for melee (scanning priority, multi-target interleaving)
  • Gun confidence weighting: should guns output confidence alongside (x, y)? Could weight fitness by self-reported confidence

Out of scope

(none yet)

## Destination A battle-ready Robocode Tank Royale bot (Nim) with a pluggable architecture: gun harness, movement harness, and radar harness — each loading interchangeable modules. First version ships with 4 guns (head-on, linear, circular, Tsetlin Machine), 1 movement module (oscillator), and 1 radar module (radar_lock). Virtual bullet fitness tracking selects the best gun automatically. ## Notes - Domain: Robocode Tank Royale, Nim language - All modules live in `common_libs/`, bot in `ModularBot_garage/` - Existing shared lib: `common_libs/radar_lock` - Skills: consult ponytail (laziest working solution), domain-modeling (CONTEXT.md) ## Decisions so far - [D1] Gun output: `predict(worldState, bulletSpeed) → (x, y)` absolute world coordinates. Gun is a black box. - [D2] Gun feedback: `onResult(tick, predicted, actual, bulletPower)` callback from harness. Guns manage own eligibility traces internally, keyed by tick. - [D3] Fitness tracking: rolling window (tunable size), per-gun × per-power (3-5 bins). - [D4] Gun selection: every tick when gun turn remaining ≈ 0, pick best fitness gun, commit to turning. - [D5] Firing: when gun turn done + heat 0 → fire at prediction power. - [D6] Initial guns: head-on, linear, circular, Tsetlin Machine. - [D7] Movement harness: same plug pattern as gun harness, oscillator first, no fitness selector yet. - [D8] Radar harness: same plug pattern, radar_lock first, no selector yet. - [D9] Mode detection: 1v1 vs melee from game type / enemy count → swap module racks. - [D10] Module location: `common_libs/`. - [D11] Registration: static at compile time. - [D12] WorldState: all available data per tick, guns manage own history internally. - [D13] TM persistence: future scope — cross-battle learning. - [D14] Garage: new `ModularBot_garage/`, Nim. - [D15] Bot name: ModularBot (working name). - [D16] Power selection: harness picks highest power with acceptable hit rate for selected gun. - [D17] Virtual bullet ownership: harness owns all virtual tracking, guns never spawn their own bullets. - [D18] History buffers: each gun/movement module maintains its own if needed. - [D19] 1v1 vs melee: both supported, mode detected at runtime, different racks loaded per mode. - [D20] Movement fitness selector: deferred — build the plug, skip the selector until 2+ modules exist. - Old tickets #166–#178 superseded by vertical-slice tickets: #179 (Gun harness + head-on + skeleton), #180 (Linear gun), #181 (Circular gun), #182 (Movement harness + oscillator), #183 (Radar harness + radar_lock), #184 (TM gun), #185 (Battle test) ## Not yet specified - **Melee gun/movement strategies**: what modules to build for melee mode, how multi-enemy tracking works per-gun - **Firing economy module**: smart power selection beyond "highest that hits" — energy management, risk assessment - **TM persistence**: serialization format, when to save/load, how to handle different enemy types - **Movement fitness**: what signal measures movement quality (damage taken? survival time?) — deferred until 2+ movement modules - **Advanced radar strategies**: for melee (scanning priority, multi-target interleaving) - **Gun confidence weighting**: should guns output confidence alongside (x, y)? Could weight fitness by self-reported confidence ## Out of scope (none yet)
SirStone added the wayfinder:map label 2026-09-19 14:38:56 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: SirStone/SirRoboGarage#165