SOURCE / PINNED RELEASE
Made of little things.
GRAV / RIFT
- Release
- 288aa261ce07…
- Author-recorded commit
- c549b5a4e17e…
- License
- LICENSE
- Author’s source reference
- nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-8a7361981e8
Archive hash verified: e52a01aff70810b3…. The source-to-build association is the author’s claim; it has not been independently rebuilt.
import { Rig, legKnee } from './rigging.js';
import { rotate, type Body, type BodyKind, type Vec } from './physics.js';
import { WORLD } from './world.js';
type Spawn=(kind: BodyKind,sprite: number,x: number,y: number,mass: number,scale: number)=>Body;
export interface LimbPose { hip: Vec; knee: Vec; foot: Vec }
export function createEnemyRig(root: Body,spawn: Spawn): Rig {
const boss=root.kind==='core',rig=new Rig(root,boss?'WARDEN':'STRIDER'),count=boss?3:4;
for(let i=0;i<count;i++) {
const upper=boss?105:58,lower=boss?115:64,key=`leg-${i}`;
for(const [segment,size] of [['upper',upper],['lower',lower]] as const) {
const b=spawn('limb',15,root.x,root.y, boss?2.5:1.1,size/56);b.hp=b.maxHp=boss?100:65;
rig.add({key:`${key}-${segment}`,role:'leg',body:b,parent:segment==='lower'?`${key}-upper`:undefined,limb:key,offset:{x:0,y:0},strength:boss?100:65});
}
}
const cell=spawn('power',16,root.x,root.y,boss?2:1.2,boss?.85:.65);cell.hp=cell.maxHp=75;
rig.add({key:'shield-cell',role:'shield',body:cell,offset:{x:boss?0:0,y:boss?-115:-61},strength:boss?125:85});
return rig;
}
export function poseLeg(rig: Rig,index: number,pose: LimbPose): void {
for(const [segment,a,b] of [['upper',pose.hip,pose.knee],['lower',pose.knee,pose.foot]] as const)
rig.pose(`leg-${index}-${segment}`,{x:(a.x+b.x)/2,y:(a.y+b.y)/2},Math.atan2(b.y-a.y,b.x-a.x));
}
export function poseWarden(rig: Rig,time: number): void {
const b=rig.root;
for(let i=0;i<3;i++) {
const localHip={x:-45+i*45,y:32},localFoot={x:-115+i*112+Math.sin(time*.8+i)*12,y:rig.grabbed?194:WORLD.floor-6-b.y};
const h=rotate(localHip,b.angle),f=rotate(localFoot,b.angle),hip={x:b.x+h.x,y:b.y+h.y},foot={x:b.x+f.x,y:b.y+f.y};
poseLeg(rig,i,{hip,foot,knee:legKnee(hip,foot,105,115,i===0?-1:1)});
}
rig.sync();
}
