Skip to content

FFA baseline: let the band target orbit, so a bot at its band radius stops standing still (dormant, default unchanged) - #74

Open
devin-ai-integration[bot] wants to merge 1 commit into
mainfrom
devin/1788671106-ffa-orbit-band
Open

FFA baseline: let the band target orbit, so a bot at its band radius stops standing still (dormant, default unchanged)#74
devin-ai-integration[bot] wants to merge 1 commit into
mainfrom
devin/1788671106-ffa-orbit-band

Conversation

@devin-ai-integration

Copy link
Copy Markdown
Contributor

Summary

ffaBandTarget projects the move target onto the bot's own current bearing from the ring center:

bearing = norm(me - center)
center + bearing * (ringRadius * fraction)

so a bot that has reached its band radius is targeting the point it is already standing on, and issues no movement until the ring shrinks into it. This adds an optional tangential lead angle, which makes the same expression self-sustaining orbital motion (the bearing is recomputed from the real position every tick, so a constant lead keeps producing a target ahead along the circumference):

FfaOrbitLeadDeg = clamp(parseEnvFloat("CTF_BOT_FFA_ORBIT_LEAD_DEG", 0.0), 0.0, 90.0)
# ffaBandTarget / ffaBandTargetAtRadius, after the bearing (incl. the at-center seat fallback):
bearing = ffaOrbitBearing(bot, rawBearing)   # rotate by ±FfaOrbitLeadDeg, sign by slot parity

The lead defaults to 0.0, which is byte-identical to today's expression, so nothing changes for any existing seat or the league until an arm sets the env var — this lands dormant like the weapon drop did. Rotation preserves |target - center|, so it orbits rather than spiralling; the sign comes from slot parity so a seat's orbit direction is stable across ticks instead of flip-flopping.

Why this knob: over 30 matched-field GV46 episodes (12-seat lobbies containing our arms and the league's top three), our arms are motionless 65-73% of their living ticks while the leaders are motionless 20-46% — and they fire a third as many shots at higher accuracy (59-64% vs 42-50%), deal a third of the damage, and die to the ring 10-20% of the time versus 0-7%. Since vision is a forward cone around the aim angle, "accurate but barely shoots" is the signature of a bot that isn't finding anyone rather than one that's missing. Two earlier hypotheses are already dead on the same data (arm-trip reach: +0.8 ±12.6; doctrine choice: every compiled doctrine 60-90 points below the leaders), which is what pointed at the band target itself.

Nothing here is a rules change: players/baseline/ and tests/ only, GameVersion untouched, no fixtures re-recorded, label contract unchanged. The measurement that decides whether the lead is worth turning on (and at what angle) runs as env-only arms off this same binary; if it doesn't clear the gate, the knob stays at 0.0 and costs nothing.

Link to Devin session: https://app.devin.ai/sessions/274a6b4a46034710a7a81a2a81dc02dc
Open in Devin Desktop: https://app.devin.ai/desktop/session/274a6b4a46034710a7a81a2a81dc02dc?variant=devin
Requested by: @aaln

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant