Item-name table Confirmed
Every item's display name, description 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. An item is a single byte-sized id, and that one id space is shared everywhere: dialog text substitutions, monster drops, the steal table, the shop UI. The price halfword here is what the buy/sell screen actually charges - there is no per-shop price data.
At a glance
- Magic
- none - static data in
SCUS_942.54 - Where
DAT_80074368, 12-byte stride, 256 ids; name pointers read asPTR_DAT_8007436C[id*3]- Id range
0x00..=0xFF;id 0= "no item"- Parser
legaia_asset::item_names::ItemNameTable- Confidence
- Confirmed - index form read off the MES substitution dispatch; prices verified live; disc-gated
item_names_real - Used by
- Enemy table (drop / steal names), Shops page, Shop subsystem, Inventory
Record layout
DAT_80xxxxxx / PTR_DAT_80xxxxxx are Ghidra labels for fixed RAM addresses; the table is static data, so each maps one-to-one back to bytes in the SCUS_942.54 file on the disc.
| Offset | Type | Field | Meaning |
|---|---|---|---|
+0 | u8 | kind | 1 = equipment, 2 = item / consumable / key |
+1 | u8 | per-kind index | 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 | gold 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 | desc_ptr | pointer to the info-window description the pause menu prints below the name; consumables carry an effect sentence, accessories their class word, many equipment ids share an empty / Best:-class slot |
- The record proper starts at
DAT_80074368; the MES0xC2/0xC4substitution indexes by the name pointer at+4, which is why the name view readsPTR_DAT_8007436C[id*3]. - The price at
+2is decisive - 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_ptrwords leave the PSX-EXE data segment.
Name and description strings
The 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. Descriptions use the MES 0x7C line-break token, decoded to '\n' by the parser. 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.
How we know
| Evidence | Address / test | What it proves |
|---|---|---|
| MES substitution dispatch | 0xC2/0xC4 opcode handlers | The PTR_DAT_8007436C[id*3] index form - table base, stride, and that this is the game's own name lookup. |
| Item info-window renderer | FUN_801D0F1C (menu overlay); funcs/overlay_menu_801d0f1c.txt | Draws the +4 name at the window origin and the +8 string one text row below (WY + 0x10) - +8 is the description pointer. |
| Live price checks | buy/sell UI captures | The +2 halfword is the charged price. |
| Disc-gated test | item_names_real | Pins a span of ids against the real executable through ItemNameTable's PSX-EXE t_addr → file-offset resolver. |
Consumers in the project: the web viewer's enemy table joins drop ids to names through the parser; the shop randomizer reads the price slot (legaia_asset::item_names::price_slot / legaia_patcher::item_price) to drop quest items from the for-sale pool and price chest-found equipment.