Extract UO static art (trees/obstacles) for map rendering #16
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 milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
marco/IsoMmo#16
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?
Extend
tools/IsoMmo.AssetExtractorto export UO static art (trees, rocks, walls, …) fromart.mul/artidx.mul, so the map obstacles introduced in #4 (M2) can render with real UO art instead of placeholders.Mirrors the existing human-animation extraction (which reads
anim.mul): same "extract once, output git-ignored, placeholder fallback when absent" model. M2 ships the map + walkability + client obstacle rendering against a placeholder tree; this issue plugs in the real statics.Scope
art.mul+artidx.mul(static indices, i.e. art id + 0x4000) and export selected statics (e.g. a tree, a rock) to PNGs.Definition of Done
Base DoD applies on top; the delta below:
Update: local extraction of
uoml_setup.exeon macOS (Apple Silicon) — not feasibleAttempted to obtain the
.mulart directly fromuoml_setup.exe(Ultima Online: Mondain's Legacy, EA Games — InstallShield 11, ~798 MB) on the macOS dev machine. Chronology and findings:7z/sevenzipreports "Cannot open as archive";unshieldreports "Failed to open as InstallShield Cabinet File" even against the carved cabinet — InstallShield 11 container format is unsupported byunshield.setup.exe+data1.hdr/data1.cab,setup.iniconfirms AppName=Ultima Online: Mondain's Legacy, EngineVersion 11.0.0.28844). The InstallShield GUI then dies immediately after the splash with: Root cause: Apple Silicon has no native 32-bit x86, and Wine's WoW64 SEH dispatch is incomplete for the 32-bit InstallShield engine. The wizard window never appears, so no product data is ever written to Program Files./s) does nothing — InstallShield 11 silent mode requires a pre-recordedsetup.issresponse file, and recording one needs a working GUI pass (which crashes as above)..muldata is embedded in the outer exe and only extracted during a completed install, so the bootstrapdata1.cab(664 KB) is not useful on its own.All tooling installed for this attempt (
sevenzip,unshield,wine-stable, dedicated prefix, logs) was rolled back.Recommendation
Run
uoml_setup.exeon a native Windows machine or a Windows VM/Parallels to install UO:ML, then copy the resulting.mulfiles (art.mul/artidx.mul,anim.mul, etc.) to the dev box. Extraction/conversion then proceeds viaIsoMmo.AssetExtractor. (Extracted art stays out of git per the assets policy — local + manifest only.) This issue stays blocked on obtaining the.mulset through that path.Unblocked: full legacy UO client obtained
A complete legacy UO client (Mondain's Legacy, 5241 files / 1.9 GB) was copied to the dev machine (
~/Games/UO) from a homelab share and integrity-verified (file count + total bytes + MD5 of the critical.mulall match source). All needed data is present:art.mul/artidx.mul(statics — trees, coins, swords),anim*.mul,hues.mul,tiledata.mul,gumpart.mul/gumpidx.mul,map0.mul/statics0.mul/staidx0.mul.This supersedes the Wine/
uoml_setup.exedead-end above — no installer needed. Next step is extendingIsoMmo.AssetExtractorto export statics fromart.mul(usingtiledata.mul+hues.mul) and produce a versioned art-ID manifest, replacing the placeholder diamonds. Extracted art stays git-ignored per the assets policy; only the source.mulstay local. Run withdotnet run --project tools/IsoMmo.AssetExtractor -- ~/Games/UO.Static art extraction landed on branch feat/static-art-extraction. Added ArtMulReader (art.mul static decode, unit-tested against synthetic bytes) + a statics extractor mode (discovery dump + named extraction via --map). Art-id manifest lives in the justfile (just extract-statics / extract-all): tree_0=0x0CCE (leafy tree), item_coin=0x0EED (gold coin), item_sword=0x0F5E (longsword) — all verified visually. Client renders real tree statics (zero-change via existing StaticArtLoader) and resolves ground-item art per kind (new ItemArt), falling back to a tinted placeholder when art is absent. Character sprites also now real (ran the existing human extractor against the local client). Deferred: land terrain tiles (UO 44x44 vs our 64x32 grid — needs a grid decision, tracked separately); item/skin hue.
Done and merged to main (
43c9098). Real UO art now renders in the client: tree statics on obstacles, per-kind ground-item art (coin/sword), and real grass land tiles (44x44 scaled to our 64x32 tile). Character sprites also real (existing human extractor run against the local client). ArtMulReader (static + land decode) is unit-tested; art-id manifest + one-command re-extraction live in the justfile (extract-all). Placeholder fallbacks keep the repo shippable without assets. Deferred as separate concerns: gump/paperdoll art (#19, parked branch), skin/clothing hue, softening the out-of-map void edge.