{"id":64,"date":"2026-06-18T09:48:28","date_gmt":"2026-06-18T07:48:28","guid":{"rendered":"https:\/\/soliddesign.fr\/?page_id=64"},"modified":"2026-06-18T09:52:13","modified_gmt":"2026-06-18T07:52:13","slug":"game","status":"publish","type":"page","link":"https:\/\/soliddesign.fr\/index.php\/game\/","title":{"rendered":"game"},"content":{"rendered":"<p>[et_pb_section fb_built=&#8221;1&#8243; _builder_version=&#8221;4.27.6&#8243; _module_preset=&#8221;default&#8221; background_color=&#8221;#000000&#8243; global_colors_info=&#8221;{}&#8221;][et_pb_row _builder_version=&#8221;4.27.6&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_column type=&#8221;4_4&#8243; _builder_version=&#8221;4.27.6&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;][et_pb_code _builder_version=&#8221;4.27.6&#8243; _module_preset=&#8221;default&#8221; global_colors_info=&#8221;{}&#8221;]<!-- ===== CUBE \u2014 bloc int\u00e9grable (coller dans un module \"Code\" Divi ou un bloc \"HTML personnalis\u00e9\" WordPress) ===== --><!-- [et_pb_line_break_holder] --><\/p>\n<style><!-- [et_pb_line_break_holder] -->  #cube-game{position:relative;width:100%;height:600px;max-width:100%;overflow:hidden;<!-- [et_pb_line_break_holder] -->    background:#9fd4ff;border-radius:10px;outline:none;<!-- [et_pb_line_break_holder] -->    font-family:'Trebuchet MS',sans-serif;-webkit-user-select:none;user-select:none;touch-action:none;}<!-- [et_pb_line_break_holder] -->  @media (max-width:600px){#cube-game{height:70vh;}}<!-- [et_pb_line_break_holder] -->  #cube-game canvas{display:block;position:absolute;inset:0;width:100%;height:100%;z-index:1;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-hud{position:absolute;inset:0;pointer-events:none;z-index:2;color:#fff;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-title{position:absolute;top:14px;left:18px;font-size:26px;font-weight:bold;<!-- [et_pb_line_break_holder] -->    letter-spacing:6px;text-shadow:2px 3px 0 rgba(0,0,0,0.25);transition:color .6s;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-day{position:absolute;top:48px;left:20px;font-size:12px;letter-spacing:3px;<!-- [et_pb_line_break_holder] -->    text-shadow:1px 2px 0 rgba(0,0,0,0.25);opacity:0.9;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-gems{position:absolute;top:16px;right:20px;font-size:20px;font-weight:bold;<!-- [et_pb_line_break_holder] -->    text-shadow:2px 2px 0 rgba(0,0,0,0.25);}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-gems span{color:#8be0ff;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-timer{position:absolute;top:12px;left:0;right:0;text-align:center;font-size:38px;<!-- [et_pb_line_break_holder] -->    font-weight:bold;letter-spacing:4px;color:#ff5566;font-family:'Courier New',monospace;<!-- [et_pb_line_break_holder] -->    text-shadow:0 0 14px #ff1133,2px 3px 0 rgba(0,0,0,0.4);display:none;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-timer small{display:block;font-size:11px;letter-spacing:5px;color:#ffb0c0;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-hint{position:absolute;bottom:16px;left:0;right:0;text-align:center;font-size:11px;<!-- [et_pb_line_break_holder] -->    letter-spacing:2px;text-shadow:1px 2px 0 rgba(0,0,0,0.3);opacity:0.85;padding:0 8px;}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-flash{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;<!-- [et_pb_line_break_holder] -->    font-size:42px;font-weight:bold;letter-spacing:6px;opacity:0;transition:opacity .3s;<!-- [et_pb_line_break_holder] -->    text-shadow:2px 4px 0 rgba(0,0,0,0.3);}<!-- [et_pb_line_break_holder] -->  #cube-game .cg-banner{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;<!-- [et_pb_line_break_holder] -->    font-size:46px;font-weight:bold;letter-spacing:6px;opacity:0;transition:opacity .5s;<!-- [et_pb_line_break_holder] -->    text-align:center;text-shadow:0 0 30px rgba(0,0,0,0.6),3px 4px 0 rgba(0,0,0,0.4);}<!-- [et_pb_line_break_holder] --><\/style>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><\/p>\n<div id=\"cube-game\" tabindex=\"0\"><!-- [et_pb_line_break_holder] -->  <\/p>\n<div class=\"cg-hud\"><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-title\" id=\"cg-title\">CUBE<\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-day\" id=\"cg-day\">JOUR 1<\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-gems\"><span id=\"cg-g\">0<\/span>\/<span id=\"cg-gt\">6<\/span><\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-timer\" id=\"cg-timer\"><span id=\"cg-tval\">25<\/span><small>RETOUR AU MATIN<\/small><\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-hint\">D\u00c9PLACER : WASD \/ FL\u00c8CHES \/ GLISSE \u00a0\u00b7\u00a0 TOURNER : , . \/ SOURIS \/ 2 DOIGTS<\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-flash\" id=\"cg-flash\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->    <\/p>\n<div class=\"cg-banner\" id=\"cg-banner\"><\/div>\n<p><!-- [et_pb_line_break_holder] -->  <\/div>\n<p><!-- [et_pb_line_break_holder] --><\/div>\n<p><!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] --><script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/three.js\/r128\/three.min.js\"><\/script><!-- [et_pb_line_break_holder] --><script><!-- [et_pb_line_break_holder] -->(function(){<!-- [et_pb_line_break_holder] -->function boot(){<!-- [et_pb_line_break_holder] -->if(typeof THREE==='undefined'){return setTimeout(boot,60);} \/\/ wait for three.js<!-- [et_pb_line_break_holder] -->const SIZE=20, SEA=2;<!-- [et_pb_line_break_holder] -->const container=document.getElementById('cube-game');<!-- [et_pb_line_break_holder] -->const $=id=>document.getElementById(id);<!-- [et_pb_line_break_holder] -->const CW=()=>container.clientWidth||800, CH=()=>container.clientHeight||600;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const scene=new THREE.Scene();<!-- [et_pb_line_break_holder] -->const camera=new THREE.PerspectiveCamera(40,CW()\/CH(),0.1,300);<!-- [et_pb_line_break_holder] -->const renderer=new THREE.WebGLRenderer({antialias:true});<!-- [et_pb_line_break_holder] -->renderer.setPixelRatio(Math.min(window.devicePixelRatio,2));<!-- [et_pb_line_break_holder] -->renderer.setSize(CW(),CH());<!-- [et_pb_line_break_holder] -->renderer.shadowMap.enabled=true;renderer.shadowMap.type=THREE.PCFSoftShadowMap;<!-- [et_pb_line_break_holder] -->renderer.outputEncoding=THREE.sRGBEncoding;<!-- [et_pb_line_break_holder] -->container.appendChild(renderer.domElement);<!-- [et_pb_line_break_holder] -->const canvas=renderer.domElement;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const hemi=new THREE.HemisphereLight(0xcfe8ff,0x4a6b3a,0.55);scene.add(hemi);<!-- [et_pb_line_break_holder] -->const sun=new THREE.DirectionalLight(0xfff3da,1.0);sun.castShadow=true;<!-- [et_pb_line_break_holder] -->sun.shadow.mapSize.set(2048,2048);sun.shadow.radius=6;sun.shadow.bias=-0.0009;<!-- [et_pb_line_break_holder] -->const sc=18;Object.assign(sun.shadow.camera,{left:-sc,right:sc,top:sc,bottom:-sc,near:1,far:80});<!-- [et_pb_line_break_holder] -->scene.add(sun);scene.add(sun.target);<!-- [et_pb_line_break_holder] -->const amb=new THREE.AmbientLight(0xffffff,0.4);scene.add(amb);<!-- [et_pb_line_break_holder] -->const menace=new THREE.PointLight(0xff2a44,0,16,2);scene.add(menace);<!-- [et_pb_line_break_holder] -->const world=new THREE.Group();scene.add(world);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const starGeo=new THREE.BufferGeometry();<!-- [et_pb_line_break_holder] -->{const n=600,p=new Float32Array(n*3);for(let i=0;i<n;i++){<!-- [et_pb_line_break_holder] -->  const r=120,th=Math.random()*6.28,ph=Math.acos(Math.random());<!-- [et_pb_line_break_holder] -->  p[i*3]=Math.sin(ph)*Math.cos(th)*r;p[i*3+1]=Math.abs(Math.cos(ph))*90+10;<!-- [et_pb_line_break_holder] -->  p[i*3+2]=Math.sin(ph)*Math.sin(th)*r;}<!-- [et_pb_line_break_holder] -->  starGeo.setAttribute('position',new THREE.BufferAttribute(p,3));}<!-- [et_pb_line_break_holder] -->const stars=new THREE.Points(starGeo,new THREE.PointsMaterial({color:0xffffff,size:0.7,transparent:true,opacity:0}));<!-- [et_pb_line_break_holder] -->scene.add(stars);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function h2(x,z){let n=x*374761393+z*668265263;n=(n^(n>>13))*1274126177;<!-- [et_pb_line_break_holder] -->  return((n^(n>>16))>>>0)\/4294967296;}<!-- [et_pb_line_break_holder] -->function vnoise(x,z,seed){const xi=Math.floor(x),zi=Math.floor(z),xf=x-xi,zf=z-zi;<!-- [et_pb_line_break_holder] -->  function hh(a,b){let n=a*374761393+b*668265263+seed*2147483647;<!-- [et_pb_line_break_holder] -->    n=(n^(n>>13))*1274126177;return((n^(n>>16))>>>0)\/4294967296;}<!-- [et_pb_line_break_holder] -->  const u=xf*xf*(3-2*xf),v=zf*zf*(3-2*zf);<!-- [et_pb_line_break_holder] -->  return(hh(xi,zi)*(1-u)+hh(xi+1,zi)*u)*(1-v)+(hh(xi,zi+1)*(1-u)+hh(xi+1,zi+1)*u)*v;}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let heights=[],walkable=[],mainCells=[];<!-- [et_pb_line_break_holder] -->let terrainDay=null, terrainEvil=null, evilShown=false;<!-- [et_pb_line_break_holder] -->const terrainMatDay=new THREE.MeshLambertMaterial({vertexColors:true,side:THREE.DoubleSide});<!-- [et_pb_line_break_holder] -->const terrainMatEvil=new THREE.MeshLambertMaterial({vertexColors:true,side:THREE.DoubleSide});<!-- [et_pb_line_break_holder] -->function biomeColor(h,x,z){<!-- [et_pb_line_break_holder] -->  let c;<!-- [et_pb_line_break_holder] -->  if(h<=SEA) c=new THREE.Color(0xe8d9a0);<!-- [et_pb_line_break_holder] -->  else if(h<=SEA+1) c=new THREE.Color(0xdfce92);<!-- [et_pb_line_break_holder] -->  else if(h<6) c=new THREE.Color(0x6fbf45);<!-- [et_pb_line_break_holder] -->  else if(h<8) c=new THREE.Color(0x8a8a8a);<!-- [et_pb_line_break_holder] -->  else c=new THREE.Color(0xf2f6fb);<!-- [et_pb_line_break_holder] -->  c.offsetHSL(0,0,(h2(x*7+1,z*13+1)-0.5)*0.06);return c;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->const AO=[0.45,0.66,0.83,1.0];<!-- [et_pb_line_break_holder] -->function buildTerrain(){<!-- [et_pb_line_break_holder] -->  if(terrainDay){world.remove(terrainDay);terrainDay.geometry.dispose();}<!-- [et_pb_line_break_holder] -->  if(terrainEvil){world.remove(terrainEvil);terrainEvil.geometry.dispose();}<!-- [et_pb_line_break_holder] -->  const P=[],Cd=[],Ce=[];<!-- [et_pb_line_break_holder] -->  const darkUnder=new THREE.Color(0x2a2336);<!-- [et_pb_line_break_holder] -->  const ht=(x,z)=>(x<0||x>=SIZE||z<0||z>=SIZE)?0:heights[z][x];<!-- [et_pb_line_break_holder] -->  function aoF(s1,s2,c){if(s1&&s2)return AO[0];return AO[3-((s1?1:0)+(s2?1:0)+(c?1:0))];}<!-- [et_pb_line_break_holder] -->  function vtx(x,y,z,col,m){<!-- [et_pb_line_break_holder] -->    const r=col.r*m,gg=col.g*m,b=col.b*m;<!-- [et_pb_line_break_holder] -->    P.push(x,y,z);Cd.push(r,gg,b);<!-- [et_pb_line_break_holder] -->    Ce.push(r*0.30+0.22, gg*0.10+0.02, b*0.20+0.07);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  function quad(p0,p1,p2,p3){vtx(...p0);vtx(...p1);vtx(...p2);vtx(...p0);vtx(...p2);vtx(...p3);}<!-- [et_pb_line_break_holder] -->  for(let z=0;z<SIZE;z++)for(let x=0;x<SIZE;x++){<!-- [et_pb_line_break_holder] -->    const h=heights[z][x],wx=x-SIZE\/2,wz=z-SIZE\/2,base=biomeColor(h,x,z);<!-- [et_pb_line_break_holder] -->    const hN=ht(x,z-1),hS=ht(x,z+1),hE=ht(x+1,z),hW=ht(x-1,z);<!-- [et_pb_line_break_holder] -->    const hNW=ht(x-1,z-1),hNE=ht(x+1,z-1),hSW=ht(x-1,z+1),hSE=ht(x+1,z+1);<!-- [et_pb_line_break_holder] -->    const a00=aoF(hW>h,hN>h,hNW>h),a10=aoF(hE>h,hN>h,hNE>h),<!-- [et_pb_line_break_holder] -->          a11=aoF(hE>h,hS>h,hSE>h),a01=aoF(hW>h,hS>h,hSW>h);<!-- [et_pb_line_break_holder] -->    quad([wx-0.5,h,wz-0.5,base,a00],[wx-0.5,h,wz+0.5,base,a01],<!-- [et_pb_line_break_holder] -->         [wx+0.5,h,wz+0.5,base,a11],[wx+0.5,h,wz-0.5,base,a10]);<!-- [et_pb_line_break_holder] -->    const TOP=0.95,BOT=0.55;<!-- [et_pb_line_break_holder] -->    function side(nh,shade,c){if(nh>=h)return;const t=shade*TOP,b=shade*BOT;<!-- [et_pb_line_break_holder] -->      quad([c[0][0],h,c[0][1],base,t],[c[1][0],h,c[1][1],base,t],<!-- [et_pb_line_break_holder] -->           [c[1][0],nh,c[1][1],base,b],[c[0][0],nh,c[0][1],base,b]);}<!-- [et_pb_line_break_holder] -->    side(hN,0.80,[[wx-0.5,wz-0.5],[wx+0.5,wz-0.5]]);<!-- [et_pb_line_break_holder] -->    side(hS,0.80,[[wx+0.5,wz+0.5],[wx-0.5,wz+0.5]]);<!-- [et_pb_line_break_holder] -->    side(hE,0.68,[[wx+0.5,wz-0.5],[wx+0.5,wz+0.5]]);<!-- [et_pb_line_break_holder] -->    side(hW,0.68,[[wx-0.5,wz+0.5],[wx-0.5,wz-0.5]]);<!-- [et_pb_line_break_holder] -->    quad([wx-0.5,0,wz-0.5,darkUnder,1],[wx+0.5,0,wz-0.5,darkUnder,1],<!-- [et_pb_line_break_holder] -->         [wx+0.5,0,wz+0.5,darkUnder,1],[wx-0.5,0,wz+0.5,darkUnder,1]);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  function mk(arr,mat){const g=new THREE.BufferGeometry();<!-- [et_pb_line_break_holder] -->    g.setAttribute('position',new THREE.Float32BufferAttribute(P,3));<!-- [et_pb_line_break_holder] -->    g.setAttribute('color',new THREE.Float32BufferAttribute(arr,3));<!-- [et_pb_line_break_holder] -->    g.computeVertexNormals();const m=new THREE.Mesh(g,mat);m.receiveShadow=true;return m;}<!-- [et_pb_line_break_holder] -->  terrainDay=mk(Cd,terrainMatDay);world.add(terrainDay);<!-- [et_pb_line_break_holder] -->  terrainEvil=mk(Ce,terrainMatEvil);terrainEvil.visible=false;world.add(terrainEvil);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let heightTex=null;<!-- [et_pb_line_break_holder] -->function buildHeightTex(){<!-- [et_pb_line_break_holder] -->  const d=new Uint8Array(SIZE*SIZE*4);<!-- [et_pb_line_break_holder] -->  for(let z=0;z<SIZE;z++)for(let x=0;x<SIZE;x++){<!-- [et_pb_line_break_holder] -->    const i=(z*SIZE+x)*4;d[i]=Math.min(255,heights[z][x]);d[i+3]=255;}<!-- [et_pb_line_break_holder] -->  if(heightTex)heightTex.dispose();<!-- [et_pb_line_break_holder] -->  heightTex=new THREE.DataTexture(d,SIZE,SIZE,THREE.RGBAFormat);<!-- [et_pb_line_break_holder] -->  heightTex.minFilter=heightTex.magFilter=THREE.LinearFilter;<!-- [et_pb_line_break_holder] -->  heightTex.wrapS=heightTex.wrapT=THREE.ClampToEdgeWrapping;heightTex.needsUpdate=true;<!-- [et_pb_line_break_holder] -->  waterMat.uniforms.uHeight.value=heightTex;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->const waterMat=new THREE.ShaderMaterial({<!-- [et_pb_line_break_holder] -->  transparent:true,depthWrite:false,<!-- [et_pb_line_break_holder] -->  uniforms:{uTime:{value:0},uHeight:{value:null},uSize:{value:SIZE},<!-- [et_pb_line_break_holder] -->    uSea:{value:SEA+0.5},uCam:{value:new THREE.Vector3()},<!-- [et_pb_line_break_holder] -->    uSky:{value:new THREE.Color(0x9fd4ff)},uDeep:{value:new THREE.Color(0x1f6fae)},<!-- [et_pb_line_break_holder] -->    uShallow:{value:new THREE.Color(0x5fc8e0)},uFoam:{value:new THREE.Color(0xf2fdff)}},<!-- [et_pb_line_break_holder] -->  vertexShader:`uniform float uTime;varying vec3 vW;<!-- [et_pb_line_break_holder] -->    float wv(vec2 p){return sin(p.x*0.6+uTime*1.2)*0.10+sin(p.y*0.5-uTime*1.5)*0.10+sin((p.x+p.y)*0.35+uTime*0.8)*0.06;}<!-- [et_pb_line_break_holder] -->    void main(){vec3 wp=(modelMatrix*vec4(position,1.0)).xyz;wp.y+=wv(wp.xz);vW=wp;<!-- [et_pb_line_break_holder] -->      gl_Position=projectionMatrix*viewMatrix*vec4(wp,1.0);}`,<!-- [et_pb_line_break_holder] -->  fragmentShader:`precision highp float;<!-- [et_pb_line_break_holder] -->    uniform float uTime,uSize,uSea;uniform sampler2D uHeight;uniform vec3 uCam,uSky,uDeep,uShallow,uFoam;<!-- [et_pb_line_break_holder] -->    varying vec3 vW;<!-- [et_pb_line_break_holder] -->    void main(){<!-- [et_pb_line_break_holder] -->      vec2 uv=(vW.xz+0.5)\/uSize+0.5;<!-- [et_pb_line_break_holder] -->      float h=texture2D(uHeight,uv).r*255.0;<!-- [et_pb_line_break_holder] -->      float depth=uSea-h;<!-- [et_pb_line_break_holder] -->      if(depth<-0.6)discard;<!-- [et_pb_line_break_holder] -->      depth=max(0.0,depth);<!-- [et_pb_line_break_holder] -->      vec3 col=mix(uShallow,uDeep,clamp(depth\/5.0,0.0,1.0));<!-- [et_pb_line_break_holder] -->      vec3 V=normalize(uCam-vW);<!-- [et_pb_line_break_holder] -->      float fres=pow(1.0-clamp(V.y,0.0,1.0),3.0);<!-- [et_pb_line_break_holder] -->      col=mix(col,uSky,fres*0.5);<!-- [et_pb_line_break_holder] -->      float spark=pow(max(0.0,sin(vW.x*3.0+uTime)*sin(vW.z*3.1-uTime*1.3)),24.0);<!-- [et_pb_line_break_holder] -->      col+=spark*0.4;<!-- [et_pb_line_break_holder] -->      float foam=smoothstep(0.85,0.0,depth);<!-- [et_pb_line_break_holder] -->      foam*=0.55+0.45*sin(depth*22.0-uTime*3.0+vW.x*1.5);<!-- [et_pb_line_break_holder] -->      col=mix(col,uFoam,clamp(foam,0.0,1.0));<!-- [et_pb_line_break_holder] -->      gl_FragColor=vec4(col,mix(0.5,0.9,clamp(depth\/3.0,0.0,1.0)));<!-- [et_pb_line_break_holder] -->    }`<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] -->const water=new THREE.Mesh(new THREE.PlaneGeometry(SIZE,SIZE,96,96),waterMat);<!-- [et_pb_line_break_holder] -->water.rotation.x=-Math.PI\/2;water.position.set(-0.5,SEA+0.55,-0.5);world.add(water);<!-- [et_pb_line_break_holder] -->function setWaterPalette(evil){<!-- [et_pb_line_break_holder] -->  if(evil){<!-- [et_pb_line_break_holder] -->    waterMat.uniforms.uDeep.value.setHex(0x4a0d12);<!-- [et_pb_line_break_holder] -->    waterMat.uniforms.uShallow.value.setHex(0xc23a26);<!-- [et_pb_line_break_holder] -->    waterMat.uniforms.uFoam.value.setHex(0xffb070);<!-- [et_pb_line_break_holder] -->  }else{<!-- [et_pb_line_break_holder] -->    waterMat.uniforms.uDeep.value.setHex(0x1f6fae);<!-- [et_pb_line_break_holder] -->    waterMat.uniforms.uShallow.value.setHex(0x5fc8e0);<!-- [et_pb_line_break_holder] -->    waterMat.uniforms.uFoam.value.setHex(0xf2fdff);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const trees=new THREE.Group();world.add(trees);<!-- [et_pb_line_break_holder] -->const treesEvil=new THREE.Group();world.add(treesEvil);<!-- [et_pb_line_break_holder] -->const crystals=[];const crystalGroup=new THREE.Group();scene.add(crystalGroup);<!-- [et_pb_line_break_holder] -->const chasers=[];const chaserGroup=new THREE.Group();scene.add(chaserGroup);<!-- [et_pb_line_break_holder] -->let seed=1,day=1,target=6,collected=0;<!-- [et_pb_line_break_holder] -->const gEl=$('cg-g'),gtEl=$('cg-gt'),dayEl=$('cg-day');<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function reachableFrom(sx,sz){<!-- [et_pb_line_break_holder] -->  const seen=Array.from({length:SIZE},()=>new Array(SIZE).fill(false));<!-- [et_pb_line_break_holder] -->  const q=[[sx,sz]];seen[sz][sx]=true;const cells=[[sx,sz]];<!-- [et_pb_line_break_holder] -->  while(q.length){const [x,z]=q.pop();<!-- [et_pb_line_break_holder] -->    [[1,0],[-1,0],[0,1],[0,-1]].forEach(d=>{const nx=x+d[0],nz=z+d[1];<!-- [et_pb_line_break_holder] -->      if(nx<0||nx>=SIZE||nz<0||nz>=SIZE)return;<!-- [et_pb_line_break_holder] -->      if(seen[nz][nx]||!walkable[nz][nx])return;<!-- [et_pb_line_break_holder] -->      if(Math.abs(heights[nz][nx]-heights[z][x])>1)return;<!-- [et_pb_line_break_holder] -->      seen[nz][nx]=true;q.push([nx,nz]);cells.push([nx,nz]);});}<!-- [et_pb_line_break_holder] -->  return cells;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->function largestComponent(){<!-- [et_pb_line_break_holder] -->  const visited=Array.from({length:SIZE},()=>new Array(SIZE).fill(false));<!-- [et_pb_line_break_holder] -->  let best=[];<!-- [et_pb_line_break_holder] -->  for(let z=0;z<SIZE;z++)for(let x=0;x<SIZE;x++){<!-- [et_pb_line_break_holder] -->    if(walkable[z][x]&&!visited[z][x]){<!-- [et_pb_line_break_holder] -->      const cells=reachableFrom(x,z);cells.forEach(c=>visited[c[1]][c[0]]=true);<!-- [et_pb_line_break_holder] -->      if(cells.length>best.length)best=cells;}}<!-- [et_pb_line_break_holder] -->  return best;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function buildTree(h,x,z,burned){<!-- [et_pb_line_break_holder] -->  const tg=new THREE.Group();<!-- [et_pb_line_break_holder] -->  const trunk=new THREE.Mesh(new THREE.BoxGeometry(0.3,1,0.3),<!-- [et_pb_line_break_holder] -->    new THREE.MeshLambertMaterial({color:burned?0x3a2f25:0x9a6b3f}));<!-- [et_pb_line_break_holder] -->  trunk.position.y=0.5;trunk.castShadow=true;tg.add(trunk);<!-- [et_pb_line_break_holder] -->  if(burned){<!-- [et_pb_line_break_holder] -->    const leaf=new THREE.Mesh(new THREE.BoxGeometry(0.95,0.95,0.95),<!-- [et_pb_line_break_holder] -->      new THREE.MeshStandardMaterial({color:0x2a1d1a,emissive:0xff3300,emissiveIntensity:0.95,roughness:1}));<!-- [et_pb_line_break_holder] -->    leaf.position.y=1.5;leaf.castShadow=true;tg.add(leaf);<!-- [et_pb_line_break_holder] -->    const embCols=[0xff6a00,0xffae2a,0xff2a00];<!-- [et_pb_line_break_holder] -->    for(let k=0;k<5;k++){<!-- [et_pb_line_break_holder] -->      const e=new THREE.Mesh(new THREE.BoxGeometry(0.14,0.14,0.14),<!-- [et_pb_line_break_holder] -->        new THREE.MeshBasicMaterial({color:embCols[k%3]}));<!-- [et_pb_line_break_holder] -->      e.position.set((Math.random()-0.5)*0.9,1.2+Math.random()*0.7,(Math.random()-0.5)*0.9);<!-- [et_pb_line_break_holder] -->      tg.add(e);<!-- [et_pb_line_break_holder] -->    }<!-- [et_pb_line_break_holder] -->  } else {<!-- [et_pb_line_break_holder] -->    const leaf=new THREE.Mesh(new THREE.BoxGeometry(1.1,1.1,1.1),<!-- [et_pb_line_break_holder] -->      new THREE.MeshLambertMaterial({color:Math.random()>0.5?0x4f9e3a:0x3f8a30}));<!-- [et_pb_line_break_holder] -->    leaf.position.y=1.5;leaf.castShadow=true;tg.add(leaf);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] -->  tg.position.set(x-SIZE\/2,h,z-SIZE\/2);<!-- [et_pb_line_break_holder] -->  return tg;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let px=Math.floor(SIZE\/2),pz=Math.floor(SIZE\/2);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function generate(){<!-- [et_pb_line_break_holder] -->  heights=[];walkable=[];<!-- [et_pb_line_break_holder] -->  for(let z=0;z<SIZE;z++){heights[z]=[];walkable[z]=[];<!-- [et_pb_line_break_holder] -->    for(let x=0;x<SIZE;x++){<!-- [et_pb_line_break_holder] -->      let n=vnoise(x*0.18,z*0.18,seed)*1.0+vnoise(x*0.4,z*0.4,seed+7)*0.4;<!-- [et_pb_line_break_holder] -->      const dx=(x-SIZE\/2)\/(SIZE\/2),dz=(z-SIZE\/2)\/(SIZE\/2);<!-- [et_pb_line_break_holder] -->      n-=Math.sqrt(dx*dx+dz*dz)*0.5;<!-- [et_pb_line_break_holder] -->      heights[z][x]=Math.max(1,Math.round(n*9+3));}}<!-- [et_pb_line_break_holder] -->  for(let z=0;z<SIZE;z++)for(let x=0;x<SIZE;x++)walkable[z][x]=(heights[z][x]>SEA);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  buildTerrain();buildHeightTex();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  trees.clear();treesEvil.clear();<!-- [et_pb_line_break_holder] -->  let placed=0;<!-- [et_pb_line_break_holder] -->  for(let tries=0;tries<200&#038;&#038;placed<10;tries++){<!-- [et_pb_line_break_holder] -->    const x=Math.floor(Math.random()*SIZE),z=Math.floor(Math.random()*SIZE),h=heights[z][x];<!-- [et_pb_line_break_holder] -->    if(h>SEA+1&&h<7){<!-- [et_pb_line_break_holder] -->      trees.add(buildTree(h,x,z,false));<!-- [et_pb_line_break_holder] -->      treesEvil.add(buildTree(h,x,z,true));<!-- [et_pb_line_break_holder] -->      walkable[z][x]=false;placed++;}<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const main=largestComponent();mainCells=main;<!-- [et_pb_line_break_holder] -->  let cxs=0,czs=0;main.forEach(c=>{cxs+=c[0];czs+=c[1];});<!-- [et_pb_line_break_holder] -->  const ccx=cxs\/main.length,ccz=czs\/main.length;<!-- [et_pb_line_break_holder] -->  let bestCell=main[0],bd=1e9;<!-- [et_pb_line_break_holder] -->  main.forEach(c=>{const d=(c[0]-ccx)**2+(c[1]-ccz)**2;if(d<bd){bd=d;bestCell=c;}});<!-- [et_pb_line_break_holder] -->  px=bestCell[0];pz=bestCell[1];<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  const pool=main.filter(c=>!(c[0]===px&&c[1]===pz)).sort(()=>Math.random()-0.5);<!-- [et_pb_line_break_holder] -->  target=Math.min(target,pool.length);<!-- [et_pb_line_break_holder] -->  crystalGroup.clear();crystals.length=0;collected=0;<!-- [et_pb_line_break_holder] -->  for(let i=0;i<target;i++){const [x,z]=pool[i];<!-- [et_pb_line_break_holder] -->    const m=new THREE.Mesh(new THREE.OctahedronGeometry(0.32),<!-- [et_pb_line_break_holder] -->      new THREE.MeshStandardMaterial({color:0x8be0ff,emissive:0x2ad0ff,emissiveIntensity:1.4,<!-- [et_pb_line_break_holder] -->        metalness:0.3,roughness:0.2}));<!-- [et_pb_line_break_holder] -->    m.castShadow=true;m.position.set(x-SIZE\/2,heights[z][x]+0.7,z-SIZE\/2);<!-- [et_pb_line_break_holder] -->    m.userData={x,z};crystalGroup.add(m);crystals.push(m);}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  chaserGroup.clear();chasers.length=0;<!-- [et_pb_line_break_holder] -->  world.rotation.x=0;evilShown=false;<!-- [et_pb_line_break_holder] -->  if(terrainDay)terrainDay.visible=true;if(terrainEvil)terrainEvil.visible=false;<!-- [et_pb_line_break_holder] -->  trees.visible=true;treesEvil.visible=false;water.visible=true;setWaterPalette(false);<!-- [et_pb_line_break_holder] -->  gtEl.textContent=target;gEl.textContent=0;dayEl.textContent='JOUR '+day;<!-- [et_pb_line_break_holder] -->  if(player)player.position.set(px-SIZE\/2,heights[pz][px],pz-SIZE\/2);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const player=new THREE.Group();<!-- [et_pb_line_break_holder] -->const pbody=new THREE.Mesh(new THREE.BoxGeometry(0.7,0.7,0.7),new THREE.MeshLambertMaterial({color:0xff5a7a}));<!-- [et_pb_line_break_holder] -->pbody.position.y=0.35;pbody.castShadow=true;player.add(pbody);<!-- [et_pb_line_break_holder] -->function eye(sx){const e=new THREE.Mesh(new THREE.BoxGeometry(0.12,0.16,0.06),new THREE.MeshBasicMaterial({color:0x1a1a1a}));<!-- [et_pb_line_break_holder] -->  e.position.set(sx,0.45,0.36);return e;}<!-- [et_pb_line_break_holder] -->player.add(eye(-0.16),eye(0.16));scene.add(player);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let hopT=1,fromPos=new THREE.Vector3(),toPos=new THREE.Vector3();<!-- [et_pb_line_break_holder] -->function tryMove(dx,dz){<!-- [et_pb_line_break_holder] -->  if(hopT<1)return;<!-- [et_pb_line_break_holder] -->  const nx=px+dx,nz=pz+dz;<!-- [et_pb_line_break_holder] -->  if(nx<0||nx>=SIZE||nz<0||nz>=SIZE)return;<!-- [et_pb_line_break_holder] -->  if(!walkable[nz][nx])return;<!-- [et_pb_line_break_holder] -->  if(Math.abs(heights[nz][nx]-heights[pz][px])>1)return;<!-- [et_pb_line_break_holder] -->  fromPos.set(px-SIZE\/2,heights[pz][px],pz-SIZE\/2);<!-- [et_pb_line_break_holder] -->  px=nx;pz=nz;toPos.set(px-SIZE\/2,heights[pz][px],pz-SIZE\/2);hopT=0;<!-- [et_pb_line_break_holder] -->  player.rotation.y=Math.atan2(dx,dz);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let camAngle=Math.PI*0.25, camTargetAngle=camAngle;<!-- [et_pb_line_break_holder] -->const camDist=23, camHeight=18;<!-- [et_pb_line_break_holder] -->function camForward(){return {fx:-Math.sin(camAngle),fz:-Math.cos(camAngle)};}<!-- [et_pb_line_break_holder] -->function moveScreen(ix,iz){<!-- [et_pb_line_break_holder] -->  const {fx,fz}=camForward();const rx=-fz,rz=fx;<!-- [et_pb_line_break_holder] -->  const vx=fx*iz+rx*ix, vz=fz*iz+rz*ix;<!-- [et_pb_line_break_holder] -->  if(Math.abs(vx)>=Math.abs(vz))tryMove(Math.sign(vx),0);else tryMove(0,Math.sign(vz));<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->\/* ---- input (scoped to the game block) ---- *\/<!-- [et_pb_line_break_holder] -->let active=false;<!-- [et_pb_line_break_holder] -->container.addEventListener('pointerenter',()=>active=true);<!-- [et_pb_line_break_holder] -->container.addEventListener('pointerleave',()=>{active=false;dragging=false;});<!-- [et_pb_line_break_holder] -->container.addEventListener('pointerdown',()=>{active=true;container.focus({preventScroll:true});});<!-- [et_pb_line_break_holder] -->window.addEventListener('keydown',e=>{<!-- [et_pb_line_break_holder] -->  if(!active)return;<!-- [et_pb_line_break_holder] -->  const k=e.key;<!-- [et_pb_line_break_holder] -->  if(['ArrowUp','ArrowDown','ArrowLeft','ArrowRight',' ',',','.'].includes(k))e.preventDefault();<!-- [et_pb_line_break_holder] -->  if(['ArrowUp','w','z'].includes(k))moveScreen(0,1);<!-- [et_pb_line_break_holder] -->  else if(['ArrowDown','s'].includes(k))moveScreen(0,-1);<!-- [et_pb_line_break_holder] -->  else if(['ArrowLeft','a','q'].includes(k))moveScreen(-1,0);<!-- [et_pb_line_break_holder] -->  else if(['ArrowRight','d'].includes(k))moveScreen(1,0);<!-- [et_pb_line_break_holder] -->  else if(k===','||k==='<')camTargetAngle-=Math.PI\/8;<!-- [et_pb_line_break_holder] -->  else if(k==='.'||k==='>')camTargetAngle+=Math.PI\/8;<!-- [et_pb_line_break_holder] -->});<!-- [et_pb_line_break_holder] -->let dragging=false,lastX=0;<!-- [et_pb_line_break_holder] -->canvas.addEventListener('mousedown',e=>{dragging=true;lastX=e.clientX;});<!-- [et_pb_line_break_holder] -->window.addEventListener('mouseup',()=>dragging=false);<!-- [et_pb_line_break_holder] -->window.addEventListener('mousemove',e=>{if(dragging){camTargetAngle-=(e.clientX-lastX)*0.01;lastX=e.clientX;}});<!-- [et_pb_line_break_holder] -->let tMode=null,tsx=null,tsy=null,tlastMid=0;<!-- [et_pb_line_break_holder] -->canvas.addEventListener('touchstart',e=>{<!-- [et_pb_line_break_holder] -->  if(e.touches.length===2){tMode='rot';tlastMid=(e.touches[0].clientX+e.touches[1].clientX)\/2;}<!-- [et_pb_line_break_holder] -->  else{tMode='move';tsx=e.touches[0].clientX;tsy=e.touches[0].clientY;}},{passive:true});<!-- [et_pb_line_break_holder] -->canvas.addEventListener('touchmove',e=>{<!-- [et_pb_line_break_holder] -->  if(e.cancelable)e.preventDefault();<!-- [et_pb_line_break_holder] -->  if(tMode==='rot'&&e.touches.length>=2){const mid=(e.touches[0].clientX+e.touches[1].clientX)\/2;<!-- [et_pb_line_break_holder] -->    camTargetAngle-=(mid-tlastMid)*0.012;tlastMid=mid;}},{passive:false});<!-- [et_pb_line_break_holder] -->canvas.addEventListener('touchend',e=>{<!-- [et_pb_line_break_holder] -->  if(tMode==='move'&&tsx!=null){const dx=e.changedTouches[0].clientX-tsx,dy=e.changedTouches[0].clientY-tsy;<!-- [et_pb_line_break_holder] -->    if(Math.abs(dx)+Math.abs(dy)>20){<!-- [et_pb_line_break_holder] -->      if(Math.abs(dx)>Math.abs(dy))moveScreen(dx>0?1:-1,0);else moveScreen(0,dy<0?1:-1);}}<!-- [et_pb_line_break_holder] -->  tMode=null;tsx=null;},{passive:true});<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->const flash=$('cg-flash');<!-- [et_pb_line_break_holder] -->const banner=$('cg-banner');<!-- [et_pb_line_break_holder] -->const timerEl=$('cg-timer'),tvalEl=$('cg-tval');<!-- [et_pb_line_break_holder] -->const titleEl=$('cg-title');<!-- [et_pb_line_break_holder] -->function showBanner(txt,color){banner.textContent=txt;banner.style.color=color||'#fff';<!-- [et_pb_line_break_holder] -->  banner.style.opacity=1;setTimeout(()=>banner.style.opacity=0,1500);}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let phase='day';<!-- [et_pb_line_break_holder] -->let flipAmt=0, flipTarget=0;<!-- [et_pb_line_break_holder] -->let fleeTime=0, chaserTimer=0, chaserInterval=0.55;<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->function startFlee(){<!-- [et_pb_line_break_holder] -->  phase='flip';flipTarget=1;<!-- [et_pb_line_break_holder] -->  titleEl.textContent='MONDE INVERS\u00c9';titleEl.style.color='#ff5566';<!-- [et_pb_line_break_holder] -->  chaserGroup.clear();chasers.length=0;<!-- [et_pb_line_break_holder] -->  const far=mainCells.filter(c=>((c[0]-px)**2+(c[1]-pz)**2)>(SIZE*0.32)**2);<!-- [et_pb_line_break_holder] -->  const pool=(far.length>=target?far:mainCells).sort(()=>Math.random()-0.5);<!-- [et_pb_line_break_holder] -->  const COUNT=Math.min(2,pool.length||2);<!-- [et_pb_line_break_holder] -->  for(let i=0;i<COUNT;i++){const [x,z]=pool[i%pool.length];<!-- [et_pb_line_break_holder] -->    const m=new THREE.Mesh(new THREE.OctahedronGeometry(0.42,0),<!-- [et_pb_line_break_holder] -->      new THREE.MeshStandardMaterial({color:0xff3344,emissive:0xff0022,emissiveIntensity:1.8,<!-- [et_pb_line_break_holder] -->        metalness:0.2,roughness:0.3}));<!-- [et_pb_line_break_holder] -->    m.castShadow=true;m.position.set(x-SIZE\/2,heights[z][x]+0.7,z-SIZE\/2);<!-- [et_pb_line_break_holder] -->    chaserGroup.add(m);<!-- [et_pb_line_break_holder] -->    chasers.push({mesh:m,x,z,hopT:1,from:new THREE.Vector3(),to:new THREE.Vector3()});}<!-- [et_pb_line_break_holder] -->  fleeTime=Math.max(16,24-(day-1)*1.0);<!-- [et_pb_line_break_holder] -->  chaserInterval=Math.max(0.6,1.05-(day-1)*0.06);<!-- [et_pb_line_break_holder] -->  chaserTimer=0;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->function stepChaser(ch){<!-- [et_pb_line_break_holder] -->  if(ch.hopT<1)return;<!-- [et_pb_line_break_holder] -->  const opts=[[1,0],[-1,0],[0,1],[0,-1]].filter(d=>{<!-- [et_pb_line_break_holder] -->    const nx=ch.x+d[0],nz=ch.z+d[1];<!-- [et_pb_line_break_holder] -->    return nx>=0&&nx<SIZE&#038;&#038;nz>=0&&nz<SIZE&#038;&#038;walkable[nz][nx]&#038;&#038;Math.abs(heights[nz][nx]-heights[ch.z][ch.x])<=1;});<!-- [et_pb_line_break_holder] -->  if(!opts.length)return;<!-- [et_pb_line_break_holder] -->  opts.sort((a,b)=>((ch.x+a[0]-px)**2+(ch.z+a[1]-pz)**2)-((ch.x+b[0]-px)**2+(ch.z+b[1]-pz)**2));<!-- [et_pb_line_break_holder] -->  const pick=Math.random()<0.82?opts[0]:opts[Math.floor(Math.random()*opts.length)];<!-- [et_pb_line_break_holder] -->  ch.from.copy(ch.mesh.position);<!-- [et_pb_line_break_holder] -->  ch.x+=pick[0];ch.z+=pick[1];<!-- [et_pb_line_break_holder] -->  ch.to.set(ch.x-SIZE\/2,heights[ch.z][ch.x]+0.7,ch.z-SIZE\/2);ch.hopT=0;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->function caught(){phase='lose';flipTarget=0;titleEl.textContent='CUBE';titleEl.style.color='#fff';<!-- [et_pb_line_break_holder] -->  timerEl.style.display='none';showBanner('ATTRAP\u00c9','#ff3344');}<!-- [et_pb_line_break_holder] -->function survived(){phase='win';flipTarget=0;titleEl.textContent='CUBE';titleEl.style.color='#fff';<!-- [et_pb_line_break_holder] -->  timerEl.style.display='none';showBanner('AUBE','#ffd27a');}<!-- [et_pb_line_break_holder] -->function resolveWin(){day++;seed=day*131+7;target=Math.min(12,6+Math.floor(day\/2));<!-- [et_pb_line_break_holder] -->  generate();player.position.set(px-SIZE\/2,heights[pz][px],pz-SIZE\/2);phase='day';}<!-- [et_pb_line_break_holder] -->function resolveLose(){seed=day*131+Math.floor(Math.random()*9000);<!-- [et_pb_line_break_holder] -->  generate();player.position.set(px-SIZE\/2,heights[pz][px],pz-SIZE\/2);phase='day';}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->generate();<!-- [et_pb_line_break_holder] -->player.position.set(px-SIZE\/2,heights[pz][px],pz-SIZE\/2);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->new ResizeObserver(()=>{const w=CW(),h=CH();<!-- [et_pb_line_break_holder] -->  camera.aspect=w\/h;camera.updateProjectionMatrix();renderer.setSize(w,h);}).observe(container);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let tclock=0;<!-- [et_pb_line_break_holder] -->const dayCol=new THREE.Color(0x9fd4ff),duskCol=new THREE.Color(0xf2a86b),nightCol=new THREE.Color(0x15203f);<!-- [et_pb_line_break_holder] -->const eerieCol=new THREE.Color(0x180a2a);<!-- [et_pb_line_break_holder] -->const sceneCol=new THREE.Color();<!-- [et_pb_line_break_holder] -->scene.fog=new THREE.Fog(0x9fd4ff,40,95);<!-- [et_pb_line_break_holder] -->function updateSky(){<!-- [et_pb_line_break_holder] -->  const a=tclock*0.07,s=Math.sin(a);<!-- [et_pb_line_break_holder] -->  sun.position.set(Math.cos(a)*30,Math.max(2,s*30+6),Math.sin(a*0.7)*20+10);<!-- [et_pb_line_break_holder] -->  sun.target.position.set(0,0,0);<!-- [et_pb_line_break_holder] -->  const dayAmt=Math.max(0,s);<!-- [et_pb_line_break_holder] -->  sun.intensity=(0.15+dayAmt*1.0)*(1-0.8*flipAmt);<!-- [et_pb_line_break_holder] -->  hemi.intensity=(0.2+dayAmt*0.5)*(1-0.6*flipAmt);<!-- [et_pb_line_break_holder] -->  amb.intensity=0.28+dayAmt*0.12;<!-- [et_pb_line_break_holder] -->  amb.color.setRGB(1,1,1).lerp(new THREE.Color(0x4a2a5a),flipAmt);<!-- [et_pb_line_break_holder] -->  if(s>0.15)sceneCol.copy(dayCol);<!-- [et_pb_line_break_holder] -->  else if(s>-0.1)sceneCol.copy(duskCol).lerp(dayCol,(s+0.1)\/0.25);<!-- [et_pb_line_break_holder] -->  else sceneCol.copy(nightCol).lerp(duskCol,Math.max(0,(s+0.4)\/0.3));<!-- [et_pb_line_break_holder] -->  sceneCol.lerp(eerieCol,flipAmt);<!-- [et_pb_line_break_holder] -->  scene.background=sceneCol;scene.fog.color.copy(sceneCol);<!-- [et_pb_line_break_holder] -->  scene.fog.near=40-18*flipAmt;scene.fog.far=95-35*flipAmt;<!-- [et_pb_line_break_holder] -->  stars.material.opacity=Math.max(Math.max(0,-s)*0.9, flipAmt*0.7);<!-- [et_pb_line_break_holder] -->  sun.color.setHSL(0.09,0.5,0.5+dayAmt*0.4);<!-- [et_pb_line_break_holder] -->  waterMat.uniforms.uSky.value.copy(sceneCol);<!-- [et_pb_line_break_holder] -->  menace.intensity=flipAmt*3.0;<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->let t=0;<!-- [et_pb_line_break_holder] -->function animate(){<!-- [et_pb_line_break_holder] -->  requestAnimationFrame(animate);<!-- [et_pb_line_break_holder] -->  const dt=0.016;t+=dt;tclock+=dt;<!-- [et_pb_line_break_holder] -->  updateSky();<!-- [et_pb_line_break_holder] -->  waterMat.uniforms.uTime.value=t;<!-- [et_pb_line_break_holder] -->  waterMat.uniforms.uCam.value.copy(camera.position);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  flipAmt+=(flipTarget-flipAmt)*0.05;<!-- [et_pb_line_break_holder] -->  if(phase==='flip'&&flipAmt>0.96){phase='flee';showBanner('FUIS !','#ff3344');<!-- [et_pb_line_break_holder] -->    timerEl.style.display='block';}<!-- [et_pb_line_break_holder] -->  if(phase==='win'&&flipAmt<0.04)resolveWin();<!-- [et_pb_line_break_holder] -->  if(phase==='lose'&&flipAmt<0.04)resolveLose();<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  if(hopT<1){hopT=Math.min(1,hopT+0.12);const e=hopT;<!-- [et_pb_line_break_holder] -->    player.position.lerpVectors(fromPos,toPos,e);<!-- [et_pb_line_break_holder] -->    player.position.y+=Math.sin(e*Math.PI)*0.6;<!-- [et_pb_line_break_holder] -->    pbody.scale.set(1+Math.sin(e*Math.PI)*0.15,1-Math.sin(e*Math.PI)*0.15,1);<!-- [et_pb_line_break_holder] -->  } else pbody.scale.set(1,1,1);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  if(phase==='day'){<!-- [et_pb_line_break_holder] -->    for(let i=crystals.length-1;i>=0;i--){const c=crystals[i];<!-- [et_pb_line_break_holder] -->      c.rotation.y+=0.05;c.position.y=heights[c.userData.z][c.userData.x]+0.7+Math.sin(t*3+i)*0.12;<!-- [et_pb_line_break_holder] -->      if(c.userData.x===px&&c.userData.z===pz&&hopT>0.5){<!-- [et_pb_line_break_holder] -->        crystalGroup.remove(c);crystals.splice(i,1);collected++;gEl.textContent=collected;<!-- [et_pb_line_break_holder] -->        flash.textContent='+1';flash.style.opacity=1;flash.style.fontSize='30px';<!-- [et_pb_line_break_holder] -->        setTimeout(()=>{flash.style.opacity=0;flash.style.fontSize='42px';},250);<!-- [et_pb_line_break_holder] -->        if(collected>=target)setTimeout(startFlee,400);}}<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  if(phase==='flee'){<!-- [et_pb_line_break_holder] -->    fleeTime-=dt;tvalEl.textContent=Math.max(0,Math.ceil(fleeTime));<!-- [et_pb_line_break_holder] -->    if(fleeTime<=0){survived();}<!-- [et_pb_line_break_holder] -->    chaserTimer+=dt;<!-- [et_pb_line_break_holder] -->    if(chaserTimer>=chaserInterval){chaserTimer=0;chasers.forEach(stepChaser);}<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  chasers.forEach((ch,i)=>{<!-- [et_pb_line_break_holder] -->    if(ch.hopT<1){ch.hopT=Math.min(1,ch.hopT+0.07);const e=ch.hopT;<!-- [et_pb_line_break_holder] -->      ch.mesh.position.lerpVectors(ch.from,ch.to,e);ch.mesh.position.y+=Math.sin(e*Math.PI)*0.5;}<!-- [et_pb_line_break_holder] -->    ch.mesh.rotation.y+=0.12;<!-- [et_pb_line_break_holder] -->    ch.mesh.material.emissiveIntensity=1.4+Math.sin(t*8+i)*0.6;<!-- [et_pb_line_break_holder] -->    if(phase==='flee'&&ch.x===px&&ch.z===pz)caught();<!-- [et_pb_line_break_holder] -->  });<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  world.rotation.x=flipAmt*Math.PI*2.0;<!-- [et_pb_line_break_holder] -->  const evilNow=flipAmt>0.5;<!-- [et_pb_line_break_holder] -->  if(evilNow!==evilShown){<!-- [et_pb_line_break_holder] -->    evilShown=evilNow;<!-- [et_pb_line_break_holder] -->    terrainDay.visible=!evilShown;terrainEvil.visible=evilShown;<!-- [et_pb_line_break_holder] -->    trees.visible=!evilShown;treesEvil.visible=evilShown;<!-- [et_pb_line_break_holder] -->    setWaterPalette(evilShown);<!-- [et_pb_line_break_holder] -->  }<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  camAngle+=(camTargetAngle-camAngle)*0.15;<!-- [et_pb_line_break_holder] -->  const cx=player.position.x+camDist*Math.sin(camAngle);<!-- [et_pb_line_break_holder] -->  const cz=player.position.z+camDist*Math.cos(camAngle);<!-- [et_pb_line_break_holder] -->  camera.position.set(cx,camHeight,cz);<!-- [et_pb_line_break_holder] -->  camera.up.set(0,1,0);<!-- [et_pb_line_break_holder] -->  camera.lookAt(player.position.x,player.position.y,player.position.z);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  menace.position.set(player.position.x,player.position.y+3,player.position.z);<!-- [et_pb_line_break_holder] --><!-- [et_pb_line_break_holder] -->  renderer.render(scene,camera);<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->animate();<!-- [et_pb_line_break_holder] -->}<!-- [et_pb_line_break_holder] -->boot();<!-- [et_pb_line_break_holder] -->})();<!-- [et_pb_line_break_holder] --><\/script><!-- [et_pb_line_break_holder] --><!-- ===== fin du bloc CUBE ===== --><!-- [et_pb_line_break_holder] -->[\/et_pb_code][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"class_list":["post-64","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/pages\/64","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/comments?post=64"}],"version-history":[{"count":4,"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/pages\/64\/revisions"}],"predecessor-version":[{"id":69,"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/pages\/64\/revisions\/69"}],"wp:attachment":[{"href":"https:\/\/soliddesign.fr\/index.php\/wp-json\/wp\/v2\/media?parent=64"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}