<!-- SOLID CITY · part 2104 -->
; plq.rotation.y = Math.PI; g.add(plq);

    // ELEVATOR (2 shafts)
    [-8, 8].forEach(function(sx){
      box(7, H, 0.6, wallM, sx, H/2, -D/2+7.3); solid(sx, -D/2+7.3, 7, 0.6, 0, H);
      box(0.6, H, 7, wallM, sx-3.5, H/2, -D/2+3.8); solid(sx-3.5, -D/2+3.8, 0.6, 7, 0, H);
      box(0.6, H, 7, wallM, sx+3.5, H/2, -D/2+3.8); solid(sx+3.5, -D/2+3.8, 0.6, 7, 0, H);
      var cab = box(6, 3.5, 6, steel, sx, 1.75, -D/2+3.8);
      cab.name = 'elevcab';
      elevators.push({ cab: cab, x: o.x+sx, z: o.z-D/2+3.8, floors: floors, idx: 0, moving: false, t: 0, from: 0, to: 0 });
    });

    // FLOOR 2 (offices) — slab with 2 elevator shaft openings
    box(W, 1, 42.7, floorM, 0, f2y-0.5, 3.65); // south of shafts (z -17.7..25)
    box(13.5, 1, 7.3, floorM, -18.25, f2y-0.5, -21.35); // NW of shafts
    box(9, 1, 7.3, floorM, 0, f2y-0.5, -21.35); // between shafts
    box(13.5, 1, 7.3, floorM, 18.25, f2y-0.5, -21.35); // NE of shafts
    standFloors.push({ x0: o.x-W/2, x1: o.x+W/2, z0: o.z-D/2, z1: o.z+D/2, y: f2y });
    for (j = 0; j < 3; j++) {
      var ox = -15 + j*15;
      // North offices
      box(12, 3, 0.4, partM, ox, f2y+1.5, -10); solid(ox, -10, 12, 0.4, f2y, f2y+3);
      box(0.4, 3, 10, partM, ox-6, f2y+1.5, -15); solid(ox-6, -15, 0.4, 10, f2y, f2y+3);
      box(0.4, 3, 10, partM, ox+6, f2y+1.5, -15); solid(ox+6, -15, 0.4, 10, f2y, f2y+3);
      box(4, 1, 2, deskM, ox, f2y+0.5, -16); solid(ox, -16, 4, 2, f2y, f2y+1);
      // South offices
      box(12, 3, 0.4, partM, ox, f2y+1.5, 10); solid(ox, 10, 12, 0.4, f2y, f2y+3);
      box(0.4, 3, 10, partM, ox-6, f2y+1.5, 15); solid(ox-6, 15, 0.4, 10, f2y, f2y+3);
      box(0.4, 3, 10, partM, ox+6, f2y+1.5, 15); solid(ox+6, 15, 0.4, 10, f2y, f2y+3);
      box(4, 1, 2, deskM, ox, f2y+0.5, 16); solid(ox, 16, 4, 2, f2y, f2y+1);
    }

    // ROOF DECK — slab with 2 elevator shaft openings
    box(W, 1, 42.7, floorM, 0, roofY-0.5, 3.65);
    box(13.5, 1, 7.3, floorM, -18.25, roofY-0.5, -21.35);
    box(9, 1, 7.3, floorM, 0, roofY-0.5, -21.35);
    box(13.5, 1, 7.3, floorM, 18.25, roofY-0.5, -21.35);
    standFloors.push({ x0: o.x-W/2, x1: o.x+W/2, z0: o.z-D/2, z1: o.z+D/2, y: roofY });
    box(W, 1.2, 0.4, steel, 0, roofY+0.6, -D/2+0.2); solid(0, -D/2+0.2, W, 0.4, roofY, roofY+1.2);
    box(W, 1.2, 0.4, steel, 0, roofY+0.6, D/2-0.2); solid(0, D/2-0.2, W, 0.4, roofY, roofY+1.2);
    box(0.4, 1.2, D, steel, -W/2+0.2, roofY+0.6, 0); solid(-W/2+0.2, 0, 0.4, D, roofY, roofY+1.2);
    box(0.4, 1.2, D, steel, W/2-0.2, roofY+0.6, 0); solid(W/2-0.2, 0, 0.4, D, roofY, roofY+1.2);
    [[-15,-15],[15,-15],[-15,15],[15,15]].forEach(function(p){
      box(3, 1.5, 3, deskM, p[0], roofY+0.75, p[1]); solid(p[0], p[1], 3, 3, roofY, roofY+1.5);
    });

  } else {
    // ============ CYLINDER PODIUM (spire) ============
    var segs = 16, rad = W/2, lobbyH2 = 14, f2y2 = floors[1], obsY = floors[2];
    for (i = 0; i < segs; i++) {
      var a = (i/segs)*Math.PI*2;
      var isDoor = (i === 3 || i === 4);
      var x1 = Math.cos(a)*rad, z1 = Math.sin(a)*rad;
      var x2 = Math.cos(a+Math.PI*2/segs)*rad, z2 = Math.sin(a+Math.PI*2/segs)*rad;
      var mx = (x1+x2)/2, mz = (z1+z2)/2;
      var segW = Math.hypot(x2-x1, z2-z1)+0.5;
      if (isDoor) {
        var wall = box(segW, H-lobbyH2, 0.8, glassA, mx, lobbyH2+(H-lobbyH2)/2, mz, -a);
      } else {
        box(segW, H, 0.8, glassA, mx, H/2, mz, -a);
        solid(mx, mz, segW, 1, 0, H);
      }
    }
    // Lobby: 8 gold columns
    for (i = 0; i < 8; i++) {
      var ca = (i/8)*Math.PI*2;
      var cx = Math.cos(ca)*18, cz = Math.sin(ca)*18;
      var col = new T.Mesh(new T.CylinderGeometry(1.1,1.3,lobbyH2,8), gold);
      col.position.set(cx, lobbyH2/2, cz); g.add(col);
      solid(cx, cz, 2.6, 2.6, 0, lobbyH2);
    }
    box(12, 1.2, 3, deskM, 0, 0.6, -10); solid(0, -10, 12, 3, 0, 1.2);
    for (i = 0; i < 4; i++) {
      var ba = (i/4)*Math.PI*2 + 0.4;
      var bx = Math.cos(ba)*24, bz = Math.sin(ba)*24;
      box(4, 0.8, 1.5, deskM, bx, 0.4, bz); solid(bx, bz, 4, 1.5, 0, 0.8);
    }
    var ceil = new T.Mesh(new T.CylinderGeometry(rad, rad, 1, 16), ceilM);
    ceil.position.y = lobbyH2+0.5; g.add(ceil);
    var plq2 = new T.Mesh(new T.PlaneGeometry(10,2.5),
      new T.MeshBasicMaterial({ map: textPlate(T, 'THE SPIRE LOBBY'), side: T.DoubleSide }));
    plq2.position.set(0, 7, rad-2); plq2.rotation.y = Math.PI; g.add(plq2);

    // Elevator (2 shafts)
    [-10, 10].forEach(function(sx){
      box(7, H, 0.6, wallM, sx, H/2, -20); solid(sx, -20, 7, 0.6, 0, H);
      box(0.6, H, 7, wallM, sx-3.5, H/2, -16.5); solid(sx-3.5, -16.5, 0.6, 7, 0, H);
      box(0.6, H, 7, wallM, sx+3.5, H/2, -16.5); solid(sx+3.5, -16.5, 0.6, 7, 0, H);
      var cab2 = box(6, 3.5, 6, steel, sx, 1.75, -16.5);
      cab2.name = 'elevcab';
      elevators.push({ cab: cab2, x: o.x+sx, z: o.z-16.5, floors: floors, idx: 0, moving: false, t: 0, from: 0, to: 0 });
    });

    // FLOOR 2 (circular, 6 rooms)
    var slab = new T.