Imported from IIxauII/coachemon (
skills/coachemon/SKILL.md). Install upstream withnpx skills add IIxauII/coachemon --skill coachemon. Copyright stays with the author.
Coaching PokéRogue
The user holds the controller. You read the game and advise. Never press, select, or start anything — no press, select_option, start_run. If the user wants you to drive, that is play-pokerogue.
Reading the game
scripts/read.sh <chrome|orion> <battle|starters> prints one JSON snapshot. It injects scripts/probe.js into the page and reads the result back off the DOM; the probe is read-only.
scripts/read.sh <browser> journal prints the Mystery Encounter journal instead: every encounter met on that browser, with the card the coach showed, the option the game recorded the player picking, and the run state at each tick it moved. It is written to the page's localStorage as the encounters happen, so it outlives the run, the reload and the panel — harvest it whenever, and empty it with window.__coachHud.journalClear() once it has been read. It records, it does not judge.
- Which browser: ask if unclear. Chrome = the MCP server's tab on debug port 9222. Orion = the user's own browser.
- Orion needs Develop → Allow JavaScript from Apple Events. If the script errors saying so, stop and ask the user to enable it. Security: that toggle lets any local script run JS in every Orion tab — remind them to turn it off when done.
- Read fresh before every recommendation. The user keeps playing between messages; a snapshot from two turns ago is stale.
errorin the JSON → report it; don't guess the state.
battle gives wave, double, trainer, money, uiMode, party and enemy (level, HP, types, ability, passive, stats, stat stages, status, on-field, boss with bossBars left of total, held items, moves with type/power/category/PP remaining) and the party's other items. enemy lists the trainer's whole party, not just the lead — plan for all of them.
starters gives unlocked species by national dex id with IV total, passive/hidden-ability unlock, egg moves, cost reduction and candy. cost is only filled while the user is on the starter grid; otherwise it is null. hud is the 🌱 starter card's proposals in one line when the HUD is running on the grid.
Always-on coaching
When the user wants the coach running for the whole session ("keep coaching", "watch my run"), start both layers:
- HUD —
scripts/read.sh <browser> huddraws a panel in the game tab's top-left corner and refreshes every second with no Claude involved. Source isscripts/hud/*.js, bundled byhud-bundle.mjs; behaviour is pinned bynode scripts/test/run.mjs.hud-offremoves it. Header buttons switch full / mini / closed.- Engine. Damage, move choice and switching come from the game's own code, per
references/game-code.md:- damage via
getAttackDamage(simulated), covering items, abilities, multi-hit, boss bars, rolls, crits, accuracy, Sturdy / Focus Band and berries; - the enemy AI's move-choice algorithm, reproduced as a probability per move and target;
- the EnemyCommandPhase switch rule.
Game calls run only in the command phase, inside
sandbox(queue muted; RNG, abilitiesApplied and turnData restored), cached per turn.window.__coachHud.stats()reports sandbox restore mismatches (should stay 0) and refresh cost. Outside the command phase it falls back to a type-chart estimate.
- damage via
- Easy wild waves collapse to one line, in either view:
🎯 W12 ⚔ Charizard Heat Wave → Rattata · 1 hit [+] [×](one ⚔ per slot in doubles). Easy = wild, no boss, no 💀/⚠ tag, no switch or missing safe switch, every slot KOs in 1–2 hits, no catch worth a ball. Anything else expands on its own; a view button the user presses holds for the rest of the wave. - Battle card.
- ⚔ who should be out and what each slot does (
2 hitsto KO: more likely than not by then, from the damage rolls rather than the average), withnow:/next:when a switch uses the turn, andthen Xwhen this turn's move sets up a different follow-up (Fake Out, then the attack). - Status moves: setup, a status on the foe, a heal or a hazard can be this turn's move when the turns after it win the fight faster or more surely than attacking, e.g.
Swords Dance +2 Atk · then Leaf Blade,Spore → Machamp sleep · then Seed Bomb,Stealth Rock 4 to come(the trainer's mons still to come). The note carries the chance it works when below 100 % (accuracy, a likely Protect). In a double the same plays are offered, priced on what the effect does to the whole field with the partner slot scored on the state it makes — and with nothen, since a double's status play is read one turn at a time. - A foe's own setup counts: its expected boosts make its later hits harder, our hits into it weaker, and a Dragon Dance can take the Speed order. This turn's hit counts only as often as the foe doesn't Protect, and Primordial weather or Psychic Terrain stopping a move leaves it out.
- The planner is exact for this turn and the next; past that it races KO odds on expected play. Near-equal options lean to the move the mon used last turn, and a mon that just came in isn't switched straight back out without a real gain.
- Drain (Giga Drain, Leech Life, Draining Kiss) heals its user its share of each hit's damage, on both sides, so a draining foe takes more hits (
drains 50%); Liquid Ooze turns it into damage. On-KO boosts (Beast Boost, Moxie, the Neighs, Soul-Heart): falling to such a foe while others are left to face it costs the option, the slot saysKO feeds Buzzwole's Beast Boost (+1 Atk), and the fight plan carries the boost into later exchanges (feeds Beast Boost +1 Atk). Speed boosts aren't modelled. - ⇄ switches: kept to failing fields, never into a KO on entry or before acting; optional when merely better; "no safe switch" otherwise. A paid switch-in says what coming in costs it and why:
takes ~6% · resists Lunge. - ⇆ predicted enemy switches aim the plan at the switch-in, with a dim ↺ if it stays. In doubles both slots can switch on one turn, and the second may be a return — the mon the first slot is withdrawing, walking straight back in on the other one (
returns from the other slot). It arrives fresh, so it is planned against at base stat stages. - ◎ focus targeting in doubles (a split shows in the ⚔ targets).
- 💀 / ⚠ danger tags with the hit's % of current HP, including next turn's.
- Each foe row (full view): trap abilities only, ▲ weaknesses / ✕ walls among the types the party has moves of, ↯ the move it will use into our mon — the game's own answer, so it carries no
% likely;~where it rode on a draw our own command makes — and ➜ a pick only for foes no slot is on yet. Trainers add "foes weak to:". - Mini: one line per slot, with ⚠ the trap ability its move runs into; the fight plan as one line.
- ⚔ who should be out and what each slot does (
- Free switches. The "Will you switch?" prompt (encounter start, "Switch" battle style, wild/mystery encounters only) and replacing a fainted mon cost no hit and no turn: the card shows
⇄ free switch? X → Yorstay. Mid-turn switches (U-turn, Eject Button) and every trainer-battle switch cost the turn. - 🎯 Catch card (wild): catch chance per ball from the game's capture formula, and a catch / maybe verdict — shown only when a catch is worth it, silent otherwise. It weighs account value (new species or form, hidden ability, shiny, a big IV gain on a line on the team), team value (covers weaknesses, clearly outclasses the weakest member, who it would replace; nothing for a line already on the team) and ending an encounter that would cost a party member. It picks the cheapest ball that works, and saves Rogue/Master balls for valuable catches. A fused mon is judged by both halves (averaged base stats, a shiny on either half), and "lower its HP" names a move that won't KO it (False Swipe first) or warns when every attack can.
- ♟ Fight plan (trainers): one line
♟ winnable · N steps [+]for a plain win; opens by itself on "likely lost", a sacrifice or a mon to reserve — the enemy win condition, who to reserve for it, sacrifices for free switch-ins, step order and warnings. A step whose ending is closer to a coin flip than a given shows its odds (KO (62%)). The trainer's next mon is predicted from the game's own send-in score at the HP the plan has reached; a tie there is the game's coin flip, so a plan can name either. Steps are marked approximate (~) in doubles. - 🎓 Learn-move card: new move vs current four as effective power (
power 96,3rd Water move), with reasons and a learn / forget / skip verdict (a skip names the slot it lost to, ↔). Full view adds Atk / SpA and ateam:line (SE types gained / lost, ⚠ losing the team's only move of a type). Mini shows the move to forget and only that ⚠.- Status moves are scored on the same scale as attacks, so Roost or Nasty Plot gets a real verdict and a dead slot (Growl, Howl on a special attacker, Helping Hand in a single battle) is offered as the move to forget. The number covers recovery, setup, disruption (Taunt, Encore), inflicted status scaled by accuracy, a typing written onto the foe (Soak, Forest's Curse — what it opens for the party's own coverage, plus the STAB a replaced typing takes away), and a foe's stat drops — worth far less than the same boost on us.
your callis left for the few moves nothing recognises. - Moveset prior: a bundled pkmn/randbats snapshot (
hud/05-randbats.js, refreshed weekly bynpm run randbats:genin a reviewed pull request) notes a move that shows up on the species' competitive sets —set move (Bulky Attacker), or, evolvedwhen the sets belong to what it grows into. It nudges a score by 6–20%, most when the move completes the role the moveset already plays. It is never a veto: a move nobody runs still wins when the numbers say so. - Atk is the number the mon actually attacks with, so Huge Power is doubled in it; an -ate ability's type change (Pixilate's Fairy Hyper Voice) drives STAB and coverage, and a move whose type the card can't pin down (Weather Ball) claims neither.
- Status moves are scored on the same scale as attacks, so Roost or Nasty Plot gets a real verdict and a dead slot (Growl, Howl on a special attacker, Helping Hand in a single battle) is offered as the move to forget. The number covers recovery, setup, disruption (Taunt, Encore), inflicted status scaled by accuracy, a typing written onto the foe (Soak, Forest's Curse — what it opens for the party's own coverage, plus the STAB a replaced typing takes away), and a foe's stat drops — worth far less than the same boost on us.
- 🛒 Rewards card: buys for current needs (revive, heal, potion, ether) first ("buy first" only when there are buys), then the free reward by what it does for the party, and what a reroll would bring;
👑 boss nextwhen the next wave is a big fight (a boss wave, a fixed battle or a gym leader — the ⚑ card's calendar, not justwave % 10). Through a gauntlet — more than one big fight before the next full heal, which is what waves 181–190 are — the hurt threshold rises to 90 % and a spare revive or heal is worth holding rather than passing over.- Held items, mints, vitamins, EXP items and candy go to the member they do the most for, named by icon: Leftovers to the bulkiest, Quick Claw to the slow, King's Rock to the fast, a status orb only to a Guts / Toxic Boost / Facade user, a mint by how much better its nature suits the stat the mon attacks with (
Adamant +Atk −SpA, was Modest), a vitamin by that stat, a species item only for its species. The carry is the highest-level member. EXP items count only members under the level cap (EXP past it is lost); a Rare Candy ignores the cap, so it goes to a member one level from evolving, then to the carry once it sits at the cap, then to whoever is furthest behind. An evolution item evolves at once, and costs an Eviolite holder its boost. - TMs are judged with the learn card's own decision, on every member the game says can learn the move (and doesn't know it yet): the recipient gaining the most, the move it replaces (
→ forget X,free slot, orsetup +1 SpAfor a setup move it suits) and the power gained. A TM that's no upgrade for anyone, or that nobody can learn, readsskipand ranks below other rewards. A fainted member can still be taught one (not in Hardcore) and is marked(fainted). Since a TM is kept for the run, a spread or ally move is judged by the game's double-battle odds over the next ten waves (lures, the four abilities that carryDoubleBattleChanceAbAttr— Illuminate, Arena Trap, No Guard, Commander — and an evil-team grunt's unseeded 1/3 included), not by whether the wave just won was a double. - 🎲 Reroll preview: the offers the next reroll will bring, read off the run's RNG stream before paying (
50-reroll.js,references/game-code.md§19): the game's own reward roll, run from where the stream stands and put back. Each offer is judged like the ones on screen, and the reroll is✓ worth itwhen its best offer beats the screen's best by half a tier (a first cut) and the money is there after the planned buys —✓ over the buyswhen it only fits by skipping them,keep, orcan't pay. With a Lock Capsule the locked (or unlocked) roll is shown too, with its own cost. Marked~: it holds while nothing else draws from the stream before the press, and a buy, a held-item move or a party change re-reads it. Every reroll made is scored against its preview (window.__coachHud.reroll()), and a miss marks the line!for the rest of the run. A reroll drops the wave's reward settings: after a fixed battle whose rewards were pinned to tiers, the reroll is an ordinary roll with luck upgrades back on. Until the live build's reward functions are found (a chunk scan, a few seconds after injection) the card shows the old "nothing good — reroll?" hint. - DNA Splicers are worth their best fusion, not their Master tier:
fuse Snorlax ← Salamence · +7, orno fusion worth a member(see the 🧬 card). - A Memory Mushroom goes to the member whose relearn list (level-up moves, unlocked egg moves, used TMs) holds the biggest upgrade by the learn card's own decision:
relearn Icicle Crash over Amnesia · +164 power.
- Held items, mints, vitamins, EXP items and candy go to the member they do the most for, named by icon: Leftovers to the bulkiest, Quick Claw to the slow, King's Rock to the fast, a status orb only to a Guts / Toxic Boost / Facade user, a mint by how much better its nature suits the stat the mon attacks with (
- 🩺 Team audit (on the rewards card): what is wrong with how the team is built, while a shop, TM or Memory Mushroom can still fix it. One line
🩺 team: N issues · <worst> [+]; full view opens it by itself when the next big fight's roster has a single answer or a speed gap.50-audit.js,references/game-code.md§17; every threshold is a first cut.- ✗ what loses fights: a foe in the next big fight only one member hits super-effectively off the stat it attacks with (
Flygon (W165) has one answer: Dudunsparce Blizzard (70%)), at most one member outspeeding the roster's fastest foe with no priority attack, a type a third of the party is weak to that nobody resists, a mon with no attack, no STAB as its only attack, or one attack beside three status moves, members far behind the carry (Diglett L12 … trail Fletchinder L23 — lead them on easy waves). - · what costs tempo: dead slots by the learn scorer (Growl, Leer, Scary Face, Amnesia on a physical attacker, Helping Hand in singles), setup for the attack stat it doesn't use, an attack on its weaker attack stat, a second attack of a type it already has, a status move most of the roster is immune to, the member that answers nothing in the roster, EXP items stacked on a party at the level cap, and the types nothing on the team hits super-effectively. A dead slot names the Memory Mushroom move that would fix it (↺).
- Held items can't sit unequipped: every one is attached to a member, so the modifier bar's list is not a bag.
- ✗ what loses fights: a foe in the next big fight only one member hits super-effectively off the stat it attacks with (
window.__coachHud.summary()is the panel's verdict in plain text; the battle read carries it ashud.- 🌱 Starter card (the starter grid, while a team is being chosen for a run): up to three teams within the point budget —
best, the bestwithoutits lead pick, and atrio(or afullerteam when the best is small) — built around whatever is already picked. Each shows its points, the types its final forms' STAB hits super-effectively, a weakness two members share that nobody resists, andno carrywhen nobody is built to attack; each pick shows its cost,carry/support(the moveset prior's roles for its line, else base stats) and why: its line's final BST, the passive, hidden ability or rare egg move this account has unlocked, IVs, Pokérus and shiny luck;but evolves by item or condition,but evolves at L55, orbut Rough Skin is offfor a picked starter whose unlocked passive isn't switched on. Full view adds 👁 the species under the cursor with its rank among what's caught. Costs, the budget (10, Endless 15, less Lower Starter Points) and which starters the challenges allow come from the grid itself; Fresh Start's stripped unlocks are read the way the grid reads them.51-starters.js,references/game-code.md§23; every weight is a first cut. Final forms are estimated (~) and passives go unnamed until the game's tables load.- Say what the card can't weigh: how good a passive or egg move actually is for the line, a challenge's strategy (Hardcore, Limited Catch), and the candy an account should spend before starting (a passive or cost reduction one purchase away).
- 🧬 Splice card (the party screen DNA Splicers open): up to three fusions in pick order,
Garchomp ← Salamencemeaning pick Garchomp first (the base: it keeps its level, nature, moves and passive) and Salamence second (it lends its ability, a type and half of every base stat, then leaves the party), each with a score and why: the base's BST before and after, the new typing, the ability swap (Disguise doesn't work fused), the member it spends; full view adds the moves it will offer, held items that move over, halves that still evolve and the passive kept. The call ispick X first, then Y,then pick Yonce a first pick is made,back out: … is betterwhen the first pick was the wrong one, orno fusion worth a member — back out, the Splicer stays unspent. A fusion is scored on the party it leaves: its members' stats at their own levels by the game's formula, strongest first at falling weights, with the freed slot refilled by a catch — so the other half's level doesn't matter (the fused mon takes the base's), a strong species caught low folds well into the lead, and spending a strong member rarely pays. Spliced Endless halves every unfused mon, so fusing there almost always does.49-fusion.js,references/game-code.md§24; every weight (stat mix, rank weights, refill, type and ability values) is a first cut.- Say what the card can't weigh: the moves the base ends up with (the learn prompts come after), held items' effect on the fused stats, and the run ahead (a fusion that fixes the next big fight's matchup).
- 🗺 Biome card (the next-biome choice a Map offers): ranks each biome for the party with a score and ★ pick / ≈ close. Encounters come from the game's own biome pools, wave by wave over the next ten: the wild tier odds with party luck and a Daily forced tier, time of day, the trainer odds and the biome's trainer classes with their parties, the tenth wave's wild boss or gym leader, fixed battles left out, species evolved at the party's level by the game's thresholds. ✓/✗ who's weak, who resists, how many mons hit them SE, the gym leader ahead (
W50 gym Poison (Janine): 2 hit SE), and a 🎯 catch that covers a weakness, hits what nothing on the team hits, outclasses the weakest member or is new — the same judgement the catch card makes of the mon in front of you, so both cards say the same about the same species at the same level. The tenth wave also counts on its own (± 10), and a near tie names what decided it (edges Cave on defense). The fainted count (the X1 heal revives them) except under Hardcore or a no-heal Limited Support. Full view adds the type mix, the species met most, 👤 the trainers met, 👑 the wild boss and where the biome leads (★ rare: Space, Fairy Cave, Laboratory). The tables are read from the game's loaded modules a moment after the HUD starts; until then the card only lists the options. - 🎭 Mystery Encounter card (the encounter's option screen): every option with what it really does for this
party, and ★ take / · ok / ✗ avoid; – for an option the party can't pick, with what it needs. Full view adds a
line per option: ⚔ the battle it starts (with the foe's level against yours and who hits it super-effectively),
the mon the game will use, and why. Built from the pinned source (
46-encounter.js,references/game-code.md§13), never from the wiki.- Judged: the common, great, ultra and rogue encounters — Mysterious Chest, Fight or Flight, Department Store Sale, Shady Vitamin Dealer, Lost at Sea, Fiery Fallout, The Strong Stuff, Berries Abound, Part-Timer, Teleporting Hijinks, Uncommon Breed, Global Trade System, Mysterious Challengers, Slumbering Snorlax, Safari Zone, Delibird-y, Absolute Avarice, Dancing Lessons, Bug-Type Superfan, Fun and Games, Training Session, The Pokémon Salesman, Trash to Treasure, Clowning Around, The Expert Pokémon Breeder, Dark Deal, A Trainer's Test, Weird Dream, The Winstrate Challenge. Every other encounter shows its options, who qualifies and what they cost, marked "not judged".
- 🔮 = fixed by the run seed. An option's first rolls are forked from the seed, so the card can say what will happen, not just the odds: whether the chest is a trap, the store's item rolls, where the teleport lands, who Fiery Fallout burns (and whose ability it overwrites), the vitamin dealer's new nature, the four moves Bug-Type Superfan's tutor will offer, which member Dark Deal takes and the tier of the legendary it pays with, every member's second type after Clowning Around's shuffle. Like the 🔮 next-wave card, treat it as the coach's own read: say it where it changes the decision.
- Safari Zone's fee names the three mons it buys, before a coin is spent: each is drawn in a seed fork of its own that no amount of play can move, so the card reads all three ahead of time — species, level, shiny and hidden ability, marked 🔮 — and calls the fee on whether any of them is worth a ball rather than on the money alone. It names them even when the fee is out of reach, and on every minigame turn the run option says which mon comes next, so letting one go is priced against what it buys. Where the game's starter table hasn't been read yet, the option falls back to what the fee buys in general and says so.
- Safari Zone's minigame is judged turn by turn. Once the ball / bait / mud / run menu is up, the card names the mon, its catch chance now, the chance it bolts at the end of this turn, where bait and mud would move both, and — playing the turns out to the end — which of the three catches it most often. Bait's +2 catch is paid for with +1 flee on the same turn, so it is rarely the call; mud wins on the mons that barely catch at all, and the ball on everything else. A mon the account has no use for is a run, not a ball. These are odds, never 🔮: both rolls are on the live stream. Fun and Games is still yours to play — the card names the prize ladder and the KO trap but leaves the three turns to you.
- Money is spent only while it leaves three waves' worth of reward money; a fight is "hard" 5+ levels over your best mon, or when nothing hits it super-effectively at your level. Both are first cuts.
- 🔮 Next wave (on the rewards and battle cards): what the run seed has already decided about the wave ahead —
wild / trainer / Mystery Encounter, which trainer and its party with levels, types, ability and moves, single or
double, and boss bars. It replays the game's own wave generation in a seed fork (
48-preview.js,references/game-code.md§11): a read, with the live RNG stream,currentBattleandwaveSeedrestored. Only a fixed battle — a rival, evil team, gym leader or Elite Four wave, whose trainer is a table lookup — is exact end to end, and even there an evil-team grunt's double comes off an unseededMath.random, so that one field is a guess. Anywhere else the wave's trainer is drawn on the stream, so the party under it is no surer than the trainer, however precisely each member is computed: fields are marked~(holds only while the game draws what the replay draws),?(a guess — the spawn pool shifts when the arena rebuilds it, entering a biome and again at X5) or!(this run has already proved it wrong). Whether the wave is a trainer at all costs a draw only where the game really rolls for it: a gym wave, an X0, an X1, every Daily wave and every wave of an Endless run (which has no trainers) are settled by rule, and readexact. The card always closes with "if nothing changes": a catch, an evolution, a shop pick or a biome change re-rolls what the preview was read from, marks or no marks. It scores itself against every wave on arrival:window.__coachHud.preview()prints hits and misses per field. Nothing is drawn if the live build has moved past the pin. Treat it as the coach's own read, not as something the user asked to be told — say it only where it changes a decision (what to buy, whether to heal, what to catch). - ⚑ Next big fight (on the rewards and battle cards): the next wave that is a boss wave, a fixed battle
(rival, evil team, Elite Four, champion), a gym leader or the run's final wave, how many waves out it is, and —
once it is close — the exact roster from the same replay the 🔮 card uses, with a ready / watch / risky
verdict: what nothing on the team hits super-effectively, the level gap, a type half the party is weak to, extra
health bars.
49-ahead.json03-calendar.js's run calendar,references/game-code.md§12; the schedule itself is arithmetic on the wave index, so it needs no roll and holds at any distance. It also carries what the calendar decides about preparing: the next full heal (entering every X1 — HP, status, PP, revives and Tera), how many big fights stand before it, the tiers a fixed battle's rewards are pinned to, and party luck with the tier-upgrade chance it buys (4 / floor(512 / (luck + 4))per reward — and nothing at all on a wave whose rewards are pinned, until a reroll, which drops the pin). In a Daily run that luck is not the party's at all: it is a roll of the run seed's, read the way the game reads it. - ☠ Eternatus checklist (classic, from ten waves out): read from the source, so it holds for every run —
phase 1 can't be KO'd (damage is capped at 1 HP, so the fight always reaches Eternamax), Eternamax carries a
Mini Black Hole that steals one held item per turn and turns the fight into a double, its Recover has
1 PP (
ppUp−4) so it heals half a bar exactly once, phase 1's Cosmic Power raises its defences every use, and phase 1 itself has no held items and no passive. It names a mon carrying most of the party's held items, since that is what the thief eats first. - Your brief still covers what the panel can't judge: setup lines, long-term team building, and anything the user asks. The split is deliberate (after PokéChamp): the panel is exact for a turn or two and coarse beyond; you judge the long horizon — whether a reserve is worth holding, when a trade is worth it, what the rest of the run needs.
- Engine. Damage, move choice and switching come from the game's own code, per
- Watcher — start
node scripts/watch.mjs <browser>with theMonitortool (timeout_ms1800000; re-arm when it expires). It prints one short summary line per event and re-injects the HUD after a page reload. Lines carry the HUD's verdict when it's running:NEW BATTLE w<wave> [double] <trainer|wild> · <easy|trainer|DANGER|catch|fight> | <foes> [💀 <our mon>] [⚠ <our mon> (after acting, saved for <foe>)] [| plan: <fight plan>]— an easy wave lists only foe names and levels.(resumed, turn N)when the watcher started mid-battle. The plan part is a trainer battle's ♟ line:winnable · A › B, orlikely lost · ☠ <win condition> KOs n/m · <why>.DANGER w<wave> <our mon> ← <foe> <move> [(after acting, saved for <foe>)]the first time a 💀 appears mid-battle, once per mon per wave; also a likely KO right after acting, but only for a mon the fight plan saves for a later foe.LIKELY LOST w<wave> turn <n> | <fight plan>once per wave, when the fight plan turns into a likely loss mid-battle. Say what the plan says to salvage (chip the win condition, keep the saved mon healthy) before the user spends another mon.LEARN MOVE w<wave> <pokémon> wants <move> | has: <moves> | <pokémon> Atk<n>/SpA<n> | HUD: <verdict> [· ⚠ loses only <type> move]REWARDS w<wave> money $<n> reroll $<n> | free: … | shop: … | HUD: take X [→ <TM recipient> (forget <move>)] · buy Y [· reroll $<n> → <offers> (<verdict>) [~|!]] [| audit: N issues: <worst finding>](again after a reroll)COACH ERROR <msg>, once per distinct failure. Report it rather than staying silent.Orion is not running JavaScriptmeans Allow JavaScript from Apple Events has been switched off: ask the user to turn it back on.BIOME w<wave> | HUD: <biome> <score> pick — <reasons> · <other biome> <score>once per biome choice, only with the HUD running.ENCOUNTER w<wave> | HUD: <encounter>: take <option> — <outcome> · avoid <options>once per Mystery Encounter, only with the HUD running (your callwhen no option stands out,not judgedfor an encounter the card doesn't know).
Lines are summaries, because notifications truncate long ones. Run read.sh <browser> battle for detail: the snapshot has turn, hud (the panel's verdict, field ⚔ text, danger: our mons likely KO'd this turn, level ko before they act or after, with saveFor the foe the fight plan keeps that mon for, plan: the fight plan's line, learn, rewards, biome, encounter: the Mystery Encounter call, next: the next-wave
preview in one line, with its marks in brackets, ahead: the next big fight, its verdict and what makes it risky, and audit: the team audit's count and its top three findings), learn (pokémon + new move) and rewards (free / shop items with description and cost, reroll cost) when those screens are up.
The panel already shows the decision; the user glances at it mid-battle. Speak only when you add something.
- Easy wild wave: no reply.
- Catch: one line — catch or not, and why, if you'd weigh it differently from the panel.
- DANGER / boss: 2–3 lines, move first: what to click, then the threat and the out (switch, sacrifice, heal).
- Trainer: send-in order and the win condition, ≤4 lines. Don't repeat the ⚔ line; add ability traps from the rules below and what the plan can't see.
- Learn move: reply only if the HUD verdict is "your call" or you disagree — coverage the party loses (dropping the only Dark move), setup and status value, recoil, accuracy, spread moves in doubles.
- Rewards: when the
audit:part names a ✗ finding before a big fight, say what fixes it with this screen (a TM, a mushroom, a catch to look for); otherwise only what the HUD can't judge: held items (items), long-term team building, whether a reroll is worth it. Buy shop items before taking the free reward: taking it ends the screen. Don't quote item effects from memory; usedesc. - Biome: reply only to add what the card doesn't weigh: the evil-team boss or rival ahead (fixed battles aren't the biome's), a gym leader's signature mons beyond its type, a rare biome two steps away, or a close call the edge line doesn't settle.
- Mystery Encounter: reply when the card says
not judgedoryour call(read the options off the screenshot or the card and weigh them), or when the run's longer plan disagrees — a vitamin on the wrong mon, money the next boss shop needs, a biome detour before a gym.
Rules learned the hard way
- Never quote a starter cost from memory. PokéRogue costs differ from intuition (Bunnelby 3, Lechonk 2, Popplio 4). No
costin the read → ask the user to open the starter grid, or say costs are unverified. - Abilities come from the read, not the species' best ability. Hidden abilities (Huge Power, Gale Wings, Protean…) are only in play if
hiddenAbilityis true / the battle read shows them. - Check every enemy ability for traps before recommending a move: Dry Skin / Water Absorb / Volt Absorb / Flash Fire / Sap Sipper / Levitate (immunity or heal), Soundproof / Bulletproof / Wind Rider / Overcoat (move-flag immunity), Fluffy (halves contact), Simple (doubled stat stages), Guts (don't status it), Sturdy, Intimidate.
- Prefer special moves into Defense boosts, physical into Special Defense boosts; read
statStages(7 entries: atk, def, spa, spd, spe, acc, eva — no HP slot). - Compare Speed stats to say who moves first. Priority moves (Quick Attack, Fake Out) go before that.
- Flag danger unprompted: an on-field ally at low HP, a status condition, a move about to run out of PP.
Answer shape
Lead with the move (or pick). Then a short per-opponent plan: what to click, why (type, ability, stat), what to watch for. Tables for starter picks. Keep it scannable — the user is mid-battle.