<!-- SOLID CITY · part 112 -->
20) in place, so no route crosses it
var PATHS = {"plaza_n|plaza_e":[],"plaza_n|plaza_w":[[-13,-16]],"plaza_n|plaza_s":[],"plaza_n|hall":[],"plaza_n|forge":[],"plaza_n|studio_gate":[],"plaza_n|soul_yard":[[68,38]],"plaza_n|garden":[[74,17]],"plaza_n|north":[[11,-103]],"plaza_n|west":[],"plaza_n|east":[[53,-61]],"plaza_n|south":[[59,194]],"plaza_n|overlook":[[-97,-328]],"plaza_n|archive":[[-151,107]],"plaza_e|plaza_w":[],"plaza_e|plaza_s":[],"plaza_e|hall":[[-22,-22]],"plaza_e|forge":[[77,-76]],"plaza_e|studio_gate":[],"plaza_e|soul_yard":[],"plaza_e|garden":[[65,17],[83,23]],"plaza_e|north":[],"plaza_e|west":[],"plaza_e|east":[],"plaza_e|south":[],"plaza_e|overlook":[[-79,-235],[-79,-265],[-97,-328]],"plaza_e|archive":[[-112,110]],"plaza_w|plaza_s":[],"plaza_w|hall":[[-64,-37]],"plaza_w|forge":[],"plaza_w|soul_yard":[[140,128]],"plaza_w|garden":[[83,59]],"plaza_w|north":[[11,-169]],"plaza_w|west":[],"plaza_w|east":[],"plaza_w|south":[],"plaza_w|overlook":[[-79,-265],[-97,-328]],"plaza_w|archive":[[-160,110]],"plaza_s|hall":[[-58,-22],[-61,-31]],"plaza_s|forge":[[50,-46],[56,-64]],"plaza_s|studio_gate":[[92,-16]],"plaza_s|soul_yard":[[140,128]],"plaza_s|garden":[],"plaza_s|north":[],"plaza_s|west":[],"plaza_s|east":[[62,8],[242,-58]],"plaza_s|south":[],"plaza_s|overlook":[[8,17],[-79,-175],[-79,-265],[-97,-328]],"plaza_s|archive":[],"hall|forge":[[5,-61]],"hall|soul_yard":[],"hall|garden":[[53,17],[80,20]],"hall|north":[],"hall|west":[],"hall|east":[],"hall|south":[[59,230]],"hall|overlook":[[-79,-265],[-97,-328]],"hall|archive":[[-178,74]],"forge|studio_gate":[],"forge|studio_yard":[],"forge|masts":[[140,-124],[218,-178],[281,-184]],"forge|soul_yard":[[161,137]],"forge|garden":[],"forge|north":[[11,-205]],"forge|west":[[-22,-52]],"forge|east":[],"forge|south":[[62,164]],"forge|overlook":[[-97,-301],[-97,-328]],"forge|archive":[[-142,107]],"studio_gate|studio_yard":[],"studio_gate|masts":[[404,-202]],"studio_gate|soul_yard":[[296,-58],[257,56],[179,149]],"studio_gate|garden":[[287,-46],[182,23],[173,23]],"studio_gate|north":[[203,-202],[119,-262]],"studio_gate|east":[[254,-79]],"studio_yard|masts":[],"studio_yard|soul_yard":[[338,5],[314,5],[176,152]],"studio_yard|garden":[[356,-67],[350,-61],[281,-37],[170,26]],"studio_yard|east":[[257,-82]],"masts|east":[[401,-199],[251,-76]],"soul_yard|garden":[[122,77]],"soul_yard|east":[[224,101],[224,5]],"soul_yard|south":[[101,260]],"soul_yard|archive":[[128,119]],"garden|north":[[11,-217]],"garden|west":[],"garden|east":[[215,-4],[227,-4]],"garden|south":[],"garden|archive":[[-118,107]],"port_apron|port_tower":[],"port_apron|hangar":[[-295,380],[-295,386]],"port_apron|warp":[[-343,332]],"port_apron|west":[[-292,104]],"port_apron|south":[[-28,299],[5,296]],"port_apron|archive":[],"port_tower|hangar":[[-292,386]],"port_tower|warp":[],"port_tower|west":[[-259,131],[-259,44]],"port_tower|archive":[[-205,143]],"hangar|warp":[],"hangar|west":[[-286,386],[-259,44]],"hangar|south":[[-277,386],[-43,299],[5,296]],"hangar|archive":[[-286,386],[-235,230]],"warp|archive":[],"north|west":[[-205,-31]],"north|east":[[47,-253],[89,-238],[89,-223]],"north|overlook":[[-67,-328]],"north|archive":[[-178,77]],"west|overlook":[[-199,-103],[-151,-295],[-136,-328]],"west|archive":[[-178,74]],"east|south":[[212,41],[194,134],[98,263]],"south|archive":[[-106,182]]};
// Solid City University (campus-map.js): one office-hours stop per campus forecourt; routes to / from campuses are
// planned live along the University roads with the Hyper A* (cached per pair), never baked
if (window.CampusMap) CampusMap.CAMPUS.forEach(function (cp) { STOPS['campus_' + cp.id] = [Math.round(cp.front.x), Math.round(cp.front.z), 'the ' + cp.name + ' campus', 1]; });
var LIVE_PATHS = {};
function route(a, b) {
  var k = PATHS[a + '|' + b]; if (k) return k.slice();
  k = PATHS[b + '|' + a]; if (k) return k.slice().reverse();
  if ((STOPS[a] && STOPS[a][3]) || (STOPS[b] && STOPS[b][3])) {
    var key = a + '|' + b;
    if (!(key in LIVE_PATHS)) {
      var p = null; try { p = window.CityHyper && CityHyper.findPath ? CityHyper.findPath({ x: STOPS[a][0], z: STOPS[a][1] }, { x: STOPS[b][0], z: STOPS[b][1] }) : null; } catch (e) { p = null; }
      LIVE_PATHS[key] = p && p.length > 1 ? p.slice(1, -1).map(function (q) { return [Math.round(q.x), Math.round(q.z)]; }) : null;
    }
    return LIVE_PATHS[key] ? LIVE_PATHS[key].slice() : null;
  }
  return null;
}

/* ---------------- roster ----------------
   img = portrait from the site (public/city/cz/*.webp); otherwise a generated emblem.
   body: std|slim|stout|bot|robe   hat: crown|halo|antenna|cap|tophat|hood|fin|phones|none
   sched: [stop, dwell s, 'F' = fly this leg] */
var ROSTER = [
  { id: 'kingplaya', name: 'King Playa', role: 'Royal citizen', accent: 0xffcc33, emb: '\u265B', img: 'kingplaya', body: 'robe', hat: 'crown', sc: 1.12, sp: 1.5,
    sched: [['plaza_n', 70], ['plaza_e', 40], ['soul_yard', 45], ['garden', 40]],
    hi: ['W