<!-- SOLID CITY · part 2886 -->
oz + hd, (W - 8) / 2, 1, 0, lh);
    /* gold door frame */
    box(g, 9, 1, 1, 0, lh - 0.5, hd, trim); box(g, 0.8, lh, 1, -4.4, lh / 2, hd, trim); box(g, 0.8, lh, 1, 4.4, lh / 2, hd, trim);

    /* lobby floor + interior */
    box(g, W - 2, 0.3, D - 2, 0, 0.15, 0, M.steel);
    SF(cfg.ox - hw + 1, cfg.ox + hw - 1, cfg.oz - hd + 1, cfg.oz + hd - 1, 0);
    for (var c = -1; c <= 1; c += 2) for (var c2 = -1; c2 <= 1; c2 += 2) {
      box(g, 1.2, 7, 1.2, c * 9, 3.5, c2 * 9, M.gold);
      FP(cfg.ox + c * 9, cfg.oz + c2 * 9, 1.6, 1.6, 0, 7);
    }
    /* reception desk */
    box(g, 6, 1.1, 2, 0, 0.55, -6, M.wood); box(g, 6.4, 0.15, 2.4, 0, 1.15, -6, M.gold);
    FP(cfg.ox, cfg.oz - 6, 6.4, 2.4, 0, 1.2);

    /* demo storefronts (2, flanking lobby east/west) */
    var shops = towerShops(cfg.id);
    for (var si = 0; si < 2; si++) {
      var sside = si === 0 ? -1 : 1, sxp = sside * 12;
      var shop = shops[si] || { name: 'SHOP ' + (si + 1), products: ['Goods', 'Wares'] };
      /* storefront: back wall, side walls, open front facing lobby center */
      box(g, 10, 5, 0.5, sxp, 2.5, -13, shell);
      box(g, 0.5, 5, 8, sxp - 5, 2.5, -9, shell); box(g, 0.5, 5, 8, sxp + 5, 2.5, -9, shell);
      box(g, 10, 0.4, 8, sxp, 5.2, -9, M.dark); // header
      /* sign */
      var sign = makeText(T, shop.name, cfg.accent); sign.position.set(sxp, 4.4, -8.6); g.add(sign);
      /* shelves with products */
      for (var sh = 0; sh < 3; sh++) {
        box(g, 8, 0.25, 1.6, sxp, 1 + sh * 1.2, -12.2, M.wood);
        for (var pi = 0; pi < 4; pi++) {
          var pc = [0xc65c5c, 0x5c8ac6, 0x6bc65c, 0xc6a55c][(pi + sh) % 4];
          box(g, 0.7, 0.9, 0.7, sxp - 3 + pi * 2, 1.6 + sh * 1.2, -12.2, lam(pc));
        }
      }
      box(g, 3, 1, 1.4, sxp, 0.5, -7, M.wood); // counter
      FP(cfg.ox + sxp, cfg.oz - 9, 10.5, 8.5, 0, 5.4);
    }

    /* floor 2: 4 offices */
    var f2 = FH;
    for (var o = 0; o < 4; o++) {
      var ox = (o % 2 === 0 ? -1 : 1) * 9, oz = (o < 2 ? -1 : 1) * 9;
      box(g, 14, 3.4, 0.4, ox, f2 + 1.7, oz + (o < 2 ? 7 : -7), M.white);
      box(g, 0.4, 3.4, 14, ox + (o % 2 === 0 ? 7 : -7), f2 + 1.7, oz, M.white);
      box(g, 3, 0.15, 1.6, ox, f2 + 0.9, oz, M.wood); // desk
      box(g, 1, 1, 1, ox + 2, f2 + 0.5, oz + 1, M.dark); // chair
      box(g, 4, 2.4, 0.5, ox - 3, f2 + 1.2, oz + (o < 2 ? 6.6 : -6.6), M.wood); // shelf
      FP(cfg.ox + ox, cfg.oz + oz, 14.5, 14.5, f2, f2 + 3.4);
    }
    SF(cfg.ox - hw + 1, cfg.ox + hw - 1, cfg.oz - hd + 1, cfg.oz + hd - 1, f2);

    /* stairs: walkable switchback lobby -> floor 2 (west wall) */
    var stx = -hw + 3;
    for (var st = 0; st < 16; st++) {
      var sy = (st + 0.5) * (FH / 16), sz2 = -hd + 4 + st * 1.55;
      box(g, 3, 0.4, 1.5, stx, sy, sz2, M.dark);
      SF(cfg.ox + stx - 1.5, cfg.ox + stx + 1.5, cfg.oz + sz2 - 0.75, cfg.oz + sz2 + 0.75, sy + 0.2);
    }
    box(g, 0.3, 3, 26, stx - 1.8, 4, 4, trim); // stair rail

    /* elevator: shaft at NE corner, rideable cab */
    var ex = hw - 5, ez = -hd + 5;
    box(g, 6, TH, 6, ex, TH / 2, ez, shell);
    FP(cfg.ox + ex, cfg.oz + ez, 6.4, 6.4, 0, TH);
    var cab = new T.Group(); cab.position.set(ex, 1.75, ez); g.add(cab);
    box(cab, 4.6, 3.2, 4.6, 0, 0, 0, trim);
    box(cab, 4.6, 0.3, 4.6, 0, -1.6, 0, M.dark);
    elevators.push({ x: ex, z: ez, cab: cab, idx: 0, toIdx: 0, moving: false, t: 0, from: 0, to: 0, floors: [0, FH, TH], tower: cfg.id });

    /* rooftop: ring + railing + mast */
    var ring = new T.Mesh(new T.TorusGeometry(W * 0.47, 0.42, 8, 48), trim);
    ring.rotation.x = Math.PI / 2; ring.position.y = TH + 1.5; g.add(ring);
    box(g, 0.8, 14, 0.8, 0, TH + 7, 0, trim);
    box(g, W, 1.1, 0.3, 0, TH + 0.8, hd, M.steel); box(g, W, 1.1, 0.3, 0, TH + 0.8, -hd, M.steel);
    box(g, 0.3, 1.1, D, hw, TH + 0.8, 0, M.steel); box(g, 0.3, 1.1, D, -hw, TH + 0.8, 0, M.steel);
    SF(cfg.ox - hw + 1, cfg.ox + hw - 1, cfg.oz - hd + 1, cfg.oz + hd - 1, TH);
    FP(cfg.ox, cfg.oz, W, D, TH - 1, TH + 1.2); // roof slab handled via standY; block below

    /* portholes: 6 glowing discs on upper facade */
    for (var ph = 0; ph < 6; ph++) {
      var pgeo = new T.CircleGeometry(1.6, 24);
      var pmt = new T.MeshBasicMaterial({ color: cfg.accent, transparent: true, opacity: 0.85, side: T.DoubleSide });
      var pm = new T.Mesh(pgeo, pmt);
      var pfl = 4 + (ph % 4) * 2, side4 = ph % 4;
      var pyy = pfl * FH + FH / 2;
      if (side4 === 0) { pm.position.set(-6 + (ph * 3) % 12, pyy, hd + 0.15); }
      else if (side4 === 1) { pm.position.set(-6 + (ph * 3) % 12, pyy, -hd - 0.15); pm.rotation.y = Math.PI; }
      else if (side4 === 2) { pm.position.set(hw + 0.15, pyy, -6 + (ph * 3) % 12); pm.rotation.y = Math.PI / 2; }
      else { pm.position.set(-hw - 0.15, pyy, -6 + (ph * 3) % 12); pm.rotation.y = -Math.PI / 2; }
      g.add(pm); portholes.push(pm);
    }

    /* name plaque */
    var plq = makeText(T, cfg.name, 0xd8a833); plq.position.set(0, 3, hd + 1