<!-- LIVE · part 108 -->
hub);
        /* Lift shafts */
        for(var l = 0; l < 4; l++){
          var lang = (l/4)*Math.PI*2;
          var lift = new THREE.Mesh(new THREE.CylinderGeometry(2, 2, 40, 8),
            new THREE.MeshBasicMaterial({color: 0x00ffff, transparent: true, opacity: 0.3}));
          lift.position.set(Math.cos(lang)*18, 20, Math.sin(lang)*18);
          group.add(lift);
        }
        /* Rotating beacon */
        var beacon = new THREE.Mesh(new THREE.OctahedronGeometry(3),
          new THREE.MeshBasicMaterial({color: 0x00ffff}));
        beacon.position.y = 45;
        group.add(beacon);
        window._dynamics.push(function(t){
          beacon.rotation.y += 0.03;
          beacon.position.y = 45 + Math.sin(t*2)*2;
        });
        /* Label */
        var canvas = document.createElement('canvas'); canvas.width=256; canvas.height=64;
        var ctx = canvas.getContext('2d'); ctx.font='bold 28px monospace'; ctx.textAlign='center';
        ctx.fillStyle='#00ffff'; ctx.fillText('TRANSIT', 128, 42);
        var label = new THREE.Sprite(new THREE.SpriteMaterial({map: new THREE.CanvasTexture(canvas), transparent: true}));
        label.scale.set(20, 5, 1); label.position.y = 52;
        group.add(label);

        group.position.set(ex, DEPTH+2, ez);
        scene.add(group);
        conduit(ex, ez, forgeX, forgeZ, 0x00ffff);
        console.log('TRANSIT DISTRICT — paths flow to the forge');
      })();

      

    console.log('FOUR DISTRICTS BUILT — the forge is fed');
    })();

    console.log('POPULATION QUARTERS BUILT — 12 homes, garden, hall. They thrive.');
    })();

    console.log('MANUFACTURING FACILITY BUILT — the deep forge burns');
    })();

    console.log('FORTRESS OF THE DEEP BUILT — the mountain guards the throne');
  }catch(e){ console.error('Fortress failed:', e); }
}
if(typeof buildFortressDeep === 'function'){ try{ buildFortressDeep(); }catch(e){ console.error(e); } }


===== FILE: public/live/three.min.js =====
/**
 * @license
 * Copyright 2010-2021 Three.js Authors
 * SPDX-License-Identifier: MIT
 */
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).THREE={})}(this,(function(t){"use strict";const e="128",n=100,i=300,r=301,s=302,a=303,o=304,l=306,c=307,h=1e3,u=1001,d=1002,p=1003,m=1004,f=1005,g=1006,v=1007,y=1008,x=1009,_=1012,w=1014,b=1015,M=1016,S=1020,T=1022,E=1023,A=1026,L=1027,R=33776,C=33777,P=33778,D=33779,I=35840,N=35841,B=35842,z=35843,F=37492,O=37496,H=2300,G=2301,U=2302,k=2400,V=2401,W=2402,j=2500,q=2501,X=3e3,Y=3001,Z=3007,J=3002,Q=3004,K=3005,$=3006,tt=7680,et=35044,nt=35048,it="300 es";class rt{addEventListener(t,e){void 0===this._listeners&&(this._listeners={});const n=this._listeners;void 0===n[t]&&(n[t]=[]),-1===n[t].indexOf(e)&&n[t].push(e)}hasEventListener(t,e){if(void 0===this._listeners)return!1;const n=this._listeners;return void 0!==n[t]&&-1!==n[t].indexOf(e)}removeEventListener(t,e){if(void 0===this._listeners)return;const n=this._listeners[t];if(void 0!==n){const t=n.indexOf(e);-1!==t&&n.splice(t,1)}}dispatchEvent(t){if(void 0===this._listeners)return;const e=this._listeners[t.type];if(void 0!==e){t.target=this;const n=e.slice(0);for(let e=0,i=n.length;e<i;e++)n[e].call(this,t);t.target=null}}}const st=[];for(let t=0;t<256;t++)st[t]=(t<16?"0":"")+t.toString(16);let at=1234567;const ot=Math.PI/180,lt=180/Math.PI;function ct(){const t=4294967295*Math.random()|0,e=4294967295*Math.random()|0,n=4294967295*Math.random()|0,i=4294967295*Math.random()|0;return(st[255&t]+st[t>>8&255]+st[t>>16&255]+st[t>>24&255]+"-"+st[255&e]+st[e>>8&255]+"-"+st[e>>16&15|64]+st[e>>24&255]+"-"+st[63&n|128]+st[n>>8&255]+"-"+st[n>>16&255]+st[n>>24&255]+st[255&i]+st[i>>8&255]+st[i>>16&255]+st[i>>24&255]).toUpperCase()}function ht(t,e,n){return Math.max(e,Math.min(n,t))}function ut(t,e){return(t%e+e)%e}function dt(t,e,n){return(1-n)*t+n*e}function pt(t){return 0==(t&t-1)&&0!==t}function mt(t){return Math.pow(2,Math.ceil(Math.log(t)/Math.LN2))}function ft(t){return Math.pow(2,Math.floor(Math.log(t)/Math.LN2))}var gt=Object.freeze({__proto__:null,DEG2RAD:ot,RAD2DEG:lt,generateUUID:ct,clamp:ht,euclideanModulo:ut,mapLinear:function(t,e,n,i,r){return i+(t-e)*(r-i)/(n-e)},inverseLerp:function(t,e,n){return t!==e?(n-t)/(e-t):0},lerp:dt,damp:function(t,e,n,i){return dt(t,e,1-Math.exp(-n*i))},pingpong:function(t,e=1){return e-Math.abs(ut(t,2*e)-e)},smoothstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*(3-2*t)},smootherstep:function(t,e,n){return t<=e?0:t>=n?1:(t=(t-e)/(n-e))*t*t*(t*(6*t-15)+10)},randInt:function(t,e){return t+Math.floor(Math.random()*(e-t+1))},randFloat:function(t,e){return t+Math.random()*(e-t)},randFloatSpread:function(t){return t*(.5-Math.random())},seededRandom:function(t){return void 0!==t&&(at=t%2147483647),at=16807*at%2147483647,(at-1)/2147483646},degToRad:function(t){return t*ot},radToDeg: