Repository navigation
UO Parity Roadmap
Goal: equipment that looks and moves like original Ultima Online art: every action, every facing, correct layering, and a working import into a classic client.
This page is the wiki view of ROADMAP.md and the detailed acceptance plan in docs/render-release-roadmap.md. Status reflects what the repository docs record as verified (as of October 2026).
Legend: done = verified locally with evidence · partial = works on targeted cases, not full coverage · open = not started or not yet proven.
- Fit Lab editing: undo/redo, 100-step history, autosave, browser crash recovery, three recoverable disk saves.
- Scoped corrections (pack, slot, group, item; per action and/or direction), resolved identically by the lab and Blender builds.
- Torso-aware back-attachment masking, separate clothing masking, per-part body hiding under clothes.
- Lab builds and selective rebuilds: untouched VD blocks stay byte-identical; mixed-version rebuilds are refused.
- The October 2026 UO_Model3D update: 112-bone rig, native 256x256 canvas, anchor (128,192).
- CC0 starter equipment for all 25 UO layer routes.
| Gate | Status | What is left | Where help is wanted |
|---|---|---|---|
| 1. Final renders are authoritative | partial | Side-by-side cases showing the Blender renderer and the live lab agree on worn-part rules, outline correction, torso mask, push-out and mounted holdout. | Reproducible front/back/side comparisons; labelling preview-only differences. |
| 2. Every animation, every slot | open | At least three representative items per slot across all 35 actions, five stored directions plus three mirrored views, including large weapons, shields, cloaks, skirts, hair, falls and mounted poses. | Running and reviewing the acceptance matrix; filing parity gaps. |
| 3. Fix exceptions locally | partial | Corrections exist; twist, finger, shield and cloak/skirt chain targets (proposed_target in mappings) are not yet used by pack_fit.py. |
Rig targets for twist bones, fingers and cloth chains; A/B evidence on failing poses. |
| 4. A complete outfit | open | Combined layers with body hiding, straps, back items, weapons, paired pieces and garment intersections across the full action set. | Building and reviewing one full outfit; reporting layer-order or double-hiding issues. |
| 5. Client compatibility | open | Full VD output staged into a copy of a classic client, animation/static IDs and body/equipment conversions handled, then equipped in game. | In-game tests on your own client/server; documenting Body.def / Bodyconv.def / Equipconv.def routing. |
UO "people" bodies have 35 actions. Content Studio's preview build renders actions 0, 4, 9, 22 and 25; a full build renders all 35. Recorded evidence so far:
- One forearm item rendered all 35 actions x 5 stored directions (175 blocks, 1,050 frames) with a passing VD alpha/anchor round trip and no clipped or empty frames; representative composites were inspected, not every frame.
- Chest, leg and back items each covered actions 0, 4, 9, 22, 25 in all five stored directions (125 frames each), file-validated and visually spot-checked.
- Not yet verified: a full 35-action lab build, mounted actions, cloaks with the torso mask, weapons on the new weapon bones. No in-game test of the current renderer yet.
Status per group against gate 2 (three items per slot, visually reviewed):
| Group | Actions | Status | Evidence / gap |
|---|---|---|---|
| Walk / run | 0 walk, 1 walkstaff, 2 run, 3 runstaff | partial | Walk (0) is in every preview and checked on several slots. 1–3 only in the single full forearm build. |
| Idle / fidget | 4 idle, 5 idle_anim, 6 yawn | partial | Idle (4) in every preview. 5–6 only in the full forearm build. |
| Melee combat | 7 combat1, 8 combat2, 9 slash1h, 10 pierce1h, 11 bash1h, 12 bash2h, 13 slash2h, 14 pierce2h, 15 combatadvance, 30 block, 31 punch | partial | 9 is in every preview and was used in scoped-correction and rebuild tests. The rest only in the full forearm build. Weapons on the new weapon bones are unverified. |
| Spells | 16 spell1, 17 spell2 | open | Only in the full forearm build; no targeted review. |
| Bow / crossbow | 18 bow_attack, 19 crossbow_attack | open | No targeted review; bows on the new bow.L bone unverified. |
| Hit / death | 20 get_hit, 21 death_back, 22 death_forward | partial | 22 is in every preview and has the only approved reconstruction poses. 20–21 only in the full forearm build. |
| Mounted | 23 mounted_walk, 24 mounted_run, 25 mounted_idle, 26 mounted_slash1h, 27 mounted_bow, 28 mounted_crossbow, 29 mounted_slash2h | open | 25 is rendered in previews, but mounted actions are listed as not verified; mounted holdout uses a horse proxy that needs visual review. |
| Emotes | 32 bow_gesture, 33 salute, 34 eat | open | Only in the full forearm build; no targeted review. |
No group is done yet: that needs three representative items per slot, all directions including mirrored ones, and a visual review.
- Preview vs final render. The lab's poke metric does not model the renderer's 1 cm holdout margin or 6 mm push-out; counts run high. The live preview also lacks exact-outline edge correction.
-
Rig targets not used yet.
proposed_targetbones (twist, fingers, shield, cloak/skirt chains) are ignored bypack_fit.py, so deformation those bones should carry cannot be fixed by a transform. - Cloth. Cloak/skirt binding uses cloth templates; a fresh physics bake is not automated, and cloaks with the torso mask are unverified.
- Mounted poses. Mounted occlusion relies on the source project's horse proxy and masks.
-
Client routing.
Body.def,Bodyconv.def,Equipconv.def, paperdoll gumps and female-body conversion are not authored automatically;artLegacyMUL.uopcan shadow MUL art. -
Untested contributed outfit-lab options:
merge_items.py,make_gump_cloak.py,build_item.py --planar/--cut,atlas_to_vd.py --body/--outline. -
Extraction gaps:
anim2–anim5.mul,Body.def/Bodyconv.defsubstitutions and hues are not read by the adapter yet. - Reconstruction annotations: only 6 approved poses exist (action 22, SE).
- Developer preview (now): reviewed code and docs, redistributable examples only.
- Reproducible setup: clean-checkout test, documented Python/Blender versions, actionable missing-prerequisite messages.
- Automated release checks: schema/unit tests, fit-parity and save/recovery tests, file scanning, and a procedural Blender regression scene in CI.
- Alpha: a tagged release with a tested compatibility matrix and an outside tester completing setup.
- Beta: gates 1–5 complete on the supported client/body combinations, with in-game outfit tests.
The next highest-value work is a full-action, three-items-per-slot acceptance matrix, followed by one complete outfit imported into a real client.
- Read Contributing first: never commit game data, extracted frames, commercial pack files or machine paths.
- Report a mismatch with original art as a Parity gap issue (new issue): action id, direction, slot, item, expected versus actual, and a screenshot of SpriteMotion output only (never original client art).
- Pick a row above marked partial or open and say which one you're taking in Discussions.
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