Bots cannot cast, withdraw, or route by teleport — a plan for all three #150

Closed
opened 2026-08-06 20:02:26 +00:00 by sickday · 1 comment
Owner

Bots cannot cast, cannot withdraw, and do not know teleports exist. Now that #149 has landed the standard spellbook, this is the plan for teaching them to use it — and for retiring the free teleports they use today.

The principle this is built on

Realism is what an observer can see, not what the input path did. A player watching a bot cannot tell whether a spell was reached through a decoded if_button packet or by calling the cast directly after a plausible pause. Emulating the click plumbing buys nothing and costs a goal several round trips per cast.

So bots call the cast path directly, after a realistic delay — and every observable effect stays real: the Magic level is required, the runes or tablet are consumed, the animation plays, the three-tick delay applies, the wilderness ceiling refuses. Only the packet decode is skipped.

This is the same deviation Goals.Merchant already documents for Act.relocate/2, but a far smaller one: there the outcome is impossible for a player, here only the input is.

Where things actually stand

  • Bot.Act has walk, object_action, npc_action, player_action, button/6, deposit_all, the trade verbs and exchange_offer. No spell affordance, and no bank withdrawal — Act.withdraw/4 is the trade screen, not a bank.
  • Bot.Travel is walking, a straight-line long-leg hop, and recover-by-relocate. Nothing in it would ever choose to teleport.
  • The bots that appear to teleport today are cheating. Goals.Merchant and Goals.Restock call Act.relocate/2 — the session moving the player directly. No runes, no level, no gate, no delay. So does Bot.Travel.recover/2 on every wedge, which is also how #138 drops bots into dungeons.
  • Each bot owns its own persisted bank. There is no shared pool and no ledger — unlike the sister project, whose economy this plan borrows from.

What the cache already gives us

  • 44 teleport spells across four spellbooks, with levels and rune costs read and recorded.
  • 47 teleport tablets, verb Break — the standard set at 8009 Falador, 8010 Camelot, 8011 Ardougne and their neighbours. So the tablet route is real, and it is the route for a bot without the Magic level.

The plan, in dependency order

1. A teleport view for bots. Given a bot's Magic level and what it holds or banks, which teleports can it actually use — and for a target tile, which one lands nearest. Pure, so it is testable without a world. This is the piece everything else asks.

2. A destination index, hand-curated. Operator's call, and the right one: derive nothing here. A curated table of common areas → nearest teleport → walking remainder. It doubles as the thing that makes an operator able to say where a bot is in words rather than coordinates, which is worth as much as the routing.

3. Bot.Act.cast_teleport/2 and break_tablet/2. The affordances, calling the real cast so every gate applies.

4. Bot.Travel prefers a teleport when one lands closer than walking. Gated on the remainder being inside its working radius — which is unmeasured, and is what #123 should be retitled around. Measure it before tuning anything on top of it.

5. Bank withdrawal. Genuinely new and the largest piece: the bank interface has only ever been driven in the deposit direction. Needed for runes and tablets, and useful far beyond teleports.

6. Acquisition, two routes plus a fallback. Have the level and borrow runes; or buy/borrow a tablet; or, for a unique location, acquire whatever item reaches it the way a player would.

7. Retire the relocate cheats. Once bots can cast, Goals.Merchant and Goals.Restock should use real teleports where one exists. Bot.Travel.recover/2 is a separate question — it is an error path, and #138 argues it is actively harmful in its current form regardless.

Three decisions this needs before it is built

Shared pool or per-bot bank? The sister project's model has gatherers depositing into a shared pool with a reason-tagged ledger, and "borrow from the economy" means drawing on that. Revenant has neither: each bot has its own bank. Borrowing therefore means either building the pool first, or minting into a bot's own bank and recording it. These are different amounts of work and different economies.

Does borrowing mint? A bot borrowing runes that did not exist is a source, and the sister project's own lending design is explicit that item-minting is the inflationary axis it was careful to avoid. A fleet quietly minting law runes to move around is a slow leak into an economy the Grand Exchange is connected to. Worth deciding deliberately rather than discovering.

What is the walking remainder allowed to be? Bot.Travel's radius is unknown. The measurement is cheap — spawn a travel bot at increasing distances and find where it stops arriving — and until it exists, "teleport near then walk" has no definition of near.

