Extract UO gump art for authentic paperdoll/container/button UI #19
Labels
No labels
alpha:wave-0
alpha:wave-1
alpha:wave-2
alpha:wave-3
area:assets
area:combat
area:ecology
area:infra
area:render
area:scripting
area:ui
area:world
enhancement
epic
migration
post-alpha
roadmap
tech-debt
type:bug
type:chore
type:design
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo#19
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Context
The legacy UO client is available locally at
~/Games/UO(gumpart.mul+gumpidx.mul). The client UI currently uses placeholder rectangles/text. Goal: an authentic layered UO paperdoll look for the inventory/equip UI, plus real container background and button/scrollbar art.Gumps are pure client-side presentation — no protocol, no authoritative state, no server validation involved.
Decisions (locked)
HumanMaleBody = 400); hue 0 for the first pass..mulstay local; repo remains shippable without assets (placeholder fallback).Scope
GumpMulReader(gump idx/mul decode:extra=(w<<16)|h, per-row RLE, ARGB1555, no hue) + an AssetExtractor "dump gumps by id/range → PNG" mode to visually identify the right IDs. Unit-tested against synthetic gump bytes.name→gumpIdfor the confirmed set; client loads them at runtime (Texture2D.FromStream) with placeholder fallback.InventoryPanel/paperdoll to authentic layout: body+frame, equip slots at UO coordinates, container background behind the grid, real buttons; per-Layer render skeleton (0/1 layers until items are typed).Independent of #16 (statics) — shares no code, can proceed in parallel.
Definition of Done
GumpMulReaderdecodes a synthetic multi-row RLE gump to exact expected pixels (transparent run = alpha 0, colored run = opaque), verified by a unit test that constructs the idx/mul bytes in-memory (no.mulcommitted).GumpMulReaderreturns null (not throw) for an empty/absent gump entry (lookup < 0 or length <= 0), covered by a test.~/Games/UOwrites one PNG per requested gump id whose pixel dimensions equal theextrawidth/height fromgumpidx.mul(demonstrable by opening a dumped PNG and matching its size to the idx entry).~/Games/UOextracted).Phase A landed on branch feat/gump-art-extraction (gump.mul reader + PNG dump mode, unit-tested; decoder verified against real data — paperdoll body 0x000C, backpack container 0x003C, and paperdoll buttons 0x07D6+ all decode correctly). Phases B/C (manifest + client paperdoll rendering) deferred: per priority call, character sprites and map tiles come first. Branch parked for later resume.
Follow-up from #32 (targeting): the targeting cursor currently uses a placeholder crosshair. When gump art is extracted, swap it for the real UO targeting cursor gump — it's a single-texture swap in
GameScreen.DrawTargetCursor.Direction shifted with #100: the backpack container gump is now our own art (baked via the
OwnArtstep in the AssetExtractor), not UO-extracted — in line with the "UO art is a temporary placeholder, to be replaced with our own original art" policy.So UO gump extraction is now only potentially useful as interim placeholders for buttons / scrollbars / the paperdoll frame. Re-scope to those, or close if we go straight to own art for the remaining UI chrome too.
marco referenced this issue2026-07-20 18:37:33 +02:00
Done — UO gump extraction shipped (the #116 line): `GumpMulReader` decodes idx/mul RLE, with tests for multi-row RLE / empty-entry-null / id-out-of-index-null; the `gumps` dump command exists; the named manifest `gumps.json` is committed. Consumed by the paperdoll (#106) and the /admin panel (#117). Closing.