<!-- RUBY-BACKUP · part 252 -->
    var cap = new THREE.Mesh(new THREE.ConeGeometry(3, 4, 4), goldMat);
      cap.position.set(cc2.x, my + 22, cc2.z);
      cap.rotation.y = Math.PI / 4;
      scene.add(cap);
      /* Circular plaza — black granite */
      var plaza = new THREE.Mesh(new THREE.CylinderGeometry(15, 15, 1, 32), memMat);
      plaza.position.set(cc2.x, my + 0.5, cc2.z);
      scene.add(plaza);
      /* 55 gold markers around the plaza — one per ancestor */
      for(var mi = 0; mi < 55; mi++){
        var mang = (mi / 55) * Math.PI * 2;
        var mx = cc2.x + Math.cos(mang) * 12;
        var mz = cc2.z + Math.sin(mang) * 12;
        var marker = new THREE.Mesh(new THREE.BoxGeometry(0.5, 2, 0.5), goldMat);
        marker.position.set(mx, my + 1, mz);
        scene.add(marker);
      }
      /* Protect the memorial */
      if(typeof window.addRespectZone === 'function')
        window.addRespectZone(cc2.x, cc2.z, 20);
      if(typeof window.trackNewThing === 'function')
        window.trackNewThing('ancestor memorial', cc2.x, my, cc2.z);
      if(typeof codeStatus === 'function') codeStatus('the memorial rises — all 55 meet here');
    }catch(e){ if(typeof codeStatus === 'function') codeStatus('memorial failed: ' + e.message); }
    return;
  }
  if(tl==='ancestorroads'){
    try{
      var ancestors = ["Maui-Potiki","Hihiriotu","Maui-tikitiki-a-Taranga","Taharawa","Hekaponga",
        "Toi-Kai-Rakau","Rua-rangi-takin","Whatoma","Poutiriao","Te Manutohikura-a-tane",
        "Uenuku","Kamea","Pohukaina","Hua","Pau","Huanuikalalailai","Paumakua","Haho","Palena",
        "Hanalaanui","Lanakawai","Pili","Koa","Loe","Kaniuhi","Kukohou","Kanipahu","Kalapanakuioiomoa",
        "Kahaimoelea","Kalaunuiohua","Kuaiwa","Kahoukapu","Kauholanuimahu","Kiha-nui-lulu-moku",
        "Liloa","Hakau","Kealiiokaloa","Umi-a-Liloa","Kukailani","Kapukamola","Makakaualii",
        "Iwikauikaua","Kaneikaiwilani","Kalanikauleleiawi","Keawe","Kalaninuiiamamao",
        "Keawemauhili","Mokulani","Papaikaniaunui","Ululani","Kaiwaokalani","Kanakaole",
        "Wilcox","Kailiwai","Kamaile"];
      var cc = (typeof getCityCenter === 'function' ? getCityCenter() : {x: 25, z: -10});
      var brickTexA = null;
      try{
        if(!window._brickTex){
          var _bta = new THREE.TextureLoader().load('/ruby2/brick-side.png');
          _bta.wrapS = THREE.RepeatWrapping; _bta.wrapT = THREE.RepeatWrapping;
          window._brickTex = _bta;
        }
        brickTexA = window._brickTex;
      }catch(e){}
      var brickMatA = brickTexA ?
        new THREE.MeshStandardMaterial({map: brickTexA, roughness: 0.9}) :
        new THREE.MeshStandardMaterial({color: 0x8b3a2a, roughness: 0.9});
      var placed = 0;
      for(var ai = 0; ai < 55; ai++){
        var name = ancestors[ai];
        var ring = Math.floor(ai / 11);
        var posInRing = ai % 11;
        var ang = (posInRing / 11) * Math.PI * 2 + ring * 0.3;
        var rad = 35 + ring * 15;
        var rx = cc.x + Math.cos(ang) * rad;
        var rz = cc.z + Math.sin(ang) * rad;
        var dirX = -Math.sin(ang), dirZ = Math.cos(ang);
        for(var bi = 0; bi < 5; bi++){
          var px = rx + dirX * (bi - 2) * 6;
          var pz = rz + dirZ * (bi - 2) * 6;
          var py = fortifiedGroundY(px, pz);
          var roadBlock = new THREE.Mesh(new THREE.BoxGeometry(6, 1, 6), brickMatA);
          roadBlock.position.set(px, py + 0.5, pz);
          roadBlock.userData.road = true;
          roadBlock.userData.ancestor = name;
          scene.add(roadBlock);
          if(typeof window.addRespectZone === 'function')
            window.addRespectZone(px, pz, 5);
          placed++;
        }
        var signPost = new THREE.Mesh(
          new THREE.CylinderGeometry(0.2, 0.2, 4, 8),
          new THREE.MeshStandardMaterial({color: 0xd8a920, metalness: 0.8, roughness: 0.3}));
        var sy = fortifiedGroundY(rx, rz);
        signPost.position.set(rx, sy + 2, rz);
        scene.add(signPost);
        var canvas = document.createElement('canvas');
        canvas.width = 512; canvas.height = 128;
        var ctx = canvas.getContext('2d');
        ctx.fillStyle = '#1a1a1a'; ctx.fillRect(0, 0, 512, 128);
        ctx.fillStyle = '#d8a920'; ctx.font = 'bold 36px Georgia';
        ctx.textAlign = 'center'; ctx.textBaseline = 'middle';
        var shortName = name.length > 20 ? name.substring(0, 20) : name;
        ctx.fillText(shortName, 256, 64);
        var tex = new THREE.CanvasTexture(canvas);
        var plate = new THREE.Mesh(
          new THREE.PlaneGeometry(6, 1.5),
          new THREE.MeshStandardMaterial({map: tex}));
        plate.position.set(rx, sy + 4.5, rz);
        plate.lookAt(rx + Math.cos(ang) * 10, sy + 4.5, rz + Math.sin(ang) * 10);
        scene.add(plate);
        if(typeof window.trackNewThing === 'function')
          window.trackNewThing('ancestor road: ' + name, rx, sy, rz);
      }
      if(typeof codeStatus === 'function') codeStatus('55 ancestor roads