Tool messages show as toasts, the card status line is gone (t27)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
+19
-2
@@ -306,9 +306,10 @@ with sync_playwright() as p:
|
||||
ore = find_ore()
|
||||
suck_at(*ore, ms=500, shift=True)
|
||||
check('Shift held standing still takes everything', ev('bag[RSTONE]') > 0 and ev('bag[CUORE]') > 0, f"ore {ev('bag[CUORE]')}, stone {ev('bag[RSTONE]')}")
|
||||
ev("GAME.aim = { x: Math.floor(bot.x), y: 1 }")
|
||||
ev("$('toasts').innerHTML = ''; GAME.aim = { x: Math.floor(bot.x), y: 1 }")
|
||||
pg.keyboard.press('f'); settle(100)
|
||||
check('F away from usable things says nothing to use', ev("$('m-dialog').hidden && GAME.status === 'Nothing to use there.'"))
|
||||
check('F away from usable things shows exactly one info toast', ev("[...document.querySelectorAll('#toasts .toast.info')].filter(e => e.textContent === 'Nothing to use there.').length === 1"))
|
||||
ev("closeModal('m-dialog')")
|
||||
# zoom jumps straight to the bot
|
||||
pg.mouse.move(640, 400); settle(600)
|
||||
@@ -338,6 +339,19 @@ with sync_playwright() as p:
|
||||
check('a material selected before you have any stays selected', ev("(() => { GAME.blow = new Set([COAL]); const n = bagTotal, f = flyers.length; GAME.rmb = true; secondaryPress(false); toolTick(); GAME.rmb = false; return GAME.blow.has(COAL); })()"))
|
||||
check('selected but none in bag blows nothing', ev("(() => { const n = bagTotal, f = flyers.length; GAME.rmb = true; secondaryPress(false); toolTick(); GAME.rmb = false; renderSelCard(); return bagTotal === n && flyers.length === f && GAME.status === 'None of the selected materials are in the bag.' && $('selcard').querySelector('.vacchoice').textContent === 'none in bag'; })()"))
|
||||
check('nothing selected blows nothing and explains how to choose', ev("(() => { GAME.blow.clear(); const n = bagTotal, f = flyers.length; GAME.rmb = true; secondaryPress(false); toolTick(); GAME.rmb = false; return bagTotal === n && flyers.length === f && GAME.status === 'Nothing selected: click or Q/E in the bag.'; })()"))
|
||||
ev("$('toasts').innerHTML = ''; GAME.blow.clear(); GAME.rmb = true; secondaryPress(false); for (let i = 0; i < 30; i++) toolTick(); GAME.rmb = false; renderSelCard()")
|
||||
check('holding blow with nothing selected shows exactly one error toast', ev("[...document.querySelectorAll('#toasts .toast.err')].filter(e => e.textContent.includes('Nothing selected')).length === 1"))
|
||||
check('the tool card has no status line', ev("document.querySelector('#selcard .status') === null"))
|
||||
pg.wait_for_timeout(300)
|
||||
pg.screenshot(path=str(out / '03b-empty-selection-toast.png'))
|
||||
ev("""(() => {
|
||||
$('toasts').innerHTML = '';
|
||||
const tool = GAME.tool, aim = GAME.aim;
|
||||
GAME.tool = 3; GAME.aim = { x: bot.x + 500, y: bot.y }; GAME.lmb = true;
|
||||
for (let i = 0; i < 30; i++) toolTick();
|
||||
GAME.lmb = false; GAME.tool = tool; GAME.aim = aim;
|
||||
})()""")
|
||||
check('holding the Igniter out of reach shows exactly one error toast', ev("[...document.querySelectorAll('#toasts .toast.err')].filter(e => e.textContent === 'Out of reach.').length === 1"))
|
||||
check('a mix drops exhausted coal and continues blowing ore', ev("(() => { const b = bag.slice(), total = bagTotal, f = flyers.length; bag.fill(0); bag[COAL] = 1; bag[CUORE] = 100; bagTotal = 101; GAME.blow = new Set([COAL, CUORE]); GAME.rmb = true; secondaryPress(false); toolTick(); const ore = bag[CUORE]; toolTick(); GAME.rmb = false; const ok = !bag[COAL] && ore > 0 && bag[CUORE] < ore && GAME.blow.size === 1 && GAME.blow.has(CUORE); bag.set(b); bagTotal = total; flyers.length = f; return ok; })()"))
|
||||
# Shift + right click blows an even mix of everything loose in the bag, without changing the choice
|
||||
refill('bag[COAL] = 60; bag[CUORE] = 60')
|
||||
@@ -482,8 +496,9 @@ with sync_playwright() as p:
|
||||
pg.keyboard.press(key); settle(150)
|
||||
check(f'tool {key} restores the top-left card', pg.is_visible('#selcard'))
|
||||
pg.keyboard.press('3'); settle(150)
|
||||
ev("$('toasts').innerHTML = ''")
|
||||
pg.mouse.click(*cell_to_screen(bx, gy - 20), button='middle'); settle(120)
|
||||
check('empty middle-click pick shows its status in the top-left card', 'Nothing built here to pick.' in pg.inner_text('#selcard'))
|
||||
check('empty middle-click pick shows its status in one info toast', ev("GAME.status === 'Nothing built here to pick.' && [...document.querySelectorAll('#toasts .toast.info')].filter(e => e.textContent === GAME.status).length === 1"))
|
||||
c0 = ev('GAME.buildCat != null ? GAME.buildCat : catOf(piece().id)')
|
||||
pg.keyboard.press('Shift+E')
|
||||
check('Shift+E switches build tabs and selects a piece in the tab', ev('GAME.buildCat') == (c0 + 1) % ev('BUILD_CATS.length') and ev('BUILD_CATS[GAME.buildCat][1].includes(piece().id)'))
|
||||
@@ -554,10 +569,12 @@ with sync_playwright() as p:
|
||||
check('F on an automatic ingot mold stays quiet without a toast', ev("$('m-dialog').hidden") and ev("$('toasts').children.length") == n_toasts)
|
||||
ev("closeModal('m-dialog')")
|
||||
check('F with vacuum still uses what is in reach', ev("""(() => {
|
||||
$('toasts').innerHTML = '';
|
||||
const old = interactAt; interactAt = () => 'Gate opened.';
|
||||
try { doInteract(); } finally { interactAt = old; }
|
||||
return $('m-dialog').hidden && GAME.status === 'Gate opened.';
|
||||
})()"""))
|
||||
check('a successful F interaction shows its message exactly once', ev("[...$('toasts').children].filter(e => e.textContent === 'Gate opened.').length === 1"))
|
||||
settle(1500)
|
||||
pg.screenshot(path=str(out / '06-bars.png'))
|
||||
pg.keyboard.press('2'); settle(60)
|
||||
|
||||
Reference in New Issue
Block a user