"""Straight-up bagged sand nozzle in the real pixel frame loop.""" import pathlib import sys sys.path.insert(0, str(pathlib.Path(__file__).resolve().parents[1] / 'tools')) from use_venv import ensure_playwright; ensure_playwright() from browser import launch, consume_gpu_option, capabilities consume_gpu_option() ROOT = pathlib.Path(__file__).resolve().parents[1] with launch(viewport={'width': 1440, 'height': 900}) as (_, page, url): errors = [] page.on('pageerror', lambda e: errors.append(str(e))) page.goto(url) print('GPU', capabilities(page), flush=True) page.evaluate("""() => { const enter=enterGame;enterGame=()=>{enter();GAME.paused=true;}; SET.workerCap=2;SET.maxSteps=1;SET.fog=false;SET.lighting='off';SET.cameraLead=false;SET.autosave=0; startNewWorld(7,768,600); }""") page.wait_for_function('GAME.running', timeout=60000) for file in ('pile-cut', 'pile-blow'): page.evaluate((ROOT / f'test/{file}.js').read_text()) page.evaluate("""() => { pileBlowSetup();renderDirty.fill(1);GPU.world=null;SM.surf=-1; document.querySelectorAll('.card,.toast').forEach(e=>e.remove()); $('hud').hidden=true;GAME.hidePreviews=true;SET.zoom=3;resizeRender(); snapCamera();updateCamera=()=>{}; }""") page.evaluate('startThreads()') page.evaluate("""() => { simPool.force=true;window.blowTicks=0;window.blowEnd=0; const tool=toolTick;toolTick=()=>{tool();if(blowTicks<1200){pileBlowStroke();blowTicks++;}}; const advance=simTick;simTick=()=>{ advance(); if(blowTicks===1200 && !blowEnd){blowEnd=tick;window.blowBefore=pileBlowProfile();GAME.paused=true;} else if(blowEnd && tick===blowEnd+480){window.blowAfter=pileBlowProfile();GAME.paused=true;} }; GAME.paused=false; }""") page.wait_for_function('window.blowBefore', timeout=120000) print('before', page.evaluate('blowBefore'), flush=True) page.screenshot(path=str(ROOT / 'shots/t93c-before.png')) page.evaluate('() => {bot.x=700;bot.y=100;GAME.paused=false;}') page.wait_for_function('window.blowAfter', timeout=60000) result=page.evaluate('({before:blowBefore,after:blowAfter,helpers:simPool.activeMax})') page.screenshot(path=str(ROOT / 'shots/t93c-after.png')) print('result', result, flush=True) assert result['before']['grains']>15000 and result['before']['height']>100, result assert result['after']['cliff']<=2 and result['helpers']>0, result assert sum(result['after'][k] for k in ('grains','flying','bag'))==40000, result assert not errors, errors print('PASS upward nozzle pile collapses within 480 real-loop ticks with active helpers')