<!-- SOLID CITY · part 2079 -->
 box(W,1,D,floorM,0,-0.5,0);
  // walls (south has 8m door gap, 10m tall opening)
  box(W,14,1,wallM,0,7,-21.5); solid(0,-21.5,W,1,0,14);
  box(18,14,1,wallM,-13,7,21.5); solid(-13,21.5,18,1,0,14);
  box(18,14,1,wallM,13,7,21.5); solid(13,21.5,18,1,0,14);
  box(8,4,1,wallM,0,12,21.5); solid(0,21.5,8,1,10,14); // above door
  box(1,14,D,wallM,-21.5,7,0); solid(-21.5,0,1,D,0,14);
  box(1,14,D,wallM,21.5,7,0); solid(21.5,0,1,D,0,14);
  // ceiling
  box(W,1,D,ceilM,0,14.5,0);
  // gold door frame
  box(0.8,10,1.2,gold,-4.4,5,21.5); solid(-4.4,21.5,0.8,1.2,0,10);
  box(0.8,10,1.2,gold,4.4,5,21.5); solid(4.4,21.5,0.8,1.2,0,10);
  box(9.6,0.8,1.2,gold,0,10.2,21.5);
  // open glass doors (angled)
  var doorGlass=new T.MeshLambertMaterial({color:0xaaccdd,transparent:true,opacity:0.4});
  var dg1=new T.Mesh(new T.BoxGeometry(3.8,9.5,0.2),doorGlass);
  dg1.position.set(-2.2,4.75,20.2); dg1.rotation.y=0.5; root.add(dg1);
  var dg2=new T.Mesh(new T.BoxGeometry(3.8,9.5,0.2),doorGlass);
  dg2.position.set(2.2,4.75,20.2); dg2.rotation.y=-0.5; root.add(dg2);
  // 8 gold columns in a ring
  for(var ci=0;ci<8;ci++){
    var ca=ci/8*Math.PI*2;
    var cx=Math.cos(ca)*13, cz=Math.sin(ca)*13;
    var col=new T.Mesh(new T.CylinderGeometry(0.9,1.1,14,10),gold);
    col.position.set(cx,7,cz); root.add(col);
    var cap=new T.Mesh(new T.CylinderGeometry(1.3,1.3,0.6,10),goldTrim);
    cap.position.set(cx,13.8,cz); root.add(cap);
    solid(cx,cz,2.2,2.2,0,14);
  }
  // reception desk
  box(8,1.2,3,woodM,0,0.6,-10); solid(0,-10,8,3,0,1.2);
  box(8,0.3,3.2,darkSteel,0,1.35,-10);
  var rq=quietMarker(T,'RECEPTION'); rq.position.set(0,1.5,-10); root.add(rq);
  // 4 seating clusters (sofa + table)
  [[-12,8],[12,8],[-12,-2],[12,-2]].forEach(function(pt){
    box(3.5,1,1.4,sofaM,pt[0],0.5,pt[1]); solid(pt[0],pt[1],3.5,1.4,0,1);
    box(3.5,1.2,0.4,sofaM,pt[0],1.1,pt[1]-0.7);
    var tbl=new T.Mesh(new T.CylinderGeometry(1,1,0.15,12),woodM);
    tbl.position.set(pt[0],0.9,pt[1]+2); root.add(tbl);
    var leg=new T.Mesh(new T.CylinderGeometry(0.15,0.15,0.9,8),darkSteel);
    leg.position.set(pt[0],0.45,pt[1]+2); root.add(leg);
    solid(pt[0],pt[1]+2,2,2,0,1);
  });
  // ceiling light strips
  for(var li=-1;li<=1;li++){
    box(20,0.3,1.2,lampM,0,13.8,li*10);
  }
  // lobby plaque
  var lp=quietMarker(T,'THE ANNEX'); lp.position.set(-14,2,21); lp.rotation.y=Math.PI; root.add(lp);
  standFloors.push({x0:-22,x1:22,z0:-22,z1:22,y:0});

  /* ============ FLOOR 2: OFFICES (16-26) ============ */
  box(W,1,D,stoneM,0,15.5,0); // slab (floor at 16)
  // walls
  box(W,10,1,wallM,0,21,-21.5); solid(0,-21.5,W,1,16,26);
  box(W,10,1,wallM,0,21,21.5); solid(0,21.5,W,1,16,26);
  box(1,10,D,wallM,-21.5,21,0); solid(-21.5,0,1,D,16,26);
  box(1,10,D,wallM,21.5,21,0); solid(21.5,0,1,D,16,26);
  box(W,1,D,ceilM,0,26.5,0); // ceiling
  // windows (glass strips on walls)
  var winM=new T.MeshLambertMaterial({color:0xaaccdd,transparent:true,opacity:0.5});
  box(W-4,3,0.3,winM,0,22,-21.4);
  box(W-4,3,0.3,winM,0,22,21.4);
  box(0.3,3,D-4,winM,-21.4,22,0);
  box(0.3,3,D-4,winM,21.4,22,0);
  // central corridor (east-west)
  // 6 offices: 3 north, 3 south
  var officeX=[-14,0,14];
  officeX.forEach(function(ox){
    // north office
    box(10,8,0.5,wallM,ox,20,-8); solid(ox,-8,10,0.5,16,24);
    // south office
    box(10,8,0.5,wallM,ox,20,8); solid(ox,8,10,0.5,16,24);
    // office door gaps (2m wide, in partition)
    // (visual only — partitions have gaps, collision split)
  });
  // office furniture: desks, chairs, shelves
  officeX.forEach(function(ox){
    [-14,14].forEach(function(oz){
      // desk
      box(3,0.15,1.5,woodM,ox,17.1,oz); solid(ox,oz,3,1.5,16,17.2);
      box(0.15,1.1,1.5,woodM,ox-1.4,16.55,oz);
      box(0.15,1.1,1.5,woodM,ox+1.4,16.55,oz);
      // chair
      box(1,0.15,1,darkSteel,ox,16.8,oz+2.5); solid(ox,oz+2.5,1,1,16,17);
      box(1,1.2,0.15,darkSteel,ox,17.4,oz+2.9);
      // shelf with books
      box(2.5,4,0.8,woodM,ox+6,18,oz); solid(ox+6,oz,2.5,0.8,16,20);
      for(var bi=0;bi<4;bi++){
        var bookC=[0xaa4444,0x4466aa,0x44aa66,0xaa8844][bi%4];
        box(0.4,0.8,0.6,new T.MeshLambertMaterial({color:bookC}),ox+5.2+bi*0.5,18.5,oz);
      }
    });
  });
  // corridor lights
  for(var l2=-1;l2<=1;l2++){ box(16,0.3,1,lampM,l2*12,25.8,0); }
  var f2p=quietMarker(T,'FLOOR 2'); f2p.position.set(-18,18,0); f2p.rotation.y=Math.PI/2; root.add(f2p);
  standFloors.push({x0:-22,x1:22,z0:-22,z1:22,y:16});

  /* ============ ROOF DECK (28) ============ */
  box(W,1,D,stoneM,0,27.5,0); // slab (deck at 28)
  // railing
  var railM=darkSteel;
  [[0,-21.5,W,1],[0,21.5,W,1],[-21.5,0,1,D],[21.5,0,1,D]].forEach(function(r){
    box(r[2],1.2,r[3],railM,r[0],28.6,r[1]); solid(r[0],r[1],r[2],r[3],28,29.2);
  });
  // planters + benches
  [[-15,-15],[15,-15],[-15,15],[15,15]].forEach(function(pt){
    box(3,1.5,3,woodM,pt[0],28.75,pt[1]); solid(pt[0],pt[1],3,3,28,29.5);
    var lf=new T.Mesh(new T.SphereGeometry(1.8