Bots cannot cast, cannot withdraw, and do not know teleports exist. Now that #149 has landed the standard spellbook, this is the plan for teaching them to use it — and for retiring the free teleports they use today. ## The principle this is built on **Realism is what an observer can see, not what the input path did.** A player watching a bot cannot tell whether a spell was reached through a decoded `if_button` packet or by calling the cast directly after a plausible pause. Emulating the click plumbing buys nothing and costs a goal several round trips per cast. So bots call the cast path directly, after a realistic delay — and **every observable effect stays real**: the Magic level is required, the runes or tablet are consumed, the animation plays, the three-tick delay applies, the wilderness ceiling refuses. Only the packet decode is skipped. This is the same deviation `Goals.Merchant` already documents for `Act.relocate/2`, but a far smaller one: there the *outcome* is impossible for a player, here only the input is. ## Where things actually stand * `Bot.Act` has `walk`, `object_action`, `npc_action`, `player_action`, `button/6`, `deposit_all`, the trade verbs and `exchange_offer`. **No spell affordance, and no bank withdrawal** — `Act.withdraw/4` is the *trade* screen, not a bank. * `Bot.Travel` is walking, a straight-line long-leg hop, and recover-by-relocate. Nothing in it would ever choose to teleport. * **The bots that appear to teleport today are cheating.** `Goals.Merchant` and `Goals.Restock` call `Act.relocate/2` — the session moving the player directly. No runes, no level, no gate, no delay. So does `Bot.Travel.recover/2` on every wedge, which is also how #138 drops bots into dungeons. * Each bot owns its **own persisted bank**. There is no shared pool and no ledger — unlike the sister project, whose economy this plan borrows from. ## What the cache already gives us * **44 teleport spells** across four spellbooks, with levels and rune costs read and recorded. * **47 teleport tablets**, verb `Break` — the standard set at `8009` Falador, `8010` Camelot, `8011` Ardougne and their neighbours. So the tablet route is real, and it is the route for a bot without the Magic level. ## The plan, in dependency order **1. A teleport view for bots.** Given a bot's Magic level and what it holds or banks, which teleports can it actually use — and for a target tile, which one lands nearest. Pure, so it is testable without a world. This is the piece everything else asks. **2. A destination index, hand-curated.** Operator's call, and the right one: derive nothing here. A curated table of common areas → nearest teleport → walking remainder. It doubles as the thing that makes an operator able to say *where a bot is* in words rather than coordinates, which is worth as much as the routing. **3. `Bot.Act.cast_teleport/2` and `break_tablet/2`.** The affordances, calling the real cast so every gate applies. **4. `Bot.Travel` prefers a teleport when one lands closer than walking.** Gated on the remainder being inside its working radius — **which is unmeasured, and is what #123 should be retitled around**. Measure it before tuning anything on top of it. **5. Bank withdrawal.** Genuinely new and the largest piece: the bank interface has only ever been driven in the deposit direction. Needed for runes and tablets, and useful far beyond teleports. **6. Acquisition, two routes plus a fallback.** Have the level and borrow runes; or buy/borrow a tablet; or, for a unique location, acquire whatever item reaches it the way a player would. **7. Retire the relocate cheats.** Once bots can cast, `Goals.Merchant` and `Goals.Restock` should use real teleports where one exists. `Bot.Travel.recover/2` is a separate question — it is an error path, and #138 argues it is actively harmful in its current form regardless. ## Three decisions this needs before it is built **Shared pool or per-bot bank?** The sister project's model has gatherers depositing into a shared pool with a reason-tagged ledger, and "borrow from the economy" means drawing on that. Revenant has neither: each bot has its own bank. Borrowing therefore means either building the pool first, or minting into a bot's own bank and recording it. These are different amounts of work and different economies. **Does borrowing mint?** A bot borrowing runes that did not exist is a **source**, and the sister project's own lending design is explicit that item-minting is the inflationary axis it was careful to avoid. A fleet quietly minting law runes to move around is a slow leak into an economy the Grand Exchange is connected to. Worth deciding deliberately rather than discovering. **What is the walking remainder allowed to be?** `Bot.Travel`'s radius is unknown. The measurement is cheap — spawn a travel bot at increasing distances and find where it stops arriving — and until it exists, "teleport near then walk" has no definition of *near*.
Author
Owner
Moved to https://forge.home.arpa/Revenant/Server/issues/49
Sign in to join this conversation.
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#150
No description provided.