<!-- SAGA-STAGING · part 105 -->
se, 'soulprint-radio');
      
      // Console glow screen
      var screen = new THREE.Mesh(new THREE.PlaneGeometry(3, 1.5), glowMat);
      screen.position.set(TX + 12, 2.2, TZ + 6.1);
      scene.add(screen);
      if(window.WORLD_REGISTRY) window.WORLD_REGISTRY.register(screen, 'soulprint-radio-screen');
      
      // Label
      if(typeof makeTextSprite === 'function'){
        var label = makeTextSprite('✦ SOUL PRINT', {size: 48, color: '#ffd700'});
        label.position.set(TX, 60, TZ);
        label.scale.set(20, 5, 1);
        scene.add(label);
      }
      
      // Collision: tower blocks movement (cylinder)
      if(window.WF && window.WF.registerCollider){
        window.WF.registerCollider(spire, {type:'cylinder', radius:6, name:'soulprint_tower'});
      }
      
      if(typeof say === 'function') say('✦ Soul Print\'s Tower rises by the edge');
    } catch(e){
      if(typeof say === 'function') say('Tower failed: ' + e.message);
    }
  }
  
  // Build after new world (delay 5s)
  setTimeout(function(){
    if(typeof scene !== 'undefined' && window.location.pathname.indexOf('saga-staging') >= 0){
      buildTower();
      initSoulPrintRadio();
      initSoulPrintChat();
    }
  }, 5000);
  
  /* ===== SOUL PRINT RADIO — 333 songs, official source ===== */
  window.SPRadio = {
    audio: null,
    playlist: [],
    current: 0,
    playing: false,
    init: function(){
      var self = this;
      fetch('/SolidBigIsland/songs.json').then(function(r){ return r.json(); }).then(function(data){
        self.playlist = data.songs || [];
        if(typeof say === 'function') say('Radio loaded: ' + self.playlist.length + ' songs');
        self.createUI();
      }).catch(function(e){
        if(typeof say === 'function') say('Radio playlist failed: ' + e.message);
      });
    },
    createUI: function(){
      var self = this;
      // Radio panel (HTML overlay)
      var panel = document.createElement('div');
      panel.id = 'sp-radio-panel';
      panel.style.cssText = 'position:fixed;bottom:120px;right:10px;width:280px;background:rgba(10,10,20,0.95);border:2px solid #00ffff;border-radius:12px;padding:12px;color:#fff;font-family:sans-serif;z-index:9999;display:none;';
      panel.innerHTML = '<div style="color:#00ffff;font-weight:bold;margin-bottom:8px;">✦ SOUL PRINT RADIO</div>' +
        '<div id="sp-track-info" style="font-size:12px;margin-bottom:8px;min-height:32px;">Loading...</div>' +
        '<div style="display:flex;gap:8px;margin-bottom:8px;">' +
        '<button id="sp-play" style="flex:1;padding:8px;background:#00aaaa;border:none;border-radius:6px;color:#fff;font-size:16px;">▶</button>' +
        '<button id="sp-next" style="flex:1;padding:8px;background:#444;border:none;border-radius:6px;color:#fff;font-size:16px;">⏭</button>' +
        '</div>' +
        '<div style="display:flex;align-items:center;gap:8px;">' +
        '<span style="font-size:12px;">🔊</span>' +
        '<input id="sp-vol" type="range" min="0" max="100" value="70" style="flex:1;">' +
        '</div>' +
        '<button id="sp-close" style="margin-top:8px;width:100%;padding:6px;background:#333;border:none;border-radius:6px;color:#fff;">Close</button>';
      document.body.appendChild(panel);
      
      this.audio = new Audio();
      this.audio.volume = 0.7;
      this.audio.addEventListener('ended', function(){ self.next(); });
      
      document.getElementById('sp-play').onclick = function(){ self.toggle(); };
      document.getElementById('sp-next').onclick = function(){ self.next(); };
      document.getElementById('sp-vol').oninput = function(e){ self.audio.volume = e.target.value/100; };
      document.getElementById('sp-close').onclick = function(){ panel.style.display='none'; };
    },
    toggle: function(){
      if(!this.playlist.length) return;
      if(this.playing){ this.audio.pause(); this.playing=false; document.getElementById('sp-play').textContent='▶'; }
      else { this.playTrack(this.current); }
    },
    playTrack: function(idx){
      var self = this;
      this.current = idx;
      var song = this.playlist[idx];
      if(!song) return;
      this.audio.src = '/SolidBigIsland/mp3/' + song.file;
      this.audio.play().then(function(){
        self.playing = true;
        document.getElementById('sp-play').textContent='⏸';
        document.getElementById('sp-track-info').textContent = (idx+1) + '/' + self.playlist.length + ': ' + song.title;
      }).catch(function(e){
        if(typeof say==='function') say('Radio play failed: ' + e.message);
      });
    },
    next: function(){ this.playTrack((this.current+1) % this.playlist.length); },
    show: function(){ document.getElementById('sp-radio-panel').style.display='block'; },
    duck: function(){ if(this.audio) this.audio.volume = 0.15; }, // Lower during conversation
    unduck: function(){ 
      var v = document.getElementById('sp-vol');
      if(this.audio && v) this.audio.volume = v.value/