Split The code is public; the app answers only to the crew.
A bullet that lands does not slow the player it hits: no tagging, so trading a shot costs the enemy nothing #226
Check · Review · Land · Live done — Landed and live in production.
A bullet that lands now tags the player it hits. Each point of damage takes **1%** of their ground speed (`TAG_PER_DAMAGE = 0.01`). It never takes more than half, however many hits land (`TAG_FLOOR = 0.5`). It wears off at **100% of full speed per second** (`TAG_RECOVERY = 1`). So 30 in the chest holds a runner to 175 u/s and is gone in 0.3 s, and the deepest tag is gone in 0.5 s. It is meant as a…
shipped merged
Sign in to join this conversation.
A bullet that lands now tags the player it hits. Each point of damage takes 1% of their ground speed (
TAG_PER_DAMAGE = 0.01). It never takes more than half, however many hits land (TAG_FLOOR = 0.5). It wears off at 100% of full speed per second (TAG_RECOVERY = 1). So 30 in the chest holds a runner to 175 u/s and is gone in 0.3 s, and the deepest tag is gone in 0.5 s. It is meant as a hesitation, not a stun.How it works.
Player.tagis the share of speed a hit has taken off.tag()inworld.tssets it, called fromshootfor every hit, so a bot shooting the person and the person shooting a bot go through the same code.applyInputmultiplies the wish speed by(1 - p.tag)and winds the tag down each tick;velis never edited. A player in the air is not tagged.startRoundclears the tag next topunch, and so does the arena'sequip.flinch, the damage numbers and the hitgroup table are unchanged.Tests, in
world.test.ts:startRoundclears everyone's tag.shoot.With the two call sites removed, the distance, cap and symmetry tests fail. The decay, air and round-start tests call
tag()directly, so they break only when their own piece of the rule goes.One test changed on purpose. In
src/rl/arena.test.ts, the test that pins the shipped policy's episodes action for action had its expected values updated: 1080 → 810 actions, hash3779f480fec06e8f→4b4b2fc68a8a1af1. Its own comment asks for a deliberate update when a physics change is meant to move it, and this one is. The episodes are shorter because fights end sooner.Measured, same seeds before and after:
scripts/duel.ts, de_forge, shipped policyscripts/duel.ts, de_forge, scriptedscripts/duel.ts --map de_cinder, shipped policyscripts/duel.ts --map de_cinder, scriptedscripts/measure.ts, plant ratescripts/measure.ts, defuse ratescripts/measure.ts, T/CT splitThe shipped policy loses 2 points on each map, which is within the couple of points the issue allowed. The scripted baseline gains 4 on de_cinder. I did not retrain.
Left out:
punch.observe.tsis untouched.The README's What is real and what is not has the rule and its numbers next to the hit-feedback text.
bun run checkpasses (797 tests) and/answers 200. To try it in the preview, sprint into a bot's line of fire: you drop to a jog for a moment after each hit, and a bot you shoot mid-push stutters the same way.🤖 Generated with Claude Code
Closes #189