Vendor browser

Select a town
About this data — where it comes from, and reading it off your own disc

This page runs off the project's curated game-data tables, mined from public walkthroughs.

These tables are ground truth for reverse engineering - a shop's on-disc inventory is just item ids and prices, and a trustworthy human-readable table is what confirms a decoded record. Each item's panel names the data anchor it validates.

Read it off your own disc

This page tells you what the shops sell. asset shop-stock tells you what the disc says they sell - and when the two agree, both are confirmed. That is the other half of the sentence at the top of this page: the curated tables are ground truth, and this command produces the decoded record they validate.

asset shop-stock --prot extracted/PROT.DAT --scus extracted/SCUS_942.54 \
                 --cdname extracted/CDNAME.TXT            # every shop on the disc

asset shop-stock --prot extracted/PROT.DAT --scus extracted/SCUS_942.54 \
                 --cdname extracted/CDNAME.TXT --scene bylon    # one scene

The join is the interesting part, because the data is in two unrelated files. A town's stock is not a shop table - it is inline in that scene's MAN field-VM script (op 0x49, sub-op 0), next to the scene's chests and doors. The item names and prices come from the static item record table in SCUS_942.54. The command opens both and joins them.

Two results are reported per shop, on purpose - "decodes 10 ids, sells 7". The record's count byte includes a trailing run of unsellable price-0 template ids that the in-game shop never displays, so the listing flags that tail rather than hiding it. Shops are also located by scanning for the opcode rather than walking the script: a vendor behind a dialogue confirm-picker desyncs a linear disassembler, and a walk would report one shop too few with no error.

Full walkthrough, with the byte offsets and the CDNAME index shift: Extracting assets.