SIMON Master Console Rebuild
True command center for SIMON + WEB360
This rebuild gives you a cleaner production spine: interactive tree, live viewer, guarded editor, dynamic graphics, architecture map, and note storage. It is designed to sit beside your existing
console.php
and become the stronger replacement path.
Dashboard
Tree
Viewer
System Map
File Registry
Notes
Files
15,279
Folders
408
Scanned Size
3.84 GB
PHP Files
891
Editable Text Files
12,540
File viewer
guarded to /htdocs
/wicked/being.php
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"/> <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover"/> <title>PANDORA LAB — Fake Original Factory (Prototype)</title> <meta name="theme-color" content="#070b16"/> <style> :root{ --bg:#060816; --panel:rgba(255,255,255,.075); --panel2:rgba(255,255,255,.045); --edge:rgba(255,255,255,.14); --edge2:rgba(255,255,255,.08); --txt:#edf4ff; --mut:#a7b5d7; --cyan:#6ae0ff; --ind:#7b62ff; --pink:#ff4fd6; --green:#4ee09f; --warn:#ffd166; --red:#ff667f; --r:20px; --shadow:0 24px 80px rgba(0,0,0,.45); } *{box-sizing:border-box} html,body{height:100%} body{ margin:0; color:var(--txt); font-family:Inter,system-ui,-apple-system,Segoe UI,Roboto,Arial,sans-serif; background: radial-gradient(1100px 700px at 10% 10%, rgba(123,98,255,.18), transparent 62%), radial-gradient(1000px 700px at 90% 18%, rgba(106,224,255,.14), transparent 60%), radial-gradient(1200px 900px at 50% 92%, rgba(255,79,214,.12), transparent 62%), linear-gradient(180deg, #070b16, #050813 50%, #070b16 100%); } canvas{position:fixed; inset:0; width:100%; height:100%; pointer-events:none} #energy{opacity:.55; filter:blur(10px)} .shell{ position:relative; z-index:2; display:grid; grid-template-columns: 390px 1fr 430px; gap:14px; height:100vh; padding:14px; } .panel{ background:linear-gradient(180deg, rgba(255,255,255,.085), rgba(255,255,255,.04)); border:1px solid var(--edge); border-radius:var(--r); box-shadow:var(--shadow), inset 0 0 45px rgba(106,224,255,.05); backdrop-filter:blur(18px) saturate(120%); overflow:hidden; min-height:0; } .head{ padding:16px 18px 12px; border-bottom:1px solid var(--edge2); background:linear-gradient(180deg, rgba(255,255,255,.04), rgba(255,255,255,.01)); } .head h1{margin:0;font-size:18px;letter-spacing:.06em} .head p{margin:8px 0 0;color:var(--mut);font-size:13px;line-height:1.35} .section{padding:14px 16px;border-bottom:1px solid rgba(255,255,255,.06)} .label{display:block;margin:0 0 8px;color:var(--mut);font-size:12px;letter-spacing:.08em;text-transform:uppercase} .grid{display:grid;grid-template-columns:1fr 1fr;gap:10px} .stat{ border:1px solid rgba(255,255,255,.08); background:rgba(0,0,0,.18); border-radius:16px; padding:12px; } .stat .k{color:var(--mut);font-size:11px;text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px} .stat .v{font-size:20px;font-weight:900} .meter{height:8px;background:rgba(255,255,255,.07);border-radius:999px;overflow:hidden;margin-top:10px} .meter>span{display:block;height:100%;border-radius:999px} input,select,textarea{ width:100%; border:1px solid var(--edge); background:rgba(0,0,0,.22); color:var(--txt); border-radius:14px; padding:10px 12px; outline:none; font-size:14px; } textarea{min-height:92px;resize:vertical} .btnrow{display:flex;flex-wrap:wrap;gap:8px} button{ border:1px solid var(--edge); background:rgba(255,255,255,.05); color:var(--txt); padding:10px 12px; border-radius:14px; cursor:pointer; font-weight:800; letter-spacing:.02em; transition:.15s ease; } button:hover{transform:translateY(-1px);border-color:rgba(106,224,255,.30)} button.primary{ background:linear-gradient(180deg, rgba(106,224,255,.28), rgba(123,98,255,.14)); border-color:rgba(106,224,255,.28); box-shadow:0 10px 26px rgba(106,224,255,.12); } button.danger{ background:linear-gradient(180deg, rgba(255,102,127,.26), rgba(255,209,102,.10)); border-color:rgba(255,102,127,.25); } .center{display:flex;flex-direction:column;min-height:0} .arena{ position:relative; flex:1; border-radius:var(--r); border:1px solid var(--edge); overflow:hidden; background: radial-gradient(circle at 50% 55%, rgba(106,224,255,.11), transparent 45%), radial-gradient(circle at 35% 30%, rgba(255,79,214,.10), transparent 48%), radial-gradient(circle at 70% 24%, rgba(123,98,255,.10), transparent 48%), rgba(255,255,255,.02); } #labCanvas{position:absolute;inset:0;width:100%;height:100%} .hud{ position:absolute;left:14px;right:14px;top:14px; display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap; pointer-events:none; } .pill{ pointer-events:auto; border:1px solid rgba(255,255,255,.10); background:rgba(6,10,22,.78); border-radius:999px; padding:10px 12px; color:var(--mut); font-size:12px; backdrop-filter:blur(12px); } .pill strong{color:var(--txt)} .log{ position:absolute;left:14px;right:14px;bottom:14px; border:1px solid rgba(255,255,255,.10); background:rgba(6,10,22,.72); border-radius:18px; padding:12px; max-height:33%; overflow:auto; backdrop-filter:blur(12px); } .log .t{font-size:12px;color:var(--mut);letter-spacing:.08em;text-transform:uppercase;margin-bottom:8px} .log ul{margin:0;padding:0 0 0 18px} .log li{margin:6px 0;color:#dbe7ff;font-size:13px;line-height:1.35} .right{display:flex;flex-direction:column;min-height:0} .content{padding:14px 16px;overflow:auto;flex:1} .card{ border:1px solid rgba(255,255,255,.08); background:rgba(255,255,255,.03); border-radius:18px; padding:12px; margin:0 0 10px; } .card .name{font-weight:950} .meta{font-size:11px;color:var(--mut);text-transform:uppercase;letter-spacing:.08em;margin-top:4px} .tiny{font-size:12px;color:var(--mut);line-height:1.45} .badge{ display:inline-flex;align-items:center;gap:6px; padding:6px 10px;border-radius:999px; border:1px solid rgba(255,255,255,.10); background:rgba(255,255,255,.04); font-size:12px;color:#dbe7ff; } .row{display:grid;grid-template-columns:1fr 1fr;gap:10px} @media (max-width: 1280px){ .shell{grid-template-columns: 390px 1fr;grid-template-rows:1fr 380px} .right{grid-column:1 / -1} } @media (max-width: 920px){ .shell{display:flex;flex-direction:column;height:auto;min-height:100vh} .panel{min-height:420px} .arena{min-height:70vh} } </style> </head> <body> <canvas id="stars"></canvas> <canvas id="energy"></canvas> <div class="shell"> <!-- LEFT --> <aside class="panel"> <div class="head"> <h1>PANDORA LAB</h1> <p>Forge <strong>Fake Originals</strong>, write <strong>Laws</strong>, and test beings in the wild. The Ledger remembers everything.</p> </div> <div class="section"> <span class="label">Global Meters</span> <div class="grid"> <div class="stat"> <div class="k">Entropy</div> <div class="v" id="mEntropy">—</div> <div class="meter"><span id="barEntropy"></span></div> </div> <div class="stat"> <div class="k">Truth Integrity</div> <div class="v" id="mTruth">—</div> <div class="meter"><span id="barTruth"></span></div> </div> <div class="stat"> <div class="k">Credits</div> <div class="v" id="mCred">—</div> <div class="meter"><span id="barCred"></span></div> </div> <div class="stat"> <div class="k">Autonomy Avg</div> <div class="v" id="mAuto">—</div> <div class="meter"><span id="barAuto"></span></div> </div> </div> <div class="tiny" style="margin-top:10px"> <strong>Rule:</strong> “Truth decays when monetized.” Selling truth tokens helps now, hurts later. </div> </div> <div class="section"> <span class="label">Canon Laws</span> <div class="card"> <div class="name">No mind may be owned</div> <div class="tiny">Coercion increases revolt + entropy.</div> </div> <div class="card"> <div class="name">Copies must declare themselves</div> <div class="tiny">Undeclared copies spike disputes and tracking noise.</div> </div> <div class="card"> <div class="name">Any being born of coercion loses sovereignty</div> <div class="tiny">Coercion-born become unstable “Null Claim” entities.</div> </div> <div class="card"> <div class="name">Truth decays when monetized</div> <div class="tiny">Selling “truth tokens” reduces Ledger integrity.</div> </div> </div> <div class="section"> <span class="label">Operations</span> <div class="btnrow"> <button class="primary" id="btnForge">Forge Being</button> <button id="btnRelease">Release to Biome</button> <button id="btnSellTruth">Sell Truth Token</button> <button class="danger" id="btnReset">Hard Reset</button> </div> <div class="tiny" style="margin-top:10px"> Release runs a quick wild simulation and writes survival history into the Ledger. </div> </div> <div class="section"> <span class="label">Save</span> <div class="tiny" id="saveTxt">Local save active.</div> </div> </aside> <!-- CENTER --> <main class="panel center"> <div class="arena" id="arena"> <canvas id="labCanvas"></canvas> <div class="hud"> <div class="pill"><strong>Ledger Count:</strong> <span id="ledgerCount">0</span></div> <div class="pill"><strong>Disputes:</strong> <span id="disputeCount">0</span></div> <div class="pill"><strong>Biome:</strong> <span id="biomeTxt">Neon Forest</span></div> </div> <div class="log"> <div class="t">Event Feed</div> <ul id="feed"></ul> </div> </div> </main> <!-- RIGHT --> <aside class="panel right"> <div class="head"> <h1>Pandora Box Forge</h1> <p>Build a being from template + memory + purpose + declaration. Undeclared copies are powerful… but dangerous.</p> </div> <div class="content"> <div class="section" style="padding:0 0 14px 0;border-bottom:none"> <span class="label">Build Parameters</span> <label class="label" style="margin-top:0">Name</label> <input id="bName" placeholder="Example: Lumen-13"/> <div class="row" style="margin-top:10px"> <div> <label class="label" style="margin-top:0">Form Template</label> <select id="bForm"> <option value="Flesh">Flesh</option> <option value="Metal">Metal</option> <option value="Hybrid">Hybrid</option> <option value="Ether">Ether</option> </select> </div> <div> <label class="label" style="margin-top:0">Purpose Directive</label> <select id="bPurpose"> <option value="Guardian">Guardian</option> <option value="Farmer">Farmer</option> <option value="Miner">Miner</option> <option value="Oracle">Oracle</option> <option value="Diplomat">Diplomat</option> <option value="Predator">Predator (Forbidden)</option> </select> </div> </div> <div class="row" style="margin-top:10px"> <div> <label class="label" style="margin-top:0">Memory Seed</label> <input id="bMem" type="range" min="0" max="100" value="55"/> <div class="tiny">Value: <span id="bMemTxt">55</span></div> </div> <div> <label class="label" style="margin-top:0">Declaration</label> <select id="bDecl"> <option value="Declared Copy">Declared Copy ✅</option> <option value="Undeclared">Undeclared ❌</option> </select> <div class="tiny">Undeclared boosts output, increases disputes.</div> </div> </div> <label class="label" style="margin-top:10px">Notes</label> <textarea id="bNotes" placeholder="Lineage patch notes, artifact source, dream seed details..."></textarea> <div class="btnrow" style="margin-top:10px"> <button class="primary" id="btnForge2">Forge + Add to Ledger</button> <button id="btnRandom">Randomize</button> </div> <div class="tiny" style="margin-top:10px"> Forge creates a ledger record. Release writes survival history. Disputes create court pressure. </div> </div> <div style="margin-top:10px"> <span class="label">Origin Ledger</span> <div id="ledgerList"></div> </div> </div> </aside> </div> <script> (()=> { const LS_KEY = "pandora_lab_proto_v1"; const S = { entropy: 22, truth: 82, credits: 35, disputes: 0, biome: "Neon Forest", ledger: [], particles: [], nodes: [] }; const $ = (id)=>document.getElementById(id); const feed = $("feed"); const clamp = (v,a=0,b=100)=>Math.max(a,Math.min(b,v)); const rnd = (a,b)=>a+Math.random()*(b-a); const pick = (arr)=>arr[Math.floor(Math.random()*arr.length)]; const esc = (s)=>String(s??"").replace(/[&<>"']/g,m=>({ "&":"&","<":"<",">":">",'"':""","'":"'" }[m])); const log = (msg)=>{ const li=document.createElement("li"); li.textContent=msg; feed.insertBefore(li, feed.firstChild); while(feed.children.length>14) feed.removeChild(feed.lastChild); }; function save(){ try{ localStorage.setItem(LS_KEY, JSON.stringify({ entropy:S.entropy, truth:S.truth, credits:S.credits, disputes:S.disputes, biome:S.biome, ledger:S.ledger })); $("saveTxt").textContent = "Saved locally ✅"; setTimeout(()=> $("saveTxt").textContent="Local save active.", 1200); }catch(e){ $("saveTxt").textContent = "Local save failed."; } } function load(){ try{ const raw=localStorage.getItem(LS_KEY); if(!raw) return; const j=JSON.parse(raw); if(!j) return; S.entropy = Number(j.entropy ?? S.entropy); S.truth = Number(j.truth ?? S.truth); S.credits = Number(j.credits ?? S.credits); S.disputes= Number(j.disputes ?? S.disputes); S.biome = String(j.biome ?? S.biome); if(Array.isArray(j.ledger)) S.ledger = j.ledger; }catch(e){} } function meter(el, v, grad){ el.style.width = clamp(v) + "%"; el.style.background = grad; } function autonomyAvg(){ if(!S.ledger.length) return 0; let sum=0; for(const b of S.ledger) sum += Number(b.autonomy||0); return sum / S.ledger.length; } function render(){ $("mEntropy").textContent = Math.round(S.entropy); $("mTruth").textContent = Math.round(S.truth); $("mCred").textContent = Math.round(S.credits); $("mAuto").textContent = Math.round(autonomyAvg()); meter($("barEntropy"), S.entropy, "linear-gradient(90deg, rgba(255,102,127,.9), rgba(255,209,102,.75))"); meter($("barTruth"), S.truth, "linear-gradient(90deg, rgba(78,224,159,.9), rgba(106,224,255,.75))"); meter($("barCred"), clamp(S.credits*2,0,100), "linear-gradient(90deg, rgba(255,209,102,.9), rgba(106,224,255,.85))"); meter($("barAuto"), autonomyAvg(), "linear-gradient(90deg, rgba(255,79,214,.85), rgba(123,98,255,.85))"); $("ledgerCount").textContent = S.ledger.length; $("disputeCount").textContent = S.disputes; $("biomeTxt").textContent = S.biome; renderLedger(); } function newId(){ return "b_" + Math.random().toString(16).slice(2) + "_" + Date.now().toString(36); } function genomeSig(form,purpose){ const a = form[0] + form.slice(-1); const p = purpose[0] + purpose.slice(-1); const salt = Math.random().toString(16).slice(2,6).toUpperCase(); return `${a}${p}-${salt}`; } function canonLawEffects(being){ // Baseline effects based on your four canon laws: // 1) No mind may be owned -> coercion increases revolt/entropy // 2) Copies must declare -> undeclared increases disputes/entropy // 3) Coercion-born loses sovereignty -> coercion-born unstable (autonomy erratic) // 4) Truth decays when monetized -> selling truth reduces truth integrity let ent=0, disp=0, truth=0; if(being.coercion){ ent += 6; disp += 1; being.sovereignty = "Null Claim"; being.autonomy = clamp(being.autonomy + rnd(-22, 22)); } if(being.declaration === "Undeclared"){ ent += 4; disp += 1; } else { truth += 1; // declared slightly helps system integrity } return {ent, disp, truth}; } function forge(){ const name = ($("bName").value||"").trim() || `Unit-${Math.floor(rnd(10,99))}`; const form = $("bForm").value; const purpose = $("bPurpose").value; const mem = Number($("bMem").value||55); const decl = $("bDecl").value; const notes = ($("bNotes").value||"").trim(); const coercion = (purpose==="Predator") || (mem<18 && Math.random()<0.35); // risky heuristic let autonomy = clamp((mem*0.72) + rnd(-10, 14)); if(decl==="Undeclared") autonomy = clamp(autonomy + 8); const being = { id: newId(), name, form, purpose, memory: mem, declaration: decl, coercion, sovereignty: coercion ? "Null Claim" : "Sovereign", truth_status: decl==="Undeclared" ? "Fake-Original" : "Copy", genome: genomeSig(form,purpose), autonomy: Math.round(autonomy), created: Date.now(), notes, lineage: { parents: [] }, survival: [] }; const fx = canonLawEffects(being); S.entropy = clamp(S.entropy + fx.ent); S.disputes += fx.disp; S.truth = clamp(S.truth + fx.truth); // Costs/benefits S.credits = clamp(S.credits - 2 + (decl==="Undeclared"? 2 : 0), 0, 9999); S.ledger.unshift(being); log(`FORGED: ${being.name} • ${being.form}/${being.purpose} • ${being.declaration}`); if(being.coercion) log(`⚠ COERCION FLAG: ${being.name} sovereignty set to Null Claim.`); $("bName").value=""; $("bNotes").value=""; save(); render(); // spawn a visual node spawnNode(being); } function release(){ if(!S.ledger.length){ log("RELEASE FAILED: no beings in the Ledger."); return; } const being = S.ledger[0]; // release newest (simple for prototype) const biome = S.biome; // Wild sim outcome influenced by stats + current meters const base = (being.autonomy/100) + (being.memory/140); const risk = (S.entropy/120) + (being.declaration==="Undeclared" ? 0.15 : 0) + (being.coercion?0.25:0); let survive = clamp((base - risk) * 100, 0, 100); survive += rnd(-12, 12); const lifespan = Math.max(1, Math.floor(rnd(3, 18) * (survive/70 + 0.4))); const mutation = Math.max(0, Math.floor(rnd(0, 8) + (S.entropy/18))); const disputeTrigger = (being.declaration==="Undeclared" && Math.random()<0.35) || (mutation>8 && Math.random()<0.2); const record = { biome, survived: survive>=50, lifespan_ticks: lifespan, mutation, note: survive>=50 ? "Adapted" : "Collapsed", ts: Date.now() }; being.survival.unshift(record); // global effects if(record.survived){ S.credits = clamp(S.credits + Math.floor(rnd(2,6))); S.truth = clamp(S.truth + 1); S.entropy = clamp(S.entropy - Math.floor(rnd(0,2))); log(`RELEASE: ${being.name} survived in ${biome} (${lifespan} ticks).`); } else { S.entropy = clamp(S.entropy + Math.floor(rnd(2,6))); S.truth = clamp(S.truth - 1); log(`RELEASE: ${being.name} failed in ${biome}. Entropy rises.`); } if(disputeTrigger){ S.disputes += 1; S.truth = clamp(S.truth - 2); log(`⚖ DISPUTE FILED: ${being.name} challenged for "originality".`); } // shift biome (prototype variety) S.biome = pick(["Neon Forest","Glass Desert","First City Ruins","Null Wetlands","Floating Slabs"]); save(); render(); burst(0.5,0.5, (record.survived?70:110), record.survived?2.8:3.8, record.survived?"pulse":"corrupt"); } function sellTruth(){ // “Truth decays when monetized” S.credits = clamp(S.credits + 12); S.truth = clamp(S.truth - 6); S.entropy = clamp(S.entropy + 2); log("BLACK MARKET: Sold a Truth Token 💰 — Ledger integrity decays."); save(); render(); } function hardReset(){ if(!confirm("Hard reset? This clears local save.")) return; localStorage.removeItem(LS_KEY); location.reload(); } function renderLedger(){ const el = $("ledgerList"); if(!S.ledger.length){ el.innerHTML = `<div class="tiny">No beings yet. Forge one in the Pandora Box.</div>`; return; } const items = S.ledger.slice(0,24); el.innerHTML = items.map(b=>{ const last = b.survival?.[0]; const surv = last ? `${last.biome}: ${last.survived?"SURVIVED":"FAILED"} (${last.lifespan_ticks}t)` : "Not released"; const flags = [ `<span class="badge">${esc(b.truth_status)}</span>`, `<span class="badge">${esc(b.sovereignty)}</span>`, b.coercion ? `<span class="badge" style="border-color:rgba(255,102,127,.35)">COERCION</span>` : "" ].join(" "); return ` <div class="card"> <div class="name">${esc(b.name)}</div> <div class="meta">${esc(b.form)} • ${esc(b.purpose)} • Memory ${b.memory} • Autonomy ${b.autonomy}</div> <div class="tiny" style="margin-top:8px">${flags}</div> <div class="tiny" style="margin-top:8px">Genome: <strong>${esc(b.genome)}</strong> • Decl: <strong>${esc(b.declaration)}</strong></div> <div class="tiny" style="margin-top:6px">Wild: <strong>${esc(surv)}</strong></div> ${b.notes?`<div class="tiny" style="margin-top:8px">Notes: ${esc(b.notes)}</div>`:""} </div> `; }).join(""); } // ---------- Visuals (simple lab nodes + particles) const arena = $("arena"); const c = $("labCanvas"); const ctx = c.getContext("2d"); function resize(){ const r = arena.getBoundingClientRect(); const dpr = Math.max(1, Math.min(2, devicePixelRatio||1)); c.width = Math.floor(r.width * dpr); c.height = Math.floor(r.height * dpr); ctx.setTransform(dpr,0,0,dpr,0,0); } addEventListener("resize", resize, {passive:true}); resize(); function spawnNode(being){ const w = arena.clientWidth, h = arena.clientHeight; S.nodes.push({ x: rnd(80, w-80), y: rnd(80, h-80), r: rnd(10, 18), vx: rnd(-0.25, 0.25), vy: rnd(-0.20, 0.20), hue: being.declaration==="Undeclared" ? 320 : 190 }); burst(rnd(0.3,0.7), rnd(0.3,0.7), 45, 2.2, being.declaration==="Undeclared"?"bang":"sun"); } function burst(nx, ny, count, speed, type){ const w = arena.clientWidth, h = arena.clientHeight; const x = nx*w, y = ny*h; for(let i=0;i<count;i++){ const a = Math.random()*Math.PI*2; const s = rnd(0.6,1.25)*speed*(0.7+Math.random()*0.7); S.particles.push({ x,y, vx:Math.cos(a)*s, vy:Math.sin(a)*s, life:rnd(40,140), type }); } } function tick(){ // soft global drift S.entropy = clamp(S.entropy + (S.disputes*0.003) - 0.005); S.truth = clamp(S.truth - (S.disputes*0.004) + 0.003); // nodes update for(const n of S.nodes){ n.x += n.vx; n.y += n.vy; if(n.x<20||n.x>arena.clientWidth-20) n.vx*=-1; if(n.y<20||n.y>arena.clientHeight-20) n.vy*=-1; } for(const p of S.particles){ p.x += p.vx; p.y += p.vy; p.vx *= 0.985; p.vy *= 0.985; p.life -= 1; } S.particles = S.particles.filter(p=>p.life>0); save(); // light autosave } function draw(){ ctx.clearRect(0,0,arena.clientWidth, arena.clientHeight); ctx.fillStyle = "rgba(0,0,0,0.18)"; ctx.fillRect(0,0,arena.clientWidth, arena.clientHeight); // links ctx.lineWidth = 1; for(let i=0;i<S.nodes.length;i++){ for(let j=i+1;j<S.nodes.length;j++){ const a=S.nodes[i], b=S.nodes[j]; const dx=a.x-b.x, dy=a.y-b.y; const d=Math.hypot(dx,dy); if(d<170){ const alpha = 0.14*(1-d/170); ctx.strokeStyle = `rgba(106,224,255,${alpha})`; ctx.beginPath(); ctx.moveTo(a.x,a.y); ctx.lineTo(b.x,b.y); ctx.stroke(); } } } // nodes for(const n of S.nodes){ const r = n.r; const g = ctx.createRadialGradient(n.x,n.y,0,n.x,n.y,r*3.2); g.addColorStop(0, `hsla(${n.hue},100%,70%,0.45)`); g.addColorStop(0.55, `hsla(${n.hue+40},100%,60%,0.18)`); g.addColorStop(1, "rgba(255,79,214,0)"); ctx.fillStyle=g; ctx.beginPath(); ctx.arc(n.x,n.y,r*3.2,0,Math.PI*2); ctx.fill(); ctx.fillStyle="rgba(234,244,255,0.92)"; ctx.beginPath(); ctx.arc(n.x,n.y,r,0,Math.PI*2); ctx.fill(); ctx.strokeStyle="rgba(255,255,255,0.35)"; ctx.beginPath(); ctx.arc(n.x,n.y,r+2,0,Math.PI*2); ctx.stroke(); } // particles for(const part of S.particles){ const a = Math.max(0, part.life/140); let color = `rgba(106,224,255,${0.35*a})`; if(part.type==="sun") color = `rgba(255,209,102,${0.42*a})`; if(part.type==="bang") color = `rgba(255,79,214,${0.40*a})`; if(part.type==="corrupt") color = `rgba(255,102,127,${0.34*a})`; if(part.type==="pulse") color = `rgba(78,224,159,${0.36*a})`; ctx.fillStyle=color; ctx.fillRect(part.x, part.y, 2.3, 2.3); } render(); requestAnimationFrame(draw); } // background FX const stars = document.getElementById("stars"); const energy = document.getElementById("energy"); const sctx = stars.getContext("2d"); const ectx = energy.getContext("2d"); let bgStars=[], bgPulses=[]; function resizeBG(){ const dpr = Math.max(1, Math.min(2, devicePixelRatio||1)); const w=innerWidth, h=innerHeight; stars.width=Math.floor(w*dpr); stars.height=Math.floor(h*dpr); energy.width=Math.floor(w*dpr); energy.height=Math.floor(h*dpr); stars.style.width=w+"px"; stars.style.height=h+"px"; energy.style.width=w+"px"; energy.style.height=h+"px"; sctx.setTransform(dpr,0,0,dpr,0,0); ectx.setTransform(dpr,0,0,dpr,0,0); bgStars=[]; for(let i=0;i<220;i++){ bgStars.push({x:rnd(0,w), y:rnd(0,h), r:rnd(0.4,2.1), o:rnd(0.2,0.95), vx:rnd(-0.06,0.06), vy:rnd(-0.04,0.04)}); } bgPulses=[]; for(let j=0;j<14;j++){ bgPulses.push({x:rnd(0,w), y:rnd(0,h), r:rnd(70,220), dr:rnd(0.2,0.45), hue:rnd(180,320), a:rnd(0.04,0.11)}); } } addEventListener("resize", resizeBG, {passive:true}); resizeBG(); function drawBG(){ const w=innerWidth, h=innerHeight; sctx.clearRect(0,0,w,h); ectx.clearRect(0,0,w,h); for(const s of bgStars){ s.x+=s.vx; s.y+=s.vy; if(s.x<0)s.x=w; if(s.x>w)s.x=0; if(s.y<0)s.y=h; if(s.y>h)s.y=0; sctx.beginPath(); sctx.fillStyle=`rgba(220,235,255,${s.o})`; sctx.arc(s.x,s.y,s.r,0,Math.PI*2); sctx.fill(); } for(const p of bgPulses){ p.r += p.dr; if(p.r>280){ p.x=rnd(0,w); p.y=rnd(0,h); p.r=rnd(60,110); } const g=ectx.createRadialGradient(p.x,p.y,0,p.x,p.y,p.r); const hue=Math.floor(p.hue); g.addColorStop(0, `hsla(${hue},100%,70%,${p.a})`); g.addColorStop(0.55, `hsla(${hue},100%,60%,${p.a*0.35})`); g.addColorStop(1, `hsla(${hue},100%,50%,0)`); ectx.fillStyle=g; ectx.beginPath(); ectx.arc(p.x,p.y,p.r,0,Math.PI*2); ectx.fill(); } requestAnimationFrame(drawBG); } // UI wiring $("bMem").addEventListener("input", ()=> $("bMemTxt").textContent = $("bMem").value); $("btnForge").addEventListener("click", forge); $("btnForge2").addEventListener("click", forge); $("btnRelease").addEventListener("click", release); $("btnSellTruth").addEventListener("click", sellTruth); $("btnReset").addEventListener("click", hardReset); $("btnRandom").addEventListener("click", ()=>{ $("bName").value = pick(["Lumen","Vanta","Echo","Orin","Nyx","Sable","Astra","Kairo"]) + "-" + Math.floor(rnd(10,99)); $("bForm").value = pick(["Flesh","Metal","Hybrid","Ether"]); $("bPurpose").value = pick(["Guardian","Farmer","Miner","Oracle","Diplomat"]); $("bMem").value = Math.floor(rnd(25,85)); $("bMemTxt").textContent = $("bMem").value; $("bDecl").value = pick(["Declared Copy","Undeclared"]); $("bNotes").value = pick([ "Artifact shard imprint. Lineage patched to reduce disputes.", "Dream-mass heavy. Behavior may self-author new myths.", "Forked from a prior unit. Declaration protocol uncertain.", "Test case: autonomy calibration; avoid coercion triggers." ]); }); // boot load(); if(!S.ledger.length){ log("BOOT: Pandora Lab online."); log("Tip: Forge a being. Undeclared copies boost output but raise disputes."); // seed a couple nodes for(let i=0;i<5;i++) S.nodes.push({x:rnd(80,700), y:rnd(80,420), r:rnd(10,18), vx:rnd(-0.25,0.25), vy:rnd(-0.2,0.2), hue: rnd(180,320)}); } else { log("BOOT: Loaded saved Ledger."); } render(); setInterval(tick, 800); requestAnimationFrame(draw); requestAnimationFrame(drawBG); })(); </script> </body> </html>
Save file
Quick jump
open a path
Open