feat: rushers rush, and a pker fights with two styles #167

Merged
sickday merged 1 commit from feat/bot-rush-and-switch into main 2026-08-11 19:49:15 +00:00
Owner

The pker fleet had a brain and one thing to do with it.

A rusher rushes. Bot.Fight.freezes?/2 states who throws a bind, and a
rusher does: it opens with the strongest freeze its Magic can pay for while
the quarry is out of melee reach, closes while they cannot walk, and hits
once it is on them. The kit is billed for those runes off the same
predicate, so a brain that throws a spell nothing bought cannot happen.

The granite maul combo. Its special is instant and its bar pays for
exactly two, so a full bar beside the quarry comes back as two toggles in
one tick — the ordinary swing the interaction is already making, plus two
specials landing with it. That is also the one place the brain asks about
reach: an instant thrown from out of range arms the bar instead, and the
second toggle disarms it, so a pair from two tiles away spends nothing and
looks exactly like a bot that never specs.

A second style, which is not a nicety. The operator's correction, in
their terms: most pkers bring at least two combat styles. A rusher that
flubs and is held at range is still in the fight if it can cast and a free
kill if it cannot — and a spell thrown while closing is damage a melee-only
body never lands. So aim/1 has three answers rather than two: freeze
somebody loose, cast at somebody out of reach who is already held, swing at
somebody in front of it.

The spellbook is a per-bot draw. On the ancients the Ice line freezes
and damages, so the freeze and the fallback are one component at Magic 82;
on the standard book Entangle holds harder and hits for nothing, so the kit
carries both. Both are era-real and the fleet holds a mix.

The stack. A burst weapon and the maul are a sequence, not alternatives.
The swap reserves the follow-up — it happens only when the bar can pay for
the switch's special and the main's — so once the burst has fired the
swap-in goes false by itself and what is left goes into the instants. The
arithmetic falls out right without any weapon being named: claws then the
maul, or dagger, dagger, maul. The swap back lands the instants in the tick
it happens, because they do not wait for a cadence.

Two rules keep it a rush rather than an optimisation. Two rushers in five
carry no burst weapon at all
, because only the maul is instant and the
alternatives arm and wait out the swing cadence — optimising for damage per
bar had quietly deleted the pure three-hit the build is named after. And
kill_now?/1 refuses the swap on a quarry inside a quarter of its health
when the bar can pay for two instants: three fifths is worth switching for,
a quarter is too late to switch.

A flubbed rush leaves. Bar spent, quarry not dying — the bar is itself
the record of what was spent, so this needs no memory.

The roster is stated; the choice is not. Ranking the whole special table
by output answers dragon claws for every body past Attack 60, which is
legal, correct by the numbers, and not a thing a 2017 pker has in its pack.
Ten melee weapons carry prevalence weights and are drawn off the stored
variant seed, still filtered by the game's own equip gates — so no tier
names a weapon: the dagger appears where a statline first reaches Attack 60
and the shortbow at Ranged 50. Measured over the whole seed span: bare maul
40%, dagger 28%, halberd 13%, warhammer 10%, anchor 5%, claws 3%.

Stances are new for everybody. Every melee bot had been fighting on
whatever slot the varp defaulted to. choose_stance/2 takes the stance and
asks the worn category which button that is, so a bot names aggressive or
rapid and never a slot — prayer's rule, applied again.

Two engine facts became published ones, both on the row that was already the
point lookup an attacker makes: the quarry's hitpoints/max_hitpoints,
and this bot's own attacking, which turns re-aiming into a transition and
stops a settled fight re-planning a route every step. The hunt now picks
who and hands over without clicking; the brain picks how, which is
the only moment a rusher's bind can be its opener.

Three fixes ride along, all found by watching rather than by testing:

  • @rusher_levels and pure_levels/2 named no Prayer, so both builds sat
    at level 1 with no protection available and no potion in the pack — the
    two builds whose whole purpose is fighting. Bot.Prayer.every_protection/0
    seeds them where all three styles have an answer.
  • The kit's levels map carried Magic and Hitpoints alone, so no refit had
    repacked a prayer restore since Prayer shipped.
  • World.EquipmentTest left the global equipment table empty rather than
    restoring the boot table, so whichever module ExUnit shuffled next lived
    in a world where nothing can be worn. It landed on Bot.GearTest; proven
    pre-existing by stashing the branch and reproducing at --seed 0.

Suite 4005 green. Format, compile-as-errors and Credo clean; Dialyzer at
#131's two known guard_fails with nothing new.

