Decoy drop and decoy hit events #36

Closed
opened 2026-10-20 18:41:26 +00:00 by mintopia · 4 comments
Owner

Decoy_Drop mod: a fake pickup is dropped on the track; racers driving into it take a decoy hit (strings: PickupPositionDecoy, DiscardDecoyPickup, ScoringEvent_Decoy, PlayersHitwithDecoys).

Spike

Hook 0x535770 logging all channels while a racer with Decoy_Drop (LAN scenario) discards pickups and others hit the decoys. Record the events/fields in an ADR.

Acceptance

  • decoy_drop {racer, powerup, serial} and decoy_hit {victim, attacker, powerup, serial} (separate from hit).
  • totals gain decoys_dropped, decoy_hits_dealt, decoy_hits_taken.
  • Verified on 2-instance LAN.

Rules

  • Wire format: ADR 0019 (docs/decisions/0019-feed-message-contract.md). Repo data/tools: ADR 0020.
  • Fix and verify on BLUR_ENGINE=recomp only.
  • Update docs/state-websocket.md and examples/live-timing for any feed change.
  • Test races: use the scripts/ scenarios (windowed, low settings) once #33 exists.
`Decoy_Drop` mod: a fake pickup is dropped on the track; racers driving into it take a decoy hit (strings: `PickupPositionDecoy`, `DiscardDecoyPickup`, `ScoringEvent_Decoy`, `PlayersHitwithDecoys`). ## Spike Hook `0x535770` logging all channels while a racer with `Decoy_Drop` (LAN scenario) discards pickups and others hit the decoys. Record the events/fields in an ADR. ## Acceptance - `decoy_drop` `{racer, powerup, serial}` and `decoy_hit` `{victim, attacker, powerup, serial}` (separate from `hit`). - `totals` gain `decoys_dropped`, `decoy_hits_dealt`, `decoy_hits_taken`. - Verified on 2-instance LAN. ## Rules - Wire format: ADR 0019 (`docs/decisions/0019-feed-message-contract.md`). Repo data/tools: ADR 0020. - Fix and verify on `BLUR_ENGINE=recomp` only. - Update `docs/state-websocket.md` and `examples/live-timing` for any feed change. - Test races: use the `scripts/` scenarios (windowed, low settings) once #33 exists.
Author
Owner

Research findings (static: Blur.exe strings + current src), 2026-10-20.

  • Decoy is the MP mod Decoy_Drop, not a powerup kind: the kind enum stays 0..7. Each pickup kind has a decoy model (models\perks\pickups\<kind>pickupdecoy.model, ...decoyhit.model, incl. xp/shieldsuper), so powerup on decoy events is the disguised kind.
  • Strings: PickupPositionDecoy, StartDecoyActionIn, DiscardDecoyPickup/...ActionIn, HitVehicleSpecialFXDecoy, tweaks Multiplayer.Upgrades.DecoyDrop.{DroppedDecoysTimer,Bob*,Rotation*,FlipGraphic*}, scoring ScoringEvent_Decoy, SCR_NEW_AMAX_SCORING_DECOY_HIT, DecoyHitScore, award stat PlayersHitwithDecoys.
  • Inferred from names only: discarding a held pickup drops a fake copy, which despawns after DroppedDecoysTimer, and a decoy hit scores for the dropper.
  • No channel-9 event is mapped to decoys yet (ADR 0016/0017). The spike as written stands. ScoringEvent_Decoy / PlayersHitwithDecoys are alternative hook points if channel 9 shows nothing.
  • Test data: "Hamilton" in examples/live-timing/sample-race.jsonl has Decoy_Drop.
Research findings (static: Blur.exe strings + current src), 2026-10-20. - Decoy is the MP mod `Decoy_Drop`, not a powerup kind: the kind enum stays 0..7. Each pickup kind has a decoy model (`models\perks\pickups\<kind>pickupdecoy.model`, `...decoyhit.model`, incl. xp/shieldsuper), so `powerup` on decoy events is the disguised kind. - Strings: `PickupPositionDecoy`, `StartDecoyActionIn`, `DiscardDecoyPickup`/`...ActionIn`, `HitVehicleSpecialFXDecoy`, tweaks `Multiplayer.Upgrades.DecoyDrop.{DroppedDecoysTimer,Bob*,Rotation*,FlipGraphic*}`, scoring `ScoringEvent_Decoy`, `SCR_NEW_AMAX_SCORING_DECOY_HIT`, `DecoyHitScore`, award stat `PlayersHitwithDecoys`. - Inferred from names only: discarding a held pickup drops a fake copy, which despawns after `DroppedDecoysTimer`, and a decoy hit scores for the dropper. - No channel-9 event is mapped to decoys yet (ADR 0016/0017). The spike as written stands. `ScoringEvent_Decoy` / `PlayersHitwithDecoys` are alternative hook points if channel 9 shows nothing. - Test data: "Hamilton" in `examples/live-timing/sample-race.jsonl` has `Decoy_Drop`.
Author
Owner

