let webkit; try { ({ webkit } = await import('playwright')); } catch (e) { ({ webkit } = await import('file:///C:/平成ゾンビ学園/node_modules/playwright/index.mjs')); } import http from 'http'; import fs from 'fs'; import path from 'path'; const ROOT='C:/石とゾンビ'; const pick=u=>{const a=path.join(ROOT,'public',u); return fs.existsSync(a)?a:path.join(ROOT,u);}; const srv=http.createServer((q,r)=>{let u=decodeURIComponent(q.url.split('?')[0]);if(u==='/')u='/index.html'; fs.readFile(pick(u),(e,d)=>{if(e){r.writeHead(404);r.end();return;} r.writeHead(200,{'Content-Type':u.endsWith('.js')?'text/javascript':'text/html'});r.end(d);});}); await new Promise(ok=>srv.listen(8855,ok)); const b=await webkit.launch(); const p=await b.newPage({viewport:{width:390,height:797}}); const errs=[]; p.on('pageerror',e=>errs.push(String(e.message).slice(0,160))); await p.goto('http://localhost:8855/index.html',{waitUntil:'load'}); await p.waitForTimeout(900); const out=await p.evaluate(()=>{ const res=[]; for(const d of [0.44,0.6,0.8,1.0,1.2]){ let kill=0,knock=0,miss=0,angs=[]; for(let a=14;a<=84;a+=2) for(let k=1;k<=10;k++){ const o=window.ZG.trial(d,a,k/10); if(o.r==='kill'){kill++;angs.push(a);} else if(o.r==='knock')knock++; else miss++; } res.push({d,kill,knock,miss,lo:angs.length?Math.min(...angs):0,hi:angs.length?Math.max(...angs):0}); } // 大岩も見る let rk=0,rn=0,rm=0; for(const d of [2,3,4,5]) for(let a=14;a<=84;a+=4) for(let k=2;k<=10;k+=2){ const o=window.ZG.trial(d,a,k/10,true); if(o.r==='kill')rk++; else if(o.r==='knock')rn++; else rm++; } return {res,rock:{rk,rn,rm}}; }); console.log('取り付かれた時の自力脱出(近い距離)'); console.log('距離 倒した 押した 外れ 倒せる角度'); for(const r of out.res) console.log((r.d+'m').padEnd(7)+String(r.kill).padEnd(8)+String(r.knock).padEnd(8)+String(r.miss).padEnd(7)+(r.kill?r.lo+'〜'+r.hi+'度':'—')); console.log('\n大岩(2〜5m・360通り): 倒した '+out.rock.rk+' / 押した '+out.rock.rn+' / 外れ '+out.rock.rm); console.log('JSエラー: '+(errs.length?errs.join(' / '):'なし')); await b.close(); srv.close(); process.exit(0);