The pker fleet had a brain and one thing to do with it. **A rusher rushes.** `Bot.Fight.freezes?/2` states who throws a bind, and a rusher does: it opens with the strongest freeze its Magic can pay for while the quarry is out of melee reach, closes while they cannot walk, and hits once it is on them. The kit is billed for those runes off the same predicate, so a brain that throws a spell nothing bought cannot happen. **The granite maul combo.** Its special is instant and its bar pays for exactly two, so a full bar beside the quarry comes back as two toggles in one tick — the ordinary swing the interaction is already making, plus two specials landing with it. That is also the one place the brain asks about reach: an instant thrown from out of range *arms* the bar instead, and the second toggle disarms it, so a pair from two tiles away spends nothing and looks exactly like a bot that never specs. **A second style, which is not a nicety.** The operator's correction, in their terms: most pkers bring at least two combat styles. A rusher that flubs and is held at range is still in the fight if it can cast and a free kill if it cannot — and a spell thrown while closing is damage a melee-only body never lands. So `aim/1` has three answers rather than two: freeze somebody loose, cast at somebody out of reach who is already held, swing at somebody in front of it. The **spellbook is a per-bot draw**. On the ancients the Ice line freezes *and* damages, so the freeze and the fallback are one component at Magic 82; on the standard book Entangle holds harder and hits for nothing, so the kit carries both. Both are era-real and the fleet holds a mix. **The stack.** A burst weapon and the maul are a sequence, not alternatives. The swap reserves the follow-up — it happens only when the bar can pay for the switch's special *and* the main's — so once the burst has fired the swap-in goes false by itself and what is left goes into the instants. The arithmetic falls out right without any weapon being named: claws then the maul, or dagger, dagger, maul. The swap back lands the instants in the tick it happens, because they do not wait for a cadence. Two rules keep it a rush rather than an optimisation. **Two rushers in five carry no burst weapon at all**, because only the maul is instant and the alternatives arm and wait out the swing cadence — optimising for damage per bar had quietly deleted the pure three-hit the build is named after. And `kill_now?/1` refuses the swap on a quarry inside a quarter of its health when the bar can pay for two instants: three fifths is worth switching for, a quarter is too late to switch. **A flubbed rush leaves.** Bar spent, quarry not dying — the bar is itself the record of what was spent, so this needs no memory. **The roster is stated; the choice is not.** Ranking the whole special table by output answers *dragon claws* for every body past Attack 60, which is legal, correct by the numbers, and not a thing a 2017 pker has in its pack. Ten melee weapons carry prevalence weights and are drawn off the stored variant seed, still filtered by the game's own equip gates — so no tier names a weapon: the dagger appears where a statline first reaches Attack 60 and the shortbow at Ranged 50. Measured over the whole seed span: bare maul 40%, dagger 28%, halberd 13%, warhammer 10%, anchor 5%, claws 3%. **Stances are new for everybody.** Every melee bot had been fighting on whatever slot the varp defaulted to. `choose_stance/2` takes the stance and asks the worn category which button that is, so a bot names aggressive or rapid and never a slot — prayer's rule, applied again. Two engine facts became published ones, both on the row that was already the point lookup an attacker makes: the quarry's `hitpoints`/`max_hitpoints`, and this bot's own `attacking`, which turns re-aiming into a transition and stops a settled fight re-planning a route every step. The hunt now picks **who** and hands over without clicking; the brain picks **how**, which is the only moment a rusher's bind can be its opener. Three fixes ride along, all found by watching rather than by testing: * `@rusher_levels` and `pure_levels/2` named no Prayer, so both builds sat at level 1 with no protection available and no potion in the pack — the two builds whose whole purpose is fighting. `Bot.Prayer.every_protection/0` seeds them where all three styles have an answer. * The kit's levels map carried Magic and Hitpoints alone, so no refit had repacked a prayer restore since Prayer shipped. * `World.EquipmentTest` left the global equipment table empty rather than restoring the boot table, so whichever module ExUnit shuffled next lived in a world where nothing can be worn. It landed on `Bot.GearTest`; proven pre-existing by stashing the branch and reproducing at `--seed 0`. Suite 4005 green. Format, compile-as-errors and Credo clean; Dialyzer at #131's two known guard_fails with nothing new.
feat: rushers rush, and a pker fights with two styles
All checks were successful
ci / gates (pull_request) Successful in 1m3s
build / image (push) Successful in 32s
ci / gates (push) Successful in 1m12s
fa0a67d153
The pker fleet had a brain and one thing to do with it.

