<!-- SOLIDIVISM-STAGING · part 12 -->
ness: 0.85
    });
    // 10% — Hot-red emissive (#FF2200) — the hero accent
    const glowMat = new THREE.MeshStandardMaterial({
      color: 0xFF2200, emissive: 0xFF2200, emissiveIntensity: 2.5,
      roughness: 0.4, metalness: 0.1
    });

    // TORSO: tapered cylinder (suit)
    const torsoGeo = new THREE.CylinderGeometry(0.65, 0.85, 1.6, 12);
    const torso = new THREE.Mesh(torsoGeo, suitMat);
    torso.position.y = 1.6;
    group.add(torso);
    avatarParts.torso = torso;

    // CHEST PLATE: flattened box (armor) — brightest at chest (Valve)
    const chestGeo = new THREE.BoxGeometry(1.1, 0.7, 0.5);
    const chest = new THREE.Mesh(chestGeo, armorMat);
    chest.position.set(0, 1.9, 0.35);
    group.add(chest);

    // CHEST EMBLEM: glowing chevron (the identity mark)
    const emblemGeo = new THREE.PlaneGeometry(0.4, 0.25);
    const emblem = new THREE.Mesh(emblemGeo, glowMat);
    emblem.position.set(0, 1.9, 0.62);
    group.add(emblem);
    avatarParts.emblem = emblem;

    // SHOULDER PADS: asymmetric (one larger) — silhouette breakers
    const padGeoL = new THREE.BoxGeometry(0.55, 0.35, 0.6);
    const padL = new THREE.Mesh(padGeoL, armorMat);
    padL.position.set(-0.75, 2.3, 0);
    padL.rotation.z = 0.15;
    group.add(padL);

    const padGeoR = new THREE.BoxGeometry(0.7, 0.42, 0.7);
    const padR = new THREE.Mesh(padGeoR, armorMat);
    padR.position.set(0.8, 2.32, 0);
    padR.rotation.z = -0.12;
    group.add(padR);

    // ARMS: cylinders (suit) with glow circuit strips
    const armGeo = new THREE.CylinderGeometry(0.22, 0.28, 1.2, 10);
    const armL = new THREE.Mesh(armGeo, suitMat);
    armL.position.set(-0.85, 1.4, 0);
    group.add(armL);
    avatarParts.armL = armL;

    const armR = new THREE.Mesh(armGeo, suitMat);
    armR.position.set(0.85, 1.4, 0);
    group.add(armR);
    avatarParts.armR = armR;

    // ARM CIRCUIT LINES: thin emissive strips (Tron signature)
    const stripGeo = new THREE.BoxGeometry(0.06, 0.9, 0.06);
    const stripL = new THREE.Mesh(stripGeo, glowMat);
    stripL.position.set(-0.85, 1.4, 0.26);
    group.add(stripL);
    const stripR = new THREE.Mesh(stripGeo, glowMat);
    stripR.position.set(0.85, 1.4, 0.26);
    group.add(stripR);

    // LEGS: tapered cylinders
    const legGeo = new THREE.CylinderGeometry(0.28, 0.22, 1.3, 10);
    const legL = new THREE.Mesh(legGeo, suitMat);
    legL.position.set(-0.32, 0.65, 0);
    group.add(legL);
    const legR = new THREE.Mesh(legGeo, suitMat);
    legR.position.set(0.32, 0.65, 0);
    group.add(legR);

    // THIGH PLATES: armor
    const thighGeo = new THREE.BoxGeometry(0.4, 0.5, 0.35);
    const thighL = new THREE.Mesh(thighGeo, armorMat);
    thighL.position.set(-0.32, 0.9, 0.1);
    group.add(thighL);
    const thighR = new THREE.Mesh(thighGeo, armorMat);
    thighR.position.set(0.32, 0.9, 0.1);
    group.add(thighR);

    // HELMET: sphere (armor)
    const helmGeo = new THREE.SphereGeometry(0.5, 16, 12);
    const helmet = new THREE.Mesh(helmGeo, armorMat);
    helmet.position.y = 2.85;
    group.add(helmet);
    avatarParts.helmet = helmet;

    // VISOR: glowing slit — the "face" (highest payoff detail)
    const visorGeo = new THREE.BoxGeometry(0.65, 0.14, 0.2);
    const visor = new THREE.Mesh(visorGeo, glowMat);
    visor.position.set(0, 2.88, 0.38);
    group.add(visor);
    avatarParts.visor = visor;

    // HELMET FIN: rear silhouette signature (third-person camera sees back)
    const finGeo = new THREE.BoxGeometry(0.08, 0.5, 0.4);
    const fin = new THREE.Mesh(finGeo, armorMat);
    fin.position.set(0, 3.15, -0.35);
    fin.rotation.x = -0.3;
    group.add(fin);

    // BACKPACK: box with glowing exhaust (rear view design)
    const packGeo = new THREE.BoxGeometry(0.7, 0.9, 0.35);
    const pack = new THREE.Mesh(packGeo, suitMat);
    pack.position.set(0, 1.8, -0.5);
    group.add(pack);

    const exhaustGeo = new THREE.CylinderGeometry(0.08, 0.12, 0.15, 8);
    const exhaust = new THREE.Mesh(exhaustGeo, glowMat);
    exhaust.position.set(0, 1.35, -0.5);
    group.add(exhaust);
    avatarParts.exhaust = exhaust;

    group.position.set(0, 0, 58); // Behind FORGE building (back face at z=53)
    group.rotation.y = Math.PI; // Face -z (building's back, toward center)
    scene.add(group);
    player = group;
  }

  // ── IDLE ANIMATION: alive, not mannequin ──
  function updateAvatar(dt) {
    if (!player) return;
    avatarTime += dt;
    const t = avatarTime;
    // Breathing bob
    player.position.y = Math.sin(t * 2) * 0.03;
    // Head scan (slow yaw)
    if (avatarParts.helmet) {
      avatarParts.helmet.rotation.y = Math.sin(t * 0.4) * 0.25;
    }
    // Visor pulse (glow as life)
    if (avatarParts.visor) {
      const m = avatarParts.visor.material;
      m.emissiveIntensity = 2.2 + Math.sin(t * 3) * 0.6;
    }
    // Emblem pulse (synced, offset)
    if (avatarParts.emblem) {
      const m = avatarParts.emblem.material;
      m.emissiveInte