<!-- LIVE · part 107 -->
ew THREE.MeshStandardMaterial({color: 0xcc3300, emissive: 0xff5500, emissiveIntensity: 0.5}));
          var vang = (v/5)*Math.PI*2;
          vent.position.set(Math.cos(vang)*12, 7, Math.sin(vang)*12);
          group.add(vent);
          var vl = new THREE.PointLight(0xff5500, 1, 30);
          vl.position.copy(vent.position); vl.position.y = 15;
          group.add(vl);
        }
        /* Power core */
        var core = new THREE.Mesh(new THREE.OctahedronGeometry(8),
          new THREE.MeshStandardMaterial({color: 0xffd700, emissive: 0xffaa00, emissiveIntensity: 0.8}));
        core.position.y = 20;
        group.add(core);
        window._dynamics.push(function(t){ core.rotation.y += 0.01; });
        /* 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='#ff5500'; ctx.fillText('ENERGY', 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 = 32;
        group.add(label);

        group.position.set(ex, DEPTH+2, ez);
        scene.add(group);
        conduit(ex, ez, forgeX, forgeZ, 0xff5500);
        console.log('ENERGY DISTRICT — power flows to the forge');
      })();

      /* EAST DISTRICT — MATERIALS */
      (function(){
        var ex = CX + 100, ez = CZ;
        var group = new THREE.Group();
        /* Storage silos */
        for(var s = 0; s < 4; s++){
          var silo = new THREE.Mesh(new THREE.CylinderGeometry(5, 5, 20, 10), steelMat);
          silo.position.set((s-1.5)*14, 10, 0);
          group.add(silo);
          var cap = new THREE.Mesh(new THREE.SphereGeometry(5, 10, 6, 0, Math.PI*2, 0, Math.PI/2), goldMat);
          cap.position.set((s-1.5)*14, 20, 0);
          group.add(cap);
        }
        /* Mining shaft */
        var shaft = new THREE.Mesh(new THREE.CylinderGeometry(4, 4, 30, 8, 1, true),
          new THREE.MeshStandardMaterial({color: 0x333333, side: THREE.DoubleSide}));
        shaft.position.set(0, -10, 20);
        group.add(shaft);
        /* 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='#d4a017'; ctx.fillText('MATERIALS', 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 = 30;
        group.add(label);

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

      /* SOUTH DISTRICT — WATER */
      (function(){
        var ex = CX, ez = CZ + 100;
        var group = new THREE.Group();
        /* Reservoir */
        var res = new THREE.Mesh(new THREE.CylinderGeometry(18, 20, 4, 16),
          new THREE.MeshStandardMaterial({color: 0x0088cc, transparent: true, opacity: 0.7}));
        res.position.y = 2;
        group.add(res);
        /* Aqueduct pillars */
        for(var a = 0; a < 6; a++){
          var ang = (a/6)*Math.PI*2;
          var pillar = new THREE.Mesh(new THREE.CylinderGeometry(1.5, 2, 25, 6), steelMat);
          pillar.position.set(Math.cos(ang)*25, 12, Math.sin(ang)*25);
          group.add(pillar);
        }
        /* Water wheel */
        var wheel = new THREE.Mesh(new THREE.TorusGeometry(8, 1, 8, 16),
          new THREE.MeshStandardMaterial({color: 0x888888, metalness: 0.6}));
        wheel.position.y = 12;
        group.add(wheel);
        window._dynamics.push(function(t){ wheel.rotation.z += 0.02; });
        var wl = new THREE.PointLight(0x0088cc, 1, 40);
        wl.position.y = 15; group.add(wl);
        /* 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='#0088cc'; ctx.fillText('WATER', 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 = 30;
        group.add(label);

        group.position.set(ex, DEPTH+2, ez);
        scene.add(group);
        conduit(ex, ez, forgeX, forgeZ, 0x0088cc);
        console.log('WATER DISTRICT — lifeblood flows to the forge');
      })();

      /* WEST DISTRICT — TRANSIT */
      (function(){
        var ex = CX - 100, ez = CZ;
        var group = new THREE.Group();
        /* Transit hub */
        var hub = new THREE.Mesh(new THREE.CylinderGeometry(12, 14, 8, 10), steelMat);
        hub.position.y = 4;
        group.add(