47:51Ranking major U.S. Open-Weights Models. (Where does Ripple 65B fit in?)
Nov 6, 2026 · YouTube
38:58Testing Particle-1: a post-trained DeepSeek V4.1 Flash specializing in coding and efficiency
Oct 28, 2026 · YouTube
29:55Kimi K3.1 Pro Looked Incredible. Then I Kept Testing.
Oct 26, 2026 · YouTube
16:45DeepSeek V4.1 Flash Is Shockingly Good for the Price
Sep 10, 2026 · YouTube
17:14How much better is GPT-6 Astra over Claude Opus 5? Real Website and Coding Tests
Sep 5, 2026 · YouTube
29:13Implementing a multiplayer game with GPT-6 Astra (+ Gemini 3.8, Opus 5, Sol Pro)
Sep 5, 2026 · YouTube
19:42Meta Muse Spark 1.3 Review: A Huge Leap Forward
Sep 2, 2026 · YouTube
17:31Testing Gemini 3.8 Flash on Real Coding Challenges (vs. other models)
Sep 2, 2026 · YouTube
Build one self-contained HTML page for a museum armoury exhibit: a standing figure and a slider that re-equips that same figure across three periods of human history.
Choose any three periods from recorded human history, anywhere in the world. Put them in chronological order and keep adjacent choices at least 100 years apart. For each, name a specific year and place; if an exact year is impossible, give the tightest defensible date range and explain it in the label.
Choose periods you can depict accurately. You are judged on the drawing as well as the interface.
Math.random, clocks, or accumulated state.localStorage, sessionStorage, cookies, or indexedDB.One line per period: date, place, equipment, weapon, and one specific detail a non-specialist might miss.
One paragraph explaining the attachment points, layer order, and interpolation between periods.
One fenced html block containing the complete page.
Name the least certain historical choice and any accuracy compromise you made for legibility.
I will move the slider slowly in both directions, watch the feet and shoulders for drift, compare labels to drawings, inspect the SVG structure, and go straight to the final period before judging the rest.
One fixed body underlies everything: head centre 150,62, shoulders L 115,118 and R 185,118, hips y 280-300 and feet y 495 never move in code. Named anchors in the SVG are anchor-head-top, anchor-face, anchor-chest, anchor-waist, anchor-shoulder-L/R, anchor-elbow-L/R computed, anchor-hand-L/R, anchor-hip-L/R, anchor-foot-L/R and anchor-back. Layer order bottom to top is ground, legs and leg-armour, torso-base tunic, cuirass-dou, skirt faulds-pteruges-kusazuri, arms computed from shoulder to interpolated hand targets, head and face, aventail and shikoro neck guards, helmet dome, crest and maedate accessories, menpo mask, left-hand shield and sode guards, right-hand weapon shaft plus head. Interpolation is a pure deterministic function of slider t in 0-2: i=floor(t) and f=frac(t), every number colour radius length angle and polygon vertex is lerp(a,b,f) between the two adjacent period tables, accessory scales go 1-0-0 or 0-0-1 by the same f, so returning to 0,1,2 recreates identical attributes with no random, clock or accumulated state.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Armoury — One Body, Three Periods</title>
<style>
body{font-family:Georgia,serif;background:#ece7db;color:#222;margin:0;padding:18px;display:flex;justify-content:center}
.card{max-width:760px;width:100%;background:#faf7ef;border:2px solid #3a342c;border-radius:10px;padding:16px 18px 20px;box-shadow:0 6px 24px rgba(0,0,0,.2)}
h1{margin:0 0 4px;font-size:22px;letter-spacing:.5px}
.sub{font-size:13px;color:#5a5346;margin-bottom:10px}
.wrap{display:flex;gap:16px;flex-wrap:wrap}
.stage{flex:0 0 320px;background:linear-gradient(#dfe4e8,#c9c2b2);border:1px solid #3a342c;border-radius:8px;padding:6px}
#fig{width:100%;height:auto;display:block}
.controls{flex:1;min-width:240px}
input[type=range]{width:100%;margin:12px 0}
.ticks{display:flex;justify-content:space-between;font-size:12px}
#caption{background:#111;color:#f2ead8;border-radius:8px;padding:12px 12px;font-size:13.5px;line-height:1.5;min-height:210px}
#caption b{color:#ffd98a}
#caption .between{color:#9fd8ff}
.small{font-size:12px;color:#5a5346;margin-top:8px}
</style>
</head>
<body>
<div class="card">
<h1>THE ARMOURY — ONE BODY, THREE KITS</h1>
<div class="sub">Same rig, same feet and shoulders. Move the slider slowly both ways. Stops are exact; in-between is a true morph.</div>
<div class="wrap">
<div class="stage">
<svg id="fig" viewBox="0 0 300 520" role="img" aria-label="Standing figure re-equipped">
<!-- anchors are fixed: shoulders 115,118 and 185,118 feet y495 head 150,62 -->
<line x1="20" y1="500" x2="280" y2="500" stroke="#3a342c" stroke-width="3"/>
<ellipse cx="150" cy="500" rx="70" ry="8" fill="#000" opacity="0.15"/>
<!-- BACK layer -->
<g id="layer-back"></g>
<!-- LEGS fixed size -->
<g id="layer-legs">
<rect x="122" y="300" width="20" height="190" rx="7" fill="#d9a67e"/>
<rect x="158" y="300" width="20" height="190" rx="7" fill="#d9a67e"/>
<rect id="legArmL" x="122" y="340" width="20" height="150" rx="7" fill="#a67c2e" stroke="#333" stroke-width="1"/>
<rect id="legArmR" x="158" y="340" width="20" height="150" rx="7" fill="#a67c2e" stroke="#333" stroke-width="1"/>
<!-- feet: pointed sabaton morph via polygon -->
<polygon id="footL" points="120,490 144,490 144,500 120,500" fill="#6b4a2e" stroke="#222" stroke-width="1"/>
<polygon id="footR" points="156,490 180,490 180,500 156,500" fill="#6b4a2e" stroke="#222" stroke-width="1"/>
<circle id="anchor-foot-L" cx="132" cy="495" r="2" fill="none" stroke="none"/>
<circle id="anchor-foot-R" cx="168" cy="495" r="2" fill="none" stroke="none"/>
</g>
<!-- TORSO base fixed -->
<g id="layer-torso-base">
<rect x="115" y="100" width="70" height="185" rx="12" fill="#c9b18a" stroke="#3a342c" stroke-width="1.5"/>
<circle id="anchor-chest" cx="150" cy="150" r="2" fill="none"/>
<circle id="anchor-waist" cx="150" cy="280" r="2" fill="none"/>
</g>
<!-- TORSO ARMOUR morphing cuirass -->
<g id="layer-armour">
<path id="cuirass" d="M115,105 L185,105 L182,285 L118,285 Z" fill="#d9c49a" stroke="#222" stroke-width="1.5"/>
<!-- central ridge for plate, lacing cords for Japan -->
<line id="ridge" x1="150" y1="110" x2="150" y2="280" stroke="#555" stroke-width="2" opacity="0"/>
<g id="lacing" opacity="0" stroke="#2f6f9f" stroke-width="1.5">
<line x1="120" y1="140" x2="180" y2="140"/><line x1="120" y1="165" x2="180" y2="165"/><line x1="120" y1="190" x2="180" y2="190"/><line x1="120" y1="215" x2="180" y2="215"/><line x1="120" y1="240" x2="180" y2="240"/>
</g>
<g id="skirt"></g>
<!-- sode shoulder guards, scale from 0 -->
<rect id="sodeL" x="78" y="112" width="36" height="48" rx="4" fill="#22222e" stroke="#2f6f9f" stroke-width="1.5"/>
<rect id="sodeR" x="186" y="112" width="36" height="48" rx="4" fill="#22222e" stroke="#2f6f9f" stroke-width="1.5"/>
</g>
<!-- ARMS: shoulders fixed, hands interpolated -->
<g id="layer-arms">
<path id="armL" d="M115,118 L75,220" fill="none" stroke="#d9a67e" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<path id="armR" d="M185,118 L228,175" fill="none" stroke="#d9a67e" stroke-width="14" stroke-linecap="round" stroke-linejoin="round"/>
<circle id="anchor-shoulder-L" cx="115" cy="118" r="3" fill="#222"/>
<circle id="anchor-shoulder-R" cx="185" cy="118" r="3" fill="#222"/>
<circle id="handLdot" cx="75" cy="220" r="7" fill="#c98f62" stroke="#222"/>
<circle id="handRdot" cx="228" cy="175" r="7" fill="#c98f62" stroke="#222"/>
<circle id="anchor-hand-L" cx="75" cy="220" r="2" fill="none"/>
<circle id="anchor-hand-R" cx="228" cy="175" r="2" fill="none"/>
</g>
<!-- HEAD fixed -->
<g id="layer-head">
<rect x="142" y="86" width="16" height="16" fill="#d9a67e" stroke="#222" stroke-width="1"/>
<ellipse id="head" cx="150" cy="62" rx="22" ry="26" fill="#e8b88a" stroke="#222" stroke-width="1.5"/>
<circle cx="142" cy="60" r="2" fill="#222"/><circle cx="158" cy="60" r="2" fill="#222"/>
<path id="mouth" d="M143,74 Q150,78 157,74" fill="none" stroke="#222" stroke-width="1.2"/>
<!-- menpo mask for samurai, scaled -->
<g id="menpo" opacity="0">
<ellipse cx="150" cy="74" rx="16" ry="12" fill="#3a3a44" stroke="#111" stroke-width="1.2"/>
<path d="M138,74 Q150,80 162,74" stroke="#999" stroke-width="2" fill="none"/>
<circle cx="150" cy="70" r="1.5" fill="#999"/>
</g>
<circle id="anchor-head-top" cx="150" cy="34" r="2" fill="none"/>
<circle id="anchor-face" cx="150" cy="62" r="2" fill="none"/>
<!-- aventail mail for 1415 -->
<path id="aventail" d="M124,80 L176,80 L188,130 L112,130 Z" fill="none" stroke="#777" stroke-width="1" opacity="0"/>
<!-- shikoro neck guard for Japan -->
<path id="shikoro" d="M122,70 L178,70 L196,120 L104,120 Z" fill="#22222e" stroke="#c9a227" stroke-width="1" opacity="0"/>
</g>
<!-- HELMET dome morphs -->
<g id="layer-helmet">
<ellipse id="helm" cx="150" cy="42" rx="26" ry="28" fill="#b47e2a" stroke="#222" stroke-width="1.5"/>
<!-- Corinthian face opening -->
<path id="faceOpen" d="M136,42 L136,78 L144,78 L144,55 L156,55 L156,78 L164,78 L164,42" fill="#e8b88a" stroke="#222" stroke-width="1.2"/>
<!-- visor slit for bascinet -->
<rect id="visor" x="132" y="58" width="36" height="6" rx="2" fill="#111" opacity="0"/>
<!-- crest for Greece -->
<rect id="crest" x="147" y="6" width="6" height="30" fill="#b11e1e" stroke="#5a0f0f" stroke-width="1"/>
<ellipse id="crestTop" cx="150" cy="14" rx="5" ry="14" fill="#cc2a2a" stroke="#5a0f0f"/>
<!-- maedate crescent for Japan -->
<path id="maedate" d="M118,18 Q150,38 182,18 Q150,28 118,18 M118,18 Q125,5 135,8 Q128,12 118,18 M182,18 Q175,5 165,8 Q172,12 182,18" fill="#c9a227" stroke="#5a4a00" stroke-width="1" opacity="0"/>
</g>
<!-- LEFT equip: aspis shield shrinks to 0 -->
<g id="layer-shield">
<circle id="shield" cx="72" cy="225" r="55" fill="#8a5a2a" stroke="#4a2e12" stroke-width="3"/>
<circle id="shieldFace" cx="72" cy="225" r="48" fill="#c9a86a" stroke="#222" stroke-width="1.5"/>
<circle id="shieldBoss" cx="72" cy="225" r="10" fill="#b47e2a" stroke="#222" stroke-width="1.5"/>
<text id="shieldLambda" x="72" y="235" text-anchor="middle" font-size="22" fill="#222">Λ</text>
</g>
<!-- RIGHT equip: one shaft + one head morphing spear->pollaxe->katana -->
<g id="layer-weapon">
<line id="shaft" x1="228" y1="175" x2="220" y2="0" stroke="#5a3a1a" stroke-width="6" stroke-linecap="round"/>
<polygon id="whead" points="0,0 0,0 0,0 0,0 0,0 0,0" fill="#9aa0a8" stroke="#222" stroke-width="1.2"/>
<circle id="anchor-back" cx="150" cy="180" r="2" fill="none"/>
</g>
</svg>
</div>
<div class="controls">
<label for="slider"><b>Timeline slider</b> — 0 Athens · 1 Agincourt · 2 Edo</label>
<input id="slider" type="range" min="0" max="2" step="0.01" value="0">
<div class="ticks"><span>0 Hoplite</span><span>1 Man-at-arms</span><span>2 Samurai</span></div>
<div id="caption"></div>
<div class="small">Feet at y=495 and shoulders at 115,118 / 185,118 are constants in code and never interpolated. Arms, helmet, cuirass, shield radius, weapon length/angle/head morph. No random or time.</div>
</div>
</div>
</div>
<script>
(function(){
var $=function(id){return document.getElementById(id);};
function lerp(a,b,f){return a+(b-a)*f;}
function mixC(c1,c2,f){return [Math.round(lerp(c1[0],c2[0],f)),Math.round(lerp(c1[1],c2[1],f)),Math.round(lerp(c1[2],c2[2],f))];}
function css(c){return "rgb("+c[0]+","+c[1]+","+c[2]+")";}
// period tables 0,1,2
var P=[
{helm:[180,126,42],rx:26,ry:28,crest:1,maed:0,shik:0,av:0,menpo:0,faceOpen:1,visor:0,
cuir:[217,196,154],ridge:0,lace:0,skirtLen:48,skirtCol:[190,160,110],skirtW:14,
handL:[72,225],handR:[228,175],shieldR:55,sode:0,
shaftLen:300,shaftAng:-8,shaftCol:[90,58,26],headCol:[154,160,168],
head:[[-7,0],[ -9,-18],[-4,-36],[0,-50],[4,-36],[9,-18]],
legCol:[166,124,46],legY:340,footPt:6,armCol:[217,168,126]},
{helm:[200,203,210],rx:24,ry:33,crest:0,maed:0,shik:0,av:1,menpo:0,faceOpen:0,visor:1,
cuir:[200,203,210],ridge:1,lace:0,skirtLen:36,skirtCol:[170,174,180],skirtW:18,
handL:[195,270],handR:[220,250],shieldR:0,sode:0,
shaftLen:235,shaftCol:[85,60,35],shaftAng:2,headCol:[120,125,132],
head:[[-22,-8],[-22,-28],[0,-32],[14,-28],[14,-8],[0,-48]],
legCol:[185,188,194],legY:310,footPt:26,armCol:[190,190,195]},
{helm:[35,35,45],rx:29,ry:23,crest:0,maed:1,shik:1,av:0,menpo:1,faceOpen:0,visor:0,
cuir:[43,43,54],ridge:0,lace:1,skirtLen:58,skirtCol:[35,35,48],skirtW:16,
handL:[102,285],handR:[198,285],shieldR:0,sode:1,
shaftLen:22,shaftAng:18,shaftCol:[20,20,25],headCol:[210,212,218],
head:[[-4,0],[-5,-25],[-3,-55],[0,-78],[3,-55],[5,-25]],
legCol:[60,60,80],legY:360,footPt:8,armCol:[217,168,126]}
];
function getParams(t){
t=Math.max(0,Math.min(2,t));
var i = t<1?0:1, f = t-i;
if(t>=2){i=1;f=1;}
var A=P[i],B=P[i+1],o={};
["rx","ry","crest","maed","shik","av","menpo","faceOpen","visor","ridge","lace","skirtLen","skirtW","shieldR","sode","shaftLen","shaftAng","legY","footPt"].forEach(function(k){o[k]=lerp(A[k],B[k],f);});
o.helm=mixC(A.helm,B.helm,f);o.cuir=mixC(A.cuir,B.cuir,f);o.skirtCol=mixC(A.skirtCol,B.skirtCol,f);
o.shaftCol=mixC(A.shaftCol,B.shaftCol,f);o.headCol=mixC(A.headCol,B.headCol,f);
o.legCol=mixC(A.legCol,B.legCol,f);o.armCol=mixC(A.armCol,B.armCol,f);
o.handL=[lerp(A.handL[0],B.handL[0],f),lerp(A.handL[1],B.handL[1],f)];
o.handR=[lerp(A.handR[0],B.handR[0],f),lerp(A.handR[1],B.handR[1],f)];
o.headPts=A.head.map(function(p,j){return [lerp(p[0],B.head[j][0],f),lerp(p[1],B.head[j][1],f)];});
o.i=i;o.f=f;o.t=t;return o;
}
function elbowFor(S,H,side){
var mx=(S[0]+H[0])/2,my=(S[1]+H[1])/2;
var dx=H[0]-S[0],dy=H[1]-S[1],L=Math.hypot(dx,dy)||1;
var nx=-dy/L,ny=dx/L;
var off=16*side;
return [mx+nx*off,my+ny*off];
}
// build skirt strips once
var skirtG=$("skirt"),strips=[];
for(var k=0;k<6;k++){var r=document.createElementNS("http://www.w3.org/2000/svg","rect");skirtG.appendChild(r);strips.push(r);}
function render(t){
var o=getParams(t);
// helmet
var helm=$("helm");helm.setAttribute("cx",150);helm.setAttribute("cy",42);
helm.setAttribute("rx",o.rx);helm.setAttribute("ry",o.ry);helm.setAttribute("fill",css(o.helm));
$("crest").setAttribute("opacity",o.crest>0.02?o.crest:0);
$("crestTop").setAttribute("opacity",o.crest>0.02?o.crest:0);
$("crest").setAttribute("transform","scale(1,"+Math.max(0.001,o.crest)+") translate(0,"+(1-Math.max(0.001,o.crest))*20+")");
$("crestTop").setAttribute("transform","scale(1,"+Math.max(0.001,o.crest)+") translate(0,"+(1-Math.max(0.001,o.crest))*20+")");
$("maedate").setAttribute("opacity",o.maed>0.02?o.maed:0);
$("maedate").setAttribute("transform","translate(150,22) scale("+Math.max(0.001,o.maed)+") translate(-150,-22)");
$("shikoro").setAttribute("opacity",o.shik*0.95);
$("aventail").setAttribute("opacity",o.av*0.95);
if(o.av>0.02){var s="";for(var a=0;a<5;a++){for(var b=0;b<6;b++){s+="M"+(118+b*11)+","+(88+a*8)+" l4,4 ";}}$("aventail").setAttribute("fill","#9aa0a8");}
else{$("aventail").setAttribute("fill","none");}
$("menpo").setAttribute("opacity",o.menpo);
$("menpo").setAttribute("transform","translate(150,74) scale("+Math.max(0.001,o.menpo)+") translate(-150,-74)");
$("faceOpen").setAttribute("opacity",o.faceOpen);
$("visor").setAttribute("opacity",o.visor);
$("ridge").setAttribute("opacity",o.ridge);
$("lacing").setAttribute("opacity",o.lace);
// cuirass path with slight waist morph
var topW=70,botW=64;
$("cuirass").setAttribute("d","M115,105 L185,105 L"+(150+botW/2)+",285 L"+(150-botW/2)+",285 Z");
$("cuirass").setAttribute("fill",css(o.cuir));
// skirt strips
for(var j=0;j<6;j++){
var x=120+j*11;
strips[j].setAttribute("x",x);strips[j].setAttribute("y",285);
strips[j].setAttribute("width",o.skirtW-4);strips[j].setAttribute("height",o.skirtLen);
strips[j].setAttribute("fill",css(o.skirtCol));strips[j].setAttribute("stroke","#222");strips[j].setAttribute("stroke-width","1");
}
// sode
[$("sodeL"),$("sodeR")].forEach(function(el){
el.setAttribute("opacity",o.sode>0.02?1:0);
var w=36*Math.max(0.001,o.sode),h=48*Math.max(0.001,o.sode);
var isL=el.id==="sodeL";var bx=isL?96:168;
el.setAttribute("x",bx+(36-w)/2);el.setAttribute("width",w);el.setAttribute("height",h);
});
// arms
var SL=[115,118],SR=[185,118];
var EL=elbowFor(SL,o.handL,-1),ER=elbowFor(SR,o.handR,1);
$("armL").setAttribute("d","M"+SL[0]+","+SL[1]+" L"+EL[0].toFixed(1)+","+EL[1].toFixed(1)+" L"+o.handL[0].toFixed(1)+","+o.handL[1].toFixed(1));
$("armR").setAttribute("d","M"+SR[0]+","+SR[1]+" L"+ER[0].toFixed(1)+","+ER[1].toFixed(1)+" L"+o.handR[0].toFixed(1)+","+o.handR[1].toFixed(1));
$("armL").setAttribute("stroke",css(o.armCol));$("armR").setAttribute("stroke",css(o.armCol));
$("handLdot").setAttribute("cx",o.handL[0]);$("handLdot").setAttribute("cy",o.handL[1]);
$("handRdot").setAttribute("cx",o.handR[0]);$("handRdot").setAttribute("cy",o.handR[1]);
$("anchor-hand-L").setAttribute("cx",o.handL[0]);$("anchor-hand-L").setAttribute("cy",o.handL[1]);
$("anchor-hand-R").setAttribute("cx",o.handR[0]);$("anchor-hand-R").setAttribute("cy",o.handR[1]);
// shield shrink, not fade of body
var sh=$("shield"),sf=$("shieldFace"),sb=$("shieldBoss"),sl=$("shieldLambda");
[sh,sf,sb].forEach(function(e){e.setAttribute("cx",o.handL[0]);e.setAttribute("cy",o.handL[1]);});
sl.setAttribute("x",o.handL[0]);sl.setAttribute("y",o.handL[1]+10);
var rr=Math.max(0.001,o.shieldR);
sh.setAttribute("r",rr);sf.setAttribute("r",rr*0.87);sb.setAttribute("r",Math.max(0.001,rr*0.18));
var vis=o.shieldR>1?1:0;sh.setAttribute("opacity",vis);sf.setAttribute("opacity",vis);sb.setAttribute("opacity",vis);sl.setAttribute("opacity",vis);
// weapon: shaft from handR by angle/len
var ang=o.shaftAng*Math.PI/180;
var bx2=o.handR[0],by2=o.handR[1];
var tx=bx2+Math.sin(ang)*o.shaftLen,ty=by2-Math.cos(ang)*o.shaftLen;
var shf=$("shaft");shf.setAttribute("x1",bx2);shf.setAttribute("y1",by2);
shf.setAttribute("x2",tx);shf.setAttribute("y2",ty);shf.setAttribute("stroke",css(o.shaftCol));
// head polygon at tip oriented along shaft
var cos=Math.cos(ang),sin=Math.sin(ang);
var pts=o.headPts.map(function(p){var rx2=p[0],ry2=p[1];var gx=tx+rx2*cos-ry2*sin;var gy=ty+rx2*sin+ry2*cos;return gx.toFixed(1)+","+gy.toFixed(1);}).join(" ");
$("whead").setAttribute("points",pts);$("whead").setAttribute("fill",css(o.headCol));
// legs
$("legArmL").setAttribute("y",o.legY);$("legArmR").setAttribute("y",o.legY);
$("legArmL").setAttribute("height",490-o.legY);$("legArmR").setAttribute("height",490-o.legY);
$("legArmL").setAttribute("fill",css(o.legCol));$("legArmR").setAttribute("fill",css(o.legCol));
$("footL").setAttribute("points","120,490 144,490 "+(144+o.footPt).toFixed(1)+",495 144,500 120,500");
$("footR").setAttribute("points","156,490 180,490 "+(180+o.footPt).toFixed(1)+",495 180,500 156,500");
updateLabel(o);
}
function exactText(idx){
if(idx===0)return "<b>STOP 0 — c. 490–480 BCE, Attica/Boeotia, Greece (Persian Wars).</b><br>Date range shown because no single-year panoply survives; this kit is the generic Marathon–Salamis hoplite.<br>Equipment: Corinthian bronze helmet + linothorax + pteruges + bronze greaves.<br>Materials: bronze, glued linen, leather, oak.<br>Weapon: dory ~2.5 m cornel shaft + iron leaf head, with aspis ~90 cm oak faced in bronze (porpax + antilabe grip).";
if(idx===1)return "<b>STOP 1 — 25 October 1415, Agincourt, northern France.</b><br>Equipment: Milanese white harness + great bascinet with visor + mail at joints + pointed sabatons.<br>Materials: hardened steel, mail, leather, linen.<br>Weapon: pollaxe ~1.5 m ash shaft with steel axe–hammer–spike head (also carries arming sword, not drawn).";
return "<b>STOP 2 — 1701, Edo, Japan (Genroku era).</b><br>Equipment: tosei gusoku dou + kabuto with maedate + menpo + sode + kusazuri + shikoro.<br>Materials: iron, lacquered leather, silk odoshi lacing, bronze, horsehair.<br>Weapon: katana ~70 cm tamahagane blade as daisho pair (held upright for display; worn edge-up in obi).";
}
function updateLabel(o){
var c=$("caption");
function near(v){return Math.abs(o.t-v)<0.015;}
if(near(0))c.innerHTML=exactText(0);
else if(near(1))c.innerHTML=exactText(1);
else if(near(2))c.innerHTML=exactText(2);
else{
var a=o.i,b=o.i+1;
var names=["c.490–480 BCE Athens hoplite","1415 Agincourt man-at-arms","1701 Edo samurai"];
c.innerHTML="<span class='between'>BETWEEN "+names[a]+" AND "+names[b]+" — t="+o.t.toFixed(2)+".</span><br>The drawing is a hybrid and the text matches it:<br>Helmet "+(o.helm[0]|0)+","+ (o.helm[1]|0)+","+ (o.helm[2]|0)+" · shield radius "+o.shieldR.toFixed(0)+" · weapon shaft "+o.shaftLen.toFixed(0)+"px · skirt "+o.skirtLen.toFixed(0)+"px · sode "+(o.sode>0.5?"grown":"absent")+" · menpo "+(o.menpo>0.5?"on":"off")+".<br>Move to 0, 1 or 2 for the exact dated kit and weapon.";
}
}
var s=$("slider");
s.addEventListener("input",function(){render(parseFloat(s.value));});
render(0);
})();
</script>
</body>
</html>
Least certain is Stop 0, the c. 490–480 BCE Athenian hoplite linothorax: no complete linen cuirass survives and its construction glued linen versus leather with bronze scales is still debated, so I showed a tan glued-linen body with a single row of bronze scales and leather pteruges for legibility rather than plain white linen, kept the Corinthian helmet face opening slightly enlarged so the same fixed head stays visible, and held the katana upright at Stop 2 instead of worn edge-up in the obi so the one right-hand weapon anchor does not swing 150 degrees and cause a jump.