Slightly Simplified OD&D Lair Treasure Tables
I find the OD&D lair treasure tables on M&T p. 22 challenging to decipher & use, so I reformatted them in a way that makes more sense to me.
- Percentile chance of appearing replaced with d20 roll-under target
- Tables transposed to emphasize sequential generation procedure
- Monster-specific modifications (ogres, bandits, & giants) added as additional entries.
- Used color-coded alchemical symbols for gold, silver, & copper because I think it's cute.
It's not as big as an overhaul as I'd like but maybe (hopefully) it'll be useful to someone.
To generate a lair, just roll a d20 for each line of the table & add the corresponding treasure if the result is less than or equal to the target number.
Here's a pdf:
And here's the Typst source code:
#set page(margin: 0.5in)
#set table(stroke: none, align:(right, left), gutter: 0em)
#set table.cell(inset: 3pt)
#show table.cell: it => {
set text(size: 11pt)
set par(justify: false)
if it.y==0 {underline(strong(it))}else{it}
}
#show "g.p.": text(fill: rgb(225, 185, 0))[*β*] // π or β
#show "s.p.": text(fill: rgb(155, 159, 170))[*β½*]
#show "c.p.": text(fill: rgb(180, 110, 48))[*β*]
// Define the treasure tables as variables that can be invoked later, or copy-pasted to manually define treasure for bandits, giants, etc.
#let Aland = [#table(
columns: (auto, auto),
table.header([d20], [A (land)]),
[#[#sym.lt.eq]5], [1d6x1,000 c.p.],
[#[#sym.lt.eq]6], [1d6x1,000 s.p.],
[#[#sym.lt.eq]7], [2d6x1,000 g.p.],
[#[#sym.lt.eq]10], [6d6 gems],
[#[#sym.lt.eq]10], [6d6 jewelry],
[#[#sym.lt.eq]8], [3 maps/magic (d4: 1-3 magic item, 4 map)],
[If Bandits], [1 prisoner / 10 Bandits],
[If Brigands], [1 important prisoner / 20 Brigands]
)]
#let Awater = [#table(
columns: (auto, auto),
table.header([d20], [A (water)]),
[#[#sym.lt.eq]12], [5d6x1,000 g.p.],
[#[#sym.lt.eq]12], [1d6x10 gems],
[#[#sym.lt.eq]12], [1d6x10 jewelry],
[#[#sym.lt.eq]10], [1 treasure map],
[If Pirates], [1 prisoner / 10 Pirates],
[If Buccaneers], [1 important prisoner / 20 Buccaneers]
)]
#let Adesert = [#table(
columns: (auto, auto),
table.header([d20], [A (desert)]),
[#[#sym.lt.eq]4], [1d4x1,000 c.p.],
[#[#sym.lt.eq]5], [1d4x1,000 s.p.],
[#[#sym.lt.eq]6], [1d6x1,000 g.p.],
[#[#sym.lt.eq]10], [10d4 gems],
[#[#sym.lt.eq]10], [10d4 jewelry],
[#[#sym.lt.eq]12], [3 magic items],
[If Nomads], [1 prisoner / 25 Nomads]
)]
#let Btreasure = [#table(
columns: (auto, auto),
table.header([d20], [B]),
[#[#sym.lt.eq]10], [1d8x1,000 c.p.],
[#[#sym.lt.eq]5], [1d6x1,000 s.p.],
[#[#sym.lt.eq]5], [1d3x1,000 g.p.],
[#[#sym.lt.eq]5], [1d6 gems],
[#[#sym.lt.eq]5], [1d6 jewelry],
[#[#sym.lt.eq]2], [1 weapon or armor]
)]
#let Ctreasure = [#table(
columns: (auto, auto),
table.header([d20], [C]),
[#[#sym.lt.eq]4], [1d12x1,000 c.p.],
[#[#sym.lt.eq]6], [1d4x1,000 s.p.],
[#[#sym.lt.eq]5], [1d4 gems],
[#[#sym.lt.eq]5], [1d4 jewelry],
[#[#sym.lt.eq]2], [2 magic items],
[If Ogres], [1,000 g.p.]
)]
#let Dtreasure = [#table(
columns: (auto, auto),
table.header([d20], [D]),
[#[#sym.lt.eq]2], [1d8x1,000 c.p.],
[#[#sym.lt.eq]3], [1d12x1,000 s.p.],
[#[#sym.lt.eq]12], [1d6x1,000 g.p.],
[#[#sym.lt.eq]6], [1d8 gems],
[#[#sym.lt.eq]6], [1d8 jewelry],
[#[#sym.lt.eq]4], [2 magic items & 1 potion]
)]
#let Etreasure = [#table(
columns: (auto, auto),
table.header([d20], [E]),
[#[#sym.lt.eq]1], [1d10x1,000 c.p.],
[#[#sym.lt.eq]6], [1d12x1,000 s.p.],
[#[#sym.lt.eq]5], [1d8x1,000 g.p.],
[#[#sym.lt.eq]2], [1d10 gems],
[#[#sym.lt.eq]2], [1d10 jewelry],
[#[#sym.lt.eq]6], [3 magic items & 1 scroll],
[If Giants], [5,000 g.p.]
)]
#let Ftreasure = [#table(
columns: (auto, auto),
table.header([d20], [F]),
[#[#sym.lt.eq]2], [2d10x1,000 s.p.],
[#[#sym.lt.eq]9], [1d12x1,000 g.p.],
[#[#sym.lt.eq]4], [2d12 gems],
[#[#sym.lt.eq]4], [2d12 jewelry],
[#[#sym.lt.eq]4], [3 magic items (excluding weapons), 1 potion, & 1 scroll]
)]
#let Gtreasure = [#table(
columns: ( auto, auto),
table.header( [d20], [G]),
[#[#sym.lt.eq]15], [10d4x1,000 g.p.],
[#[#sym.lt.eq]5], [3d6 gems],
[#[#sym.lt.eq]5], [1d10 jewelry],
[#[#sym.lt.eq]8], [4 magic items & 1 scroll]
)]
#let Htreasure = [#table(
columns: (auto, auto),
table.header([d20], [H]),
[#[#sym.lt.eq]5], [3d8x1,000 c.p.],
[#[#sym.lt.eq]10], [1d100x1,000 s.p.],
[#[#sym.lt.eq]15], [10d6x1,000 g.p.],
[#[#sym.lt.eq]10], [1d100 gems],
[#[#sym.lt.eq]10], [10d4 jewelry],
[#[#sym.lt.eq]4], [4 magic items, 1 scroll & 1 potion]
)]
#let Itreasure = [#table(
columns: (auto, auto),
table.header([d20], [I]),
[#[#sym.lt.eq]10], [2d8 gems],
[#[#sym.lt.eq]10], [2d8 jewelry],
[#[#sym.lt.eq]4], [1 magic item]
)]
=== Lair Treasure Types
To generate a hoard, roll a d20 for _each_ row of a table and include the given quantity of treasure only if the roll is less than or equal to the target number.
#grid(
columns: (auto, auto, auto),
inset: 1em,
[#Aland],
[#Adesert],
[#Awater],
[#Btreasure],
[#Ctreasure],
[#Dtreasure],
[#Etreasure],
[#Ftreasure],
[#Gtreasure],
[#Htreasure],
[#Itreasure],
)