Bribe's starting powerup missing from the feed #37

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

Racers with the Bribe mod get a starting powerup (BribeModSettings: chance_of_nitro, PickupPercentages, bribe_on_activate_pickups), but powerups doesn't show it. In examples/live-timing/sample-race.jsonl remote "Senna" (Bribe) shows [null,null,null] until race_ms 12350.

Spike

LAN scenario with Bribe on one instance: snapshot +0xea0, +0xeac, +0xeb4 and entries every 25 ms from race load to lap 1 on both instances, logging channel-9 events. Hypothesis: granted only on the owner's instance (not replicated), or held outside the queue.

Acceptance

  • The granted powerup shows in powerups on the owner's instance from the grant.
  • Other instances show it if the game replicates it; otherwise backfill when it's used (collect with inferred: true, #35) and document the limit.

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.
Racers with the `Bribe` mod get a starting powerup (`BribeModSettings`: `chance_of_nitro`, `PickupPercentages`, `bribe_on_activate_pickups`), but `powerups` doesn't show it. In `examples/live-timing/sample-race.jsonl` remote "Senna" (Bribe) shows `[null,null,null]` until race_ms 12350. ## Spike LAN scenario with Bribe on one instance: snapshot `+0xea0`, `+0xeac`, `+0xeb4` and entries every 25 ms from race load to lap 1 on both instances, logging channel-9 events. Hypothesis: granted only on the owner's instance (not replicated), or held outside the queue. ## Acceptance - The granted powerup shows in `powerups` on the owner's instance from the grant. - Other instances show it if the game replicates it; otherwise backfill when it's used (`collect` with `inferred: true`, #35) and document the limit. ## 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.

  • Also: tweak Multiplayer.Upgrades.Bribe.BribeMeNow (grant trigger).
  • An out-of-range kind is unlikely: it would show as unknown, not null.
  • The sample-race null → shunt at 12350 is on a remote racer, so the "owner-instance only" hypothesis fits. World-pickup collection does replicate. Also check +0xea0 as an alternative holder.
Research findings (static: Blur.exe strings + current src), 2026-10-20. - Also: tweak `Multiplayer.Upgrades.Bribe.BribeMeNow` (grant trigger). - An out-of-range kind is unlikely: it would show as `unknown`, not `null`. - The sample-race `null` → `shunt` at 12350 is on a remote racer, so the "owner-instance only" hypothesis fits. World-pickup collection does replicate. Also check `+0xea0` as an alternative holder.
Author
Owner

Spike (2-instance LAN, Bribe on instance 0, 25 ms polling of +0xea0/ea4/eac/eb0/eb4): no feed bug. The grant is in the owner's queue (eb4 0->1, entry 0 kind -1 for ~1.1 s, then the real kind; +0xea0 stays -1 until fired). The other instance's queue for that racer never changes, so it is not replicated. Owner feed shows it (unknown ~1 s, then kind) and sends collect; remote only sees an inferred collect when a fireable kind is used (Nitro/Repair emit no use event, so invisible there). Documented in docs/state-websocket.md and ADR 0017. Also fixed scripts/race.py lan host (players feed value is a string). No host code change.

Spike (2-instance LAN, Bribe on instance 0, 25 ms polling of +0xea0/ea4/eac/eb0/eb4): no feed bug. The grant is in the owner's queue (eb4 0->1, entry 0 kind -1 for ~1.1 s, then the real kind; +0xea0 stays -1 until fired). The other instance's queue for that racer never changes, so it is not replicated. Owner feed shows it (unknown ~1 s, then kind) and sends collect; remote only sees an inferred collect when a fireable kind is used (Nitro/Repair emit no use event, so invisible there). Documented in docs/state-websocket.md and ADR 0017. Also fixed scripts/race.py lan host (players feed value is a string). No host code change.
Author
Owner

Completed and merged by Harmonic (task 31).

Completed and merged by Harmonic (task 31).
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#37
No description provided.