Module:LootChest

From Minecraft Wiki
Jump to: navigation, search
[view | edit | history | purge]DocumentationJump to code ↴

Maintenance[edit]

The data for Java release versions is current as of 1.14.2. Sealbudsman talk | contribs 18:30, 4 May 2019 (UTC)
The data for Java snapshots is current as of 1.14.2. (needs to be checked/updated to 1.14.3 Pre-Release 3). Sealbudsman talk | contribs 18:30, 4 May 2019 (UTC)
The data for Bedrock release versions is current as of 1.11.4. Sealbudsman talk | contribs 18:30, 4 May 2019 (UTC)
The data for Bedrock beta versions is current as of beta 1.12.0.6. (needs to be checked/updated to beta 1.12.0.12). Sealbudsman talk | contribs 12:36, 9 May 2019 (UTC)

.base usage (Template:LootChest)[edit]

Generates a table of the contents of the designated chests, with columns corresponding to various statistics about the availability of those items.

Invoking[edit]

It takes any number of chest parameters, and any number of column parameters, in no particular order.

If no chest parameters are listed, it displays them all; likewise for column parameters.

{{#invoke:LootChest|base
 [ |<chestParam1> ... |<chestParamN> ]
 [ |<columnHideParam1> ... |<columnHideParamN> ]
}}

Chest parameters[edit]

bonus,
buried-treasure,
desert-temple ( desert ),
dungeon,
end-city,
igloo,
jungle-temple ( jungle ),
jungle-temple-dispenser,
mineshaft,
nether-fortress ( nether, fortress ),
pillager-outpost ( outpost ),
shipwreck-map,
shipwreck-supply,
shipwreck-treasure,
stronghold-altar ( altar ),
stronghold-library ( library ),
stronghold-storeroom ( storeroom ),
underwater-ruin-big,
underwater-ruin-small,
village-armorer ( armorer ),
village-butcher ( butcher ),
village-cartographer ( cartographer ),
village-desert-house ( desert-house ),
village-fisherman ( fisherman ),
village-fletcher ( fletcher ),
village-mason ( mason ),
village-plains-house ( plains-house ),
village-savanna-house ( savanna-house ),
village-shepherd ( shepherd ),
village-snowy-house ( snowy-house ),
village-taiga-house ( taiga-house ),
village-tannery ( tannery ),
village-temple ( temple ),
village-toolsmith ( toolsmith ),
village-weaponsmith ( weaponsmith ),
woodland-mansion ( mansion )

Column parameters[edit]

chance: The odds of finding any of this item in a single chest.,
chests: The number of chests the player should expect to search, to find any of this item.,
items: The number of items expected per chest, averaged over a large number of chests.,
stacksize: The size of stacks (or for unstackable items, number) of this item on any given roll.,
weight: The weight of this item relative to other items in the pool.

Example[edit]

