<!-- SOLID CITY · part 2875 -->
ject.assign({ name: 'Folk', height: 1.74, shoulders: 0.46, torso: 0.60, armLength: 0.60, legLength: 0.86, build: 1, headSize: 1, skin: '#a87a56', eyes: '#274b5c', hair: '#14100c', hairStyle: 'short', face: 'round', top: 'jacket', bottom: 'pants', shoes: 'boots', armor: 'none', accessory: 'none', primary: '#3a5a8c', secondary: '#c8ccd4', metalness: 0.3, roughness: 0.55, animation: 'idle', showRig: false }, o || {});
    }
    function buildForge(desc) {
      if (!forge) { census.forgeFailed = true; return simpleFolk({ cloth: 0x3a5a8c, skin: 0xa87a56, hair: 0x14100c }); }
      try { return forge.buildAvatar(forgeDesc(desc), { preview: false }); }
      catch (e) { census.forgeFailed = true; return simpleFolk({ cloth: 0x3a5a8c, skin: 0xa87a56, hair: 0x14100c }); }
    }
    function buildPlate(palette, s) {
      if (!createHero) return simpleFolk({ cloth: 0x23242c, skin: 0x8a6248, hair: 0x0c0e12 });
      var w = new T.Group();
      var h = createHero(T, { palette: palette }); h.scale.setScalar(1.08 * (s || 0.86)); w.add(h);
      w.userData.heroInner = h;
      return w;
    }

    var C = { x: 0, z: -1600 };
    /* ——— WALKERS ——— */
    addFigure('forge', buildForge({ primary: '#1f7a6d', secondary: '#d8d8dc', skin: '#9c7048', hairStyle: 'long', height: 1.78 }), { x: 0, y: 0, z: 0, walk: { cx: 4, cz: 2, r: 15, a0: 0.4, dir: 1, speed: 1.25 } });
    addFigure('simple', simpleFolk({ cloth: 0x8c2f39, skin: 0xcaa27a, hair: 0x2a1a10 }), { x: 0, y: 0, z: 0, walk: { cx: 4, cz: 2, r: 18, a0: 2.6, dir: -1, speed: 1.45 } });
    addFigure('forge', buildForge({ primary: '#e8e4da', secondary: '#e07b28', skin: '#a87a56', accessory: 'visor', height: 1.70 }), { x: 0, y: 0, z: 0, walk: { cx: 4, cz: 2, r: 12, a0: 4.4, dir: -1, speed: 1.15 } });
    addFigure('simple', simpleFolk({ cloth: 0x2f4a34, skin: 0x8a5f43, hair: 0x05070a }), { x: 0, y: 0, z: 0, walk: { cx: C.x, cz: C.z, r: 118, a0: 1.2, dir: 1, speed: 1.3, fixedY: 46.14 } });
    addFigure('forge', buildForge({ primary: '#7a3b1e', secondary: '#2f4a34', skin: '#8a5f43', hairStyle: 'long', height: 1.82 }), { x: 0, y: 0, z: 0, walk: { cx: C.x, cz: C.z, r: 96, a0: 3.9, dir: -1, speed: 1.2, fixedY: 46.14 } });
    addFigure('forge', buildForge({ primary: '#31597f', secondary: '#e2b15b', skin: '#bb8a5f', hair: '#10151c', height: 1.76 }), { x: 0, y: 0, z: 0, walk: { cx: C.x, cz: C.z, r: 110, a0: 5.5, dir: 1, speed: 1.28, fixedY: 186.14 } });
    addFigure('plate', buildPlate('teal', 0.84), { x: 0, y: 0, z: 0, hero: true, walk: { cx: C.x, cz: C.z, r: 88, a0: 0.9, dir: -1, speed: 1.18, fixedY: 186.14 } });
    addFigure('simple', simpleFolk({ cloth: 0x5a4a8c, skin: 0x96683f, hair: 0x1c1410 }), { x: 0, y: 0, z: 0, walk: { cx: C.x, cz: C.z, r: 21, a0: 2.2, dir: 1, speed: 0.95, fixedY: 334.14 } });

    /* ——— STANDERS ——— */
    addFigure('plate', buildPlate('red', 0.92), { x: 2500, y: surfY(2500, 1392), z: 1392, face: 2.36, hero: true, plateName: 'THE GATE WARDEN', plateSub: 'of the Entree', plateColor: '#ffb0a0' });
    addFigure('forge', buildForge({ primary: '#8a3b12', secondary: '#2b2b30', skin: '#96683f', build: 1.18, shoulders: 0.55, height: 1.79 }), { x: 2596, y: surfY(2596, 1470), z: 1470, face: Math.PI / 2, plateName: 'THE PROVISIONER', plateSub: 'of the Midway', plateColor: '#ffd98a' });
    addFigure('plate', buildPlate('gold', 0.90), { x: 2588, y: surfY(2588, 1652), z: 1652, face: 2.6, hero: true, plateName: 'THE KEEPER OF THE DEEP', plateSub: 'the ember watch', plateColor: '#ffe2a8' });
    addFigure('shade', shadeFigure(), { x: 4.5, y: surfY(4.5, -1094), z: -1094, face: Math.PI, plateName: 'THE WAYFARER', plateSub: 'by the wormhole', plateColor: '#bcd6ff' });
    addFigure('forge', buildForge({ primary: '#23222a', secondary: '#c8ccd4', skin: '#caa27a', hair: '#d8d8dc', hairStyle: 'long', height: 1.72 }), { x: -1292, y: surfY(-1292, -992), z: -992, face: 0.7, plateName: 'THE GREETER', plateSub: 'of the First City', plateColor: '#f2e8d5' });
    addFigure('simple', simpleFolk({ cloth: 0x274b5c, skin: 0x7d5a38, hair: 0x0c0e12 }), { x: -1288, y: surfY(-1288, -612), z: -612, face: -0.6, plateName: 'THE LOT HAND', plateSub: 'of the South Lot', plateColor: '#cfe2ee' });

    group.userData = {
      census: census,
      update: function (dt, t) {
        t = t || 0;
        var i, w, x, z;
        for (i = 0; i < walkers.length; i++) {
          w = walkers[i];
          w.a += (w.speed / w.r) * w.dir * dt;
          x = w.cx + Math.cos(w.a) * w.r; z = w.cz + Math.sin(w.a) * w.r;
          w.g.position.x = x; w.g.position.z = z;
          w.g.position.y = (w.fixedY != null ? w.fixedY : surfY(x, z)) + (w.kind === 'shade' ? 0.12 + 0.05 * Math.sin(t * 1.3 + w.phase) : Math.abs(Math.sin(w.phase)) * 0.035);
          w.g.rotation.y = Math.atan2(-Math.sin(w.a) * w.dir, Math.cos(w.a) * w.dir);
          w.phase += dt * w.speed * 3.4;
          var limbs = w.g.userData.limbs;
          if (limbs) {
            var sw = Math.sin(w.phase) * 0.