Repository navigation
Glossary
MUL / IDX — The classic client's data files. A .mul holds the data, the matching .idx (or *idx.mul) holds
offsets into it. art.mul / artidx.mul hold static/inventory art; tiledata describes items.
anim.mul / anim.idx — The mobile animation data for "file 1", including the human bodies and their equipment
animations. Each animation is stored as blocks of one action x one stored direction. Animations routed by
Bodyconv.def to anim2–anim5.mul are not read by SpriteMotion yet.
UOP — The newer container format (AnimationFrame1..6.uop, AnimationSequence.uop, artLegacyMUL.uop).
SpriteMotion's extractor reads UOP animations when mobtypes.txt flags a body for UOP, like ClassicUO.
artLegacyMUL.uop can shadow MUL art when staging.
VD — UOFiddler's animation export format: a header, one index entry per action x 5 stored directions, and per
block a 256-color 15-bit palette and RLE frames. Type 2 = people and equipment (35 actions). Builds produce
item.vd.
Body IDs 400 / 401 — The human male (0x190) and human female (0x191) base bodies. SpriteMotion's canonical model
is the male body (UO_Body_0x190.blend). Gargoyle bodies 666/667 are extractable for reconstruction research.
Animation ID vs static graphic ID — An equipment item has an animation ID (its worn animation in anim.mul)
and a separate static graphic ID (its inventory art). Staging needs unused values of both.
Body.def / Bodyconv.def / Equipconv.def — Client files that remap bodies and equipment animations. Not authored automatically by SpriteMotion yet.
Action IDs — The 35 "people" actions, numbered 0–34: walk, walkstaff, run, runstaff, idle, idle_anim, yawn, combat1, combat2, slash1h, pierce1h, bash1h, bash2h, slash2h, pierce2h, combatadvance, spell1, spell2, bow_attack, crossbow_attack, get_hit, death_back, death_forward, mounted_walk, mounted_run, mounted_idle, mounted_slash1h, mounted_bow, mounted_crossbow, mounted_slash2h, block, punch, bow_gesture, salute, eat. Grouped status: UO Parity Roadmap.
Preview build — Actions 0, 4, 9, 22, 25 in five stored directions. Full build — all 35 actions, 175 blocks, 1,050 frames.
Block — One action x one stored direction in a VD/anim file. Selective rebuilds work per block.
Directions: 5 stored + 3 mirrored — UO characters face 8 directions, but the files store only five per action. The client draws the other three by flipping stored ones: directions 5, 6, 7 mirror 3, 2, 1. Fit Lab and builds use stored directions 0–4 and the ring 0–7 (dashed 5–7 are mirrored). The reconstruction datasets name the same facings by compass (N, NE, … NW) with their own ids; see the UO game README.
Canvas and anchor — Frames are placed on a 256x256 canvas with the ground origin at (128, 192), the way the client places a mobile on its tile.
Layer / slot — UO's Layer enum: one item per layer per mobile. 25 layers, from 1 OneHanded to 25 Mount; most
animate, jewelry is paperdoll-only, Mount is internal. Defined in
layers.json. Shields
and two-handed weapons share layer 2; cloaks and quivers share layer 20. See Asset Packs.
Studio part / template — The fit template a slot uses in Content Studio: helm, chest, arms, gloves, legs, boots, robe, cloak, skirt, weapon, shield, bow, quiver.
Skinned vs rigid binding — Skinned items deform with their bones (cloth); rigid items follow one bone (metal that must not stretch).
Holdout — In item renders the body is invisible but still blocks what is behind it. Body poking through clothing therefore cuts holes in the item sprite.
hide_body — "Hide body under clothes": body faces within an outward/inward distance of a part are removed from the fitting body (like CC4's hide-mesh) so they cannot poke through. Set per part in a mapping and tuned per slot in Fit Lab. The complete body still controls final occlusion.
Occlusion mode — Which body parts may hide an item: clothing (limbs and head), body (also torso; the default for back and quiver slots) or none.
Poke pixels — Fit Lab's estimate of body pixels showing through an item. Approximate; compare, don't treat as absolute.
Scoped correction — A fit delta for a pack, slot, named group or item, optionally limited to one action and/or stored direction.
UO_Model3D v13 — Levy's 3D reconstruction of the UO human body with its original actions, rig and reference
renderer. SpriteMotion's canonical body, installed with pipeline.py setup --source <folder>; not redistributed.
112 bones — The October 2026 update of the v13 rig UO_Rig: v13's 108 bones plus weapon1h.R, axe2h.L,
bow.L and polearm.L for weapons.
Canonical model — The installed body scene in workspace/ultima-online/canonical-model.
Content Studio — Web tool on port 8772 for importing, building and reviewing items. Page.
Fit Lab — Web tool on port 8774 for tuning fits on the animated body. Page.
Workbench — The launcher that starts both. Page.
Pack / pack export — An asset pack mapped 1:1 by one mapping; its export is the body GLB, item GLBs and manifest
Fit Lab loads. cc0-starter is the bundled pack.
Sidecar — A local folder (SPRITEMOTION_SIDECAR, default ../SpriteMotion-Sidecar) for licensed pack mappings,
scripts and outputs. Never pushed.
Job — One build under workspace/ultima-online/content-studio/jobs/<id>, with frozen settings and fingerprints.
Annotations, estimates, corrections — 2D joint positions on sprite frames. Estimates are read-only starting points; corrections are what a person edited or approved. Rig projections are never independent evidence.
Fingerprint — sha256: of a normalized frame canvas, tying an annotation to exact pixels.
IoU — Silhouette overlap used by compare. Shape overlap, not proof of a correct pose.
GUO — GodotUO, a related project that can host a shared Fit Lab; its integration is still in development.
SpriteMotion is MIT licensed · Repository · License · Third-party notices
Not affiliated with or endorsed by Electronic Arts or Broadsword. Ultima Online is a trademark of its owners. No game data is distributed with this project.
Start
Guides
- Fit a slot in Fit Lab
- Render an item end to end
- Clean up with masking
- Troubleshoot a failing step
- Take content into GUO
Tools
Reference
Project