Back to Limb Race
SOURCE / PINNED RELEASE

Made of little things.

Limb Race

Release
6a8ae4fc626e…
Author-recorded commit
008c01ee6454…
License
LICENSE
Author’s source reference
nostr://npub182jczunncwe0jn6frpqwq3e0qjws7yqqnc3auccqv9nte2dnd63scjm4rf/wss%3A%2F%2Fgit.napplet.soy%2F/n-c2869f12ad8

Archive hash verified: 7be8492d1f89b891…. The source-to-build association is the author’s claim; it has not been independently rebuilt.

src/race-data.ts
import {PHYSICS_VERSION, validDesign, type Design} from './physics.js';

export type SharedDrawing = {version: 1; physics: number; limbs: number[][][]};
export function encodeDrawing(design: Design): SharedDrawing {
  if (!design.length || !validDesign(design)) throw new Error('This drawing cannot be shared.');
  return {version: 1, physics: PHYSICS_VERSION, limbs: design.map(stroke => stroke.map(p => [Math.round(p.x * 1000), Math.round(p.y * 1000)]))};
}
export function decodeDrawing(value: unknown): Design {
  const data = value as Partial<SharedDrawing> | null;
  if (!data || data.version !== 1 || data.physics !== PHYSICS_VERSION || !Array.isArray(data.limbs) || !data.limbs.length || data.limbs.length > 8) throw new Error('This run uses an unsupported drawing format.');
  let points = 0;
  const design = data.limbs.map(stroke => {
    if (!Array.isArray(stroke) || stroke.length < 2 || (points += stroke.length) > 240) throw new Error('The shared drawing is too large.');
    return stroke.map(p => {
      if (!Array.isArray(p) || p.length !== 2 || !p.every(n => Number.isSafeInteger(n) && Math.abs(n) <= 1000)) throw new Error('The shared drawing contains invalid points.');
      return {x: p[0] / 1000, y: p[1] / 1000};
    });
  });
  if (!validDesign(design)) throw new Error('The shared drawing is invalid.');
  return design;
}