The 15-row table that drives the belt's potion grid at the bottom of the HUD. Every belt base in armor.txt resolves through this table (via the armor.belt integer column, which is a row index here) to determine how many potions the belt holds, where each potion icon renders, and what the auto-fill button puts in each column by default.
74 columns total — 1 name, 1 capacity (numboxes), 64 per-slot pixel coordinates (4 numbers × 16 slots), and 8 auto-fill defaults (4 item-type/item-code pairs).
The single most-asked question — slot counts per belt category
| Slots | Belt category | armor.txt bases |
|---|---|---|
| 4 | default (no belt equipped) | — (the no-belt state) |
| 8 | sash, light belt | Sash (lbl), Light Belt (vbl) |
| 12 | belt, heavy belt | Belt (mbl), Heavy Belt (tbl) |
| 16 | girdle, uber belt | Plated Belt (hbl); all exceptional/elite belts (War, Mesh, Demonhide Sash, Sharkskin, Battle); all unique-tier belts (Colossus Girdle, Spiderweb Sash, Mithril Coil, Troll, Vampirefang) |
Plated Belt jumps from 12 to 16 — that's the single tier-up in the normal-quality belt progression. Everything in the exceptional and elite tier inherits the uber belt (16 slots) category.
How armor.txt belt maps to belts.txt rows
armor.txt carries an integer belt column on each belt base (0–6). That integer is the row index into this table:
armor.belt value | belts.txt row | numboxes |
|---|---|---|
| 0 | belt | 12 |
| 1 | sash | 8 |
| (2) | default | 4 (not assigned to any belt — represents no-belt state) |
| 3 | girdle | 16 |
| 4 | light belt | 8 |
| 5 | heavy belt | 12 |
| 6 | uber belt | 16 |
This indirection is why every Plated Belt and every elite/unique belt shares the same 16-slot capacity — they all carry armor.belt=3 (Plated Belt → girdle) or armor.belt=6 (everything else → uber belt).
Locbones coverage
Documented at locbones D2R Data Guide § Belts.txt. The columns listed there are name, numboxes, the per-box pixel coordinates, and the auto-fill defaults — matching the 74-column file exactly.
Columns
Identity and capacity
| Column | Meaning |
|---|---|
name | Belt-category reference name. The set is closed: belt, sash, default, girdle, light belt, heavy belt, uber belt, plus an Expansion sentinel and a mirror of all 7 with a 2 suffix (used at a different HUD position). |
numboxes | Number of potion slots. Always 4, 8, 12, or 16. |
Per-slot pixel coordinates
| Column pattern | Meaning |
|---|---|
box1left, box1right, box1top, box1bottom … box16left/right/top/bottom | Pixel coordinates of each potion icon on the HUD. Used for rendering only; mathematically the grid is always 4-wide and (numboxes/4)-tall. |
The bottom row of potions (the always-keybound row) anchors at box1top=442, box1bottom=471. Higher rows are 32 px above each: row 2 at top=410, row 3 at top=378, row 4 at top=346.
Auto-fill defaults
The four defaultItemType / defaultItemCode pairs drive the auto-fill button: when clicked, the engine puts these item types into each visible column.
| Column | Always equals | Meaning |
|---|---|---|
defaultItemTypeCol1 | hpot | Column 1: healing potion. |
defaultItemTypeCol2 | mpot | Column 2: mana potion. |
defaultItemTypeCol3 | rpot | Column 3: rejuvenation potion. |
defaultItemTypeCol4 | scro | Column 4: scroll (any). |
defaultItemCodeCol4 | tsc | Column 4 specifically defaults to Town Portal Scrolls. |
defaultItemCodeCol1 / defaultItemCodeCol2 / defaultItemCodeCol3 | (blank) | Generic — auto-fill picks any potion of the typed kind. |
The defaultItemCodeCol4=tsc is the only specific item-code default — auto-fill prefers TP scrolls over Identify scrolls in column 4.
Why the table has 15 rows for 7 categories
The 15 rows split into:
- 7 primary rows (rows 0–6): the actual belt categories that
armor.txtreferences. - 1
Expansionsentinel (row 7): blank-data marker separating Classic and Expansion rows in the .txt source. - 7 mirror rows (rows 8–14, suffixed
2): same categories with different pixel coordinates, used for the inventory-tab belt grid that renders at a separate HUD position when the inventory pane is open.
Only the primary rows are referenced by armor.belt. The mirrors are looked up by the engine when rendering the inventory's belt-on-character display.