Shops & vendors
Every merchant in the game and everything they sell - browsable by town, with each item's price, category, and what it actually does. No disc image needed - click any item for its detail panel.
Vendor browser
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.