import { launch, CDP } from './cdpshot.mjs'; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); const { url: wsUrl, kill } = await launch('http://localhost:8080/index.html', undefined, 1280, 720, 5000); const cdp = new CDP(wsUrl); await cdp.open(); await cdp.send('Runtime.enable'); const ev = async (expression) => { const r = await cdp.send('Runtime.evaluate', { expression, returnByValue: true, awaitPromise: true }); if (r.exceptionDetails) throw new Error('eval: ' + (r.exceptionDetails.exception?.description ?? r.exceptionDetails.text)); return r.result?.value; }; const toClient = (x, y) => `(() => { const c = window.game.canvas; const r = c.getBoundingClientRect(); const z = r.width / c.width; return [r.left + ${x} * z, r.top + ${y} * z]; })()`; async function click(cx, cy) { await cdp.send('Input.dispatchMouseEvent', { type: 'mouseMoved', x: cx, y: cy }); await sleep(80); await cdp.send('Input.dispatchMouseEvent', { type: 'mousePressed', x: cx, y: cy, button: 'left', clickCount: 1 }); await sleep(100); await cdp.send('Input.dispatchMouseEvent', { type: 'mouseReleased', x: cx, y: cy, button: 'left', clickCount: 1 }); await sleep(80); } let menuUp = false; for (let i = 0; i < 120 && !menuUp; i++) { await sleep(500); menuUp = await ev(`!!(window.game && window.game.scene.isActive('MenuScene'))`); } if (!menuUp) throw new Error('no menu'); await sleep(4200); const mb = await ev(`(() => { const m = window.game.scene.getScene('MenuScene'); return [m.newGameBtn.x, m.newGameBtn.y]; })()`); await click(...(await ev(toClient(mb[0], mb[1])))); let gameUp = false; for (let i = 0; i < 240 && !gameUp; i++) { await sleep(500); gameUp = await ev(`!!(window.game && window.game.scene.isActive('GameScene') && window.game.scene.getScene('GameScene').ship)`); } if (!gameUp) throw new Error('no game'); await sleep(1000); const [cx, cy] = await ev(toClient(1143.33, 680)); // move pointer over the slot first (so world pointer is set) await cdp.send('Input.dispatchMouseEvent', { type: 'mouseMoved', x: cx, y: cy }); await sleep(250); const dump = await ev(`(() => { const g = window.game; const p = g.input.activePointer; const objs = g.input.interactionObjects.slice().sort((a, b) => a.sortOrder - b.sortOrder); const under = []; for (const o of objs) { try { const hit = o.hitArea ? o.hitTest(p) : false; if (hit) under.push({ name: o.name || o.type || o.constructor?.name, so: o.sortOrder, scene: o.scene?.scene?.key, enabled: o.input.enabled, x: o.worldX ?? o.x, y: o.worldY ?? o.y }); } catch (e) {} } return { pointer: [p.x, p.y], count: objs.length, under }; })()`); console.log(JSON.stringify(dump, null, 1)); cdp.close(); kill();