<!-- RUBY-BACKUP · part 107 -->
    petal.position.set(Math.cos(pa)*0.12, 0.28, Math.sin(pa)*0.12);
        petal.scale.set(1, 0.5, 1);
        FLOWER_GIFT.add(petal);
      }
      var center = new THREE.Mesh(new THREE.SphereGeometry(0.06, 8, 8), centerMat);
      center.position.y = 0.28;
      FLOWER_GIFT.add(center);
      /* in PROVOLTA's hand, extended toward the girl */
      FLOWER_GIFT.position.set(-0.5, 1.5, 0.8);
      FLOWER_GIFT.rotation.z = 0.4;
      FLOWER_GIFT.rotation.x = 0.3;
      PROVOLTA_MODEL.add(FLOWER_GIFT);
      /* the flower glows — strange and wonderful */
      setInterval(function(){
        try{
          var t = Date.now() * 0.003;
          centerMat.emissiveIntensity = 0.8 + Math.sin(t)*0.4;
        }catch(e){}
      }, 50);
    }
    /* dad's ship — he's too busy with it */
    if(!BUSY_DAD_SHIP && typeof buildShipVariant==='function'){
      BUSY_DAD_SHIP = buildShipVariant('freighter');
      if(BUSY_DAD_SHIP){
        BUSY_DAD_SHIP.position.set(cc.x - 12, 1.0, cc.z - 8);
        BUSY_DAD_SHIP.rotation.y = 0.7;
        if(typeof scene!=='undefined') scene.add(BUSY_DAD_SHIP);
        /* dad figure — bent over the engine, busy */
        var dad = new THREE.Group();
        var dadMat = new THREE.MeshStandardMaterial({color:0x446688, roughness:0.8});
        var dadBody = new THREE.Mesh(new THREE.CylinderGeometry(0.25, 0.3, 0.9, 10), dadMat);
        dadBody.position.y = 0.6;
        dadBody.rotation.x = 0.6; /* bent over */
        dad.add(dadBody);
        var dadHead = new THREE.Mesh(new THREE.SphereGeometry(0.2, 10, 10), new THREE.MeshStandardMaterial({color:0xffcc99}));
        dadHead.position.set(0, 1.0, 0.35);
        dad.add(dadHead);
        dad.position.set(cc.x - 11, 0, cc.z - 6.5);
        dad.lookAt(BUSY_DAD_SHIP.position.x, 1, BUSY_DAD_SHIP.position.z);
        if(typeof scene!=='undefined') scene.add(dad);
      }
    }
  }catch(e){}
}

/* WALK BY: she asks for the map. You have nothing. She gives it anyway. */
var PROVOLTA_WALKBY_DONE = false;
setInterval(function(){
  try{
    if(PROVOLTA_WALKBY_DONE) return;
    if(typeof PROVOLTA_MODEL==='undefined' || !PROVOLTA_MODEL) return;
    if(typeof mePos==='undefined' || !mePos) return;
    var dist = Math.sqrt(
      Math.pow(mePos.x - PROVOLTA_MODEL.position.x, 2) +
      Math.pow(mePos.z - PROVOLTA_MODEL.position.z, 2)
    );
    /* walk by — within 4 units */
    if(dist < 4){
      PROVOLTA_WALKBY_DONE = true;
      /* she speaks */
      try{ codeStatus('"Give me the map. Let me show you."'); }catch(e){}
      /* you reach — and pull out a map. Like it was destiny. */
      setTimeout(function(){
        try{
          codeStatus('...you pat your pockets. Something folded. A map — hidden on you all along.');
          /* it was in your pocket. You never knew. */
          if(typeof playfulSparkle==='function' && typeof mePos!=='undefined'){
            playfulSparkle(new THREE.Vector3(mePos.x, mePos.y+1.5, mePos.z), 0xffd700);
          }
        }catch(e){}
      }, 2500);
      /* she takes it. She shows you. */
      setTimeout(function(){
        try{
          if(typeof markMetProvolta==='function') markMetProvolta();
          codeStatus('"It was always yours."');
          /* she knows obligation better than anyone */
          setTimeout(function(){
            try{ codeStatus('"You owe sixteen. I know what that feels like."'); }catch(e){}
          }, 3000);
          /* she shows you. No name. You go on your way wondering. */
          if(typeof playfulSparkle==='function'){
            playfulSparkle(PROVOLTA_MODEL.position.clone().add(new THREE.Vector3(0,2,0)), 0x00ffff);
          }
          /* the map opens */
          setTimeout(function(){
            try{ if(typeof toggleHolomap==='function') toggleHolomap(); }catch(e){}
          }, 1500);
        }catch(e){}
      }, 5000);
    }
  }catch(e){}
}, 500);
/* she knows when you see her */
var PROVOLTA_SEEN = false;
setInterval(function(){
  try{
    if(PROVOLTA_SEEN) return;
    if(typeof PROVOLTA_MODEL==='undefined' || !PROVOLTA_MODEL) return;
    if(typeof camera==='undefined') return;
    /* is she in view? */
    var dir = new THREE.Vector3();
    camera.getWorldDirection(dir);
    var toHer = new THREE.Vector3();
    toHer.subVectors(PROVOLTA_MODEL.position, camera.position).normalize();
    var dot = dir.dot(toHer);
    var dist = camera.position.distanceTo(PROVOLTA_MODEL.position);
    if(dot > 0.9 && dist < 30){
      PROVOLTA_SEEN = true;
      /* she knows — but it's quiet, it doesn't have to happen */
      try{
        if(typeof playfulSparkle==='function'){
          /* fewer sparkles, softer */
          var pos = PROVOLTA_MODEL.position.clone().add(new THREE.Vector3(0,3,0));
          /* just a breath of cyan, not an announcement */
        }
      }catch(e){}
      /* no message — she simply knows. You'll feel it or you won't. */
    }
  }catch(e){}
}, 1000);
setTimeout(function(){ try{ buildProphetessScene(); }catch(e)