<!-- SOLID CITY · part 2077 -->
y=f[2];
      pm.name='porthole'; root.add(pm); portholeMeshes.push(pm);
      // silver bezel ring
      var bz=new T.Mesh(new T.TorusGeometry(3.35,0.28,8,28),silver);
      bz.position.set(f[0],py,f[1]); bz.rotation.y=f[2];
      root.add(bz);
    });
  });

  /* ============ CROWN (95-115): deliberate, not stacked ============ */
  var drum=new T.Mesh(new T.CylinderGeometry(10,12,6,8),titaniumDeep);
  drum.position.y=98; root.add(drum);                       // transition drum
  box(21,1,21,goldTrim,0,101.2,0);                          // gold cornice
  var ring=new T.Mesh(new T.TorusGeometry(13,1.6,10,36),gold);
  ring.rotation.x=Math.PI/2; ring.position.y=104; root.add(ring);
  var ring2=new T.Mesh(new T.TorusGeometry(9.5,1.2,10,32),goldTrim);
  ring2.rotation.x=Math.PI/2; ring2.position.y=107.5; root.add(ring2);
  var spire=new T.Mesh(new T.CylinderGeometry(0.5,2.2,10,8),gold);
  spire.position.y=113; root.add(spire);
  for(var sf=0;sf<4;sf++){                                   // crown fins
    var fin=new T.Mesh(new T.BoxGeometry(0.4,8,2.2),titanium);
    var fa=sf/4*Math.PI*2;
    fin.position.set(Math.cos(fa)*3,112,Math.sin(fa)*3);
    fin.rotation.y=-fa; root.add(fin);
  }
  var beaconM=new T.MeshBasicMaterial({color:0xffe8a0});
  var beacon=new T.Mesh(new T.SphereGeometry(1.2,10,8),beaconM);
  beacon.position.y=119; root.add(beacon);
  solid(0,0,30,30,95,120);

  /* ============ ELEVATOR: designed, not a box ============ */
  // shaft at east side (x=14, z=0), clad in brushed silver with accent strips
  box(5,28,5,silver,14,14,0); solid(14,0,5,5,0,28);
  [[-2.2],[2.2]].forEach(function(sx){
    box(0.3,28,5.2,titaniumDeep,14+sx[0],14,0);
  });
  // door frames on west face at each floor (visual)
  [0,16,28].forEach(function(fy){
    box(0.4,4.2,4.4,silver,11.4,fy+2.1,0);
    box(0.45,0.15,4.5,goldTrim,11.4,fy+4.35,0);
    box(0.2,3.8,3.6,titaniumDeep,11.5,fy+1.9,0); // door recess
  });
  // cab: silver panels, glass front, warm interior, gold trim
  var cab=new T.Mesh(new T.BoxGeometry(3.6,3.5,3.6),silverLight);
  cab.position.set(14,1.75,0); root.add(cab);
  var cabGlass=new T.Mesh(new T.BoxGeometry(0.15,2.6,2.8),doorGlassM);
  cabGlass.position.set(-1.85,0,0); cab.add(cabGlass);
  var cabTrim=new T.Mesh(new T.BoxGeometry(3.8,0.35,3.8),goldTrim);
  cabTrim.position.set(0,1.6,0); cab.add(cabTrim);
  var cabLight=new T.Mesh(new T.BoxGeometry(2.4,0.12,2.4),warmLight);
  cabLight.position.set(0,1.7,0); cab.add(cabLight);
  var cabBase=new T.Mesh(new T.BoxGeometry(3.7,0.3,3.7),titaniumDeep);
  cabBase.position.set(0,-1.65,0); cab.add(cabBase);
  // floor indicator lamp (color follows el.idx in update)
  var lampM=new T.MeshBasicMaterial({color:0xffe8a0});
  var lamp=new T.Mesh(new T.SphereGeometry(0.45,8,6),lampM);
  lamp.position.set(14,30.5,0); root.add(lamp);
  floorLamps.push(lampM);
  elevators.push({cab:cab,x:14,z:0,floors:[0,16,28],idx:0,moving:false,t:0,from:0,to:0,toIdx:0});
  var ep=quietMarker(T,'LIFT'); ep.position.set(10.5,2,4); ep.rotation.y=Math.PI/4; root.add(ep);

  /* ============ NAME PLATE ============ */
  var nm=quietMarker(T,'THE ANNEX');
  nm.position.set(0,2,26); root.add(nm);

  /* ============ userData — IDENTICAL contract to the original ============ */
  root.userData={
    footprint:foot, center:{x:0,z:0}, radius:80, height:130,
    elevators:elevators, standFloors:standFloors,
    update:function(t,dt,A){
      // portholes pulse and rotate
      for(var i=0;i<portholeMeshes.length;i++){
        var pm=portholeMeshes[i];
        pm.material.opacity=0.85+0.15*Math.sin(t*2+i*0.7);
        pm.rotation.z=t*0.3+i;
      }
      // beacon pulse
      var bp=0.7+0.3*Math.sin(t*2.4); beacon.scale.setScalar(bp);
      // floor indicator lamp follows elevator floor
      var lampColors=[0xffe8a0,0x7ae0ff,0xd8a833];
      for(var li=0;li<elevators.length;li++){
        if(floorLamps[li]) floorLamps[li].color.setHex(lampColors[elevators[li].idx]||0xffe8a0);
      }
      // elevator (unchanged logic)
      if(dt&&A&&A.S){
        var S=A.S;
        for(var e=0;e<elevators.length;e++){
          var el=elevators[e];
          if(el.moving){
            el.t+=dt;
            var dur=3.0, k=Math.min(1,el.t/dur);
            var ease=k<0.5?2*k*k:1-Math.pow(-2*k+2,2)/2;
            var y=el.from+(el.to-el.from)*ease;
            el.cab.position.y=y+1.75;
            var dx=S.p.x-(P.x+el.x), dz=S.p.z-(P.z+el.z);
            if(Math.abs(dx)<3&&Math.abs(dz)<3&&Math.abs(S.p.y-(P.y+y))<4){
              S.p.y=P.y+y+0.2;
            }
            if(k>=1){ el.moving=false; el.idx=el.toIdx; }
          }
        }
      }
    },
    actHere:function(wx,wz){
      for(var e=0;e<elevators.length;e++){
        var el=elevators[e];
        if(el.moving)continue;
        var dx=wx-(P.x+el.x), dz=wz-(P.z+el.z);
        if(Math.abs(dx)<4&&Math.abs(dz)<4){
          var nf=(el.idx+1)%el.floors.length;
          var names=['LOBBY','FLOOR 2','ROOF'];
          return '