diff --git a/system/tests/oskiewar-generation.test.mjs b/system/tests/oskiewar-generation.test.mjs index a0ff82bb6d..4495aa1ca9 100644 --- a/system/tests/oskiewar-generation.test.mjs +++ b/system/tests/oskiewar-generation.test.mjs @@ -165,11 +165,11 @@ test('shared character follows the game bones without mutating physics or restor world.segments.find(b=>b.role==='left-upper-arm').role='attack-upper-arm'; before.segments = structuredClone(world.segments); const instances = poseFighter(model, world); - assert.equal(instances.length, 16); + assert.equal(instances.length, 20); assert.equal(instances.find(i=>i.name==='head').faces,model.parts.head); assert.deepEqual(world,before); const missing = poseFighter(model,world,{headless:true,hasPart:part=>part!=='left-arm'}); - assert.equal(missing.length,12); + assert.equal(missing.length,15); assert.ok(!missing.some(i=>i.name==='head')); const arm = world.segments.find(b=>b.role==='right-forearm'); Object.assign(arm,{x2:arm.x1,y2:arm.y1,z2:arm.z1+32}); diff --git a/xbox/live/oskiewar-fighter.mjs b/xbox/live/oskiewar-fighter.mjs index 0a0f284a1f..30bd81dc61 100644 --- a/xbox/live/oskiewar-fighter.mjs +++ b/xbox/live/oskiewar-fighter.mjs @@ -53,6 +53,8 @@ export function fighterParts(a) { rings([[0,5.8,5.8],[.25,6.7,6.5],[.78,5.3,5.2],[.94,4.8,4.8],[1,4.8,4.8]],color); if(a.sleeves==='long') rings([[.88,5.5,5.4],[.98,5.3,5.3]],tint(color,-.1)); }); + part('elbow',()=>ellipsoid([0,0,0],[6.2,6.2,6.2],a.sleeves==='long'?a.shirt:a.skin,10,6)); + part('knee',()=>ellipsoid([0,0,0],[7.8,7.8,7.8],a.pants,10,6)); part('hand',()=>{ellipsoid([0,3,0],[5.4,7.2,4],a.skin,10,6);ellipsoid([4,1,2],[2.5,4,2.5],a.skin,8,4);}); part('thigh',()=>rings([[0,8,9],[.1,10,11],[.5,9.7,10],[.9,7.8,8],[1,7.5,8]],a.pants)); part('shin',()=>{ @@ -137,6 +139,8 @@ export function poseFighter(model, world, {yaw=0,headless=false,hasPart=()=>true if(!model.parts[name])continue; add(name,endpoint(bone,1),frame(bone)); if(name==='torso')add('pelvis',endpoint(bone,2),rigid); + if(name==='upper-arm')add('elbow',endpoint(bone,2),rigid); + if(name==='thigh')add('knee',endpoint(bone,2),rigid); if(name==='forearm')add('hand',endpoint(bone,2),[...frame(bone).map(unit)]); if(name==='shin')add('shoe',endpoint(bone,2),rigid); } diff --git a/xbox/live/oskiewar.js b/xbox/live/oskiewar.js index 3088d190e6..af77b69f15 100644 --- a/xbox/live/oskiewar.js +++ b/xbox/live/oskiewar.js @@ -102,7 +102,7 @@ if (hostAnalytics) const hostAc = typeof ac === "function" ? ac : null; // Monotonic count of committed revisions to this piece (next revision included). -const buildVersion = 260; +const buildVersion = 261; const parkDecalResolution=Number(globalThis.decalSurfaceSize)||2048; const floorY = 1800; // Oskiewar now opens as a versus game. An ordinary web visit hosts a room —