Item-name table Confirmed
Every item's display name and shop price - weapons, armor, accessories, consumables, key items - lives in one static 256-entry table baked into SCUS_942.54, the game's main executable on the disc. Each item is a single byte-sized id, 0x00..=0xFF, and that one id space is shared everywhere: when dialog text prints an item name (the game's MES text engine has substitution codes 0xC2 XX / 0xC4 XX that index this table), when a monster's drop_item byte says what it drops, and when the steal table says what can be stolen. The price halfword in each record is what the buy/sell UI actually charges - so this table, not any per-shop data, is where an item's price lives.
Table base + record layout
(DAT_80xxxxxx / PTR_DAT_80xxxxxx are Ghidra names - labels the disassembler assigns to fixed RAM addresses. The table is static data, so those addresses map one-to-one back to bytes in the SCUS_942.54 file on the disc. "Stride" is the size of one record.)
| Field | Value |
|---|---|
| Record base | DAT_80074368 |
| Name-pointer view | PTR_DAT_8007436C (= record base +4); the MES dispatch reads PTR_DAT_8007436C[id*3] (three u32 words per record) |
| Stride | 0xC bytes |
| Id range | 0x00..=0xFF (256 ids; id 0 = "no item") |
| Offset | Type | Field |
|---|---|---|
+0 | u8 | kind (1 = equipment, 2 = item / consumable / key) |
+1 | u8 | per-kind index byte - equipment (kind 1): index into the stat-bonus table; items (kind 2): effect subtype into the item-effect table, which also carries the accessory-passive index |
+2 | u16 | shop price in gold - what the buy/sell UI charges; 0 = quest / found-only item the shop never prices |
+4 | u32 | name_ptr - pointer to the NUL-terminated display name |
+8 | u32 | secondary pointer (a shared "type" / description string for some classes) |
The shop price at +2 is verified live (War God Band = 21000, Healing Leaf = 100, Ra-Seru / quest items = 0). The table's extent is found by reading until the name_ptr words leave the PSX-EXE data segment.
Name strings
The display strings carry the same control prefixes as every other in-game string (MES, the game's text markup): a leading 0x01 icon escape and 0xCE XX colour-control bytes. The parser strips control bytes (keeping printable ASCII) and trims whitespace. A handful of ids (0x00, 0x12, 0x1A, 0x52, 0xB9, 0xFD) have empty names - reserved / gap slots.
Provenance + parser
PTR_DAT_8007436C and the *3-word index form are read straight from the MES 0xC2/0xC4 substitution dispatch. legaia_asset::item_names::ItemNameTable resolves the table from a SCUS_942.54 image at runtime (PSX-EXE t_addr → file-offset map); the disc-gated item_names_real test pins a span of ids against the real executable. Consumers: the web viewer's enemy table joins drop ids to names through it; the shop randomizer reads price_slot (legaia_asset::item_names / legaia_patcher::item_price) to drop quest items from the for-sale pool and price chest-found equipment.