{{#invoke:LootChest|base}} → all chests and all columns

{{#invoke:LootChest|base|weaponsmith|jungle|bonus|chance|stacksize}} → only weaponsmith and jungle chests, and only 'stacksize' and 'chance' columns

.base2 usage (Template:LootChestItem)[edit]

Prints a summary of this item's availability in the various worldgen chests.

Invoking[edit]

It takes exactly one item name as a parameter.

{{#invoke:LootChest|base2|<itemParam>}}

Item parameters[edit]

acacia-log, acacia-sapling, activator-rail, apple, arrow, bamboo, barrel, beetroot, beetroot-seeds, beetroot-soup, birch-log, birch-sapling, black-wool, blue-ice, bone, book, book-and-quill, bottle-o'-enchanting, bread, brown-mushroom, brown-wool, bucket, buried-treasure-map, cactus, cake, carrot, chainmail-boots, chainmail-chestplate, chainmail-helmet, chainmail-leggings, clay, clock, coal, cocoa-beans, compass, cooked-cod, cooked-salmon, crossbow, dandelion, dark-oak-log, dark-oak-sapling, dead-bush, detector-rail, diamond, diamond-chestplate, diamond-hoe, diamond-horse-armor, disc-13, disc-cat, disc-mellohi, disc-wait, egg, emerald, empty, empty-map, enchanted-book, enchanted-book-rnd, enchanted-book-rnd-treasure, enchanted-diamond-boots, enchanted-diamond-chestplate, enchanted-diamond-helmet, enchanted-diamond-leggings, enchanted-diamond-pickaxe, enchanted-diamond-shovel, enchanted-diamond-sword, enchanted-fishing-rod, enchanted-golden-apple, enchanted-iron-boots, enchanted-iron-chestplate, enchanted-iron-helmet, enchanted-iron-leggings, enchanted-iron-pickaxe, enchanted-iron-shovel, enchanted-iron-sword, enchanted-leather-boots, enchanted-leather-cap, enchanted-leather-pants, enchanted-leather-tunic, ender-pearl, feather, fern, flint, flint-and-steel, flower-pot, furnace, gold-ingot, gold-nugget, golden-apple, golden-chestplate, golden-helmet, golden-horse-armor, golden-sword, grass, gray-wool, green-dye, gunpowder, heart-of-the-sea, ink-sac, iron-boots, iron-chestplate, iron-helmet, iron-horse-armor, iron-ingot, iron-leggings, iron-nugget, iron-pickaxe, iron-shovel, iron-sword, jungle-log, jungle-sapling, lapis-lazuli, large-fern, lead, leather, leather-boots, leather-cap, leather-pants, leather-tunic, light-gray-wool, map, melon-seeds, name-tag, nether-wart, oak-log, oak-planks, oak-sapling, oak-sign, obsidian, paper, poisonous-potato, poppy, potato, potion-of-regeneration, potion-of-water-breathing, powered-rail, prismarine-crystals, pumpkin, pumpkin-pie, pumpkin-seeds, rail, raw-beef, raw-cod, raw-mutton, raw-porkchop, raw-salmon, redstone, rotten-flesh, saddle, sand, shears, smooth-stone, snow-block, snowball, spider-eye, spruce-log, spruce-sapling, spruce-sign, stick, stone, stone-axe, stone-bricks, stone-pickaxe, string, suspicious-stew, sweet-berries, tall-grass, tnt, torch, tripwire-hook, water-bucket, wheat, wheat-seeds, white-wool, wooden-axe, wooden-hoe, wooden-pickaxe, yellow-dye

Example[edit]

{{#invoke:LootChest|base2|iron-ingot}} → Iron ingots can be found in 54.2% of village armorer chests and 30.5% of pillager outpost chests in stacks of 1–3; in 23.3% of stronghold altar chests, 41.2% of village toolsmith chests, 97.4% of shipwreck treasure chests, 34.3% of stronghold storeroom chests, 45.1% of village weaponsmith chests, 19.0% of fortress chests, 37.4% of jungle temple chests, 18.0% of desert temple chests, and 31.6% of chest minecarts in Mineshafts, all in stacks of 1–5; in 38.4% of End city chests in stacks of 4–8; and in 18.5% of dungeon chests, 18.5% of woodland mansion chests, and 99.4% of buried treasure chests, all in stacks of 1–4.

In Bedrock Edition they can be found in 57.2% of buried treasure chests in stacks of 3–5, and in 22.6% of stronghold altar chests, 28.5% of stronghold storeroom chests, and 37.3% of jungle temple chests, all in stacks of 1–5.

{{#invoke:LootChest|base2|emerald}} → Emeralds can be found in 14.9% of big underwater ruins chests, 24.2% of village fisherman chests, 31.8% of village armorer chests, 12.3% of village shepherd chests, 10.2% of village butcher chests, 16.4% of small underwater ruins chests, 12.3% of village fletcher chests, 7.6% of igloo chests, and 20.8% of village mason chests, all in stacks of 1; in 25.4% of village temple chests, 21.5% of savanna village house chests, 9.9% of snowy village house chests, 22.3% of plains village house chests, 18.6% of taiga village house chests, and 17.3% of village tannery chests, all in stacks of 1–4; in 73.7% of shipwreck treasure chests in stacks of 1–5; in 53.1% of buried treasure chests in stacks of 4–8; in 14.3% of desert village house chests, 8.7% of jungle temple chests, and 18.0% of desert temple chests, all in stacks of 1–3; and in 9.0% of End city chests in stacks of 2–6.

In Bedrock Edition they can be found in 7.2% of stronghold altar chests and 8.7% of jungle temple chests in stacks of 1–3, and in 20.3% of taiga village house chests in stacks of 1–4.

Source[edit]

  • The data is set up within p so that it can be pulled directly from (or compared directly to) the minecraft loot table files.
  • stack size given here (and given in code) can be larger than the stackable size of the item, prominently in the case of enchanted books. However this fact does not affect the calculated values. This is because the game puts the right number of items, but unstacked rather than stacked.

Data structure[edit]

  • p.items
'<item-id>' = {
This key must match a sprite name for the items/blocks defined in Module:BlockSprite or Module:ItemSprite, unless id is included in the item definition.
'<sprite-type>'
Either item or block.
[, id='<sprite-id>']
Use this to specify a sprite defined in Module:BlockSprite or Module:ItemSprite. Otherwise it will use the sprite with the name given by item-id.
[, link='<item-link>']
A link to a page that is different from the sprite-id name. Used in Template:LootChest.
[, title='<item-text>']
A name for an item that is different from the sprite-id name.
[, cannot_stack=false]
Use this to indicate that the item comes in groups rather than in stacks. Used in Template:LootChestItem.
[, plural=(false|'<custom-plural-word>')]
Use false when a word has no plural, like 'Nether Wart'. Use a custom plural word when you cannot simply append an 's' to the base word to make it plural, like 'Bottles o' Enchanting'. Used in Template:LootChestItem.
[, preserve_case=false]
Use false when an item name should follow the capitalization exactly specified in title, and not follow sentence case, like 'TNT'.
[, note='<note-name>']
Indicates that a note will appear next to this item in the table. (notes are defined directly below the item list)
}
  • p.notes
'<note-name>' = '<note-full-text>'
  • p.chests[n].poolsJava[n]
  • p.chests[n].poolsJavaUpcoming[n]
  • p.chests[n].poolsBedrock[n]
  • p.chests[n].poolsBedrockUpcoming[n]
    • rolls
{ <min-number-of-stacks>, <max-number-of-stacks> }
  • p.chests[n].poolsJava[n].items
  • p.chests[n].poolsJavaUpcoming[n].items
  • p.chests[n].poolsBedrock[n].items
  • p.chests[n].poolsBedrockUpcoming[n].items
'<item-id>' = { <min-stack-size>, <max-stack-size>, <item-weight> }
  • p.synonyms
'<chest-name-synonym>' = '<original-interally-valid-chest-name>'
Allows additional chest names to be used as parameters, in addition to the ones defined in p.chests.
  • p.display_names
'<chest-name-given-via-parameter>' = '<name-displayed-in-single-chest-table>'
If a single chest parameter is used, this defines the name it is called in the summary text above the table.
  • p.columns
'<column-name>' = '<column-full-description>'
The column descriptions, found either in the tooltip on the column header, or in the summary text above the table.

Functions[edit]

The following functions are made available at the top of the file, for ease of inspection.

  • calc_average_amount_this_item_per_chest
average number of a certain item (not number of stacks), per-chest (not per-structure).
  • calc_chance_any_of_this_item_per_chest
chance that at least one of a certain item will be found, per-chest (not per-structure).

Item tests[edit]

{{#invoke:LootChest|base2_test}}



Acacia logs can be found in 28.0% of bonus chests in stacks of 1–3.

In Bedrock Edition they can be found in 50.0% of bonus chests in stacks of 1–3.

Acacia saplings can be found in 71.7% of savanna village house chests in stacks of 1–2.

In Bedrock Edition they can be found in 16.7% of bonus chests in stacks of 4.

Activator rails can be found in 27.1% of chest minecarts in Mineshafts in stacks of 1–4.

Apples can be found in 33.5% of stronghold altar chests, 47.5% of stronghold storeroom chests, 59.8% of village weaponsmith chests, and 70.4% of igloo chests, all in stacks of 1–3; in 73.4% of plains village house chests in stacks of 1–5; and in 83.8% of bonus chests in stacks of 1–2.

In Bedrock Edition they can be found in 32.5% of stronghold altar chests and 40.0% of stronghold storeroom chests in stacks of 1–3, and in all bonus chests in stacks of 1–2.

Arrows can be found in 23.3% of village fletcher chests in stacks of 1–3, and in all dispensers in jungle temples and 39.1% of pillager outpost chests in stacks of 2–7.

Bamboo can be found in 15.6% of shipwreck supply chests and 51.0% of jungle temple chests in stacks of 1–3.

In Bedrock Edition they can be found in 17.7% of shipwreck supply chests and 50.9% of jungle temple chests in stacks of 1–3.

Barrels can be found in 24.2% of village fisherman chests in stacks of 1–3.

Beetroot seeds can be found in 18.5% of dungeon chests, 31.6% of chest minecarts in Mineshafts, and 18.5% of woodland mansion chests, all in stacks of 2–4; in 21.2% of End city chests in stacks of 1–10; and in 66.3% of snowy village house chests in stacks of 1–5.

In Bedrock Edition they can be found in 33.3% of bonus chests in stacks of 1–2.

Beetroot soup can be found in 9.9% of snowy village house chests in groups of 1.

Birch logs can be found in 28.0% of bonus chests in stacks of 1–3.

In Bedrock Edition they can be found in 25.0% of bonus chests in stacks of 1–3.

Black wool can be found in 33.0% of village shepherd chests in stacks of 1–3.

Blue ice can be found in 9.9% of snowy village house chests in stacks of 1.

Bones can be found in 61.9% of jungle temple chests and 28.7% of desert temple chests in stacks of 4–6, and in 57.8% of dungeon chests, 59.0% of desert temple chests, and 57.8% of woodland mansion chests, all in stacks of 1–8.

In Bedrock Edition they can be found in 61.8% of jungle temple chests in stacks of 4–6.

Books can be found in 14.3% of desert village house chests and 11.8% of plains village house chests in stacks of 1, in 89.2% of stronghold library chests in stacks of 1–3, and in 34.5% of shipwreck map chests in stacks of 1–5.

In Bedrock Edition they can be found in 88.3% of stronghold library chests in stacks of 1–3.

Bottles o' enchanting can be found in 14.1% of shipwreck treasure chests and 60.9% of pillager outpost chests in stacks of 1.

In Bedrock Edition they can be found in 11.8% of buried treasure chests in stacks of 1.

Bread can be found in 34.1% of dungeon chests and 34.1% of woodland mansion chests in stacks of 1; in 33.5% of stronghold altar chests, 81.2% of village toolsmith chests, 47.5% of stronghold storeroom chests, 59.8% of village weaponsmith chests, and 44.3% of chest minecarts in Mineshafts, all in stacks of 1–3; in 61.5% of bonus chests in stacks of 1–2; and in 89.3% of village temple chests, 80.6% of village armorer chests, 80.6% of desert village house chests, 61.2% of village cartographer chests, 71.7% of savanna village house chests, 66.3% of snowy village house chests, 73.4% of plains village house chests, 62.2% of village mason chests, 65.6% of taiga village house chests, and 62.8% of village tannery chests, all in stacks of 1–4.

In Bedrock Edition they can be found in 69.3% of taiga village house chests in stacks of 1–4, in all bonus chests in stacks of 1–2, and in 32.5% of stronghold altar chests and 40.0% of stronghold storeroom chests in stacks of 1–3.

Brown wool can be found in 23.3% of village shepherd chests in stacks of 1–3.

Buckets can be found in 18.5% of dungeon chests, 11.3% of savanna village house chests, and 18.5% of woodland mansion chests, all in stacks of 1.

Buried treasure maps can be found in 43.5% of big underwater ruins chests, 41.7% of small underwater ruins chests, and all shipwreck map chests, all in stacks of 1.

Cactus can be found in 80.6% of desert village house chests in stacks of 1–4.

In Bedrock Edition they can be found in 50.0% of bonus chests in stacks of 1–2.

Carrots can be found in 44.9% of shipwreck supply chests in stacks of 4–8, and in 57.5% of pillager outpost chests in stacks of 3–5.

In Bedrock Edition they can be found in 49.6% of shipwreck supply chests in stacks of 4–8, and in 50.0% of bonus chests in stacks of 1–2.

Chainmail chestplates can be found in 14.9% of woodland mansion chests in groups of 1.

In Bedrock Edition they can be found in 14.7% of woodland mansion chests and 57.2% of buried treasure chests in groups of 1.

Clay can be found in 14.3% of desert village house chests in stacks of 1, and in 20.8% of village mason chests in stacks of 1–3.

Clocks can be found in 7.7% of shipwreck map chests in stacks of 1.

Coal can be found in 43.0% of village fisherman chests, 9.9% of village toolsmith chests, and 27.9% of village butcher chests, all in stacks of 1–3; in 40.0% of shipwreck supply chests in stacks of 2–8; in 81.0% of big underwater ruins chests, 84.2% of small underwater ruins chests, 26.6% of dungeon chests, 70.4% of igloo chests, 41.2% of snowy village house chests, and 26.6% of woodland mansion chests, all in stacks of 1–4; and in 34.3% of stronghold storeroom chests and 31.6% of chest minecarts in Mineshafts in stacks of 3–8.

In Bedrock Edition they can be found in 44.4% of shipwreck supply chests in stacks of 2–8, and in 28.5% of stronghold storeroom chests in stacks of 3–8.

Compasses can be found in 7.7% of shipwreck map chests, 26.3% of village cartographer chests, and 10.9% of stronghold library chests, all in stacks of 1.

In Bedrock Edition they can be found in 10.5% of stronghold library chests in stacks of 1.

Cooked cod can be found in 75.0% of buried treasure chests in stacks of 2–4.

Cooked salmon can be found in 75.0% of buried treasure chests in stacks of 2–4.

Crossbows can be found in all pillager outpost chests in groups of 1.

Dandelions can be found in 22.3% of plains village house chests in stacks of 1.

Dark oak logs can be found in 28.0% of bonus chests in stacks of 1–3, and in all pillager outpost chests in stacks of 2–3.

In Bedrock Edition they can be found in 50.0% of bonus chests in stacks of 1–3.

Dead bushes can be found in 26.6% of desert village house chests in stacks of 1–3.

Detector rails can be found in 27.1% of chest minecarts in Mineshafts in stacks of 1–4.

Diamond chestplates can be found in 7.7% of woodland mansion chests in groups of 1.

In Bedrock Edition they can be found in 7.6% of woodland mansion chests in groups of 1.

Diamond hoes can be found in 21.8% of woodland mansion chests in groups of 1.

In Bedrock Edition they can be found in 21.5% of woodland mansion chests in groups of 1.

Diamond horse armor can be found in 2.5% of stronghold altar chests, 5.7% of village weaponsmith chests, 7.7% of dungeon chests, 11.8% of fortress chests, 4.5% of jungle temple chests, 6.3% of desert temple chests, and 4.6% of End city chests, all in groups of 1.

In Bedrock Edition they can be found in 2.4% of stronghold altar chests and 4.4% of jungle temple chests in groups of 1.

Diamonds can be found in 14.1% of shipwreck treasure chests in stacks of 1; in 7.4% of stronghold altar chests, 9.9% of village toolsmith chests, 16.2% of village weaponsmith chests, 19.0% of fortress chests, 12.9% of jungle temple chests, and 6.3% of desert temple chests, all in stacks of 1–3; in 10.4% of chest minecarts in Mineshafts and 53.1% of buried treasure chests in stacks of 1–2; and in 21.2% of End city chests in stacks of 2–7.

In Bedrock Edition they can be found in 46.9% of buried treasure chests in stacks of 1, and in 7.2% of stronghold altar chests and 12.8% of jungle temple chests in stacks of 1–3.

Eggs can be found in 23.3% of village fletcher chests in stacks of 1–3.

Emeralds can be found in 14.9% of big underwater ruins chests, 24.2% of village fisherman chests, 31.8% of village armorer chests, 12.3% of village shepherd chests, 10.2% of village butcher chests, 16.4% of small underwater ruins chests, 12.3% of village fletcher chests, 7.6% of igloo chests, and 20.8% of village mason chests, all in stacks of 1; in 25.4% of village temple chests, 21.5% of savanna village house chests, 9.9% of snowy village house chests, 22.3% of plains village house chests, 18.6% of taiga village house chests, and 17.3% of village tannery chests, all in stacks of 1–4; in 73.7% of shipwreck treasure chests in stacks of 1–5; in 53.1% of buried treasure chests in stacks of 4–8; in 14.3% of desert village house chests, 8.7% of jungle temple chests, and 18.0% of desert temple chests, all in stacks of 1–3; and in 9.0% of End city chests in stacks of 2–6.

In Bedrock Edition they can be found in 7.2% of stronghold altar chests and 8.7% of jungle temple chests in stacks of 1–3, and in 20.3% of taiga village house chests in stacks of 1–4.

Empty maps can be found in 7.7% of shipwreck map chests and 10.9% of stronghold library chests in stacks of 1, and in 46.2% of village cartographer chests in stacks of 1–3.

Enchanted books[note 3] can be found in 2.5% of stronghold altar chests, 4.0% of stronghold storeroom chests, 4.5% of jungle temple chests, and 67.8% of stronghold library chests, all in groups of 1.

In Bedrock Edition they can be found in 2.9% of stronghold altar chests, 3.8% of stronghold storeroom chests, 5.3% of jungle temple chests, and 72.9% of stronghold library chests, all in groups of 1.

Enchanted books[note 4] can be found in 21.7% of big underwater ruins chests, 14.9% of dungeon chests, 23.5% of desert temple chests, 11.0% of pillager outpost chests, 14.1% of chest minecarts in Mineshafts, and 14.9% of woodland mansion chests, all in groups of 1.

Enchanted diamond boots[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted diamond chestplates[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted diamond helmets[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted diamond leggings[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted diamond pickaxes[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted diamond shovels[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted diamond swords[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted fishing rods[note 4] can be found in 21.7% of big underwater ruins chests and 41.7% of small underwater ruins chests in groups of 1.

Enchanted golden apples can be found in 3.1% of dungeon chests, 2.6% of desert temple chests, 1.4% of chest minecarts in Mineshafts, and 3.1% of woodland mansion chests, all in stacks of 1.

In Bedrock Edition they can be found in 3.1% of woodland mansion chests in stacks of 1.

Enchanted iron boots[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted iron chestplates[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted iron helmets[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted iron leggings[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted iron pickaxes[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted iron shovels[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted iron swords[note 2] can be found in 13.3% of End city chests in groups of 1.

Enchanted leather boots[note 4] can be found in 22.4% of shipwreck supply chests in groups of 1.

In Bedrock Edition they can be found in 25.3% of shipwreck supply chests in groups of 1.

Enchanted leather caps[note 4] can be found in 22.4% of shipwreck supply chests in groups of 1.

In Bedrock Edition they can be found in 25.3% of shipwreck supply chests in groups of 1.

Enchanted leather pants[note 4] can be found in 22.4% of shipwreck supply chests in groups of 1.

In Bedrock Edition they can be found in 25.3% of shipwreck supply chests in groups of 1.

Enchanted leather tunics[note 4] can be found in 22.4% of shipwreck supply chests in groups of 1.

In Bedrock Edition they can be found in 25.3% of shipwreck supply chests in groups of 1.

Ender pearls can be found in 23.3% of stronghold altar chests in stacks of 1.

In Bedrock Edition they can be found in 22.6% of stronghold altar chests in stacks of 1.

Feathers can be found in 11.8% of plains village house chests in stacks of 1, in 55.8% of village fletcher chests in stacks of 1–3, and in 60.0% of shipwreck map chests in stacks of 1–5.

Ferns can be found in 18.6% of taiga village house chests in stacks of 1.

In Bedrock Edition they can be found in 20.3% of taiga village house chests in stacks of 1.

Flint and steel can be found in 19.0% of fortress chests in groups of 1.

Flint can be found in 55.8% of village fletcher chests in stacks of 1–3.

Flower pots can be found in 20.8% of village mason chests in stacks of 1.

Furnaces can be found in 9.9% of snowy village house chests in stacks of 1.

Gold ingots can be found in 25.4% of village temple chests, 9.6% of dungeon chests, 9.6% of woodland mansion chests, and 88.0% of buried treasure chests, all in stacks of 1–4; in 26.5% of shipwreck treasure chests in stacks of 1–5; in 51.0% of jungle temple chests, 18.0% of desert temple chests, and 52.3% of End city chests, all in stacks of 2–7; and in 12.1% of stronghold altar chests, 9.9% of village toolsmith chests, 18.6% of stronghold storeroom chests, 25.6% of village weaponsmith chests, 49.0% of fortress chests, and 16.9% of chest minecarts in Mineshafts, all in stacks of 1–3.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests and 15.2% of stronghold storeroom chests in stacks of 1–3, in 34.3% of buried treasure chests in stacks of 1–5, and in 50.9% of jungle temple chests in stacks of 2–7.

Gold nuggets can be found in 81.0% of big underwater ruins chests, 55.3% of igloo chests, 11.3% of savanna village house chests, and 11.8% of plains village house chests, all in stacks of 1–3; and in 36.6% of shipwreck treasure chests in stacks of 1–10.

Golden apples can be found in 2.5% of stronghold altar chests, 4.3% of big underwater ruins chests, 21.8% of dungeon chests, all igloo chests, 23.5% of desert temple chests, 28.2% of chest minecarts in Mineshafts, and 21.8% of woodland mansion chests, all in stacks of 1.

In Bedrock Edition they can be found in 2.4% of stronghold altar chests and 21.5% of woodland mansion chests in stacks of 1.

Golden chestplates can be found in 19.0% of fortress chests in groups of 1.

Golden helmets can be found in 4.3% of big underwater ruins chests and 8.3% of small underwater ruins chests in groups of 1.

Golden horse armor can be found in 2.5% of stronghold altar chests, 5.7% of village weaponsmith chests, 14.9% of dungeon chests, 29.1% of fortress chests, 4.5% of jungle temple chests, 12.3% of desert temple chests, and 4.6% of End city chests, all in groups of 1.

In Bedrock Edition they can be found in 2.4% of stronghold altar chests and 4.4% of jungle temple chests in groups of 1.

Golden swords can be found in 19.0% of fortress chests in groups of 1.

Grass can be found in 45.9% of savanna village house chests in stacks of 1.

Gray wool can be found in 23.3% of village shepherd chests in stacks of 1–3.

Green dye can be found in 14.3% of desert village house chests in stacks of 1.

Gunpowder can be found in 22.4% of shipwreck supply chests in stacks of 1–5, and in 57.8% of dungeon chests, 59.0% of desert temple chests, and 57.8% of woodland mansion chests, all in stacks of 1–8.

In Bedrock Edition they can be found in 25.3% of shipwreck supply chests in stacks of 1–5.

Heart of the sea can be found in all buried treasure chests in stacks of 1.

In Bedrock Edition Potion of Regeneration can be found in 34.3% of buried treasure chests in stacks of 1.

In Bedrock Edition Potion of Water Breathing can be found in 46.9% of buried treasure chests in stacks of 1.

In Bedrock Edition birch saplings can be found in 16.7% of bonus chests in stacks of 4.

In Bedrock Edition book and quill can be found in 18.9% of buried treasure chests in stacks of 1–2.

In Bedrock Edition brown mushrooms can be found in all bonus chests in stacks of 1–2.

In Bedrock Edition cake can be found in 4.1% of buried treasure chests in stacks of 1.

In Bedrock Edition chainmail boots can be found in 57.2% of buried treasure chests in groups of 1.

In Bedrock Edition chainmail helmets can be found in 57.2% of buried treasure chests in groups of 1.

In Bedrock Edition chainmail leggings can be found in 57.2% of buried treasure chests in groups of 1.

In Bedrock Edition cocoa beans can be found in 50.0% of bonus chests in stacks of 1–2.

In Bedrock Edition dark oak saplings can be found in 16.7% of bonus chests in stacks of 4.

In Bedrock Edition enchanted books[note 1] can be found in 17.5% of woodland mansion chests in groups of 1.

In Bedrock Edition ink sacs can be found in 40.0% of stronghold storeroom chests in stacks of 1–3.

In Bedrock Edition jungle saplings can be found in 16.7% of bonus chests in stacks of 4.

In Bedrock Edition maps[note 5] can be found in 7.7% of shipwreck map chests and 10.5% of stronghold library chests in stacks of 1, and in 46.2% of village cartographer chests in stacks of 1–3.

In Bedrock Edition music disc (mellohi) can be found in 18.9% of buried treasure chests in groups of 1.

In Bedrock Edition music disc (wait) can be found in 18.9% of buried treasure chests in groups of 1.

In Bedrock Edition oak signs can be found in 10.7% of taiga village house chests in stacks of 1.

Iron boots can be found in 12.1% of stronghold altar chests and 25.6% of village weaponsmith chests in groups of 1.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests in groups of 1.

Iron chestplates can be found in 12.1% of stronghold altar chests and 25.6% of village weaponsmith chests in groups of 1.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests in groups of 1.

Iron helmets can be found in 12.1% of stronghold altar chests, 31.8% of village armorer chests, and 25.6% of village weaponsmith chests, all in groups of 1.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests in groups of 1.

Iron horse armor can be found in 2.5% of stronghold altar chests, 5.7% of village weaponsmith chests, 21.8% of dungeon chests, 19.0% of fortress chests, 4.5% of jungle temple chests, 18.0% of desert temple chests, and 4.6% of End city chests, all in groups of 1.

In Bedrock Edition they can be found in 2.4% of stronghold altar chests and 4.4% of jungle temple chests in groups of 1.

Iron ingots can be found in 54.2% of village armorer chests and 30.5% of pillager outpost chests in stacks of 1–3; in 23.3% of stronghold altar chests, 41.2% of village toolsmith chests, 97.4% of shipwreck treasure chests, 34.3% of stronghold storeroom chests, 45.1% of village weaponsmith chests, 19.0% of fortress chests, 37.4% of jungle temple chests, 18.0% of desert temple chests, and 31.6% of chest minecarts in Mineshafts, all in stacks of 1–5; in 38.4% of End city chests in stacks of 4–8; and in 18.5% of dungeon chests, 18.5% of woodland mansion chests, and 99.4% of buried treasure chests, all in stacks of 1–4.

In Bedrock Edition they can be found in 57.2% of buried treasure chests in stacks of 3–5, and in 22.6% of stronghold altar chests, 28.5% of stronghold storeroom chests, and 37.3% of jungle temple chests, all in stacks of 1–5.

Iron leggings can be found in 12.1% of stronghold altar chests and 25.6% of village weaponsmith chests in groups of 1.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests in groups of 1.

Iron nuggets can be found in 9.7% of taiga village house chests in stacks of 1–5, and in 94.5% of shipwreck treasure chests in stacks of 1–10.

In Bedrock Edition they can be found in 10.7% of taiga village house chests in stacks of 1–5.

Iron pickaxes can be found in 12.1% of stronghold altar chests, 41.2% of village toolsmith chests, 4.0% of stronghold storeroom chests, 25.6% of village weaponsmith chests, and 7.0% of chest minecarts in Mineshafts, all in groups of 1.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests and 3.2% of stronghold storeroom chests in groups of 1.

Iron shovels can be found in 41.2% of village toolsmith chests in groups of 1.

Iron swords can be found in 12.1% of stronghold altar chests, 25.6% of village weaponsmith chests, and 75.0% of buried treasure chests, all in groups of 1.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests in groups of 1.

Jungle logs can be found in 28.0% of bonus chests in stacks of 1–3.

In Bedrock Edition they can be found in 25.0% of bonus chests in stacks of 1–3.

Lapis lazuli can be found in 25.4% of village temple chests in stacks of 1–4, in 61.5% of shipwreck treasure chests in stacks of 1–10, and in 16.9% of chest minecarts in Mineshafts in stacks of 4–9.

Large ferns can be found in 18.6% of taiga village house chests in stacks of 1.

In Bedrock Edition they can be found in 20.3% of taiga village house chests in stacks of 1.

Leads can be found in 28.3% of woodland mansion chests in stacks of 1.

In Bedrock Edition they can be found in 27.9% of woodland mansion chests in stacks of 1, and in 34.3% of buried treasure chests in stacks of 1–3.

Leather boots can be found in 31.8% of village tannery chests in groups of 1.

Leather can be found in 17.3% of village tannery chests in stacks of 1–3.

Leather caps can be found in 31.8% of village tannery chests in groups of 1.

Leather pants can be found in 31.8% of village tannery chests in groups of 1.

Leather tunics can be found in 4.3% of big underwater ruins chests, 8.3% of small underwater ruins chests, 75.0% of buried treasure chests, and 31.8% of village tannery chests, all in groups of 1.

Light gray wool can be found in 23.3% of village shepherd chests in stacks of 1–3.

Melon seeds can be found in 18.5% of dungeon chests, 31.6% of chest minecarts in Mineshafts, and 18.5% of woodland mansion chests, all in stacks of 2–4.

In Bedrock Edition they can be found in 33.3% of bonus chests in stacks of 1–2.

Music disc (13) can be found in 21.8% of dungeon chests and 21.8% of woodland mansion chests in groups of 1.

In Bedrock Edition they can be found in 21.5% of woodland mansion chests in groups of 1.

Music disc (cat) can be found in 21.8% of dungeon chests and 21.8% of woodland mansion chests in groups of 1.

In Bedrock Edition they can be found in 21.5% of woodland mansion chests in groups of 1.

Name tags can be found in 28.3% of dungeon chests, 42.3% of chest minecarts in Mineshafts, and 28.3% of woodland mansion chests, all in stacks of 1.

In Bedrock Edition they can be found in 27.9% of woodland mansion chests and 34.3% of buried treasure chests in stacks of 1.

Nether wart can be found in 19.0% of fortress chests in stacks of 3–7.

Nothing[note 6] can be found in 18.0% of desert temple chests and 7.0% of chest minecarts in Mineshafts in stacks of 1.

Oak logs can be found in 28.0% of bonus chests in stacks of 1–3.

In Bedrock Edition they can be found in 25.0% of bonus chests in stacks of 1–3.

Oak planks can be found in 70.5% of bonus chests in stacks of 1–12.

In Bedrock Edition they can be found in all bonus chests in stacks of 1–12.

Oak saplings can be found in 47.4% of plains village house chests in stacks of 1–2, and in 25.6% of village weaponsmith chests in stacks of 3–7.

In Bedrock Edition they can be found in 16.7% of bonus chests in stacks of 4, and in 26.3% of village cartographer chests in stacks of 1–2.

Obsidian can be found in 8.0% of fortress chests in stacks of 2–4, and in 25.6% of village weaponsmith chests in stacks of 3–7.

Paper can be found in 49.4% of shipwreck supply chests in stacks of 1–12, in 89.4% of shipwreck map chests in stacks of 1–10, in 89.2% of stronghold library chests in stacks of 2–7, and in 61.2% of village cartographer chests in stacks of 1–5.

In Bedrock Edition they can be found in 54.4% of shipwreck supply chests in stacks of 1–12, and in 88.3% of stronghold library chests in stacks of 2–7.

Poisonous potatoes can be found in 44.9% of shipwreck supply chests in stacks of 2–6.

In Bedrock Edition they can be found in 49.6% of shipwreck supply chests in stacks of 2–6.

Poppies can be found in 22.3% of plains village house chests in stacks of 1.

Potatoes can be found in 44.9% of shipwreck supply chests in stacks of 2–6; in 66.3% of snowy village house chests, 73.4% of plains village house chests, and 65.6% of taiga village house chests, all in stacks of 1–7; and in 57.5% of pillager outpost chests in stacks of 2–5.

In Bedrock Edition they can be found in 49.6% of shipwreck supply chests in stacks of 2–6, in 69.3% of taiga village house chests in stacks of 1–7, and in 50.0% of bonus chests in stacks of 1–2.

Powered rails can be found in 27.1% of chest minecarts in Mineshafts in stacks of 1–4.

Prismarine crystals can be found in 53.1% of buried treasure chests in stacks of 1–5.

In Bedrock Edition they can be found in 18.9% of buried treasure chests in stacks of 1–5.

Pumpkin pie can be found in 9.7% of taiga village house chests in stacks of 1.

In Bedrock Edition they can be found in 10.7% of taiga village house chests in stacks of 1.

Pumpkin seeds can be found in 40.6% of taiga village house chests in stacks of 1–5, and in 18.5% of dungeon chests, 31.6% of chest minecarts in Mineshafts, and 18.5% of woodland mansion chests, all in stacks of 2–4.

In Bedrock Edition they can be found in 33.3% of bonus chests in stacks of 1–2, and in 43.7% of taiga village house chests in stacks of 1–5.

Pumpkins can be found in 15.6% of shipwreck supply chests in stacks of 1–3.

In Bedrock Edition they can be found in 17.7% of shipwreck supply chests in stacks of 1–3.

Rails can be found in 78.4% of chest minecarts in Mineshafts in stacks of 4–8.

Raw beef can be found in 48.6% of village butcher chests in stacks of 1–3.

Raw cod can be found in 43.0% of village fisherman chests in stacks of 1–3.

Raw mutton can be found in 48.6% of village butcher chests in stacks of 1–3.

Raw porkchops can be found in 48.6% of village butcher chests in stacks of 1–3.

Raw salmon can be found in 24.2% of village fisherman chests in stacks of 1–3, and in 61.5% of bonus chests in stacks of 1–2.

In Bedrock Edition they can be found in all bonus chests in stacks of 1–2.

Redstone dust can be found in 44.8% of village temple chests, 26.6% of dungeon chests, and 26.6% of woodland mansion chests, all in stacks of 1–4; and in 12.1% of stronghold altar chests, 18.6% of stronghold storeroom chests, and 16.9% of chest minecarts in Mineshafts, all in stacks of 4–9.

In Bedrock Edition they can be found in 11.8% of stronghold altar chests and 15.2% of stronghold storeroom chests in stacks of 4–9.

Rotten flesh can be found in 59.6% of small underwater ruins chests and 55.3% of igloo chests in stacks of 1; in 89.3% of village temple chests in stacks of 1–4; in 57.8% of dungeon chests, 59.0% of desert temple chests, and 57.8% of woodland mansion chests, all in stacks of 1–8; in 34.6% of shipwreck supply chests in stacks of 5–24; and in 53.4% of jungle temple chests and 28.7% of desert temple chests in stacks of 3–7.

In Bedrock Edition they can be found in 53.3% of jungle temple chests in stacks of 3–7, and in 38.6% of shipwreck supply chests in stacks of 5–24.

Saddles can be found in 2.5% of stronghold altar chests, 16.2% of village weaponsmith chests, 28.3% of dungeon chests, 11.3% of savanna village house chests, 35.3% of fortress chests, 12.9% of jungle temple chests, 23.5% of desert temple chests, 13.3% of End city chests, and 17.3% of village tannery chests, all in groups of 1.

In Bedrock Edition they can be found in 2.4% of stronghold altar chests and 12.8% of jungle temple chests in groups of 1.

Sand can be found in 59.0% of desert temple chests in stacks of 1–8.

Shears can be found in 12.3% of village shepherd chests in groups of 1.

Smooth stone can be found in 20.8% of village mason chests in stacks of 1.

Snow blocks can be found in 34.5% of snowy village house chests in stacks of 1.

Snowballs can be found in 66.3% of snowy village house chests in stacks of 1–7.

Spider eyes can be found in 28.7% of desert temple chests in stacks of 1–3.

Spruce logs can be found in 28.0% of bonus chests in stacks of 1–3, and in 65.6% of taiga village house chests in stacks of 1–5.

In Bedrock Edition they can be found in 25.0% of bonus chests in stacks of 1–3, and in 69.3% of taiga village house chests in stacks of 1–5.

Spruce saplings can be found in 40.6% of taiga village house chests in stacks of 1–5.

In Bedrock Edition they can be found in 16.7% of bonus chests in stacks of 4, and in 43.7% of taiga village house chests in stacks of 1–5.

Spruce signs can be found in 9.7% of taiga village house chests in stacks of 1.

Sticks can be found in 90.0% of village toolsmith chests and 55.8% of village fletcher chests in stacks of 1–3, in 26.3% of village cartographer chests in stacks of 1–2, and in 70.5% of bonus chests in stacks of 1–12.

In Bedrock Edition they can be found in all bonus chests in stacks of 1–12.

Stone axes can be found in 30.2% of small underwater ruins chests, 14.7% of igloo chests, and 25.0% of bonus chests, all in groups of 1.

Stone bricks can be found in 37.7% of village mason chests in stacks of 1.

Stone can be found in 37.7% of village mason chests in stacks of 1.

Stone pickaxes can be found in 25.0% of bonus chests in groups of 1.

String can be found in 39.1% of pillager outpost chests in stacks of 1–6, and in 57.8% of dungeon chests, 59.0% of desert temple chests, and 57.8% of woodland mansion chests, all in stacks of 1–8.

Suspicious stew[note 7] can be found in 57.4% of shipwreck supply chests in stacks of 1.

Sweet berries can be found in 40.6% of taiga village house chests in stacks of 1–7.

TNT can be found in 8.1% of shipwreck supply chests and 62.7% of buried treasure chests in stacks of 1–2.

In Bedrock Edition they can be found in 9.3% of shipwreck supply chests and 34.3% of buried treasure chests in stacks of 1–2.

Tall grass can be found in 45.9% of savanna village house chests in stacks of 1.

Torches can be found in 65.7% of chest minecarts in Mineshafts in stacks of 1–16, and in 11.3% of savanna village house chests in stacks of 1–2.

Tripwire hooks can be found in 30.5% of pillager outpost chests in stacks of 1–3.

Water buckets can be found in 24.2% of village fisherman chests in groups of 1–3.

Wheat can be found in 34.1% of dungeon chests and 34.1% of woodland mansion chests in stacks of 1–4; in 80.6% of desert village house chests in stacks of 1–7; in 81.0% of big underwater ruins chests, 84.2% of small underwater ruins chests, and 55.3% of igloo chests, all in stacks of 2–3; in 48.6% of village butcher chests in stacks of 1–3; in 72.5% of pillager outpost chests in stacks of 3–5; in 44.9% of shipwreck supply chests in stacks of 8–21; and in 55.8% of village shepherd chests in stacks of 1–6.

In Bedrock Edition they can be found in 49.6% of shipwreck supply chests in stacks of 8–21.

Wheat seeds can be found in 57.5% of village fisherman chests in stacks of 1–3, and in 71.7% of savanna village house chests in stacks of 1–5.

White wool can be found in 55.8% of village shepherd chests in stacks of 1–8.

Wooden axes can be found in 75.0% of bonus chests in groups of 1.

Wooden pickaxes can be found in 75.0% of bonus chests in groups of 1.

Yellow dye can be found in 20.8% of village mason chests in stacks of 1.


Notes[edit]

  1. All enchantments are equally probable, including treasure enchantments, and any level of the enchantment is equally probable.
  2. a b c d e f g h i j k l m n Enchantment probabilities are the same as a level-20 to level-39 enchantment would be on an enchantment table that had no cap at level 30, and that was able to apply treasure enchantments, and where the chance of multiple enchantments is not reduced.
  3. Enchantment probabilities are the same as a level-30 enchantment on an enchantment table that was able to apply treasure enchantments, and where the chance of multiple enchantments is not reduced.
  4. a b c d e f All enchantments are equally probable, except treasure enchantments, and any level of the enchantment is equally probable.
  5. Named unknown map, but changed to map 0, the scale level is 1:4, Maps from the same stack are stackable, but maps which are not stacked are unstackable despite looking identical.
  6. 'Nothing' does not refer to the chance of an empty chest. Instead, it refers to the chance that the random loot generator will not add any loot on a single roll.
  7. The stew will grant one of the following effects: 5–7 seconds of Blindness, 7–10 seconds of Jump Boost, 10–20 seconds of Poison, 7–10 seconds of Saturation, 7–10 seconds of Speed, or 6–8 seconds of Weakness.
[view | edit | history | purge]The above documentation is transcluded from Module:LootChest/doc.
local p = {

	calc_average_amount_this_item_per_pool = function( 
			min_stacksize, max_stacksize,
			min_pool_rolls, max_pool_rolls, 
			item_weight, pool_total_item_weight )

		local avg_stacksize = ( min_stacksize + max_stacksize ) / 2
		local avg_rolls = ( min_pool_rolls + max_pool_rolls ) / 2
		
		return avg_stacksize * avg_rolls * item_weight / pool_total_item_weight
		
	end,
	
	calc_chance_any_of_this_item_per_pool = function( 
			min_pool_rolls, max_pool_rolls,
			item_weight, pool_total_item_weight )

		local inverse_result = 0 -- 1 - inverse_result = return value
		local inverse_item_weight = pool_total_item_weight - item_weight
		
		-- will be used for the division in the for loop to avoid the slightly
		-- less performant math.pow(). The divisor already includes the probability
		-- of picking any specific number of rolls.
		local cur_dividend = inverse_item_weight
		local cur_divisor = pool_total_item_weight * (max_pool_rolls - min_pool_rolls + 1)
		
		for i = 1, max_pool_rolls do
			if i >= min_pool_rolls then
				inverse_result = inverse_result + cur_dividend / cur_divisor
			end
			cur_dividend = cur_dividend * inverse_item_weight -- simulate pow
			cur_divisor = cur_divisor * pool_total_item_weight -- simulate pow
		end
		
		return 1 - inverse_result
		
	end,
	
	java = 'In [[Java Edition]],[[Category:Java Edition specific information]] ',
	['java-upcoming'] = 'In [[Java Edition 1.15]]{{upcoming}},[[Category:Java Edition specific information]] ',
	bedrock = 'In [[Bedrock Edition]][[Category:Bedrock Edition specific information]] ',
	['bedrock-upcoming'] = 'In [[Bedrock Edition 1.13]]{{upcoming}}[[Category:Bedrock Edition specific information]] ',
	
	-- These 'items' define which sprite, label and link to use in the table.
	-- Properties 'cannot_stack', 'preserve_case', and 'plural' describe how to display the single-item summary in p.base2.
	-- Order within this 'items' list doesn't matter.

	items = {
		["acacia-log"]          = { "block", link="Log" },
		["acacia-sapling"]      = { "block", link="Sapling" },
		["activator-rail"]      = { "block" },
		["apple"]               = { "item" },
		["arrow"]               = { "item" },
		["bamboo"]              = { "item", plural=false },
		["barrel"]              = { "block" },
		["beetroot"]            = { "item" },
		["beetroot-seeds"]      = { "item", plural=false },
		["beetroot-soup"]		= { "item", plural=false, cannot_stack=true },
		["birch-log"]           = { "block", link="Log" },
		["birch-sapling"]       = { "block", link="Sapling" },
		["black-wool"]          = { "block", link="Wool", plural=false },
		["blue-ice"]			= { "block", plural=false },
		["bone"]                = { "item" },
		["book"]                = { "item" },
		["book-and-quill"]      = { "item", plural=false, title="Book and Quill" },
		["bottle-o'-enchanting"] = { "item", title="Bottle o' Enchanting", plural="bottles o' enchanting" },
		["bread"]               = { "item", plural=false },
		["brown-mushroom"]      = { "block", link="Mushroom" },
		["brown-wool"]          = { "block", link="Wool", plural=false },
		["bucket"]              = { "item" },
        ["buried-treasure-map"] = { "item", link="Explorer Map" },
		["cactus"]              = { "block", plural=false },
		["cake"]                = { "block", plural=false },
		["carrot"]              = { "item" },
		["chainmail-boots"]     = { "item", link="Armor", cannot_stack=true, plural=false },
		["chainmail-chestplate"] = { "item", link="Armor", cannot_stack=true },
		["chainmail-helmet"]    = { "item", link="Armor", cannot_stack=true },
		["chainmail-leggings"]  = { "item", link="Armor", cannot_stack=true, plural=false },
		["clay"]				= { "item", plural=false },
		["clock"]				= { "item" },
		["coal"]                = { "item", plural=false },
		["cocoa-beans"]         = { "item", plural=false },
		["cooked-cod"]          = { "item", plural=false, link="Cooked Cod" },
		["cooked-salmon"]       = { "item", plural=false, link="Cooked Salmon" },
		["compass"]             = { "item" },
		["crossbow"]            = { "item", cannot_stack=true },
		["dandelion"]			= { "block", link="Flower" },
		["dark-oak-log"]        = { "block", link="Log" },
		["dark-oak-sapling"]    = { "block", link="Sapling" },
		["dead-bush"]			= { "block", link="Dead Bush" },
		["detector-rail"]       = { "block" },
		["diamond"]             = { "item" },
		["diamond-chestplate"]  = { "item", link="Armor", cannot_stack=true },
		["diamond-hoe"]         = { "item", link="Hoe", cannot_stack=true },
		["diamond-horse-armor"] = { "item", link="Horse Armor", cannot_stack=true, plural=false },
		["disc-13"]             = { "item", id='music-disc-13', title="Music Disc (13)", link="Music Disc", cannot_stack=true, plural=false },
		["disc-cat"]            = { "item", id='music-disc-cat',title="Music Disc (Cat)", link="Music Disc", cannot_stack=true, plural=false },
		["disc-mellohi"]        = { "item", id='music-disc-mellohi',title="Music Disc (Mellohi)", link="Music Disc", cannot_stack=true, plural=false },
		["disc-wait"]           = { "item", id='music-disc-wait',title="Music Disc (Wait)", link="Music Disc", cannot_stack=true, plural=false },
		["egg"]             = { "item" },
		["emerald"]             = { "item" },
		["empty-map"]           = { "item", link="Map", title="Empty Map" },
		["enchanted-book"]   = { "item", id='enchanted-book', title="Enchanted Book", link="Enchanted Book", cannot_stack=true, note="enchant-with-levels-30" },
		["enchanted-book-rnd"]  = { "item", id='enchanted-book', title="Enchanted Book", link="Enchanted Book", cannot_stack=true, note="enchant-randomly" },
		["enchanted-book-rnd-treasure"] = { "item", id='enchanted-book', title="Enchanted Book", link="Enchanted Book", cannot_stack=true, note="enchant-randomly-treasure" },
		["enchanted-fishing-rod"] = { "item", id="fishing-rod", link="Fishing Rod", cannot_stack=true, note="enchant-randomly" },
		["enchanted-golden-apple"] = { "item", id='golden-apple', link="Golden Apple" },
		["ender-pearl"]         = { "item" },
		["feather"]             = { "item" },
		["fern"]				= { "block", link="Grass" },
		["flint"]               = { "item", plural=false },
		["flint-and-steel"]     = { "item", cannot_stack=true, plural=false },
		["flower-pot"]			= { "item" },
		["furnace"]             = { "block" },
		["golden-apple"]        = { "item" },
		["golden-chestplate"]   = { "item", link="Armor", cannot_stack=true },
		["golden-helmet"]       = { "item", link="Armor", cannot_stack=true },
		["golden-horse-armor"]  = { "item", link="Horse Armor", cannot_stack=true, plural=false },
		["golden-sword"]        = { "item", link="Sword", cannot_stack=true },
		["gold-ingot"]          = { "item" },
		["gold-nugget"]         = { "item" },
		["grass"]				= { "block", link="Grass", plural=false },
		["gray-wool"]           = { "block", link="Wool", plural=false },
		["green-dye"]			= { "item", link="Dye", plural=false },
		["gunpowder"]           = { "item", plural=false },
		["heart-of-the-sea"]    = { "item", plural=false, link="Heart of the Sea" },
		["ink-sac"]             = { "item" },
		["iron-boots"]          = { "item", link="Armor", cannot_stack=true, plural=false },
		["iron-chestplate"]     = { "item", link="Armor", cannot_stack=true },
		["iron-helmet"]         = { "item", link="Armor", cannot_stack=true },
		["iron-horse-armor"]    = { "item", link="Horse Armor", cannot_stack=true, plural=false },
		["iron-ingot"]          = { "item" },
		["iron-leggings"]       = { "item", link="Armor", cannot_stack=true, plural=false },
		["iron-nugget"]         = { "item" },
		["iron-pickaxe"]        = { "item", link="Pickaxe", cannot_stack=true },
		["iron-shovel"]         = { "item", link="Shovel", cannot_stack=true },
		["iron-sword"]          = { "item", link="Sword", cannot_stack=true },
		["jungle-log"]          = { "block", link="Log" },
		["jungle-sapling"]      = { "block", link="Sapling" },
		["lapis-lazuli"]        = { "item", plural=false },
		["large-fern"]			= { "block", link="Grass" },
		["lead"]                = { "item" },
		["leather"]      		= { "item", plural=false },
		["leather-boots"]       = { "item", link="Armor", cannot_stack=true, plural=false },
		["leather-cap"]         = { "item", link="Armor", cannot_stack=true },
		["leather-pants"]       = { "item", link="Armor", cannot_stack=true, plural=false },
		["leather-tunic"]       = { "item", link="Armor", cannot_stack=true },
		["light-gray-wool"]     = { "block", link="Wool", plural=false },
		["melon-seeds"]         = { "item", plural=false },
		["name-tag"]            = { "item" },
		["nether-wart"]         = { "item", plural=false },
		["oak-log"]             = { "block", link="Log" },
		["oak-planks"]          = { "block", link="Planks", id="oak-wood-planks", plural=false },
		["oak-sapling"]         = { "block", link="Sapling" },
		["oak-sign"]            = { "item", link="Sign" },
		["obsidian"]            = { "block", plural=false },
		["paper"]               = { "item", plural=false },
		["poisonous-potato"]    = { "item", plural="poisonous potatoes" },
		["poppy"]				= { "block", link="Flower", plural="poppies" },
		["potato"]              = { "item", plural="potatoes" },
		["potion-of-regeneration"] = { "item", link="Potion", title="Potion of Regeneration", plural=false, preserve_case=true },
		["potion-of-water-breathing"] = { "item", link="Potion", title="Potion of Water Breathing", plural=false, preserve_case=true },
		["powered-rail"]        = { "block", title="Powered Rails", plural=false },
		["prismarine-crystals"] = { "item", plural=false },
		["pumpkin"]             = { "block" },
		["pumpkin-pie"]         = { "item", plural=false },
		["pumpkin-seeds"]       = { "item", plural=false },
		["rail"]                = { "block", title="Rails", plural=false },
		["raw-beef"]		    = { "item", link="Raw Beef", plural=false },
		["raw-cod"]             = { "item", link="Raw Cod", plural=false },
		["raw-mutton"]			= { "item", link="Raw Mutton", plural=false },
		["raw-porkchop"]		= { "item", link="Raw Porkchop" },
		["raw-salmon"]          = { "item", link="Raw Salmon", plural=false },
		["redstone"]            = { "item", id="redstone-dust", title="Redstone Dust", plural=false },
		["rotten-flesh"]        = { "item", plural=false },
		["saddle"]              = { "item", cannot_stack=true },
		["sand"]                = { "block", plural=false },
		["shears"]              = { "item", plural=false, cannot_stack=true },
		["smooth-stone"]		= { "block", plural=false },
		["snowball"]			= { "item", link="Snowball" },
		["snow-block"]			= { "block", link="Snow Block" },
		["spider-eye"]          = { "item" },
		["spruce-log"]          = { "block", link="Log" },
		["spruce-sapling"]      = { "block", link="Sapling" },
		["spruce-sign"]     	= { "item", link="Sign" },
		["stick"]               = { "item" },
		["stone"]               = { "block", plural=false },
		["stone-axe"]           = { "item", link="Axe", cannot_stack=true },
		["stone-bricks"]        = { "block", plural=false },
		["stone-pickaxe"]       = { "item", link="Pickaxe", cannot_stack=true },
		["string"]              = { "item", plural=false },
		["suspicious-stew"]     = { "item", plural=false, note="suspicious-stew" },
		["sweet-berries"]       = { "item", plural=false },
		["tall-grass"]			= { "block", plural=false, link="Grass" },
		["tnt"]                 = { "block", title="TNT", plural=false, preserve_case=true },
		["torch"]               = { "block" },
		["tripwire-hook"]       = { "block" },
		["water-bucket"]        = { "item", cannot_stack=true },
		["wheat"]               = { "item", plural=false },
		["wheat-seeds"]         = { "item", plural=false },
		["white-wool"]          = { "block", link="Wool", plural=false },
		["wooden-axe"]          = { "item", link="Axe", cannot_stack=true },
		["wooden-hoe"]          = { "item", link="Hoe", cannot_stack=true },
		["wooden-pickaxe"]      = { "item", link="Pickaxe", cannot_stack=true },
		["yellow-dye"]			= { "item", link="Dye", plural=false },
		["map"]                 = { "item", link="Map", note="map" },

		["enchanted-diamond-boots"]      = { "item", id="diamond-boots", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true, plural=false },
		["enchanted-diamond-chestplate"] = { "item", id="diamond-chestplate", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-diamond-helmet"]     = { "item", id="diamond-helmet", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-diamond-leggings"]   = { "item", id="diamond-leggings", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true, plural=false },
		["enchanted-diamond-pickaxe"]    = { "item", id="diamond-pickaxe", link="Pickaxe", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-diamond-shovel"]     = { "item", id="diamond-shovel", link="Shovel", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-diamond-sword"]      = { "item", id="diamond-sword", link="Sword", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-iron-boots"]         = { "item", id="iron-boots", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true, plural=false },
		["enchanted-iron-chestplate"]    = { "item", id="iron-chestplate", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-iron-helmet"]        = { "item", id="iron-helmet", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-iron-leggings"]      = { "item", id="iron-leggings", link="Armor", note="enchant-with-levels-20-39", cannot_stack=true, plural=false },
		["enchanted-iron-pickaxe"]       = { "item", id="iron-pickaxe", link="Pickaxe", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-iron-shovel"]        = { "item", id="iron-shovel", link="Shovel", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-iron-sword"]         = { "item", id="iron-sword", link="Sword", note="enchant-with-levels-20-39", cannot_stack=true },
		["enchanted-leather-boots"]      = { "item", id="leather-boots", link="Armor", note="enchant-randomly", cannot_stack=true, plural=false },
		["enchanted-leather-cap"]        = { "item", id="leather-cap", link="Armor", note="enchant-randomly", cannot_stack=true },
		["enchanted-leather-pants"]      = { "item", id="leather-pants", link="Armor", note="enchant-randomly", cannot_stack=true, plural=false },
		["enchanted-leather-tunic"]      = { "item", id="leather-tunic", link="Armor", note="enchant-randomly", cannot_stack=true },

		["empty"]                        = { "block", id="air", link='', title='Nothing', plural=false, note="nothing" },
	},

	notes = {
		["enchant-randomly"] = "All enchantments are equally probable, ''except'' [[treasure enchantment]]s, and any level of the enchantment is equally probable.",
		["enchant-randomly-treasure"] = "All enchantments are equally probable, ''including'' [[treasure enchantment]]s, and any level of the enchantment is equally probable.",
		["enchant-with-levels-20-39"] = "Enchantment probabilities are the same as a level-20 to level-39 [[enchantment mechanics|enchantment]] would be on an [[enchantment table]] that had no cap at level 30, and that was able to apply [[treasure enchantment]]s, and where the chance of multiple enchantments is not reduced.",
		["enchant-with-levels-30"] = "Enchantment probabilities are the same as a level-30 enchantment on an [[enchantment table]] that was able to apply [[treasure enchantment]]s, and where the chance of multiple enchantments is not reduced.",
		["nothing"] = "'Nothing' does not refer to the chance of an empty chest.  Instead, it refers to the chance that the random loot generator will not add any loot ''on a single roll''.",
		["suspicious-stew"] = "The stew will grant one of the following effects: 5–7 seconds of [[Blindness]], 7–10 seconds of [[Jump Boost]], 10–20 seconds of [[Poison]], 7–10 seconds of [[Saturation]], 7–10 seconds of [[Speed]], or 6–8 seconds of [[Weakness]].",
		["map"] = "Named unknown map, but changed to map 0, the scale level is 1:4, Maps from the same stack are stackable, but maps which are not stacked are unstackable despite looking identical."
	},

	-- <ref group='note' name='enchant-randomly'>
	
	-- NOTE: order here doesn't matter.  
	--		 * in the table, chests will sort in alphabetical order
	--       * in the table, items will sort by chance, then by avg#, then alphabetically.
	--       * If poolsJavaUpcoming is omitted, poolsJava will be used. To omit a pool entirely, set it to {}.
	--       * If poolsBedrock is omitted, it implies that Bedrock has the same pools as Java.  This is a shortcoming; it ought to be made explicit somehow.
	
	chests = {
		["shipwreck-map"] = { -- shipwreck_map.json
			header = "Map",
			superheader = "[[Shipwreck]]",
			link   = "[[shipwreck]] map",
			structure = "Shipwreck",
			container = "Map chest",
			structID = "shipwreck",
			poolsJava = {
				{
					rolls = {1,1},
					items = {
                        ["buried-treasure-map"] = {1,1,1},
					}
				},
				{
					rolls = {3,3},
					items = {
						["compass"]             = {1,1,1},
						["empty-map"]           = {1,1,1},
						["clock"]               = {1,1,1},
						["paper"]               = {1,10,20},
						["feather"]             = {1,5,10},
						["book"]                = {1,5,5},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {1,1},
					items = {
						["buried-treasure-map"] = {1,1,1},
					}
				},
				{
					rolls = {3,3},
					items = {
						["compass"]             = {1,1,1},
						["map"]                 = {1,1,1},
						["clock"]               = {1,1,1},
						["paper"]               = {1,10,20},
						["feather"]             = {1,5,10},
						["book"]                = {1,5,5},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["shipwreck-supply"] = { -- shipwreck_supply.json
			header = "Supply",
			superheader = "[[Shipwreck]]",
			link   = "[[shipwreck]] supply",
			structure = "Shipwreck",
			container = "Supply chest",
			structID = "shipwreck",
			poolsJava = {
				{
					rolls = {3,10},
					items = {
						["paper"]               = {1,12,8},
						["potato"]              = {2,6,7},
						["poisonous-potato"]    = {2,6,7},
						["carrot"]              = {4,8,7},
						["wheat"]               = {8,21,7},
						["coal"]                = {2,8,6},
						["rotten-flesh"]        = {5,24,5},
						["bamboo"]              = {1,3,2},
						["suspicious-stew"]     = {1,1,10},
						["pumpkin"]             = {1,3,2},
						["gunpowder"]           = {1,5,3},
						["tnt"]                 = {1,2,1},
						["enchanted-leather-cap"]         = {1,1,3},
						["enchanted-leather-tunic"]       = {1,1,3},
						["enchanted-leather-pants"]       = {1,1,3},
						["enchanted-leather-boots"]       = {1,1,3},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {3,10},
					items = {
						["paper"]               = {1,12,8},
						["potato"]              = {2,6,7},
						["poisonous-potato"]    = {2,6,7},
						["carrot"]              = {4,8,7},
						["wheat"]               = {8,21,7},
						["coal"]                = {2,8,6},
						["rotten-flesh"]        = {5,24,5},
						["bamboo"]              = {1,3,2},
						["pumpkin"]             = {1,3,2},
						["gunpowder"]           = {1,5,3},
						["tnt"]                 = {1,2,1},
						["enchanted-leather-cap"]         = {1,1,3},
						["enchanted-leather-tunic"]       = {1,1,3},
						["enchanted-leather-pants"]       = {1,1,3},
						["enchanted-leather-boots"]       = {1,1,3},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["shipwreck-treasure"] = { -- shipwreck_treasure.json
			header = "Treasure",
			superheader = "[[Shipwreck]]",
			link   = "[[shipwreck]] treasure",
			structure = "Shipwreck",
			container = "Treasure chest",
			structID = "shipwreck",
			poolsJava = {
				{
					rolls = {3,6},
					items = {
						["iron-ingot"]          = {1,5,90},
						["gold-ingot"]          = {1,5,10},
						["emerald"]             = {1,5,40},
						["diamond"]             = {1,1,5},
						["bottle-o'-enchanting"] = {1,1,5},
					}
				},
				{
					rolls = {2,5},
					items = {
						["iron-nugget"]         = {1,10,50},
						["gold-nugget"]         = {1,10,10},
						["lapis-lazuli"]        = {1,10,20},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["buried-treasure"] = { -- buried_treasure.json
			header = "[[Buried treasure]]",
			link   = "[[buried treasure]]",
			structure = "Buried treasure",
			container = "",
			structID = "buried-treasure",
			poolsJava = {
				{
					rolls = {1,1},
					items = {
						["heart-of-the-sea"]    = {1,1,1},
					}
				},
				{
					rolls = {5,8},
					items = {
						["iron-ingot"]          = {1,4,20},
						["gold-ingot"]          = {1,4,10},
						["tnt"]                 = {1,2,5},
					}
				},
				{
					rolls = {1,3},
					items = {
						["emerald"]             = {4,8,5},
						["diamond"]             = {1,2,5},
						["prismarine-crystals"] = {1,5,5},
					}
				},
				{
					rolls = {0,1},
					items = {
						["leather-tunic"]       = {1,1,1},
						["iron-sword"]          = {1,1,1},
					}
				},
				{
					rolls = {2,2},
					items = {
						["cooked-cod"]          = {2,4,1},
						["cooked-salmon"]       = {2,4,1},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {1,1},
					items = {
						["heart-of-the-sea"]    = {1,1,1},
					}
				},
				{
					rolls = {5,12},
					items = {
						["prismarine-crystals"] = {1,5,5},
						["iron-ingot"]          = {3,5,20},
						["gold-ingot"]          = {1,5,10},
						["tnt"]                 = {1,2,10},
						["diamond"]             = {1,1,15},
						["disc-wait"]           = {1,1,5},
						["disc-mellohi"]        = {1,1,5},
						["name-tag"]            = {1,1,10},
						["chainmail-chestplate"] = {1,1,20},
						["chainmail-helmet"]    = {1,1,20},
						["chainmail-leggings"]  = {1,1,20},
						["chainmail-boots"]     = {1,1,20},
						["book-and-quill"]      = {1,2,5},
						["lead"]                = {1,3,10},
						["bottle-o'-enchanting"] = {1,1,3},
						["potion-of-water-breathing"] = {1,1,15},
						["potion-of-regeneration"] = {1,1,10},
						["cake"]                = {1,1,1},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["underwater-ruin-big"] = { -- underwater_ruin_big.json
			header = "Big",
			superheader = "[[Underwater ruins]]",
			link   = "big [[underwater ruins]]",
			structure = "Underwater ruins",
			container = "Big ruins chest",
			structID = "underwater-ruins",
			poolsJava = {
				{
					rolls = {2,8},
					items = {
						["coal"]                = {1,4,10},
						["gold-nugget"]         = {1,3,10},
						["emerald"]             = {1,1,1},
						["wheat"]               = {2,3,10},
					}
				},
				{
					rolls = {1,1},
					items = {
						["golden-apple"]        = {1,1,1},
						["enchanted-book-rnd"]  = {1,1,5},
						["leather-tunic"]       = {1,1,1},
						["golden-helmet"]       = {1,1,1},
						["enchanted-fishing-rod"] = {1,1,5},
                        ["buried-treasure-map"] = {1,1,10},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["underwater-ruin-small"] = { -- underwater_ruin_small.json
			header = "Small",
			superheader = "[[Underwater ruins]]",
			link   = "small [[underwater ruins]]",
			structure = "Underwater ruins",
			container = "Small ruins chest",
			structID = "underwater-ruins",
			poolsJava = {
				{
					rolls = {2,8},
					items = {
						["coal"]                = {1,4,10},
						["stone-axe"]           = {1,1,2},
						["rotten-flesh"]        = {1,1,5},
						["emerald"]             = {1,1,1},
						["wheat"]               = {2,3,10},
					}
				},
				{
					rolls = {1,1},
					items = {
						["leather-tunic"]       = {1,1,1},
						["golden-helmet"]       = {1,1,1},
						["enchanted-fishing-rod"] = {1,1,5},
                        ["buried-treasure-map"] = {1,1,5},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		
		["village-armorer"] = { -- village\village_armorer.json
			header = "Armorer",
			superheader = "[[Village]]",
			link   = "[[village]] armorer",
			structure = "Village",
			container = "Armorer's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["iron-ingot"]     = {1,3,2},
						["bread"]          = {1,4,4},
						["iron-helmet"]    = {1,1,1},
						["emerald"]        = {1,1,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-butcher"] = { -- village\village_butcher.json
			header = "Butcher",
			superheader = "[[Village]]",
			link   = "[[village]] butcher",
			structure = "Village",
			container = "Butcher's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["emerald"]        = {1,1,1},
						["raw-porkchop"]   = {1,3,6},
						["wheat"]          = {1,3,6},
						["raw-beef"]       = {1,3,6},
						["raw-mutton"]     = {1,3,6},
						["coal"]           = {1,3,3}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-cartographer"] = { -- village\village_cartographer.json
			header = "Cartographer",
			superheader = "[[Village]]",
			link   = "[[village]] cartographer",
			structure = "Village",
			container = "Cartographer's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["empty-map"]      = {1,3,10},
						["paper"]          = {1,5,15},
						["compass"]        = {1,1,5},
						["bread"]          = {1,4,15},
						["stick"]          = {1,2,5}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {1,5},
					items = {
						["map"]            = {1,3,10},
						["paper"]          = {1,5,15},
						["compass"]        = {1,1,5},
						["bread"]          = {1,4,15},
						["oak-sapling"]    = {1,2,5}
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["village-fisherman"] = { -- village\village_fisher.json, Java-exclusive as of Java 1.14 / Bedrock 1.12
			header = "Fisherman",
			superheader = "[[Village]]",
			link   = "[[village]] fisherman",
			structure = "Village",
			container = "Fisherman's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["emerald"]         = {1,1,1},
						["raw-cod"]         = {1,3,2},
						["raw-salmon"]      = {1,3,1},
						["water-bucket"]    = {1,3,1},
						["barrel"]          = {1,3,1},
						["wheat-seeds"]     = {1,3,3},
						["coal"]            = {1,3,2}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-fletcher"] = { -- village\village_fletcher.json
			header = "Fletcher",
			superheader = "[[Village]]",
			link   = "[[village]] fletcher",
			structure = "Village",
			container = "Fletcher's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["emerald"]         = {1,1,1},
						["arrow"]           = {1,3,2},
						["feather"]         = {1,3,6},
						["egg"]             = {1,3,2},
						["flint"]           = {1,3,6},
						["stick"]           = {1,3,6}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-mason"] = { -- village\village_mason.json
			header = "Mason",
			superheader = "[[Village]]",
			link   = "[[village]] mason",
			structure = "Village",
			container = "Mason's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["clay"]           = {1,3,1},
						["flower-pot"]     = {1,1,1},
						["stone"]          = {1,1,2},
						["stone-bricks"]   = {1,1,2},
						["bread"]          = {1,4,4},
						["yellow-dye"]     = {1,1,1},
						["smooth-stone"]   = {1,1,1},
						["emerald"]        = {1,1,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-shepherd"] = { -- village\village_shepherd.json
			header = "Shepherd",
			superheader = "[[Village]]",
			link   = "[[village]] shepherd",
			structure = "Village",
			container = "Shepherd's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["white-wool"]      = {1,8,6},
						["black-wool"]      = {1,3,3},
						["gray-wool"]       = {1,3,2},
						["brown-wool"]      = {1,3,2},
						["light-gray-wool"] = {1,3,2},
						["emerald"]         = {1,1,1},
						["shears"]          = {1,1,1},
						["wheat"]           = {1,6,6}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-tannery"] = { -- village\village_tannery.json
			header = "Tannery",
			superheader = "[[Village]]",
			link   = "[[village]] tannery",
			structure = "Village",
			container = "Tanner's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {1,5},
					items = {
						["leather"]         = {1,3,1},
						["leather-tunic"]   = {1,1,2},
						["leather-boots"]   = {1,1,2},
						["leather-cap"]     = {1,1,2},
						["bread"]           = {1,4,5},
						["leather-pants"]   = {1,1,2},
						["saddle"]          = {1,1,1},
						["emerald"]         = {1,4,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-temple"] = { -- village\village_temple.json
			header = "Temple",
			superheader = "[[Village]]",
			link   = "[[village]] temple",
			structure = "Village",
			container = "Temple chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["redstone"]        = {1,4,2},
						["bread"]           = {1,4,7},
						["rotten-flesh"]    = {1,4,7},
						["lapis-lazuli"]    = {1,4,1},
						["gold-ingot"]      = {1,4,1},
						["emerald"]         = {1,4,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-toolsmith"] = { -- village\village_toolsmith.json
			header = "Toolsmith",
			superheader = "[[Village]]",
			link   = "[[village]] toolsmith",
			structure = "Village",
			container = "Toolsmith's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["diamond"]         = {1,3,1},
						["iron-ingot"]      = {1,5,5},
						["gold-ingot"]      = {1,3,1},
						["bread"]           = {1,3,15},
						["iron-pickaxe"]    = {1,1,5},
						["coal"]            = {1,3,1},
						["stick"]           = {1,3,20},
						["iron-shovel"]     = {1,1,5}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-weaponsmith"] = { -- village\village_weaponsmith.json
			header = "Weaponsmith",
			superheader = "[[Village]]",
			link   = "[[village]] weaponsmith",
			structure = "Village",
			container = "Weaponsmith's chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["diamond"]             = {1,3,3},
						["iron-ingot"]          = {1,5,10},
						["gold-ingot"]          = {1,3,5},
						["bread"]               = {1,3,15},
						["apple"]               = {1,3,15},
						["iron-pickaxe"]        = {1,1,5},
						["iron-sword"]          = {1,1,5},
						["iron-chestplate"]     = {1,1,5},
						["iron-helmet"]         = {1,1,5},
						["iron-leggings"]       = {1,1,5},
						["iron-boots"]          = {1,1,5},
						["obsidian"]            = {3,7,5},
						["oak-sapling"]         = {3,7,5},
						["saddle"]              = {1,1,3},
						["iron-horse-armor"]    = {1,1,1},
						["golden-horse-armor"]  = {1,1,1},
						["diamond-horse-armor"] = {1,1,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		
		["village-desert-house"] = { -- village\village_desert_house.json
			header = "Desert House",
			superheader = "[[Village]]",
			link   = "desert [[village]] house",
			structure = "Village",
			container = "Desert house chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["clay"]            = {1,1,1},
						["green-dye"]       = {1,1,1},
						["cactus"]          = {1,4,10},
						["wheat"]           = {1,7,10},
						["bread"]           = {1,4,10},
						["book"]            = {1,1,1},
						["dead-bush"]       = {1,3,2},
						["emerald"]         = {1,3,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-plains-house"] = { -- village\village_plains_house.json
			header = "Plains house",
			superheader = "[[Village]]",
			link   = "plains [[village]] house",
			structure = "Village",
			container = "Plains house chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["gold-nugget"]     = {1,3,1},
						["dandelion"]       = {1,1,2},
						["poppy"]           = {1,1,2},
						["potato"]          = {1,7,10},
						["bread"]           = {1,4,10},
						["apple"]           = {1,5,10},
						["book"]            = {1,1,1},
						["feather"]         = {1,1,1},
						["emerald"]         = {1,4,2},
						["oak-sapling"]     = {1,2,5}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-savanna-house"] = { -- village\village_savanna_house.json
			header = "Savanna house",
			superheader = "[[Village]]",
			link   = "savanna [[village]] house",
			structure = "Village",
			container = "Savanna house chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["gold-nugget"]     = {1,3,1},
						["grass"]           = {1,1,5},
						["tall-grass"]      = {1,1,5},
						["bread"]           = {1,4,10},
						["wheat-seeds"]     = {1,5,10},
						["emerald"]         = {1,4,2},
						["acacia-sapling"]  = {1,2,10},
						["saddle"]          = {1,1,1},
						["torch"]           = {1,2,1},
						["bucket"]          = {1,1,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-snowy-house"] = { -- village\village_snowy_house.json
			header = "Snowy house",
			superheader = "[[Village]]",
			link   = "snowy [[village]] house",
			structure = "Village",
			container = "Snowy house chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["blue-ice"]        = {1,1,1},
						["snow-block"]      = {1,1,4},
						["potato"]          = {1,7,10},
						["bread"]           = {1,4,10},
						["beetroot-seeds"]  = {1,5,10},
						["beetroot-soup"]   = {1,1,1},
						["furnace"]         = {1,1,1},
						["emerald"]         = {1,4,1},
						["snowball"]        = {1,7,10},
						["coal"]            = {1,4,5}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["village-taiga-house"] = { -- village\village_taiga_house.json
			header = "Taiga house",
			superheader = "[[Village]]",
			link   = "taiga [[village]] house",
			structure = "Village",
			container = "Taiga house chest",
			structID = "village",
			poolsJava = {
				{
					rolls = {3,8},
					items = {
						["iron-nugget"]     = {1,5,1},
						["fern"]            = {1,1,2},
						["large-fern"]      = {1,1,2},
						["potato"]          = {1,7,10},
						["sweet-berries"]   = {1,7,5},
						["bread"]           = {1,4,10},
						["pumpkin-seeds"]   = {1,5,5},
						["pumpkin-pie"]     = {1,1,1},
						["emerald"]         = {1,4,2},
						["spruce-sapling"]  = {1,5,5},
						["spruce-sign"]     = {1,1,1},
						["spruce-log"]      = {1,5,10}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {3,8},
					items = {
						["iron-nugget"]     = {1,5,1},
						["fern"]            = {1,1,2},
						["large-fern"]      = {1,1,2},
						["potato"]          = {1,7,10},
						["bread"]           = {1,4,10},
						["pumpkin-seeds"]   = {1,5,5},
						["pumpkin-pie"]     = {1,1,1},
						["emerald"]         = {1,4,2},
						["spruce-sapling"]  = {1,5,5},
						["oak-sign"]        = {1,1,1},
						["spruce-log"]      = {1,5,10}
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		
		["stronghold-altar"] = { -- stronghold_corridor.json
			header      = "Altar",
			superheader = "[[Stronghold]]",
			link        = "[[stronghold]] altar",
			structure = "Stronghold",
			container = "Altar chest",
			structID = "stronghold",
			poolsJava = {
				{
					rolls = {2,3},
					items = {
						["ender-pearl"]         = {1,1,10},
						["diamond"]             = {1,3,3},
						["iron-ingot"]          = {1,5,10},
						["gold-ingot"]          = {1,3,5},
						["redstone"]            = {4,9,5},
						["bread"]               = {1,3,15},
						["apple"]               = {1,3,15},
						["iron-pickaxe"]        = {1,1,5},
						["iron-sword"]          = {1,1,5},
						["iron-chestplate"]     = {1,1,5},
						["iron-helmet"]         = {1,1,5},
						["iron-leggings"]       = {1,1,5},
						["iron-boots"]          = {1,1,5},
						["golden-apple"]        = {1,1,1},
						["saddle"]              = {1,1,1},
						["iron-horse-armor"]    = {1,1,1},
						["golden-horse-armor"]  = {1,1,1},
						["diamond-horse-armor"] = {1,1,1},
						["enchanted-book"]      = {1,1,1},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {2,3},
					items = {
						["ender-pearl"]         = {1,1,50},
						["emerald"]             = {1,3,15},
						["diamond"]             = {1,3,15},
						["iron-ingot"]          = {1,5,50},
						["gold-ingot"]          = {1,3,25},
						["redstone"]            = {4,9,25},
						["bread"]               = {1,3,75},
						["apple"]               = {1,3,75},
						["iron-pickaxe"]        = {1,1,25},
						["iron-sword"]          = {1,1,25},
						["iron-chestplate"]     = {1,1,25},
						["iron-helmet"]         = {1,1,25},
						["iron-leggings"]       = {1,1,25},
						["iron-boots"]          = {1,1,25},
						["golden-apple"]        = {1,1,5},
						["saddle"]              = {1,1,5},
						["iron-horse-armor"]    = {1,1,5},
						["golden-horse-armor"]  = {1,1,5},
						["diamond-horse-armor"] = {1,1,5},
						["enchanted-book"]      = {1,1,6},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["stronghold-library"] = { -- stronghold_library.json
			header      = "Library",
			superheader = "[[Stronghold]]",
			link        = "[[stronghold]] library",
			structure = "Stronghold",
			container = "Library chest",
			structID = "stronghold",
			poolsJava = {
				{
					rolls = {2,10},
					items = {
						["book"]                = {1,3,20},
						["paper"]               = {2,7,20},
						["empty-map"]           = {1,1,1},
						["compass"]             = {1,1,1},
						["enchanted-book"]      = {1,1,10},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {2,10},
					items = {
						["book"]                = {1,3,100},
						["paper"]               = {2,7,100},
						["map"]                 = {1,1,5},
						["compass"]             = {1,1,5},
						["enchanted-book"]      = {1,1,60},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["stronghold-storeroom"] = { -- stronghold_crossing.json
			header      = "Storeroom",
			superheader = "[[Stronghold]]",
			link        = "[[stronghold]] storeroom",
			structure = "Stronghold",
			container = "Storeroom chest",
			structID = "stronghold",
			poolsJava = {
				{
					rolls = {1,4},
					items = {
						["iron-ingot"]          = {1,5,10},
						["gold-ingot"]          = {1,3,5},
						["redstone"]            = {4,9,5},
						["coal"]                = {3,8,10},
						["bread"]               = {1,3,15},
						["apple"]               = {1,3,15},
						["iron-pickaxe"]        = {1,1,1},
						["enchanted-book"]      = {1,1,1},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {1,4},
					items = {
						["iron-ingot"]          = {1,5,50},
						["gold-ingot"]          = {1,3,25},
						["redstone"]            = {4,9,25},
						["coal"]                = {3,8,50},
						["bread"]               = {1,3,75},
						["apple"]               = {1,3,75},
						["iron-pickaxe"]        = {1,1,5},
						["enchanted-book"]      = {1,1,6},
						["ink-sac"]             = {1,3,75},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["bonus"] = { -- spawn_bonus_chest.json
			header = "[[Chest#Bonus chest|Bonus]]",
			link   = "[[Chest#Bonus chest|bonus]]",
			structure = "Bonus chest",
			container = "",
			structID = "day",
			poolsJava = {
				{
					rolls = {1,1},
					items = {
						["stone-axe"]           = {1,1,1},
						["wooden-axe"]          = {1,1,3},
					}
				},
				{
					rolls = {1,1},
					items = {
						["stone-pickaxe"]       = {1,1,1},
						["wooden-pickaxe"]      = {1,1,3}
					}
				},
				{
					rolls = {3,3},
					items = {
						["apple"]               = {1,2,5},
						["bread"]               = {1,2,3},
						["raw-salmon"]          = {1,2,3},
					}
				},
				{
					rolls = {4,4},
					items = {
						["stick"]               = {1,12,10},
						["oak-planks"]          = {1,12,10},
						["oak-log"]             = {1,3,3},
						["spruce-log"]          = {1,3,3},
						["birch-log"]           = {1,3,3},
						["jungle-log"]          = {1,3,3},
						["acacia-log"]          = {1,3,3},
						["dark-oak-log"]        = {1,3,3},
					}
				},
			},
		    poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {1,1},
					items = {
						["stone-axe"]           = {1,1,1},
						["wooden-axe"]          = {1,1,3},
					}
				},
				{
					rolls = {1,1},
					items = {
						["stone-pickaxe"]       = {1,1,1},
						["wooden-pickaxe"]      = {1,1,3}
					}
				},
				{
					rolls = {1,1},
					items = {
						["apple"]               = {1,2,1}
					}
				},
				{
					rolls = {1,1},
					items = {
						["bread"]               = {1,2,1}
					}
				},
				{
					rolls = {1,1},
					items = {
						["raw-salmon"]          = {1,2,1}
					}
				},
				{
					rolls = {1,1},
					items = {
						["stick"]               = {1,12,1}
					}  
				},
				{
					rolls = {1,1},
					items = {
						["oak-planks"]          = {1,12,1}
					}  
				},
				{
					rolls = {1,1},
					items = {
						["dark-oak-log"]        = {1,3,1},
						["acacia-log"]          = {1,3,1},
					}
				},
				{
					rolls = {1,1},
					items = {
						["oak-log"]             = {1,3,1},
						["spruce-log"]          = {1,3,1},
						["birch-log"]           = {1,3,1},
						["jungle-log"]          = {1,3,1},
					}
				},
				{
					rolls = {1,1},
					items = {
						["potato"]              = {1,2,3},
						["carrot"]              = {1,2,3},
					}
				},
				{
					rolls = {1,1},
					items = {
						["oak-sapling"]         = {4,4,2},
						["spruce-sapling"]      = {4,4,2},
						["birch-sapling"]       = {4,4,2},
						["jungle-sapling"]      = {4,4,2},
						["dark-oak-sapling"]    = {4,4,2},
						["acacia-sapling"]      = {4,4,2},
					}
				},
				{
					rolls = {1,1},
					items = {
						["melon-seeds"]         = {1,2,3},
						["pumpkin-seeds"]       = {1,2,3},
						["beetroot-seeds"]      = {1,2,3},
					}
				},
				{
					rolls = {1,1},
					items = {
						["cactus"]              = {1,2,3},
						["cocoa-beans"]         = {1,2,3},
					}
				},
				{
					rolls = {1,1},
					items = {
						["brown-mushroom"]              = {1,2,2},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["dungeon"] = { -- simple_dungeon.json
			header = "[[Dungeon]]",
			link   = "[[dungeon]]",
			structure = "Dungeon",
			container = "",
			structID = "Dungeon",
			poolsJava = {
				{
					rolls = {1,3},
					items = {
						["saddle"]              = {1,1,20},
						["golden-apple"]        = {1,1,15},
						["enchanted-golden-apple"] = {1,1,2},
						["disc-13"]             = {1,1,15},
						["disc-cat"]            = {1,1,15},
						["name-tag"]            = {1,1,20},
						["golden-horse-armor"]  = {1,1,10},
						["iron-horse-armor"]    = {1,1,15},
						["diamond-horse-armor"] = {1,1,5},
						["enchanted-book-rnd"]  = {1,1,10},
					}
				},
				{
					rolls = {1,4},
					items = {
						["iron-ingot"]          = {1,4,10},
						["gold-ingot"]          = {1,4,5},
						["bread"]               = {1,1,20},
						["wheat"]               = {1,4,20},
						["bucket"]              = {1,1,10},
						["redstone"]            = {1,4,15},
						["coal"]                = {1,4,15},
						["melon-seeds"]         = {2,4,10},
						["pumpkin-seeds"]       = {2,4,10},
						["beetroot-seeds"]      = {2,4,10},
					}
				},
				{
					rolls = {3,3},
					items = {
						["bone"]                = {1,8,10},
						["gunpowder"]           = {1,8,10},
						["rotten-flesh"]        = {1,8,10},
						["string"]              = {1,8,10},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["mineshaft"] = { -- abandoned_mineshaft.json
			chest_type = "minecart with chest",
			header = "[[Mineshaft]]",
			link   = "[[Mineshaft]]s",
			structure = "Mineshaft",
			container = "",
			structID = "abandoned-mineshaft",
			poolsJava = {
				{
					rolls = {1,1},
					items = {
						["golden-apple"]        = {1,1,20},
						["enchanted-golden-apple"] = {1,1,1},
						["name-tag"]            = {1,1,30},
						["enchanted-book-rnd"]  = {1,1,10},
						["iron-pickaxe"]        = {1,1,5},
						["empty"]				= {1,1,5},
					}
				},
				{
					rolls = {2,4},
					items = {
						["iron-ingot"]          = {1,5,10},
						["gold-ingot"]          = {1,3,5},
						["redstone"]            = {4,9,5},
						["lapis-lazuli"]        = {4,9,5},
						["diamond"]             = {1,2,3},
						["coal"]                = {3,8,10},
						["bread"]               = {1,3,15},
						["melon-seeds"]         = {2,4,10},
						["pumpkin-seeds"]       = {2,4,10},
						["beetroot-seeds"]      = {2,4,10},
					}
				},
				{
					rolls = {3,3},
					items = {
						["rail"]                = {4,8,20},
						["powered-rail"]        = {1,4,5},
						["detector-rail"]       = {1,4,5},
						["activator-rail"]      = {1,4,5},
						["torch"]               = {1,16,15},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["nether-fortress"] = { -- nether_bridge.json
			header = "[[fortress]]",
			link   = "[[fortress]]",
			structure = "Nether fortress",
			container = "",
			structID = "nether-fortress",
			poolsJava = {
				{
					rolls = {2,4},
					items = {
						["diamond"]             = {1,3,5},
						["iron-ingot"]          = {1,5,5},
						["gold-ingot"]          = {1,3,15},
						["golden-sword"]        = {1,1,5},
						["golden-chestplate"]   = {1,1,5},
						["flint-and-steel"]     = {1,1,5},
						["nether-wart"]         = {3,7,5},
						["saddle"]              = {1,1,10},
						["golden-horse-armor"]    = {1,1,8},
						["iron-horse-armor"]    = {1,1,5},
						["diamond-horse-armor"] = {1,1,3},
						["obsidian"]            = {2,4,2},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["desert-temple"] = { -- desert_pyramid.json
			header = "[[Desert temple]]",
			link   = "[[desert temple]]",
			structure = "Desert temple",
			container = "",
			structID = "desert-temple",
			poolsJava = {
				{
					rolls = {2,4},
					items = {
						["diamond"]             = {1,3,5},
						["iron-ingot"]          = {1,5,15},
						["gold-ingot"]          = {2,7,15},
						["emerald"]             = {1,3,15},
						["bone"]                = {4,6,25},
						["spider-eye"]          = {1,3,25},
						["rotten-flesh"]        = {3,7,25},
						["saddle"]              = {1,1,20},
						["iron-horse-armor"]    = {1,1,15},
						["golden-horse-armor"]  = {1,1,10},
						["diamond-horse-armor"] = {1,1,5},
						["enchanted-book-rnd"]  = {1,1,20},
						["golden-apple"]        = {1,1,20},
						["enchanted-golden-apple"] = {1,1,2},
						["empty"]               = {1,1,15},
					}
				},
				{
					rolls = {4,4},
					items = {
						["bone"]                = {1,8,10},
						["gunpowder"]           = {1,8,10},
						["rotten-flesh"]        = {1,8,10},
						["string"]              = {1,8,10},
						["sand"]                = {1,8,10},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["jungle-temple"] = { -- jungle_temple.json
			header = "[[Jungle temple]]",
			link   = "[[jungle temple]]",
			structure = "Jungle temple",
			container = "Chest",
			structID = "jungle-temple",
			poolsJava = {
				{
					rolls = {2,6},
					items = {
						["diamond"]             = {1,3,3},
						["iron-ingot"]          = {1,5,10},
						["gold-ingot"]          = {2,7,15},
						["emerald"]             = {1,3,2},
						["bone"]                = {4,6,20},
						["bamboo"]              = {1,3,15},
						["rotten-flesh"]        = {3,7,16},
						["saddle"]              = {1,1,3},
						["iron-horse-armor"]    = {1,1,1},
						["golden-horse-armor"]  = {1,1,1},
						["diamond-horse-armor"] = {1,1,1},
						["enchanted-book"]      = {1,1,1}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {2,6},
					items = {
						["diamond"]             = {1,3,15},
						["iron-ingot"]          = {1,5,50},
						["gold-ingot"]          = {2,7,75},
						["emerald"]             = {1,3,10},
						["bone"]                = {4,6,100},
						["rotten-flesh"]        = {3,7,80},
						["bamboo"]              = {1,3,75},
						["saddle"]              = {1,1,15},
						["iron-horse-armor"]    = {1,1,5},
						["golden-horse-armor"]  = {1,1,5},
						["diamond-horse-armor"] = {1,1,5},
						["enchanted-book"]      = {1,1,6}
					}
				},
			},
			poolsBedrockUpcoming = {},
		},
		["jungle-temple-dispenser"] = { -- jungle_temple_dispenser.json
			chest_type = "dispenser",
			link   = "[[jungle temple]]s",
			structure = "Jungle temple",
			container = "Dispenser",
			structID = "jungle-temple",
			poolsJava = {
				{
					rolls = {1,2},
					items = {
						["arrow"] = {2,7,30}
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {2,2},
					items = {
						["arrow"] = {2,7,30}
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
		["end-city"] = { -- end_city_treasure.json
			header = "[[End city]]",
			link   = "[[End city]]",
			structure = "End city",
			container = "",
			structID = "end-city",
			poolsJava = {
				{
					rolls = {2,6},
					items = {
						["diamond"]             = {2,7,5},
						["iron-ingot"]          = {4,8,10},
						["gold-ingot"]          = {2,7,15},
						["emerald"]             = {2,6,2},
						["beetroot-seeds"]      = {1,10,5},
						["saddle"]              = {1,1,3},
						["iron-horse-armor"]    = {1,1,1},
						["golden-horse-armor"]  = {1,1,1},
						["diamond-horse-armor"] = {1,1,1},
						["enchanted-diamond-sword"]      = {1,1,3},
						["enchanted-diamond-boots"]      = {1,1,3},
						["enchanted-diamond-chestplate"] = {1,1,3},
						["enchanted-diamond-leggings"]   = {1,1,3},
						["enchanted-diamond-helmet"]     = {1,1,3},
						["enchanted-diamond-pickaxe"]    = {1,1,3},
						["enchanted-diamond-shovel"]     = {1,1,3},
						["enchanted-iron-sword"]         = {1,1,3},
						["enchanted-iron-boots"]         = {1,1,3},
						["enchanted-iron-chestplate"]    = {1,1,3},
						["enchanted-iron-leggings"]      = {1,1,3},
						["enchanted-iron-helmet"]        = {1,1,3},
						["enchanted-iron-pickaxe"]       = {1,1,3},
						["enchanted-iron-shovel"]        = {1,1,3},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["igloo"] = {
			header = "[[Igloo]]",
			link   = "[[igloo]]",
			structure = "Igloo",
			container = "",
			structID = "igloo",
			poolsJava = {
				{
					rolls = {2,8},
					items = {
						["apple"]               = {1,3,15},
						["coal"]                = {1,4,15},
						["gold-nugget"]         = {1,3,10},
						["stone-axe"]           = {1,1,2},
						["rotten-flesh"]        = {1,1,10},
						["emerald"]             = {1,1,1},
						["wheat"]               = {2,3,10}
					}
				},
				{
					rolls = {1,1},
					items = {
						["golden-apple"]        = {1,1,1},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["pillager-outpost"] = {
			header = "[[Pillager outpost]]",
			link   = "[[pillager outpost]]",
			structure = "Pillager Outpost",
			container = "",
			structID = "pillager-outpost",
			poolsJava = {			
				{
					rolls = {0,1},
					items = {
						["crossbow"]             = {1,1,1},
					}
				},
				{
					rolls = {2,3},
					items = {
						["wheat"]                = {3,5,7},
						["potato"]               = {2,5,5},
						["carrot"]               = {3,5,5}
					}
				},
				{
					rolls = {1,3},
					items = {
						["dark-oak-log"]         = {2,3,1}
					}
				},
				{
					rolls = {2,3},
					items = {
						["bottle-o'-enchanting"] = {1,1,7},
						["string"]               = {1,6,4},
						["arrow"]                = {2,7,4},
						["tripwire-hook"]        = {1,3,3},
						["iron-ingot"]           = {1,3,3},
						["enchanted-book-rnd"]   = {1,1,1}
					}
				}
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {},
			poolsBedrockUpcoming = {}
		},
		["woodland-mansion"] = { -- woodland_mansion.json
			header = "[[Woodland Mansion]]",
			link   = "[[woodland mansion]]",
			structure = "Woodland mansion",
			container = "",
			structID = "woodland-mansion",
			poolsJava = {
				{
					rolls = {1,3},
					items = {
						["lead"]                  = {1,1,20},
						["golden-apple"]          = {1,1,15},
						["enchanted-golden-apple"] = {1,1,2},
						["disc-13"]               = {1,1,15},
						["disc-cat"]              = {1,1,15},
						["name-tag"]              = {1,1,20},
						["chainmail-chestplate"]  = {1,1,10},
						["diamond-hoe"]           = {1,1,15},
						["diamond-chestplate"]    = {1,1,5},
						["enchanted-book-rnd"]    = {1,1,10},
					}
				},
				{
					rolls = {1,4},
					items = {
						["iron-ingot"]            = {1,4,10},
						["gold-ingot"]            = {1,4,5},
						["bread"]                 = {1,1,20},
						["wheat"]                 = {1,4,20},
						["bucket"]                = {1,1,10},
						["redstone"]              = {1,4,15},
						["coal"]                  = {1,4,15},
						["melon-seeds"]           = {2,4,10},
						["pumpkin-seeds"]         = {2,4,10},
						["beetroot-seeds"]        = {2,4,10},
					}
				},
				{
					rolls = {3,3},
					items = {
						["bone"]                  = {1,8,10},
						["gunpowder"]             = {1,8,10},
						["rotten-flesh"]          = {1,8,10},
						["string"]                = {1,8,10},
					}
				},
			},
			poolsJavaUpcoming = {},
			poolsBedrock = {
				{
					rolls = {1,3},
					items = {
						["lead"]                  = {1,1,100},
						["golden-apple"]          = {1,1,75},
						["enchanted-golden-apple"] = {1,1,10},
						["disc-13"]               = {1,1,75},
						["disc-cat"]              = {1,1,75},
						["name-tag"]              = {1,1,100},
						["chainmail-chestplate"]  = {1,1,50},
						["diamond-hoe"]           = {1,1,75},
						["diamond-chestplate"]    = {1,1,25},
						["enchanted-book-rnd-treasure"] = {1,1,60},
					}
				},
				{
					rolls = {1,4},
					items = {
						["iron-ingot"]            = {1,4,50},
						["gold-ingot"]            = {1,4,25},
						["bread"]                 = {1,1,100},
						["wheat"]                 = {1,4,100},
						["bucket"]                = {1,1,50},
						["redstone"]              = {1,4,75},
						["coal"]                  = {1,4,75},
						["melon-seeds"]           = {2,4,50},
						["pumpkin-seeds"]         = {2,4,50},
						["beetroot-seeds"]        = {2,4,50},
					}
				},
				{
					rolls = {3,3},
					items = {
						["bone"]                  = {1,8,50},
						["gunpowder"]             = {1,8,50},
						["rotten-flesh"]          = {1,8,50},
						["string"]                = {1,8,50},
					}
				},
			},
			poolsBedrockUpcoming = {}
		},
	},

	-- these values are used:
	-- * in place of the keys, when the key is used as a parameter
	
	-- chest-param -> internally-valid-chest-param
	
	synonyms = {
		["desert"] = "desert-temple",
		["jungle"] = "jungle-temple",
		["nether"] = "nether-fortress",
		["fortress"] = "nether-fortress",
		
		["armorer"]       = "village-armorer",
		["butcher"]       = "village-butcher",
		["cartographer"]  = "village-cartographer",
		["fisherman"]     = "village-fisherman",
		["fletcher"]      = "village-fletcher",
		["mason"]         = "village-mason",
		["shepherd"]      = "village-shepherd",
		["tannery"]       = "village-tannery",
		["temple"]        = "village-temple",
		["toolsmith"]     = "village-toolsmith",
		["weaponsmith"]   = "village-weaponsmith",

		["desert-house"]  = "village-desert-house",
		["plains-house"]  = "village-plains-house",
		["savanna-house"] = "village-savanna-house",
		["snowy-house"]   = "village-snowy-house",
		["taiga-house"]   = "village-taiga-house",
		
		["altar"] = "stronghold-altar",
		["storeroom"] = "stronghold-storeroom",
		["library"] = "stronghold-library",
		["outpost"] = "pillager-outpost",
		["mansion"] = "woodland-mansion"
	},

	-- these values are used:
	-- * in the header-description of a table showing only a single chest
	-- * if the key is not here, but it is a valid chest parameter,
	--   that header-description will default to use the key string from p.chests,
	--   e.g. "nether-fortress"
	
	-- chest-param -> description-string
	
	display_names = {
		["nether-fortress"] = "Fortress",
		["nether"] = "fortress",
		["fortress"] = "fortress",
		["desert"] = "desert pyramid",
		["jungle"] = "jungle pyramid",
		["desert-temple"] = "desert pyramid",
		["jungle-temple"] = "jungle pyramid"
	},
	
	-- these descriptions are used:
	-- * in column <abbr> titles,
	-- * and above the table when only a single column-type is chosen
	
	columns = {
		["stacksize"] = 'The size of stacks (or for unstackable items, number) of this item on any given roll.',
		["weight"] = 'The weight of this item relative to other items in the pool.',
		["items"] = 'The number of items expected per chest, averaged over a large number of chests.',
		["chance"] = 'The odds of finding any of this item in a single chest.',
		["chests"] = 'The number of chests the player should expect to search, to find any of this item.'
	},
	
	current_frame = nil
}

p.base = function( ... )

	p.current_frame = mw.getCurrentFrame()

	local args = { ... }
	if args[1] == p.current_frame then 
		args = require( 'Module:ProcessArgs' ).merge( true )
	else
		args = args[1]
	end
	
	-- transform args into usable list
	
	local chests, columns = q.massage_args( args )
	
	if #chests == 0 then
		return "<span style='font-style:italic; color:red;'>Module:LootChest: no valid arguments</span>"
	end

	q.fill_in_chest_derivative_data( chests )
	
	-- construct an ordered list dictating the order of the rows
	
	local ordered_item_rows_java = {}
	local ordered_item_rows_java_upcoming = {}
	local ordered_item_rows_bedrock = {}
	local ordered_item_rows_bedrock_upcoming = {}

	local ret = {}
	
	local java_specified             = args.java                and args.java ~= '0';
	local java_upcoming_specified    = args['java-upcoming']    and args['java-upcoming'] ~= '0';
	local bedrock_specified          = args.bedrock             and args.bedrock ~= '0';
	local bedrock_upcoming_specified = args['bedrock-upcoming'] and args['bedrock-upcoming'] ~= '0';
	
	local any_specified = java_specified or java_upcoming_specified or bedrock_specified or bedrock_upcoming_specified
	
	if any_specified then
	
		if java_specified then
			ordered_item_rows_java = q.construct_ordered_item_rows( chests, 'Java' )
		end	
		if java_upcoming_specified then
			ordered_item_rows_java_upcoming = q.construct_ordered_item_rows( chests, 'JavaUpcoming' )
		end	
		if bedrock_specified then
			ordered_item_rows_bedrock = q.construct_ordered_item_rows( chests, 'Bedrock' )
		end	
		if bedrock_upcoming_specified then
			ordered_item_rows_bedrock_upcoming = q.construct_ordered_item_rows( chests, 'BedrockUpcoming' )
		end
	
	else
	
		local java_excluded             = args.java                and args.java == '0';
		local java_upcoming_excluded    = args['java-upcoming']    and args['java-upcoming'] == '0';
		local bedrock_excluded          = args.bedrock             and args.bedrock == '0';
		local bedrock_upcoming_excluded = args['bedrock-upcoming'] and args['bedrock-upcoming'] == '0';
		
		if not java_excluded then
			ordered_item_rows_java = q.construct_ordered_item_rows( chests, 'Java' )
		end	
		if not java_upcoming_excluded then
			ordered_item_rows_java_upcoming = q.construct_ordered_item_rows( chests, 'JavaUpcoming' )
		end	
		if not bedrock_excluded then
			ordered_item_rows_bedrock = q.construct_ordered_item_rows( chests, 'Bedrock' )
		end	
		if not bedrock_upcoming_excluded then
			ordered_item_rows_bedrock_upcoming = q.construct_ordered_item_rows( chests, 'BedrockUpcoming' )
		end
	
	end
	
	if q.tablelength( ordered_item_rows_java ) > 0 then
		table.insert( ret, q.print_table( chests, columns, ordered_item_rows_java, 'Java' ) )
	end
	if q.tablelength( ordered_item_rows_java_upcoming ) > 0 and q.compare_tables( ordered_item_rows_java, ordered_item_rows_java_upcoming ) then
		table.insert( ret, p.current_frame:preprocess( p['java-upcoming'] ) .. q.lcfirst( q.print_table( chests, columns, ordered_item_rows_java_upcoming, 'JavaUpcoming' ) ) )
	end
	if q.tablelength( ordered_item_rows_bedrock ) > 0 and q.compare_tables( ordered_item_rows_java, ordered_item_rows_bedrock ) then
		table.insert( ret, p.current_frame:preprocess( p.bedrock ) .. q.lcfirst( q.print_table( chests, columns, ordered_item_rows_bedrock, 'Bedrock' ) ) .. '[[Category:Bedrock Edition specific information]]' )
	end
	if q.tablelength( ordered_item_rows_bedrock_upcoming ) > 0 and q.compare_tables( ordered_item_rows, ordered_item_rows_bedrock_upcoming ) then
		table.insert( ret, p.current_frame:preprocess( p['bedrock-upcoming'] ) .. q.lcfirst( q.print_table( chests, columns, ordered_item_rows_bedrock_upcoming, 'BedrockUpcoming' ) ) .. '[[Category:Bedrock Edition specific information]]' )
	end
	
	return table.concat( ret, '\n\n' )
end

p.doc = function()

	local valid_args = {}
	for chest_name, val in pairs(p.chests) do
		local synonyms = {}
		for syn, orig in pairs(p.synonyms) do
			if orig == chest_name then
				table.insert( synonyms, syn )
			end
		end
		if #synonyms > 0 then
			chest_name = chest_name .. " ( " .. table.concat( synonyms, ", " ) .. " )"
		end
		table.insert( valid_args, chest_name )
	end
	table.sort( valid_args )
	return table.concat( valid_args, ",\n<br>" )

end

p.doc2 = function()

	local valid_args = {}
	for column_name, val in pairs(p.columns) do
		table.insert( valid_args, column_name .. ": " .. val )
	end
	table.sort( valid_args )
	return table.concat( valid_args, ",\n<br>" )

end

p.doc3 = function()

	local valid_args = {}
	for item_name, val in pairs(p.items) do
		table.insert( valid_args, item_name )
	end
	table.sort( valid_args )
	return table.concat( valid_args, ", " )

end

p.base2 = function( ... )

	p.current_frame = mw.getCurrentFrame()

	local args = { ... }
	if args[1] == p.current_frame then 
		args = require( 'Module:ProcessArgs' ).merge( true )
	else
		args = args[1]
	end
	
	local itemname = args[1]
	
	if p.items[itemname] == nil then
		return '<span style="color:red;">unknown item "' .. itemname .. '"</span>'
	end
	
	if args.java and args.java ~= '0' then
		javaChances = q.single_item_find_values( itemname, 'poolsJava' )
		javaUpcomingChances = {}
		bedrockChances = {}
		bedrockUpcomingChances = {}
	else
		if args['java-upcoming'] and args['java-upcoming'] ~= '0' then
			javaChances = q.single_item_find_values( itemname, 'poolsJavaUpcoming' )
			javaUpcomingChances = {}
			bedrockChances = {}
			bedrockUpcomingChances = {}
		else
			if args.bedrock and args.bedrock ~= '0' then
				javaChances = q.single_item_find_values( itemname, 'poolsBedrock' )
				javaUpcomingChances = {}
				bedrockChances = {}
				bedrockUpcomingChances = {}
			else
				if args['bedrock-upcoming'] and args['bedrock-upcoming'] ~= '0' then
					javaChances = q.single_item_find_values( itemname, 'poolsBedrockUpcoming' )
					javaUpcomingChances = {}
					bedrockChances = {}
					bedrockUpcomingChances = {}
				else
					javaChances = q.single_item_find_values( itemname, 'poolsJava' )
					javaUpcomingChances = q.single_item_find_values( itemname, 'poolsJavaUpcoming', javaChances )
					bedrockChances = q.single_item_find_values( itemname, 'poolsBedrock', javaChances )
					bedrockUpcomingChances = q.single_item_find_values( itemname, 'poolsBedrockUpcoming', javaChances, bedrockChances )
				end
			end
		end
	end
	
	local html = {}
	
	local any_current = q.tablelength( javaChances ) > 0
	local any_changes_upcoming = q.tablelength( javaUpcomingChances ) > 0 and q.compare_tables( javaChances, javaUpcomingChances )
	local any_standard = any_current or any_changes_upcoming
	
	local any_bedrock_current = q.tablelength( bedrockChances ) > 0
	local any_bedrock_upcoming = q.tablelength( bedrockUpcomingChances ) > 0 and q.compare_tables( bedrockChances, bedrockUpcomingChances )
	local any_bedrock = any_bedrock_current or any_bedrock_upcoming
	
	local change_case = p.items[itemname].preserve_case == nil or p.items[itemname].preserve_case ~= true

	if any_current then
		table.insert( html, p.base2_sub( itemname, javaChances ) )
	end
	if any_changes_upcoming then
		table.insert( html, p.current_frame:preprocess( p['java-upcoming']  ) .. ( change_case and q.lcfirst( p.base2_sub( itemname, javaUpcomingChances, any_current ) ) or p.base2_sub( itemname, javaUpcomingChances, any_current ) ) )
	end
	if any_bedrock_current then
		table.insert( html, ( any_standard and '\n\n' or '' ) .. p.current_frame:preprocess( p.bedrock ) .. ( change_case and q.lcfirst( p.base2_sub( itemname, bedrockChances, any_standard ) ) or p.base2_sub( itemname, bedrockChances, any_standard ) ) )
	end
	if any_bedrock_upcoming then
		table.insert( html, ( any_standard and not any_bedrock_current and '\n\n' or '' ) .. p.current_frame:preprocess( p['bedrock-upcoming'] ) .. ( change_case and q.lcfirst( p.base2_sub( itemname, bedrockUpcomingChances, any_bedrock_current or any_standard ) ) or p.base2_sub( itemname, bedrockUpcomingChances, any_bedrock_current or any_standard ) ) )
	end

	if args.nocat then
	else
		table.insert( html, '[[Category:Pages with loot chest item templates]]' )
		if p.items[itemname].category ~= nil and p.items[itemname].category ~= false then
			table.insert( html, '[[Category:Pages with specific loot chest items]]' )
		end
		if any_bedrock then
			table.insert( html, '[[Category:Bedrock Edition specific information]]' )
		end
	end
	
	return table.concat( html, ' ' )
end

p.base2_sub = function( itemname, chances, use_they )

	local html = {}
	local item_display_name = ''
	
	if use_they then
		item_display_name = 'they'
	else
		if p.items[itemname].plural ~= nil and p.items[itemname].plural ~= false then
			item_display_name = p.items[itemname].plural
		else
			if p.items[itemname].title ~= nil then
				item_display_name = p.items[itemname].title
			else
				item_display_name = string.gsub( itemname, '-', ' ' )
			end
			if p.items[itemname].plural == nil or p.items[itemname].plural ~= false then
				item_display_name = q.single_item_plural( item_display_name )
			end
		end
		
		if p.items[itemname].preserve_case == nil or p.items[itemname].preserve_case ~= true then
			item_display_name = q.capitalize( item_display_name )
		end
		
		if p.items[itemname].note and p.notes[p.items[itemname].note] then
			item_display_name = item_display_name .. p.current_frame:extensionTag( 'ref', p.notes[p.items[itemname].note], { group='note', name=p.items[itemname].note } )
		end
	end
	
	table.insert( html, item_display_name )
	table.insert( html, ' can be found ' )

	local html_stacks = {}
	local stack_sep = ', '
	local ns = q.tablelength( chances )
	local s = 0

	for stacksize, chest_details in pairs( chances ) do
		s = s + 1
	
		local html_per_stack = { 'in ' }
		local c = 0
		local nc = q.tablelength( chest_details )
		local sep = ( nc > 2 and ', ' or ' ' )
		if nc > 2 and s ~= ns then
			stack_sep = '; '
		end
		for k, chest in pairs( chest_details ) do
			c = c + 1
			if c == nc and nc > 1 then
				table.insert( html_per_stack, 'and ' )
			end
			if chest.chance == 1 then
				table.insert( html_per_stack, " all " )
			else
				table.insert( html_per_stack, string.format("%.1f", chest.chance*100) )
				table.insert( html_per_stack, "% of " )
			end
			if chest.chest_type == 'minecart with chest' then
				table.insert( html_per_stack, ' [[Minecart with Chest|chest minecarts]] in ' )
				table.insert( html_per_stack, p.chests[chest.chest_name].link )
			elseif chest.chest_type == 'dispenser' then
				table.insert( html_per_stack, ' [[dispenser]]s in ' )
				table.insert( html_per_stack, p.chests[chest.chest_name].link )
			else
				table.insert( html_per_stack, p.chests[chest.chest_name].link )
				table.insert( html_per_stack, ' chests' )
			end
			table.insert( html_per_stack, sep )
		end
		if nc > 2 then
			table.insert( html_per_stack, 'all ' )
		end
		table.insert( html_per_stack, 'in ' )
		if p.items[itemname].cannot_stack ~= nil then
			table.insert( html_per_stack, 'groups of ' )
		else
			table.insert( html_per_stack, 'stacks of ' )
		end
		table.insert( html_per_stack, stacksize )
	
		table.insert( html_stacks, table.concat( html_per_stack ) )
	end
	
	local stackwise_summaries = ''
	if #html_stacks == 1 then
		table.insert( html, html_stacks[1] )
	else
		for i = 1, #html_stacks - 1 do
			table.insert( html, html_stacks[ i ] )
			table.insert( html, stack_sep ) 
		end
		table.insert( html, 'and ' )
		table.insert( html, html_stacks[#html_stacks] )
	end
	
	table.insert( html, '.' )
	
	return table.concat( html )
	
end

p.base2_test = function()

	items = {}
	for item_name, v in pairs( p.items ) do
		table.insert( items, p.base2{ item_name, ["nocat"]=true } .. '\n\n' )
	end

	table.sort( items )
	
	return table.concat(items)
end








p.base3 = function( ... )

	p.current_frame = mw.getCurrentFrame()

	local args = { ... }
	if args[1] == p.current_frame then 
		args = require( 'Module:ProcessArgs' ).merge( true )
	else
		args = args[1]
	end
	
	local z = args[1]
	
	local html_java = {}
	local html_java_u = {}
	local html_bedrock = {}
	local html_bedrock_u = {}
	
	local rErr = ""
	
	local zT = {}
	if args[1] == "!!!ALL!!!" then
		for item_name, v in pairs( p.items ) do
			table.insert( zT, item_name )
			table.sort( zT )
		end
	else
		zT = mw.text.split( args[1], ',' )
	end
	
	for x, itemname in pairs( zT ) do
	
		if p.items[itemname] == nil then
			rErr = rErr .. "<span class='error'>Unknown item " .. itemname .. ".</span>\n"
		else
			
			local javaChances, javaUpcomingChances, bedrockChances, bedrockUpcomingChances
			
			if args.java and args.java ~= '0' then
				javaChances = q.single_item_find_values( itemname, 'poolsJava' )
				javaUpcomingChances = {}
				bedrockChances = {}
				bedrockUpcomingChances = {}
			else
				if args['java-upcoming'] and args['java-upcoming'] ~= '0' then
					javaChances = q.single_item_find_values( itemname, 'poolsJavaUpcoming' )
					javaUpcomingChances = {}
					bedrockChances = {}
					bedrockUpcomingChances = {}
				else
					if args.bedrock and args.bedrock ~= '0' then
						javaChances = q.single_item_find_values( itemname, 'poolsBedrock' )
						javaUpcomingChances = {}
						bedrockChances = {}
						bedrockUpcomingChances = {}
					else
						if args['bedrock-upcoming'] and args['bedrock-upcoming'] ~= '0' then
							javaChances = q.single_item_find_values( itemname, 'poolsBedrockUpcoming' )
							javaUpcomingChances = {}
							bedrockChances = {}
							bedrockUpcomingChances = {}
						else
							javaChances = q.single_item_find_values( itemname, 'poolsJava' )
							javaUpcomingChances = q.single_item_find_values( itemname, 'poolsJavaUpcoming', javaChances )
							bedrockChances = q.single_item_find_values( itemname, 'poolsBedrock', javaChances )
							bedrockUpcomingChances = q.single_item_find_values( itemname, 'poolsBedrockUpcoming', javaChances, bedrockChances )
						end
					end
				end
			end
			
			local any_current = q.tablelength( javaChances ) > 0
			local any_changes_upcoming = q.tablelength( javaUpcomingChances ) > 0 and q.compare_tables( javaChances, javaUpcomingChances )
			local any_standard = any_current or any_changes_upcoming
			
			local any_bedrock_current = q.tablelength( bedrockChances ) > 0
			local any_bedrock_upcoming = q.tablelength( bedrockUpcomingChances ) > 0 and q.compare_tables( bedrockChances, bedrockUpcomingChances )
			local any_bedrock = any_bedrock_current or any_bedrock_upcoming
			
			if any_current then
				table.insert( html_java, p.base3_sub( itemname, javaChances ) )
			end
			if any_changes_upcoming then
				table.insert( html_java_u, p.base3_sub( itemname, javaUpcomingChances ) )
			end
			if any_bedrock_current then
				table.insert( html_bedrock, p.base3_sub( itemname, bedrockChances ) )
			end
			if any_bedrock_upcoming then
				table.insert( html_bedrock_u, p.base3_sub( itemname, bedrockUpcomingChances ) )
			end
			
		end	
	end
	
	local output = rErr .. '{| class="wikitable sortable" \n! Item \n! Structure \n! Container \n! Quantity \n! Chance \n' .. table.concat( html_java )
	if q.tablelength( html_java_u ) > 0 then
		output = output .. '|-\n!colspan=5|' .. p['java-upcoming'] .. ' \n' .. table.concat( html_java_u ) 
	end
	if q.tablelength( html_bedrock ) > 0 then
		output = output .. '|-\n!colspan=5|' .. p.bedrock .. ' \n' .. table.concat( html_bedrock ) 
	end
	if q.tablelength( html_bedrock_u ) > 0 then
		output = output .. '|-\n!colspan=5|' .. p['bedrock-upcoming'] .. ' \n' .. table.concat( html_bedrock_u ) 
	end
	output = output .. '|}' .. p.current_frame:extensionTag( 'references', "", { group="note" } )
	
	return output
end

p.base3_sub = function( itemname, chances )
	local html = {}
	local item_display_name = ''
	local output = ""
	lang = mw.getContentLanguage()
	
	if p.items[itemname].title ~= nil then
		item_display_name = p.items[itemname].title
	else
		item_display_name = q.titlecase( string.gsub( itemname, '-', ' ' ) )
	end
	
	local objectList = {}
	local ns = q.tablelength( chances )
	local s = 0
	local m = 0
	
	local rn = 0

	for stacksize, chest_details in pairs( chances ) do
		s = s + 1
		
		local nc = q.tablelength( chest_details )
		local c = 0
		for k, chest in pairs( chest_details ) do
			c = c + 1
			rn = rn + 1
			local r = ""
			
			r = r .. '|' .. p.chests[chest.chest_name].container  .. '\n|' .. stacksize .. '\n|' .. lang:formatNum( math.floor( chest.chance*1000 + 0.5 ) /10 ) .. ' %' .. '\n'
			if ns ~= s or nc ~= c then
				r = r 
			end
			
			table.insert( objectList , { p.chests[chest.chest_name].structID , p.chests[chest.chest_name].structure, r } )
			
		end
		m = m + nc
	end
	table.sort( objectList, function(a,b) return a[1] < b[1] end )
	local struct = ""
	local t = ""
	local nt = 1
	local ntt = 0
	for v, w  in pairs( objectList ) do
		ntt = ntt + 1
		if w[1] ~= struct then
			if t ~= "" then
				output = output .. "|rowspan=" .. nt .. t
			end
			t = "|'''" .. p.current_frame:expandTemplate{ title = 'EnvLink', args = { w[2],  id = w[1] } } .. "'''\n" .. w[3]
			struct = w[1]
			nt = 1
		else
			t = t .. w[3]
			nt = nt + 1
		end
		if ntt == m then
			output = output .. "|rowspan=" .. nt .. t
		else
			t = t .. '|-' .. '\n'
		end
	end

	return "|-\n| rowspan=" .. m .. "|'''" .. p.getItem(itemname, item_display_name) .. "'''\n" .. output
	
end

p.getItem = function( itemname, item_display_name )
	local s = ""
	local k = item_display_name
	local link = item_display_name
	local m = itemname
	
	if p.items[itemname].title ~= nil then
		k = p.items[itemname].title
	end
	if p.items[itemname].link ~= nil then
		link = p.items[itemname].link
	end
	if p.items[itemname].id ~= nil then
		m = p.items[itemname].id
	end
	
	if p.items[itemname][1] == "item" then
		s = p.current_frame:expandTemplate{ title = 'ItemLink', args = { link , k , id = m } }
	elseif p.items[itemname][1] == "block" then
		s = p.current_frame:expandTemplate{ title = 'BlockLink', args = { link , k , id = m } }
	end
	if p.items[itemname].note ~= nil and p.items[itemname].note ~= "" then
		s = s .. p.current_frame:extensionTag( 'ref', p.notes3[p.items[itemname].note], { group='note', name=p.items[itemname].note } )
	end
	return s
	
end








q = {

	tablelength = function(T)
		local count = 0
		for _ in pairs(T) do count = count + 1 end
		return count
	end,
	
	deepcopy = function(orig)
	    local orig_type = type(orig)
	    local copy
	    if orig_type == 'table' then
	        copy = {}
	        for orig_key, orig_value in next, orig, nil do
	            copy[q.deepcopy(orig_key)] = q.deepcopy(orig_value)
	        end
	        setmetatable(copy, q.deepcopy(getmetatable(orig)))
	    else -- number, string, boolean, etc
	        copy = orig
	    end
	    return copy
	end,
	
	single_item_find_values = function( itemname, poolsKey, exclusions_param, other_exclusions_param )
	
		local chances = {}
		
		local exclusions = q.deepcopy(exclusions_param or {})
		local other_exclusions = q.deepcopy(other_exclusions_param or {})
		
		for stacksize, other_exclusion_list in pairs(other_exclusions) do
			if exclusions[stacksize] == nil then
				exclusions[stacksize] = {}
			end 
			for _, other_exclusion in pairs(other_exclusion_list) do
				local already_in_here = false
				for _, exclusion in pairs(exclusions[stacksize]) do
					if exclusion["chest_name"] == other_exclusion["chest_name"] and exclusion["chance"] == other_exclusion["chance"] then
						already_in_here = true
						break 
					end
				end
				if not already_in_here then
					table.insert( exclusions[stacksize], other_exclusion )
				end 
			end
		end

		for chest_name, chest in pairs( p.chests ) do
			local poolchances = {}
			for k, pool in pairs( chest[poolsKey] or chest.poolsJava or {} ) do
				local poolitem = pool.items[itemname]
				if poolitem ~= nil then
				
					local stacksize = poolitem[1]
					if poolitem[1] ~= poolitem[2] then
						stacksize = stacksize .. "–" .. poolitem[2]
					end
					
					local itemweight = poolitem[3]
					
					local pool_total_item_weight = 0
					for itemname, item in pairs(pool.items) do
						pool_total_item_weight = pool_total_item_weight + item[3]
					end
				
					local chance = p.calc_chance_any_of_this_item_per_pool( 
						pool.rolls[1], pool.rolls[2],
						itemweight, pool_total_item_weight )

					if poolchances[stacksize] == nil then
						poolchances[stacksize] = chance
					else
						poolchances[stacksize] = poolchances[stacksize] + (1 - poolchances[stacksize]) * chance
					end
				end
			end
			for stacksize, chance in pairs( poolchances ) do
				local excluded = false
				for _, exclusion in pairs( exclusions[stacksize] or {} ) do
					if exclusion["chest_name"] == chest_name and exclusion["chance"] == chance then
						excluded = true
						break 
					end
				end
				if not excluded then
					if chances[stacksize] == nil then
						chances[stacksize] = {}
					end
					table.insert( chances[stacksize], { ["chance"]=chance, ["chest_name"]=chest_name, ["chest_type"]=( chest.chest_type or "chest" ) } )
				end
			end
		end

		return chances
		
	end,
	
	single_item_plural = function( itemname )
	
		if string.sub( itemname, -2 ) == 'ss' 
			or string.sub( itemname, -2 ) == 'ch' 
			or string.sub( itemname, -2 ) == 'sh' 
			or string.sub( itemname, -1 ) == 's' then 
				return itemname .. 'es' 
		end
		
		return itemname .. 's'
	
	end,
	
	massage_args = function( args )

		-- find what columns to put
		
		local columns = {}
		
		for k, _arg in pairs(args) do
			if p.columns[_arg] ~= nil then
				columns[_arg] = true
			end
		end
		
		if q.tablelength(columns) == 0 then
			for column_name, v in pairs(p.columns) do
				columns[column_name] = true
			end
		end
		
		-- find what chests to show

		local chests = {}
		
		for k, _arg in pairs(args) do
			if p.chests[_arg] ~= nil then
				table.insert( chests, _arg )
			elseif p.synonyms[_arg] ~= nil then 
				table.insert( chests, p.synonyms[_arg] )
			end
			if p.display_names[_arg] ~= nil then
				local chestname = _arg
				if p.chests[chestname] == nil then 
					chestname = p.synonyms[_arg]
				end
				p.chests[chestname].display_name = p.display_names[_arg]
			end
		end
		
		if #chests == 0 then
			for chest_name, chest in pairs(p.chests) do
				local chest_type = ( chest.chest_type or "chest" )
				if chest_type == "chest" or chest_type == "minecart with chest" then
					table.insert( chests, chest_name )
				end
			end
		end
		
		table.sort( chests )
		
		return chests, columns
		
	end,

	sort_items = function( e1, e2 )
		
		if e1.chanceany ~= e2.chanceany then return ( e1.chanceany > e2.chanceany ) end
		if e1.avgamount ~= e2.avgamount then return ( e1.avgamount > e2.avgamount ) end
		
		if e1.material == nil then
			
			e1.material = 0
			if string.find( e1.itemname, "leather" ) ~= nil then e1.material = 1 end
			if string.find( e1.itemname, "iron" ) ~= nil then e1.material = 2 end
			if string.find( e1.itemname, "gold" ) ~= nil then e1.material = 3 end
			if string.find( e1.itemname, "diamond" ) ~= nil then e1.material = 4 end
			e1.armor = 0
			if string.find( e1.itemname, "helmet" ) ~= nil or string.find( e1.itemname, "cap" ) ~= nil then e1.armor = 1 end
			if string.find( e1.itemname, "chestplate" ) ~= nil or string.find( e1.itemname, "tunic" ) ~= nil then e1.armor = 2 end
			if string.find( e1.itemname, "leggings" ) ~= nil or string.find( e1.itemname, "pants" ) ~= nil then e1.armor = 3 end
			if string.find( e1.itemname, "boots" ) ~= nil then e1.armor = 4 end
			
		end
		
		if e2.material == nil then
			
			e2.material = 0
			if string.find( e2.itemname, "leather" ) ~= nil then e2.material = 1 end
			if string.find( e2.itemname, "iron" ) ~= nil then e2.material = 2 end
			if string.find( e2.itemname, "gold" ) ~= nil then e2.material = 3 end
			if string.find( e2.itemname, "diamond" ) ~= nil then e2.material = 4 end
			e2.armor = 0
			if string.find( e2.itemname, "helmet" ) ~= nil or string.find( e2.itemname, "cap" ) ~= nil then e2.armor = 1 end
			if string.find( e2.itemname, "chestplate" ) ~= nil or string.find( e2.itemname, "tunic" ) ~= nil then e2.armor = 2 end
			if string.find( e2.itemname, "leggings" ) ~= nil or string.find( e2.itemname, "pants" ) ~= nil then e2.armor = 3 end
			if string.find( e2.itemname, "boots" ) ~= nil then e2.armor = 4 end
		
		end
		
		if e1.material ~= e2.material then return ( e1.material < e2.material ) end
		if e1.armor ~= e2.armor then return ( e1.armor < e2.armor ) end
		
		return ( e1.itemname < e2.itemname )
		
	end,
	
	fill_in_chest_derivative_data = function( chest_names )

		for k, chest_name in pairs(chest_names) do
			local chest = p.chests[chest_name]
			if chest == nil then break end

			chest.allRollsJava = {}
			chest.itemDataJava = {}
			for k, pool in pairs( chest.poolsJava or {} ) do
				table.insert( chest.allRollsJava, ( pool.rolls[1] == pool.rolls[2] and pool.rolls[1] or pool.rolls[1]..'–'..pool.rolls[2] ) )

				local total_weight = 0
				for itemname, item in pairs(pool.items) do
					total_weight = total_weight + item[3]
				end
				pool.totalweight = total_weight

				q.fill_in_chest_item_details( chest.itemDataJava, pool, #chest.allRollsJava )
			end

			chest.allRollsJavaUpcoming = {}
			chest.itemDataJavaUpcoming = {}
			for k, pool in pairs( chest.poolsJavaUpcoming or chest.poolsJava or {} ) do
				table.insert( chest.allRollsJavaUpcoming, ( pool.rolls[1] == pool.rolls[2] and pool.rolls[1] or pool.rolls[1]..'–'..pool.rolls[2] ) )

				local total_weight = 0
				for itemname, item in pairs(pool.items) do
					total_weight = total_weight + item[3]
				end
				pool.totalweight = total_weight

				q.fill_in_chest_item_details( chest.itemDataJavaUpcoming, pool, #chest.allRollsJavaUpcoming )
			end

			chest.allRollsBedrock = {}
			chest.itemDataBedrock = {}
			for k, pool in pairs( chest.poolsBedrock or chest.poolsJava or {} ) do
				table.insert( chest.allRollsBedrock, ( pool.rolls[1] == pool.rolls[2] and pool.rolls[1] or pool.rolls[1]..'–'..pool.rolls[2] ) )

				local total_weight = 0
				for itemname, item in pairs(pool.items) do
					total_weight = total_weight + item[3]
				end
				pool.totalweight = total_weight

				q.fill_in_chest_item_details( chest.itemDataBedrock, pool, #chest.allRollsBedrock )
			end

			chest.allRollsBedrockUpcoming = {}
			chest.itemDataBedrockUpcoming = {}
			for k, pool in pairs( chest.poolsBedrockUpcoming or chest.poolsJava or {} ) do
				table.insert( chest.allRollsBedrockUpcoming, ( pool.rolls[1] == pool.rolls[2] and pool.rolls[1] or pool.rolls[1]..'–'..pool.rolls[2] ) )

				local total_weight = 0
				for itemname, item in pairs(pool.items) do
					total_weight = total_weight + item[3]
				end
				pool.totalweight = total_weight

				q.fill_in_chest_item_details( chest.itemDataBedrockUpcoming, pool, #chest.allRollsBedrockUpcoming )
			end
		end
	end,

	fill_in_chest_item_details = function( data, pool, ct )
		for item_name, item in pairs(pool.items) do
			if p.items[item_name] then
				local min_stacksize = item[1]
				local max_stacksize = item[2]
				local min_pool_rolls = pool.rolls[1]
				local max_pool_rolls = pool.rolls[2]
				local item_weight = item[3]
			
				if data[item_name] == nil then
					data[item_name] = {
						avgamount = 0,
						chanceany = 0,
						itemname = item_name,
						sortsize = {},
						sortweight = {},
						sizes = {},
						weights = {},
					}
					for i = 1, ct-1 do
						data[item_name].sortsize[i] = 0
						data[item_name].sortweight[i] = 0
						data[item_name].sizes[i] = '—'
						data[item_name].weights[i] = '—'
					end
				end

				data[item_name].avgamount = data[item_name].avgamount + p.calc_average_amount_this_item_per_pool( 
					min_stacksize, max_stacksize, 
					min_pool_rolls, max_pool_rolls, 
					item_weight, pool.totalweight )
					
				data[item_name].chanceany = data[item_name].chanceany + (1 - data[item_name].chanceany) * p.calc_chance_any_of_this_item_per_pool(
					min_pool_rolls, max_pool_rolls, 
					item_weight, pool.totalweight )

				data[item_name].sortsize[ct] = ( min_stacksize + max_stacksize ) / 2
				data[item_name].sortweight[ct] = item_weight;
				data[item_name].sizes[ct] = ( min_stacksize == max_stacksize and min_stacksize or min_stacksize .. '–' .. max_stacksize )
				data[item_name].weights[ct] = p.current_frame:expandTemplate{ title = 'frac', args = { item_weight, pool.totalweight } }
			end
		end

		for item_name, d in pairs(data) do
			if not d.sizes[ct] then
				d.sortsize[ct] = 0
				d.sortweight[ct] = 0
				d.sizes[ct] = '—'
				d.weights[ct] = '—'
			end
		end
	end,

	construct_ordered_items_from_first_chest = function( chest_names, suffix )
		local items_from_first_table = {}
		local item_chests = {}
		local item_names_ordered = {}
		for item_name, item in pairs( p.chests[chest_names[1]]['itemData'..suffix] ) do
			table.insert( items_from_first_table, item )
		end
		
		table.sort( items_from_first_table, q.sort_items )
		
		for k, item in pairs( items_from_first_table ) do
			table.insert( item_names_ordered, item.itemname )
			item_chests[item.itemname] = true
		end
		
		return item_names_ordered, item_chests
	end,

	get_ordered_items_from_other_chests = function( chest_names, item_chests, suffix )
		local items_not_from_first_table = {}
		
		for chest_idx = 2, #chest_names do
			for item_name, item in pairs( p.chests[chest_names[chest_idx]]['itemData'..suffix] ) do
				if item_chests[item_name] == nil then
					p.items[item_name].itemname = item_name
					table.insert( items_not_from_first_table, p.chests[chest_names[chest_idx]]['itemData'..suffix][item_name] )
					item_chests[item_name] = true
				end
			end
		end

		table.sort( items_not_from_first_table, q.sort_items )
		
		return items_not_from_first_table
	end,

	add_other_items_to_first_list = function( chest_names, item_names_ordered, item_chests, items_not_from_first_table )
		for k, item in pairs( items_not_from_first_table ) do
			table.insert( item_names_ordered, item.itemname )
		end
		
		return item_names_ordered
	end,

	set_up_ordered_item_rows = function( chest_names, item_names_ordered, suffix )
		for k, itemname in pairs(item_names_ordered) do
			item_names_ordered[k] = {itemname}
			for chest_idx = 1, #chest_names do
				if suffix == 'JavaUpcoming' or p.chests[chest_names[chest_idx]]['pools'..suffix] ~= nil then
					local item_data = p.chests[chest_names[chest_idx]]['itemData'..suffix][itemname]
					if item_data == nil then
						table.insert( item_names_ordered[k], false )
					else
						table.insert( item_names_ordered[k], item_data )
					end				
				end
			end
		end

		return item_names_ordered
	end,

	construct_ordered_item_rows = function( chest_names, suffix )
		-- for the first chest, sort its by chance desc, then by avg amount desc, then alphabetically asc
		local item_names_ordered, item_chests = q.construct_ordered_items_from_first_chest( chest_names, suffix )
		
		if #chest_names > 1 then
			-- after that, sort all the remaining items in list order
			local items_not_from_first_table = q.get_ordered_items_from_other_chests( chest_names, item_chests, suffix )
			item_names_ordered = q.add_other_items_to_first_list( chest_names, item_names_ordered, item_chests, items_not_from_first_table )
		end

		-- set up item_names_ordered so that each is a row, representing chest values
		item_names_ordered = q.set_up_ordered_item_rows( chest_names, item_names_ordered, suffix )
		
		return item_names_ordered
	end,

	print_table = function( chest_names, columns, ordered_item_rows, suffix )

		local html = {}
		
		local use_roll_row = false
		local use_superheader = false
		local superheader_sizes = {}
		for i = 1, #chest_names do
			sh = p.chests[chest_names[i]].superheader
			if sh ~= nil then
				if superheader_sizes[sh] == nil then
					superheader_sizes[sh] = 0
				end
				superheader_sizes[sh] = superheader_sizes[sh] + 1
				use_superheader = true
			end
			local allRolls = p.chests[chest_names[i]]['allRolls'..suffix]
			if #allRolls > 1 then
				use_roll_row = true
			end
		end
		if columns['stacksize'] == nil and columns['weight'] == nil then
			use_roll_row = false
		end
		
		local rowspan = ( #chest_names > 1 and 1 or 0 ) + ( use_superheader and 1 or 0 ) + 1
		local hide_col_description = rowspan > 1 and q.tablelength(columns) == 1
		if use_roll_row then
			rowspan = rowspan + 1
		end
		
		if q.tablelength(columns) == 1 then
			for column_name, v in pairs(columns) do
				table.insert( html, "Values represent " )
				table.insert( html, p.columns[column_name] )
				table.insert( html, "\n" )
			end
		end

		if #chest_names == 1 then
		
			if q.tablelength(columns) == 1 then
				table.insert( html, "<br>" )
			end
		
			local chest_name = chest_names[1]
			local allRolls = p.chests[chest_name]['allRolls'..suffix]
			local chest_type = p.chests[chest_name].chest_type or "chest"

			local display_name = p.chests[chest_name].display_name

			chest_name = chest_name:gsub( "-", " " )
			
			table.insert( html, "Each " )
			table.insert( html, display_name or chest_name )
			if chest_type ~= 'chest' and chest_type ~= 'minecart with chest' then
				table.insert( html, " contains " )
			else
				table.insert( html, " chest contains " )
			end
			if #allRolls == 1 then
				table.insert( html, allRolls[1] )
				table.insert( html, " item stacks, " )
			else
				table.insert( html, ' items drawn from ' )
				table.insert( html, #allRolls )
				table.insert( html, ' pools, ' )
			end
			table.insert( html, " with the following distribution: \n" )
		end
		
		table.insert( html, '<div style="overflow:auto">\n' )
		table.insert( html, "<table class='wikitable sortable jquery-tablesorter'>\n" )
		table.insert( html, "<tr>\n" )
		table.insert( html, "<th rowspan=" )
		table.insert( html, ( rowspan - ( hide_col_description and 1 or 0 ) ) )
		table.insert( html, "></th>\n" )
		
		local superheader_cols_used = {}
		
		if #chest_names > 1 then
			local row1, row2 = {}, {}

			for i = 1, #chest_names do
			
				if suffix == 'JavaUpcoming' or p.chests[chest_names[i]]['pools'..suffix] ~= nil then
					local allRolls = p.chests[chest_names[i]]['allRolls'..suffix]
					local colspan = q.tablelength(columns)
					local allRollsSpan = #allRolls == 0 and 1 or #allRolls
					if columns['stacksize'] ~= nil then
						colspan = colspan - 1 + allRollsSpan
					end
					if columns['weight'] ~= nil then
						colspan = colspan - 1 + allRollsSpan
					end
					local row = row1
					
					rowspan = 1
					if use_superheader then
						sh = p.chests[chest_names[i]].superheader
						if sh ~= nil then
							if superheader_cols_used[sh] == nil then
								table.insert( row, "<th colspan=" )
								table.insert( row, ( colspan * superheader_sizes[sh] ) )
								table.insert( row, ">" )
								table.insert( row, sh )
								table.insert( row, "</th>\n" )
								superheader_cols_used[sh] = 0
							end
							row = row2
						else
							rowspan = rowspan + 1
						end
					end
					if use_roll_row and hide_col_description and #allRolls < 2 then
						rowspan = rowspan + 1
					end

					table.insert( row, "<th colspan=" )
					table.insert( row, colspan )
					if rowspan > 1 then
						table.insert( row, " rowspan=" )
						table.insert( row, rowspan )
					end
					table.insert( row, ">" )
					table.insert( row, p.chests[ chest_names[i] ].header )
					if #allRolls > 0 then
						table.insert( row, ' <br><span style="font-weight:normal; font-style:italic; font-size:11px;">(' )
						if #allRolls == 1 then
							table.insert( row, allRolls[1] )
						else
							local s = ( #allRolls > 2 and ', ' or ' ' )
							for i = 1, #allRolls-1 do
								table.insert( row, allRolls[i] )
								table.insert( row, s )
							end
							table.insert( row, 'and ' )
							table.insert( row, allRolls[#allRolls] )
						end
						table.insert( row, ' stacks)</span>' )
					end
					table.insert( row, "</th>\n" )
				end
			end
			
			table.insert( html, table.concat( row1 ) )
			table.insert( html, "</tr><tr>\n" )
			if #row2 then
				table.insert( html, table.concat( row2 ) )
				table.insert( html, "</tr><tr>\n" )
			end
		end

		if not hide_col_description then
			local headersort_th_open
			if use_roll_row then
				headersort_th_open = "<th rowspan='2' class='headersort' role='columnheader button' data-sort-type='number'> <abbr title='"
			else
				headersort_th_open = "<th class='headersort' role='columnheader button' data-sort-type='number'> <abbr title='"
			end
			for i = 1, #chest_names do
				if suffix == 'JavaUpcoming' or p.chests[chest_names[i]]['pools'..suffix] ~= nil then
					local allRolls = p.chests[chest_names[i]]['allRolls'..suffix]
					local allRollsSpan = #allRolls == 0 and 1 or #allRolls
					local headersort_th_colspan_open
					if #allRolls > 1 then
						headersort_th_colspan_open = "<th colspan='" .. allRollsSpan .. "' role='columnheader'> <abbr title='"
					else
						headersort_th_colspan_open = headersort_th_open
					end

					if columns['stacksize'] ~= nil then
						table.insert( html, headersort_th_colspan_open )
						table.insert( html, p.columns['stacksize'] )
						table.insert( html, "'> Stack Size </abbr></th>\n" )
					end
					if columns['weight'] ~= nil then
						table.insert( html, headersort_th_colspan_open )
						table.insert( html, p.columns['weight'] )
						table.insert( html, "'> Weight" )
						table.insert( html, "</abbr></th>\n" )
					end
					if columns['items'] ~= nil then
						table.insert( html, headersort_th_open )
						table.insert( html, p.columns['items'] )
						table.insert( html, "'> # Items </abbr></th>\n" )
					end
					if columns['chance'] ~= nil then
						table.insert( html, headersort_th_open )
						table.insert( html, p.columns['chance'] )
						table.insert( html, "'> Chance </abbr></th>\n" )
					end
					if columns['chests'] ~= nil then
						table.insert( html, headersort_th_open )
						table.insert( html, p.columns['chests'] )
						table.insert( html, "'> # Chests </abbr></th>\n" )
					end
				end
			end
			table.insert( html, "</tr><tr>\n" )
		end
		
		if use_roll_row then
			local rowcols = ( columns['stacksize'] ~= nil and 1 or 0 ) + ( columns['weight'] ~= nil and 1 or 0 )
			for i = 1, #chest_names do
				local allRolls = p.chests[chest_names[i]]['allRolls'..suffix]
				if #allRolls > 1 then
					for j = 1, rowcols do
						for k = 1, #allRolls do
							table.insert( html, "<th class='headersort' role='columnheader button' data-sort-type='number' style='font-weight:normal'><abbr title='The chest will draw " )
							table.insert( html, allRolls[k] )
							table.insert( html, " stack(s) randomly from this pool.'>" )
							table.insert( html, allRolls[k] )
							table.insert( html, "×</abbr></th>\n" )
						end
					end
				end
			end
			table.insert( html, "</tr><tr>\n" )
		end

		for i = 1, #ordered_item_rows do
			if type( ordered_item_rows[i] ) == "table" then
				for j = 1, #ordered_item_rows[i] do

					local chest_item = ordered_item_rows[i][j]
					
					if type( chest_item ) == "table" then
					
						local avg_amount = string.format("%.3f", chest_item.avgamount)
						local chance_any = string.format("%.1f", chest_item.chanceany*100) .. "%"
						local num_chests = string.format("%.1f", 1/chest_item.chanceany)
						
						table.insert( html, "\n" )
						if columns['stacksize'] ~= nil then
							for k = 1, #chest_item.sizes do
								table.insert( html, "<td style='text-align:center;' data-sort-value='" )
								table.insert( html, ( chest_item.sortsize[k] == 0 and "9e99" or chest_item.sortsize[k] ) )
								table.insert( html, "'>" )
								table.insert( html, chest_item.sizes[k] )
								table.insert( html, "</td>" )
							end
						end
						if columns['weight'] ~= nil then
							for k = 1, #chest_item.sizes do
								table.insert( html, "<td style='text-align:center;' data-sort-value='" )
								table.insert( html, ( chest_item.sortweight[k] == 0 and "9e99" or chest_item.sortweight[k] ) )
								table.insert( html, "'>" )
								table.insert( html, chest_item.weights[k] )
								table.insert( html, "</td>" )
							end
						end
						if columns['items'] ~= nil then
							table.insert( html, "<td style='text-align:center;'>" )
							table.insert( html, avg_amount )
							table.insert( html, "</td>" )
						end
						if columns['chance'] ~= nil then
							table.insert( html, "<td style='text-align:center;'>" )
							table.insert( html, chance_any )
							table.insert( html, "</td>" )
						end
						if columns['chests'] ~= nil then
							table.insert( html, "<td style='text-align:center;'>" )
							table.insert( html, num_chests )
							table.insert( html, "</td>" )
						end
							
					elseif type( chest_item ) == "boolean" then
						local allRolls = p.chests[chest_names[j-1]]['allRolls'..suffix]
						local allRollsSpan = #allRolls == 0 and 1 or #allRolls

						table.insert( html, "\n" )
						if columns['stacksize'] ~= nil then
							for k = 1, allRollsSpan do
								table.insert( html, "<td data-sort-value='9e99' style='text-align:center;'>—</td>" )
							end
						end
						if columns['weight'] ~= nil then
							for k = 1, allRollsSpan do
								table.insert( html, "<td data-sort-value='9e99' style='text-align:center;'>—</td>" )
							end
						end
						if columns['items'] ~= nil then
							table.insert( html, "<td data-sort-value='9e99' style='text-align:center;'>—</td>" )
						end
						if columns['chance'] ~= nil then
							table.insert( html, "<td data-sort-value='9e99' style='text-align:center;'>—</td>" )
						end
						if columns['chests'] ~= nil then
							table.insert( html, "<td data-sort-value='9e99' style='text-align:center;'>—</td>" )
						end
					else
						if i > 1 then
							table.insert( html, "</tr><tr>" )
						end
						
						local item = p.items[chest_item]
						
						local s = require( 'Module:Sprite' )
						table.insert( html, "\n<td>" )
						local image, spriteCat = s.link{ 
							id=item.id or chest_item, 
							link=item.link or string.gsub(chest_item,'-',' '), 
							text=item.title or q.titlecase(string.gsub(chest_item,'-',' ')), 
							data= ( item[1] == 'item' and 'ItemSprite' or 'BlockSprite' )
						}
						table.insert( html, image )
						table.insert( html, spriteCat )
						if item.note and p.notes[item.note] then
							table.insert( html, p.current_frame:extensionTag( 'ref', p.notes[item.note], { group='note', name=item.note } ) )
						end
						table.insert( html, "</td>" )
					end
					
					if j == #ordered_item_rows[i] then
						table.insert( html, "</tr>" )
					end
					
				end
				table.insert( html, "\n" )
			end
		end
		
		table.insert( html, "</table></div>" )
		
		return table.concat( html )
		
	end,
	
	titlecase = function( str )
		local buf = {}
		for word in string.gfind(str, "%S+") do
			if word == "and" then
				table.insert( buf, word )
			else
				local first, rest = string.sub( word, 1, 1 ), string.sub( word, 2 )
				table.insert( buf, string.upper(first) .. string.lower(rest) )
			end
		end    
		return table.concat( buf, " " )
	end,
	
	capitalize = function( str )
		return ( string.lower(str):gsub( "^%l", string.upper ) )
	end,

	lcfirst = function( str )
		return ( string.gsub( str, "^%u", string.lower ) )
	end,
	
	compare_tables = function( a, b )
		local seen = {}
		for k, v in pairs( a ) do
			if type( v ) ~= type( b[k] ) then
				return true
			end
			if v ~= b[k] then
				return true
			end
			if type( v ) == 'table' and q.compare_tables( v, b[k] ) then
				return true
			end
			seen[k] = true
		end
		for k, v in pairs( b ) do
			if not seen[k] then
				return true
			end
		end
		return false
	end,
}

string.lpad = function(str, len, char)
	if char == nil then char = ' ' end
	return string.rep(char, len - #(''..str)) .. str
end

return p