**A rusher rushes.** `Bot.Fight.freezes?/2` states who throws a bind, and a
rusher does: it opens with the strongest freeze its Magic can pay for while
the quarry is out of melee reach, closes while they cannot walk, and hits
once it is on them. The kit is billed for those runes off the same
predicate, so a brain that throws a spell nothing bought cannot happen.

**The granite maul combo.** Its special is instant and its bar pays for
exactly two, so a full bar beside the quarry comes back as two toggles in
one tick — the ordinary swing the interaction is already making, plus two
specials landing with it. That is also the one place the brain asks about
reach: an instant thrown from out of range *arms* the bar instead, and the
second toggle disarms it, so a pair from two tiles away spends nothing and
looks exactly like a bot that never specs.

**A second style, which is not a nicety.** The operator's correction, in
their terms: most pkers bring at least two combat styles. A rusher that
flubs and is held at range is still in the fight if it can cast and a free
kill if it cannot — and a spell thrown while closing is damage a melee-only
body never lands. So `aim/1` has three answers rather than two: freeze
somebody loose, cast at somebody out of reach who is already held, swing at
somebody in front of it.

The **spellbook is a per-bot draw**. On the ancients the Ice line freezes
*and* damages, so the freeze and the fallback are one component at Magic 82;
on the standard book Entangle holds harder and hits for nothing, so the kit
carries both. Both are era-real and the fleet holds a mix.

**The stack.** A burst weapon and the maul are a sequence, not alternatives.
The swap reserves the follow-up — it happens only when the bar can pay for
the switch's special *and* the main's — so once the burst has fired the
swap-in goes false by itself and what is left goes into the instants. The
arithmetic falls out right without any weapon being named: claws then the
maul, or dagger, dagger, maul. The swap back lands the instants in the tick
it happens, because they do not wait for a cadence.

Two rules keep it a rush rather than an optimisation. **Two rushers in five
carry no burst weapon at all**, because only the maul is instant and the
alternatives arm and wait out the swing cadence — optimising for damage per
bar had quietly deleted the pure three-hit the build is named after. And
`kill_now?/1` refuses the swap on a quarry inside a quarter of its health
when the bar can pay for two instants: three fifths is worth switching for,
a quarter is too late to switch.

**A flubbed rush leaves.** Bar spent, quarry not dying — the bar is itself
the record of what was spent, so this needs no memory.

**The roster is stated; the choice is not.** Ranking the whole special table
by output answers *dragon claws* for every body past Attack 60, which is
legal, correct by the numbers, and not a thing a 2017 pker has in its pack.
Ten melee weapons carry prevalence weights and are drawn off the stored
variant seed, still filtered by the game's own equip gates — so no tier
names a weapon: the dagger appears where a statline first reaches Attack 60
and the shortbow at Ranged 50. Measured over the whole seed span: bare maul
40%, dagger 28%, halberd 13%, warhammer 10%, anchor 5%, claws 3%.

**Stances are new for everybody.** Every melee bot had been fighting on
whatever slot the varp defaulted to. `choose_stance/2` takes the stance and
asks the worn category which button that is, so a bot names aggressive or
rapid and never a slot — prayer's rule, applied again.

Two engine facts became published ones, both on the row that was already the
point lookup an attacker makes: the quarry's `hitpoints`/`max_hitpoints`,
and this bot's own `attacking`, which turns re-aiming into a transition and
stops a settled fight re-planning a route every step. The hunt now picks
**who** and hands over without clicking; the brain picks **how**, which is
the only moment a rusher's bind can be its opener.

Three fixes ride along, all found by watching rather than by testing:

  * `@rusher_levels` and `pure_levels/2` named no Prayer, so both builds sat
    at level 1 with no protection available and no potion in the pack — the
    two builds whose whole purpose is fighting. `Bot.Prayer.every_protection/0`
    seeds them where all three styles have an answer.
  * The kit's levels map carried Magic and Hitpoints alone, so no refit had
    repacked a prayer restore since Prayer shipped.
  * `World.EquipmentTest` left the global equipment table empty rather than
    restoring the boot table, so whichever module ExUnit shuffled next lived
    in a world where nothing can be worn. It landed on `Bot.GearTest`; proven
    pre-existing by stashing the branch and reproducing at `--seed 0`.

Suite 4005 green. Format, compile-as-errors and Credo clean; Dialyzer at
#131's two known guard_fails with nothing new.
Sign in to join this conversation.
No reviewers
No labels
No milestone
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.

Dependencies

No dependencies set

Reference
Revenant/Server!167
No description provided.