RELEASE
planning/2.8.5/mockups/FO3/audit-u9-zoom.mjs
sha256 2bdc70797320a9ad · 2213 bytes ·
original held in the private archive
import { chromium } from 'playwright';
import { fileURLToPath } from 'url';
import path from 'path';
const ROOT = path.join(path.dirname(fileURLToPath(import.meta.url)), '..', '..', '..');
const INDEX = 'file://' + path.join(ROOT, 'index.html').split(path.sep).join('/');
const OUT = path.join(ROOT, 'planning', 'mockups', 'fo3');
const save = { activeContext: 'FO3', campaigns: { FO3: { lvl:12, hpCur:18, hpMax:100, rads:850, caps:350, la:'CRIPPLED', ra:'OK', ll:'OK', rl:'OK', hd:'OK', s_s:6,s_p:7,s_e:5,s_c:4,s_i:8,s_a:6,s_l:5, inventory: Array.from({length:24},(_,i)=>({name:'Test Item '+i,qty:15,wgt:1,val:10,type:i%2?'weapon':'aid'})), collectibles:[], perks:[], status:[{name:'Well Rested',ticks:4,type:'BUFF'}] } } };
const b = await chromium.launch();
const ctx = await b.newContext({ viewport:{width:780,height:360}, hasTouch:true, isMobile:true });
await ctx.addInitScript(s=>localStorage.setItem('robco_v8',JSON.stringify(s)), save);
const page = await ctx.newPage();
await page.goto(INDEX); await page.waitForTimeout(2200);
await page.evaluate(()=>window.selectSubsystem&&window.selectSubsystem('operator')); await page.waitForTimeout(200);
await page.evaluate(()=>{const x=[...document.querySelectorAll('#fo3SubtabRail button')].find(z=>z.textContent.trim()==='STATUS'); if(x)x.click();}); await page.waitForTimeout(300);
// 3x zoom crops
await page.screenshot({ path: path.join(OUT,'audit-u9-zoom-topstrip.png'), clip:{x:80,y:30,width:620,height:30} });
await page.screenshot({ path: path.join(OUT,'audit-u9-zoom-radexp.png'), clip:{x:90,y:230,width:260,height:30} });
await page.screenshot({ path: path.join(OUT,'audit-u9-zoom-larm.png'), clip:{x:390,y:75,width:200,height:60} });
// what is the 'Inserved' fragment? dump text nodes near L.ARM
const near = await page.evaluate(()=>{
const out=[];
document.querySelectorAll('#opHarnessPanel *').forEach(el=>{
const t=[...el.childNodes].filter(n=>n.nodeType===3).map(n=>n.textContent.trim()).filter(Boolean).join('|');
if(t) out.push({tag:el.tagName,cls:el.className.toString().slice(0,30),id:el.id,text:t.slice(0,40),color:getComputedStyle(el).color});
});
return out;
});
console.log(JSON.stringify(near,null,1));
await b.close();
STAMP · generated for RELEASE v2.8.5 commit 06e5180 (06e51801b38a) · archive input-tree hash c07fbfbdd2e1ddeb · 754 files · no wall-clock timestamp (regenerates identically when nothing changed).