<!-- SOLID CITY · part 2083 -->
0]);
    });
  }
  // planters
  var planterM=new T.MeshLambertMaterial({color:0x3a3226});
  var leafM=new T.MeshLambertMaterial({color:0x2e6a34});
  for(i=0;i<16;i++){
    var px=-180+R()*360, pz=-350+R()*700;
    if(Math.abs(px)<30&&Math.abs(pz)<30)continue;
    if(px<-150)continue; // not on promenade
    var pl=new T.Mesh(new T.BoxGeometry(4,2,4),planterM);pl.position.set(px,1,pz);root.add(pl);
    var lf=new T.Mesh(new T.SphereGeometry(2.2,8,6),leafM);lf.position.set(px,3.4,pz);root.add(lf);
    foot.push([px,pz,4,4,0,2,0]);
  }

  // ---- THE 24 MEGATOWERS ----
  // jittered grid positions, avoiding plaza (r<45) and promenade (x<-150)
  var spots=[];
  var gx,gz,tries=0;
  while(spots.length<40&&tries<1600){
    tries++;
    gx=-190+R()*380; gz=-350+R()*700;
    if(Math.hypot(gx,gz)<55)continue;          // plaza
    if(gx<-150)continue;                        // promenade
    var ok=true;
    for(var s=0;s<spots.length;s++){ if(Math.hypot(gx-spots[s][0],gz-spots[s][1])<52){ok=false;break;} }
    if(ok)spots.push([gx,gz]);
  }
  function tower(x,z,h,type){
    var g=new T.Group();g.position.set(x,0,z);
    var w=18+R()*22, d=18+R()*22;
    var mat=R()<0.5?glassA:glassB;
    if(type===0){ // needle: tapered
      var nd=new T.Mesh(new T.CylinderGeometry(w*0.28,w*0.55,h,8),mat);
      nd.position.y=h/2;g.add(nd);
      var tip=new T.Mesh(new T.CylinderGeometry(0.8,2.5,26,6),gold);
      tip.position.y=h+13;g.add(tip);
      foot.push([x,z,w*1.2,w*1.2,0,h+26,0]);
    }else if(type===1){ // slab with golden-ratio setbacks
      var w1=w,d1=d,h1=h*0.55;
      var b1=new T.Mesh(new T.BoxGeometry(w1,h1,d1),mat);b1.position.y=h1/2;g.add(b1);
      var w2=w1/PHI,d2=d1/PHI,h2=h*0.3;
      var b2=new T.Mesh(new T.BoxGeometry(w2,h2,d2),mat);b2.position.set(0,h1+h2/2,0);g.add(b2);
      var w3=w2/PHI,d3=d2/PHI,h3=h*0.15;
      var b3=new T.Mesh(new T.BoxGeometry(w3,h3,d3),gold);b3.position.set(0,h1+h2+h3/2,0);g.add(b3);
      foot.push([x,z,Math.max(w1,d1),Math.max(w1,d1),0,h,0]);
    }else if(type===2){ // twisted: 5 rotated segments
      var seg=h/5;
      for(var k=0;k<5;k++){
        var sw=w*(1-k*0.09),sd=d*(1-k*0.09);
        var sg=new T.Mesh(new T.BoxGeometry(sw,seg,sd),mat);
        sg.position.y=seg*(k+0.5);sg.rotation.y=k*0.16;g.add(sg);
      }
      var cap=new T.Mesh(new T.BoxGeometry(w*0.5,4,d*0.5),gold);
      cap.position.y=h+2;g.add(cap);
      foot.push([x,z,w*1.15,w*1.15,0,h+4,0]);
    }else{ // crown: tower + glowing crown ring + spire
      var bd=new T.Mesh(new T.BoxGeometry(w,h*0.82,d),mat);bd.position.y=h*0.41;g.add(bd);
      var ring=new T.Mesh(new T.TorusGeometry(Math.max(w,d)*0.42,1.6,8,24),goldTrim);
      ring.rotation.x=Math.PI/2;ring.position.y=h*0.86;g.add(ring);
      var sp=new T.Mesh(new T.CylinderGeometry(1,3,h*0.18,6),steel);
      sp.position.y=h*0.91+h*0.09;g.add(sp);
      foot.push([x,z,Math.max(w,d),Math.max(w,d),0,h,0]);
    }
    root.add(g);
    return {x:x,z:z,h:h,w:Math.max(w,d)};
  }
  var built=[];
  var types=[0,1,2,3];
  for(i=0;i<spots.length;i++){
    var h=150+R()*250; // 150-400m
    var tp=types[i%4];
    // taller near center: scale by proximity
    var dc=Math.hypot(spots[i][0],spots[i][1]);
    if(dc<120)h=Math.min(400,h+60);
    built.push(tower(spots[i][0],spots[i][1],h,tp));
  }
  // skybridges: connect 4 pairs at ~60% height
  var bridges=0;
  for(i=0;i<built.length&&bridges<4;i++){
    for(var j2=i+1;j2<built.length;j2++){
      var dd=Math.hypot(built[i].x-built[j2].x,built[i].z-built[j2].z);
      if(dd>55&&dd<95){
        var by=Math.min(built[i].h,built[j2].h)*0.62;
        var mx=(built[i].x+built[j2].x)/2, mz=(built[i].z+built[j2].z)/2;
        var bl=Math.hypot(built[i].x-built[j2].x,built[i].z-built[j2].z);
        var br=new T.Mesh(new T.BoxGeometry(bl,5,7),glassB);
        br.position.set(mx,by,mz);
        br.rotation.y=-Math.atan2(built[j2].z-built[i].z,built[j2].x-built[i].x);
        root.add(br);
        bridges++;
        break;
      }
    }
  }

  // ---- THE HYPER SPIRE (460m) at plaza north edge ----
  var spire=new T.Group();spire.position.set(0,0,-58);
  var sh=460;
  var s1=new T.Mesh(new T.CylinderGeometry(14,26,sh*0.7,12),glassA);s1.position.y=sh*0.35;spire.add(s1);
  var s2=new T.Mesh(new T.CylinderGeometry(8,14,sh*0.22,12),glassB);s2.position.set(0,sh*0.7+sh*0.11,0);spire.add(s2);
  var s3=new T.Mesh(new T.CylinderGeometry(0.8,6,sh*0.08+30,8),gold);s3.position.set(0,sh*0.92+sh*0.04+10,0);spire.add(s3);
  // gold crown rings
  [0.55,0.7,0.82].forEach(function(f){
    var r=new T.Mesh(new T.TorusGeometry(20*(1-f*0.4)+8,1.8,8,32),goldTrim);
    r.rotation.x=Math.PI/2;r.position.y=sh*f;spire.add(r);
  });
  // beacon
  var beacon=new T.Mesh(new T.SphereGeometry(3.2,12,10),new T.MeshBasicMaterial({color:0xffe8a0}));
  beacon.position.y=sh+32;beacon.name='beacon';spire.add(beacon);
  var beam=new T.Mesh(new T.CylinderGeometry(1.2,2.2,120,8,1,true),
    new T.MeshBasicMaterial({color:0xffe8a0,tra