[
  {
    "name": "town-hill-1-street",
    "page": "settlement.html",
    "js": [
      "await window.__show('town','hill',1,'walk','auto'); window.__walkStreet();",
      "Object.defineProperty(window,'__mats',{configurable:true,get:()=>({stats:window.__stats,fps:window.__fps,ground:window.__built().group.children.find(m=>m.name==='ground-grass')?.userData.groundTimings})});"
    ],
    "wait": 3000
  },
  {
    "name": "town-hill-1-curve",
    "page": "settlement.html",
    "js": [
      "const p=window.__plan(),r=p.roads.find(r=>r.kind==='main'),i=Math.min(r.pts.length-2,Math.floor(r.pts.length*.35)),a=r.pts[i],b=r.pts[Math.min(i+9,r.pts.length-1)]; window.__view('walk'); window.__walkTo(a[0],a[1],Math.atan2(b[1]-a[1],b[0]-a[0]),.03);"
    ],
    "wait": 1500
  },
  {
    "name": "town-hill-1-square",
    "page": "settlement.html",
    "js": [
      "const s=window.__plan().squares[0],c=s.poly.reduce((a,b)=>[a[0]+b[0]/s.poly.length,a[1]+b[1]/s.poly.length],[0,0]); window.__view('walk'); window.__walkTo(c[0]-8,c[1]-3,.1,.02);"
    ],
    "wait": 1500
  },
  {
    "name": "town-hill-1-real-junction",
    "page": "settlement.html",
    "js": [
      "const p=window.__plan(),inside=(q,poly)=>{let c=false;for(let i=0,j=poly.length-1;i<poly.length;j=i++){const a=poly[i],b=poly[j];if((a[1]>q[1])!==(b[1]>q[1])&&q[0]<(b[0]-a[0])*(q[1]-a[1])/(b[1]-a[1])+a[0])c=!c;}return c;}; const j=p.junctions.find(j=>!p.squares.some(s=>inside([j.x,j.z],s.poly))&&Math.hypot(j.x-p.rect.x,j.z-p.rect.z)>35),r=p.roads.find(r=>r.id===j.road),i=r.pts.reduce((best,q,k)=>Math.hypot(q[0]-j.x,q[1]-j.z)<Math.hypot(r.pts[best][0]-j.x,r.pts[best][1]-j.z)?k:best,0),a=r.pts[Math.max(0,i-5)];window.__view('walk');window.__walkTo(a[0],a[1],Math.atan2(j.z-a[1],j.x-a[0]),.03);"
    ],
    "wait": 1500
  },
  {
    "name": "town-hill-5-street",
    "page": "settlement.html",
    "js": [
      "await window.__show('town','hill',5,'walk','auto'); window.__walkStreet();",
      "Object.defineProperty(window,'__mats',{configurable:true,get:()=>({stats:window.__stats,fps:window.__fps,ground:window.__built().group.children.find(m=>m.name==='ground-grass')?.userData.groundTimings})});"
    ],
    "wait": 3000
  },
  {
    "name": "village-hill-1-street",
    "page": "settlement.html",
    "js": [
      "await window.__show('village','hill',1,'walk','auto'); window.__walkStreet();",
      "Object.defineProperty(window,'__mats',{configurable:true,get:()=>({stats:window.__stats,fps:window.__fps,ground:window.__built().group.children.find(m=>m.name==='ground-grass')?.userData.groundTimings})});"
    ],
    "wait": 3000
  },
  {
    "name": "city-river-1-street",
    "page": "settlement.html",
    "js": [
      "await window.__show('city','river',1,'walk','auto'); window.__walkStreet();",
      "Object.defineProperty(window,'__mats',{configurable:true,get:()=>({stats:window.__stats,fps:window.__fps,ground:window.__built().group.children.find(m=>m.name==='ground-grass')?.userData.groundTimings})});"
    ],
    "wait": 3000
  },
  {
    "name": "city-river-1-parvis",
    "page": "settlement.html",
    "js": [
      "const l=window.__plan().plots.find(p=>p.use==='church'||p.use==='cathedral'); window.__view('walk');window.__walkTo(l.x-l.w/2-9,l.z,0,.03);"
    ],
    "wait": 1500
  },
  {
    "name": "village-plain-2-street",
    "page": "settlement.html",
    "js": [
      "await window.__show('village','plain',2,'walk','auto'); window.__walkStreet();",
      "Object.defineProperty(window,'__mats',{configurable:true,get:()=>({stats:window.__stats,fps:window.__fps,ground:window.__built().group.children.find(m=>m.name==='ground-grass')?.userData.groundTimings})});"
    ],
    "wait": 3000
  },
  {
    "name": "town-hill-1-cost-top",
    "page": "settlement.html",
    "js": [
      "await window.__show('town','hill',1,'top','auto');"
    ],
    "wait": 1500
  },
  {
    "name": "town-hill-1-cost-repeat",
    "page": "settlement.html",
    "js": [
      "await window.__show('town','hill',1,'walk','auto');window.__walkStreet();"
    ],
    "wait": 1500
  }
]