Back to GRAV / RIFT
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.

src/game/enemy-rigs.ts
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();
}