Task 32 spike progress (no code committed). Built blurhost in a worktree and regenerated recomp with the current HOOKS (the shared work/recomp/m3/gen is stale: it predates the 0x535770 hook, so any worktree build using it gets no hit/use events; regenerate with emit.py+shard.py into a private dir and pass -DRECOMP_GEN_DIR). Logged every 0x535770 call (channel/event/payload) on 2-instance LAN with Decoy_Drop on both. Tried bot presses A, B, X (0.5s hold), then cycling LB/RB/X/B/A/Back/Start across a full race: no new channel-9 event ids appeared (only the known 0,2,10,11,12,14 and hit 4), and no decoy-like events on other channels, so decoy drop/hit is not on channel 9 and the discard binding was never found. Blocked: need the controller/keyboard binding that discards a held pickup (CMN_OPT_CNT_DISCARD_PERK), or a decision to hook ScoringEvent_Decoy / PlayersHitwithDecoys instead. Spike patch (event logger + BLUR_BOT_CYCLE/PULSE bot env) saved at /tmp/t32-spike.diff.

Task 32 spike progress (no code committed). Built blurhost in a worktree and regenerated recomp with the current HOOKS (the shared work/recomp/m3/gen is stale: it predates the 0x535770 hook, so any worktree build using it gets no hit/use events; regenerate with emit.py+shard.py into a private dir and pass -DRECOMP_GEN_DIR). Logged every 0x535770 call (channel/event/payload) on 2-instance LAN with Decoy_Drop on both. Tried bot presses A, B, X (0.5s hold), then cycling LB/RB/X/B/A/Back/Start across a full race: no new channel-9 event ids appeared (only the known 0,2,10,11,12,14 and hit 4), and no decoy-like events on other channels, so decoy drop/hit is not on channel 9 and the discard binding was never found. Blocked: need the controller/keyboard binding that discards a held pickup (CMN_OPT_CNT_DISCARD_PERK), or a decision to hook ScoringEvent_Decoy / PlayersHitwithDecoys instead. Spike patch (event logger + BLUR_BOT_CYCLE/PULSE bot env) saved at /tmp/t32-spike.diff.
mintopia removed their assignment 2026-10-21 12:50:11 +00:00
Author
Owner

Done (commit 0d0d401, ADR 0026). Discard binding is Y (pad 0x8000); first spike never pressed it as discard. Findings: decoy hit = ch9 event 4 with +0x20 == 4 (real hits 0/2), no game event for a drop. New feed: decoy_hit {victim,attacker,powerup,serial} (instead of hit), decoy_drop {racer,powerup,serial} (inferred from held-queue removal with no use, Decoy_Drop racers only; serial = join_ref<<24 + nth drop), totals decoys_dropped/decoy_hits_dealt/decoy_hits_taken. docs/state-websocket.md + live-timing tooltip updated. Verified on 2-instance recomp LAN: 3 decoy_hit with identical serials on both instances, each matching a decoy_drop serial; totals agree. Caveats: decoy_drop count differs per instance (17 vs 13, remote 5Hz view merges), RB not run, drop serial only exact for racers that never fire.

Done (commit 0d0d401, ADR 0026). Discard binding is Y (pad 0x8000); first spike never pressed it as discard. Findings: decoy hit = ch9 event 4 with +0x20 == 4 (real hits 0/2), no game event for a drop. New feed: decoy_hit {victim,attacker,powerup,serial} (instead of hit), decoy_drop {racer,powerup,serial} (inferred from held-queue removal with no use, Decoy_Drop racers only; serial = join_ref<<24 + nth drop), totals decoys_dropped/decoy_hits_dealt/decoy_hits_taken. docs/state-websocket.md + live-timing tooltip updated. Verified on 2-instance recomp LAN: 3 decoy_hit with identical serials on both instances, each matching a decoy_drop serial; totals agree. Caveats: decoy_drop count differs per instance (17 vs 13, remote 5Hz view merges), RB not run, drop serial only exact for racers that never fire.
Author
Owner

Completed and merged by Harmonic (task 32).

Completed and merged by Harmonic (task 32).
Sign in to join this conversation.
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Reference
mintopia/blur#36
No description provided.