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,026
Folders
377
Scanned Size
3.79 GB
PHP Files
791
Editable Text Files
12,310
File viewer
guarded to /htdocs
/arcade/games/Simon_field.html
<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width,initial-scale=1,viewport-fit=cover" /> <title>SIMON • Particle Field — FX Edition</title> <style> html,body{height:100%;width:100%;margin:0;padding:0;background:#050a15;color:#eaf2ff;font:15px/1.3 system-ui,Segoe UI,Roboto,Arial;overflow:hidden} canvas{position:fixed;inset:0;display:block} #bg{z-index:0} #fx{z-index:1} #ui{z-index:2} .hud{position:fixed;top:12px;left:50%;transform:translateX(-50%);z-index:3;background:rgba(255,255,255,.06);border:1px solid rgba(157,195,255,.28);backdrop-filter:blur(8px);border-radius:10px;padding:8px 12px;font-weight:800;white-space:nowrap} .legend{position:fixed;bottom:12px;left:50%;transform:translateX(-50%);z-index:3;opacity:.9;color:#a8b6d9;font-weight:800;text-shadow:0 2px 10px rgba(0,0,0,.6);background:rgba(0,0,0,.2);border:1px solid rgba(157,195,255,.2);border-radius:10px;padding:8px 10px} .chip{padding:.2em .5em;border:1px solid rgba(157,195,255,.35);border-radius:999px;background:rgba(255,255,255,.06);color:#cfe3ff;margin:0 .15em} </style> </head> <body> <canvas id="bg"></canvas> <canvas id="fx"></canvas> <canvas id="ui"></canvas> <div class="hud" id="hud">Particles: 12,000 • Trails ON • Shimmer ON • Sparks ON • Vortex ON</div> <div class="legend"> <span class="chip">Click</span> gravity burst <span class="chip">Hold & drag</span> stir flow <span class="chip">1</span> Trails <span class="chip">2</span> Shimmer <span class="chip">3</span> Sparks <span class="chip">4</span> Vortex <span class="chip">R</span> Reset </div> <script> const bg=document.getElementById('bg'), g=bg.getContext('2d',{alpha:true}); const fx=document.getElementById('fx'), gx=fx.getContext('2d',{alpha:true}); const ui=document.getElementById('ui'), gg=ui.getContext('2d',{alpha:true}); const HUD=document.getElementById('hud'); let DPR=1,W=0,H=0; function resize(){ DPR=Math.min(2, devicePixelRatio||1); W=innerWidth; H=innerHeight; for(const c of [bg,fx,ui]){ c.width=W*DPR; c.height=H*DPR; c.style.width='100vw'; c.style.height='100vh'; } for(const ctx of [g,gx,gg]){ ctx.setTransform(DPR,0,0,DPR,0,0); } } addEventListener('resize', resize); // Perlin curl const P=new Uint8Array(512); (function(){ for(let i=0;i<256;i++) P[i]=i; for(let i=255;i>0;i--){ const j=(Math.random()*i)|0; [P[i],P[j]]=[P[j],P[i]] } for(let i=0;i<256;i++) P[i+256]=P[i]; })(); const fade=t=>t*t*t*(t*(t*6-15)+10); const grad=(h,x,y)=>((h&1)?-x:x)+((h&2)?-y:y); function noise2(x,y){ const X=Math.floor(x)&255,Y=Math.floor(y)&255; x-=Math.floor(x); y-=Math.floor(y); const u=fade(x),v=fade(y),A=P[X]+Y,B=P[X+1]+Y; const n0=grad(P[A],x,y),n1=grad(P[B],x-1,y),n2=grad(P[A+1],x,y-1),n3=grad(P[B+1],x-1,y-1); const nx0=n0+(n1-n0)*u,nx1=n2+(n3-n2)*u; return nx0+(nx1-nx0)*v; } const FIELD_BASE=0.0017; function curl(x,y,t,intens=1){ const s=FIELD_BASE*(0.9+0.35*Math.sin(t*0.18)), e=0.0005; const nx=x*s+Math.sin(t*0.13)*2, ny=y*s+Math.cos(t*0.11)*2; const n1=noise2(nx,ny+e), n2=noise2(nx,ny-e), n3=noise2(nx+e,ny), n4=noise2(nx-e,ny); const dx=(n1-n2)/(2*e), dy=(n3-n4)/(2*e); return [dy*intens, -dx*intens]; } // Particles const COUNT=12000; let px,py,vx,vy; function initParticles(n=COUNT){ px=new Float32Array(n); py=new Float32Array(n); vx=new Float32Array(n); vy=new Float32Array(n); for(let i=0;i<n;i++){ px[i]=Math.random()*W; py[i]=Math.random()*H; vx[i]=(Math.random()*2-1)*0.2; vy[i]=(Math.random()*2-1)*0.2; } } // FX const wells=[], vortices=[], sparks=[], shimmers=[]; const flags={trails:true, shimmer:true, sparks:true, vortex:true}; function updateHUD(){ HUD.textContent=`Particles: ${px.length.toLocaleString()} • Trails ${flags.trails?'ON':'OFF'} • Shimmer ${flags.shimmer?'ON':'OFF'} • Sparks ${flags.sparks?'ON':'OFF'} • Vortex ${flags.vortex?'ON':'OFF'}`; } function spawnWell(x,y,strength=1100,life=1.6){ wells.push({x,y,age:0,life,strength,radius:20}); if(flags.shimmer) shimmers.push({x,y,age:0,life:0.6,r:26}); if(flags.sparks) addSparks(x,y,200+Math.random()*80,40,280); } function spawnVortex(x,y,spin=(Math.random()<0.5?-1:1)*0.002,pull=900,life=4){ vortices.push({x,y,age:0,life,spin,pull,radius:24}); } function addSparks(x,y,hue=220,count=36,sp=240){ for(let i=0;i<count;i++){ const a=Math.random()*Math.PI*2, s=80+Math.random()*sp; sparks.push({x,y,vx:Math.cos(a)*s,vy:Math.sin(a)*s,life:0.6+Math.random()*0.6,h:hue}); } } let dragging=false,lastX=0,lastY=0; ui.addEventListener('pointerdown',e=>{ dragging=true; lastX=e.clientX; lastY=e.clientY; spawnWell(e.clientX,e.clientY,1400,1.2); if(flags.vortex && Math.random()<0.4) spawnVortex(e.clientX,e.clientY); }); ui.addEventListener('pointermove',e=>{ if(!dragging) return; const dx=e.clientX-lastX, dy=e.clientY-lastY; const r=62, r2=r*r; for(let i=0;i<px.length;i+=3){ const ddx=px[i]-e.clientX, ddy=py[i]-e.clientY; if(ddx*ddx+ddy*ddy<r2){ vx[i]+=dx*2; vy[i]+=dy*2; } } lastX=e.clientX; lastY=e.clientY; if(flags.shimmer) shimmers.push({x:e.clientX,y:e.clientY,age:0,life:0.5,r:18}); }); addEventListener('pointerup',()=> dragging=false); addEventListener('keydown',e=>{ const k=e.key; if(k==='1') flags.trails=!flags.trails; if(k==='2') flags.shimmer=!flags.shimmer; if(k==='3') flags.sparks=!flags.sparks; if(k==='4') flags.vortex=!flags.vortex; if(k.toLowerCase()==='r'){ wells.length=0; vortices.length=0; sparks.length=0; shimmers.length=0; initParticles(px.length); } updateHUD(); }); let last=performance.now(); function loop(){ const now=performance.now(); const dt=Math.min(0.033,(now-last)/1000); last=now; // trails g.fillStyle=`rgba(5,10,22,${flags.trails?0.08:0.16})`; g.fillRect(0,0, W,H); // particles g.globalCompositeOperation='lighter'; g.fillStyle=`hsla(${(now*0.04)%360},95%,60%,0.07)`; for(let i=0;i<px.length;i++){ const f=curl(px[i],py[i],now*0.001,1); vx[i]=vx[i]*0.985 + f[0]*24*dt + (Math.random()*2-1)*0.1*dt; vy[i]=vy[i]*0.985 + f[1]*24*dt + (Math.random()*2-1)*0.1*dt; for(const w of wells){ const dx=w.x-px[i], dy=w.y-py[i], d2=dx*dx+dy*dy+40, inv=1/d2; const phase=w.age/w.life; const outward=(phase<0.22)?(1-(phase/0.22)):0, inward=phase; vx[i]+= (dx*inv*w.strength*0.00004*inward) - (dx*inv*w.strength*0.00003*outward); vy[i]+= (dy*inv*w.strength*0.00004*inward) - (dy*inv*w.strength*0.00003*outward); } if(flags.vortex) for(const v of vortices){ const dx=v.x-px[i], dy=v.y-py[i], d=Math.hypot(dx,dy)+0.001, inv=1/(d*d); vx[i]+= (-dy)*v.spin*24; vy[i]+= (dx)*v.spin*24; vx[i]+= dx*inv*v.pull*0.00005; vy[i]+= dy*inv*v.pull*0.00005; } px[i]+=vx[i]; py[i]+=vy[i]; if(px[i]<-2) px[i]+=W+4; else if(px[i]>W+2) px[i]-=W+4; if(py[i]<-2) py[i]+=H+4; else if(py[i]>H+2) py[i]-=H+4; g.fillRect(px[i],py[i],1.2,1.2); } g.globalCompositeOperation='source-over'; // FX layer gx.clearRect(0,0,W,H); for(let i=wells.length-1;i>=0;i--){ const w=wells[i]; w.age+=dt; w.radius+=420*dt; const a=1-(w.age/w.life); const hue=((w.age*220)|0)%360; gx.strokeStyle=`hsla(${hue},100%,70%,${0.5*a})`; gx.lineWidth=2.2; gx.beginPath(); gx.arc(w.x,w.y,w.radius,0,Math.PI*2); gx.stroke(); const grad=gx.createRadialGradient(w.x,w.y,0,w.x,w.y,w.radius*0.7); grad.addColorStop(0,`hsla(${(hue+30)%360},100%,70%,${0.22*a})`); grad.addColorStop(1,`hsla(${(hue+30)%360},100%,70%,0)`); gx.fillStyle=grad; gx.beginPath(); gx.arc(w.x,w.y,w.radius*0.7,0,Math.PI*2); gx.fill(); if(w.age>w.life) wells.splice(i,1); } if(flags.vortex){ for(let i=vortices.length-1;i>=0;i--){ const v=vortices[i]; v.age+=dt; v.radius+=60*dt; const p=v.age/v.life; gx.strokeStyle=`hsla(${(280+p*100)|0},100%,70%,0.35)`; gx.lineWidth=2; gx.beginPath(); gx.arc(v.x,v.y,v.radius,0,Math.PI*2); gx.stroke(); if(v.age>v.life) vortices.splice(i,1); } } if(flags.sparks){ for(let i=sparks.length-1;i>=0;i--){ const s=sparks[i]; s.life-=dt; s.x+=s.vx*dt; s.y+=s.vy*dt; s.vx*=0.985; s.vy*=0.985; gx.fillStyle=`hsla(${s.h},100%,70%,${Math.max(0,s.life)})`; gx.fillRect(s.x,s.y,2,2); if(s.life<=0) sparks.splice(i,1); } } if(flags.shimmer){ for(let i=shimmers.length-1;i>=0;i--){ const b=shimmers[i]; b.age+=dt; b.r+=180*dt; const a=Math.max(0,0.18*(1-b.age/b.life)); gx.strokeStyle=`rgba(255,255,255,${a})`; gx.lineWidth=1.5; gx.beginPath(); gx.arc(b.x,b.y,b.r,0,Math.PI*2); gx.stroke(); if(b.age>b.life) shimmers.splice(i,1); } } // UI overlay gg.clearRect(0,0,W,H); if(dragging){ gg.strokeStyle='rgba(200,230,255,.6)'; gg.lineWidth=1.5; gg.beginPath(); gg.arc(lastX,lastY,22,0,Math.PI*2); gg.stroke(); gg.beginPath(); gg.moveTo(lastX-26,lastY); gg.lineTo(lastX+26,lastY); gg.moveTo(lastX,lastY-26); gg.lineTo(lastX,lastY+26); gg.stroke(); } requestAnimationFrame(loop); } function boot(){ resize(); initParticles(); updateHUD(); setTimeout(()=>spawnWell(W*0.3,H*0.5,1200,1.4), 200); setTimeout(()=>spawnWell(W*0.7,H*0.4,1200,1.4), 600); requestAnimationFrame(loop); } boot(); </script> </body> </html>
Save file
Quick jump
open a path
Open