From fb611e0c870d4e473b0a3f10436c3c69b7be12b8 Mon Sep 17 00:00:00 2001 From: Eric Wagoner Date: Sun, 9 Aug 2026 12:55:36 -0400 Subject: [PATCH] Containment becomes editable: the where-it-lives card grows controls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eric's question exposed the gap: stored_in was settable only at pick-time, with no path for a game already in the system. The Library detail page's "Where it lives" card now renders for every entry — "in its own box on a shelf" with an it-lives-inside-another-box control, or the current container with a change button — saving through a new /api/stored-in endpoint that updates the match rows (the durable record) AND the library entry in place, so the page and the shelf math reflect it immediately, no enrich run needed. Guards refuse self-containment and direct cycles; local games are addressable through their key's normalized title. Co-Authored-By: Claude Fable 5 Claude-Session: https://claude.ai/code/session_016jXZFSTZQKzAC8fqdW79g --- data/games.json | 1478 ++++++++++++++++-- src/bggpipe/templates/pages/help.html | 2 +- src/bggpipe/templates/pages/librarygame.html | 56 +- src/bggpipe/webreview.py | 60 + tests/test_webreview.py | 25 + 5 files changed, 1484 insertions(+), 137 deletions(-) diff --git a/data/games.json b/data/games.json index 1aacc4b..52df273 100644 --- a/data/games.json +++ b/data/games.json @@ -83,7 +83,8 @@ "depth_in": 2.1, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "71:24006": { "bgg_id": 71, @@ -170,7 +171,8 @@ "depth_in": 2.1, "weight_lb": 2.0, "source": "version" - } + }, + "stored_in": null }, "177:24972": { "bgg_id": 177, @@ -249,7 +251,8 @@ "depth_in": 2.1, "weight_lb": 1.9, "source": "version" - } + }, + "stored_in": null }, "3090:25782": { "bgg_id": 3090, @@ -312,7 +315,8 @@ "depth_in": 2.25, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "3585:211154": { "bgg_id": 3585, @@ -386,7 +390,8 @@ "depth_in": 2.1, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "2524:219137": { "bgg_id": 2524, @@ -452,7 +457,8 @@ "depth_in": 2.0, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "334011:701315": { "bgg_id": 334011, @@ -520,7 +526,8 @@ "depth_in": 1.57, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "589:27352": { "bgg_id": 589, @@ -587,7 +594,8 @@ "depth_in": 1.0, "weight_lb": 1.1905, "source": "version" - } + }, + "stored_in": null }, "224:20727": { "bgg_id": 224, @@ -668,7 +676,8 @@ "depth_in": 3.5, "weight_lb": 4.55034, "source": "version" - } + }, + "stored_in": null }, "9209:294188": { "bgg_id": 9209, @@ -757,7 +766,8 @@ "depth_in": 2.8, "weight_lb": 2.86601, "source": "version" - } + }, + "stored_in": null }, "13:347121": { "bgg_id": 13, @@ -897,7 +907,8 @@ "depth_in": 3.14961, "weight_lb": 2.42508, "source": "version" - } + }, + "stored_in": null }, "1219:488621": { "bgg_id": 1219, @@ -988,7 +999,8 @@ "depth_in": 2.2, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "137909:216474": { "bgg_id": 137909, @@ -1056,7 +1068,8 @@ "depth_in": 2.25, "weight_lb": 2.35233, "source": "version" - } + }, + "stored_in": null }, "27710:606657": { "bgg_id": 27710, @@ -1142,7 +1155,8 @@ "depth_in": 0.98, "weight_lb": 0.28, "source": "version" - } + }, + "stored_in": null }, "169784:260454": { "bgg_id": 169784, @@ -1212,7 +1226,8 @@ "depth_in": 1.7, "weight_lb": 0.3, "source": "version" - } + }, + "stored_in": null }, "147370:231664": { "bgg_id": 147370, @@ -1278,7 +1293,8 @@ "depth_in": 2.0, "weight_lb": 2.51327, "source": "version" - } + }, + "stored_in": null }, "43443:103068": { "bgg_id": 43443, @@ -1352,7 +1368,8 @@ "depth_in": 2.5, "weight_lb": 2.3, "source": "version" - } + }, + "stored_in": null }, "24310:374258": { "bgg_id": 24310, @@ -1434,7 +1451,8 @@ "depth_in": 1.9685, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "39856:296529": { "bgg_id": 39856, @@ -1522,7 +1540,8 @@ "depth_in": 2.25, "weight_lb": 1.7, "source": "version" - } + }, + "stored_in": null }, "125921:476263": { "bgg_id": 125921, @@ -1589,7 +1608,8 @@ "depth_in": 3.25, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "35505:781669": { "bgg_id": 35505, @@ -1661,7 +1681,8 @@ "depth_in": 2.5, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "31260:297589": { "bgg_id": 31260, @@ -1749,7 +1770,8 @@ "depth_in": 2.75, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "164:28465": { "bgg_id": 164, @@ -1809,7 +1831,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "181304:536289": { "bgg_id": 181304, @@ -1897,7 +1920,8 @@ "depth_in": 2.8, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "65244:31208": { "bgg_id": 65244, @@ -1991,7 +2015,8 @@ "depth_in": 2.75, "weight_lb": 1.35143, "source": "version" - } + }, + "stored_in": null }, "95386:290572": { "bgg_id": 95386, @@ -2068,7 +2093,8 @@ "depth_in": 1.5748, "weight_lb": 0.5, "source": "version" - } + }, + "stored_in": null }, "258:20840": { "bgg_id": 258, @@ -2143,7 +2169,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "312786:514050": { "bgg_id": 312786, @@ -2216,7 +2243,8 @@ "depth_in": 2.0, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "188614:779792": { "bgg_id": 188614, @@ -2283,7 +2311,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "273240:446069": { "bgg_id": 273240, @@ -2364,7 +2393,8 @@ "depth_in": 4.0, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "4324:26859": { "bgg_id": 4324, @@ -2437,7 +2467,8 @@ "depth_in": 2.75, "weight_lb": 2.72, "source": "version" - } + }, + "stored_in": null }, "419687:711400": { "bgg_id": 419687, @@ -2502,7 +2533,8 @@ "depth_in": 4.875, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "252153:404702": { "bgg_id": 252153, @@ -2576,7 +2608,8 @@ "depth_in": 3.93701, "weight_lb": 4.40925, "source": "version" - } + }, + "stored_in": null }, "255984:701034": { "bgg_id": 255984, @@ -2663,7 +2696,8 @@ "depth_in": 4.25, "weight_lb": 8.0, "source": "version" - } + }, + "stored_in": null }, "283766:463140": { "bgg_id": 283766, @@ -2742,7 +2776,8 @@ "depth_in": 1.4, "weight_lb": 2.49122, "source": "version" - } + }, + "stored_in": null }, "280794:458300": { "bgg_id": 280794, @@ -2820,7 +2855,8 @@ "depth_in": 4.72441, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "380837:650545": { "bgg_id": 380837, @@ -2892,7 +2928,8 @@ "depth_in": 3.0, "weight_lb": 3.0, "source": "version" - } + }, + "stored_in": null }, "393672:669782": { "bgg_id": 393672, @@ -2975,7 +3012,8 @@ "depth_in": 2.87402, "weight_lb": 0.66139, "source": "version" - } + }, + "stored_in": null }, "1927:28144": { "bgg_id": 1927, @@ -3077,7 +3115,8 @@ "depth_in": 1.75, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "14535:29075": { "bgg_id": 14535, @@ -3147,7 +3186,8 @@ "depth_in": 1.875, "weight_lb": 1.0, "source": "version" - } + }, + "stored_in": null }, "9666:215137": { "bgg_id": 9666, @@ -3214,7 +3254,8 @@ "depth_in": 2.0, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "40508:644326": { "bgg_id": 40508, @@ -3284,7 +3325,8 @@ "depth_in": 0.8, "weight_lb": 0.21, "source": "version" - } + }, + "stored_in": null }, "3181:87931": { "bgg_id": 3181, @@ -3360,7 +3402,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "193485:300446": { "bgg_id": 193485, @@ -3424,7 +3467,8 @@ "depth_in": 1.75, "weight_lb": 0.74957, "source": "version" - } + }, + "stored_in": null }, "226065:353389": { "bgg_id": 226065, @@ -3504,7 +3548,8 @@ "depth_in": 2.2, "weight_lb": 1.10231, "source": "version" - } + }, + "stored_in": null }, "143884:453051": { "bgg_id": 143884, @@ -3589,7 +3634,8 @@ "depth_in": 2.75, "weight_lb": 1.32277, "source": "version" - } + }, + "stored_in": null }, "1784:110926": { "bgg_id": 1784, @@ -3647,7 +3693,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "176:27673": { "bgg_id": 176, @@ -3714,7 +3761,8 @@ "depth_in": 0.5, "weight_lb": 0.257941, "source": "version" - } + }, + "stored_in": null }, "257:520364": { "bgg_id": 257, @@ -3789,7 +3837,8 @@ "depth_in": 0.375, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "358880:603694": { "bgg_id": 358880, @@ -3849,7 +3898,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "153999:280845": { "bgg_id": 153999, @@ -3920,7 +3970,8 @@ "depth_in": 0.984252, "weight_lb": 0.66139, "source": "version" - } + }, + "stored_in": null }, "166976:410382": { "bgg_id": 166976, @@ -3986,7 +4037,8 @@ "depth_in": 1.69291, "weight_lb": 1.41096, "source": "version" - } + }, + "stored_in": null }, "231302:361880": { "bgg_id": 231302, @@ -4052,7 +4104,8 @@ "depth_in": 2.0, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "40692:294178": { "bgg_id": 40692, @@ -4136,7 +4189,8 @@ "depth_in": 2.8, "weight_lb": 4.23288, "source": "version" - } + }, + "stored_in": null }, "432858:734890": { "bgg_id": 432858, @@ -4199,7 +4253,8 @@ "depth_in": 2.5, "weight_lb": 4.0, "source": "version" - } + }, + "stored_in": null }, "172503:265107": { "bgg_id": 172503, @@ -4267,7 +4322,8 @@ "depth_in": 1.4, "weight_lb": 2.0, "source": "version" - } + }, + "stored_in": null }, "417060:706506": { "bgg_id": 417060, @@ -4333,7 +4389,8 @@ "depth_in": 1.25, "weight_lb": 1.0, "source": "version" - } + }, + "stored_in": null }, "417064:706510": { "bgg_id": 417064, @@ -4400,7 +4457,8 @@ "depth_in": 1.25, "weight_lb": 1.0, "source": "version" - } + }, + "stored_in": null }, "104710:117685": { "bgg_id": 104710, @@ -4490,7 +4548,8 @@ "depth_in": 3.0, "weight_lb": 3.1, "source": "version" - } + }, + "stored_in": null }, "local:cat crimes:IMG_4499.jpeg;IMG_4505.jpeg;shelf-20260803-215723.jpg": { "bgg_id": null, @@ -4505,6 +4564,7 @@ "IMG_4505.jpeg", "shelf-20260803-215723.jpg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4522,6 +4582,7 @@ "source_photos": [ "IMG_4508.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4541,6 +4602,7 @@ "source_photos": [ "IMG_4510.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4560,6 +4622,7 @@ "source_photos": [ "IMG_4516.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4579,6 +4642,7 @@ "source_photos": [ "IMG_4526.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4598,6 +4662,7 @@ "source_photos": [ "IMG_4529.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4615,6 +4680,7 @@ "source_photos": [ "IMG_4544.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4710,7 +4776,8 @@ "depth_in": 1.25, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "380459:743266": { "bgg_id": 380459, @@ -4772,7 +4839,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "311654": { "bgg_id": 311654, @@ -4832,7 +4900,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "258849:449806": { "bgg_id": 258849, @@ -4912,7 +4981,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "local:dungeons and dragons:IMG_4519.jpeg": { "bgg_id": null, @@ -4925,6 +4995,7 @@ "source_photos": [ "IMG_4519.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -4944,6 +5015,7 @@ "source_photos": [ "IMG_4519.jpeg" ], + "stored_in": null, "dims": { "width_in": null, "length_in": null, @@ -5016,7 +5088,8 @@ "depth_in": 2.75, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "40529:27692": { "bgg_id": 40529, @@ -5084,7 +5157,8 @@ "depth_in": 3.0, "weight_lb": 2.0, "source": "version" - } + }, + "stored_in": null }, "157969:237864": { "bgg_id": 157969, @@ -5176,7 +5250,8 @@ "depth_in": 3.0, "weight_lb": 3.0, "source": "version" - } + }, + "stored_in": null }, "207830:344075": { "bgg_id": 207830, @@ -5254,7 +5329,8 @@ "depth_in": 2.625, "weight_lb": 2.675, "source": "version" - } + }, + "stored_in": null }, "194655:668826": { "bgg_id": 194655, @@ -5327,7 +5403,8 @@ "depth_in": 2.5, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "161928:245124": { "bgg_id": 161928, @@ -5390,7 +5467,8 @@ "depth_in": 3.5, "weight_lb": 2.0, "source": "version" - } + }, + "stored_in": null }, "50381:134539": { "bgg_id": 50381, @@ -5463,7 +5541,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "193621:300682": { "bgg_id": 193621, @@ -5539,7 +5618,8 @@ "depth_in": 2.75, "weight_lb": 1.625, "source": "version" - } + }, + "stored_in": null }, "1269:29705": { "bgg_id": 1269, @@ -5605,7 +5685,8 @@ "depth_in": 0.75, "weight_lb": 0.5, "source": "version" - } + }, + "stored_in": null }, "172225:296012": { "bgg_id": 172225, @@ -5700,7 +5781,8 @@ "depth_in": 1.6, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "202982:316090": { "bgg_id": 202982, @@ -5761,7 +5843,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "2529:98655": { "bgg_id": 2529, @@ -5837,7 +5920,8 @@ "depth_in": 1.4, "weight_lb": 5.5, "source": "version" - } + }, + "stored_in": null }, "483:48522": { "bgg_id": 483, @@ -5939,7 +6023,8 @@ "depth_in": 2.2, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "26:28607": { "bgg_id": 26, @@ -6009,7 +6094,8 @@ "depth_in": 2.125, "weight_lb": 3.75, "source": "version" - } + }, + "stored_in": null }, "97903:231971": { "bgg_id": 97903, @@ -6076,7 +6162,8 @@ "depth_in": 3.94, "weight_lb": 4.41, "source": "version" - } + }, + "stored_in": null }, "160477:269392": { "bgg_id": 160477, @@ -6153,7 +6240,8 @@ "depth_in": 3.8, "weight_lb": 1.37789, "source": "version" - } + }, + "stored_in": null }, "195314:525268": { "bgg_id": 195314, @@ -6227,7 +6315,8 @@ "depth_in": 0.8, "weight_lb": 0.337307, "source": "version" - } + }, + "stored_in": null }, "320202:528008": { "bgg_id": 320202, @@ -6291,7 +6380,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "2452:288640": { "bgg_id": 2452, @@ -6426,7 +6516,8 @@ "depth_in": 2.16535, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "208428:325455": { "bgg_id": 208428, @@ -6494,7 +6585,8 @@ "depth_in": 9.0, "weight_lb": 3.4, "source": "version" - } + }, + "stored_in": null }, "42063:191736": { "bgg_id": 42063, @@ -6550,7 +6642,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "57215:295423": { "bgg_id": 57215, @@ -6615,7 +6708,8 @@ "depth_in": 3.0, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "340420:567183": { "bgg_id": 340420, @@ -6688,7 +6782,8 @@ "depth_in": 3.0, "weight_lb": 1.47, "source": "version" - } + }, + "stored_in": null }, "139443:202519": { "bgg_id": 139443, @@ -6755,7 +6850,8 @@ "depth_in": 2.2, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "1260:156689": { "bgg_id": 1260, @@ -6827,7 +6923,8 @@ "depth_in": 0.75, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "2197:42495": { "bgg_id": 2197, @@ -6896,7 +6993,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "116:28201": { "bgg_id": 116, @@ -6972,7 +7070,8 @@ "depth_in": 4.875, "weight_lb": 0.5, "source": "version" - } + }, + "stored_in": null }, "124548:165214": { "bgg_id": 124548, @@ -7036,7 +7135,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "169124:451577": { "bgg_id": 169124, @@ -7111,7 +7211,8 @@ "depth_in": 2.8, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "2387:91428": { "bgg_id": 2387, @@ -7174,7 +7275,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "20866:40025": { "bgg_id": 20866, @@ -7232,7 +7334,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "196105:304900": { "bgg_id": 196105, @@ -7292,7 +7395,8 @@ "depth_in": 2.5, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "156994:236280": { "bgg_id": 156994, @@ -7355,7 +7459,8 @@ "depth_in": 1.9685, "weight_lb": 1.25, "source": "version" - } + }, + "stored_in": null }, "269564:439948": { "bgg_id": 269564, @@ -7421,7 +7526,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "18755:284056": { "bgg_id": 18755, @@ -7481,7 +7587,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "166109:253058": { "bgg_id": 166109, @@ -7548,7 +7655,8 @@ "depth_in": 2.6, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "125675:167657": { "bgg_id": 125675, @@ -7613,7 +7721,8 @@ "depth_in": 2.2, "weight_lb": 1.2, "source": "version" - } + }, + "stored_in": null }, "128554:207529": { "bgg_id": 128554, @@ -7678,7 +7787,8 @@ "depth_in": 2.0, "weight_lb": 1.4, "source": "version" - } + }, + "stored_in": null }, "822:187468": { "bgg_id": 822, @@ -7794,7 +7904,8 @@ "depth_in": 2.6, "weight_lb": 1.37128, "source": "version" - } + }, + "stored_in": null }, "201248:313478": { "bgg_id": 201248, @@ -7865,7 +7976,8 @@ "depth_in": 2.5, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "362205:612448": { "bgg_id": 362205, @@ -7935,7 +8047,8 @@ "depth_in": 2.55906, "weight_lb": 3.02033, "source": "version" - } + }, + "stored_in": null }, "220199:369805": { "bgg_id": 220199, @@ -7995,7 +8108,8 @@ "depth_in": 0.59, "weight_lb": 0.35, "source": "version" - } + }, + "stored_in": null }, "453845:772660": { "bgg_id": 453845, @@ -8052,7 +8166,8 @@ "depth_in": 1.25, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "329230:547518": { "bgg_id": 329230, @@ -8115,7 +8230,8 @@ "depth_in": 1.0, "weight_lb": 0.2, "source": "version" - } + }, + "stored_in": null }, "358320:602661": { "bgg_id": 358320, @@ -8195,7 +8311,8 @@ "depth_in": 4.25197, "weight_lb": 5.0, "source": "version" - } + }, + "stored_in": null }, "389113:662372": { "bgg_id": 389113, @@ -8267,7 +8384,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "324937:537230": { "bgg_id": 324937, @@ -8328,7 +8446,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "295770:484007": { "bgg_id": 295770, @@ -8420,7 +8539,8 @@ "depth_in": 9.84252, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "174430:520054": { "bgg_id": 174430, @@ -8524,7 +8644,8 @@ "depth_in": 7.5, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "442312:752105": { "bgg_id": 442312, @@ -8584,7 +8705,8 @@ "depth_in": 1.25, "weight_lb": 0.85, "source": "version" - } + }, + "stored_in": null }, "332398:553061": { "bgg_id": 332398, @@ -8666,7 +8788,8 @@ "depth_in": 6.81102, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "334065:759453": { "bgg_id": 334065, @@ -8753,7 +8876,8 @@ "depth_in": 2.76, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "283155:462049": { "bgg_id": 283155, @@ -8842,7 +8966,8 @@ "depth_in": 2.79528, "weight_lb": 3.48771, "source": "version" - } + }, + "stored_in": null }, "291457:476060": { "bgg_id": 291457, @@ -8944,7 +9069,8 @@ "depth_in": 4.0, "weight_lb": 5.8, "source": "version" - } + }, + "stored_in": null }, "173057:266044": { "bgg_id": 173057, @@ -8997,7 +9123,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "150925:225659": { "bgg_id": 150925, @@ -9065,7 +9192,8 @@ "depth_in": 2.55906, "weight_lb": 1.5, "source": "version" - } + }, + "stored_in": null }, "2980:138013": { "bgg_id": 2980, @@ -9125,7 +9253,8 @@ "depth_in": 4.0, "weight_lb": 1.7, "source": "version" - } + }, + "stored_in": null }, "1197:78624": { "bgg_id": 1197, @@ -9203,7 +9332,8 @@ "depth_in": 0.75, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "352819:591147": { "bgg_id": 352819, @@ -9259,7 +9389,8 @@ "depth_in": 1.75, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "163412:495998": { "bgg_id": 163412, @@ -9363,7 +9494,8 @@ "depth_in": 1.77, "weight_lb": 1.25, "source": "version" - } + }, + "stored_in": null }, "291847:476820": { "bgg_id": 291847, @@ -9437,7 +9569,8 @@ "depth_in": 2.5, "weight_lb": 2.2, "source": "version" - } + }, + "stored_in": null }, "2058:28041": { "bgg_id": 2058, @@ -9511,7 +9644,8 @@ "depth_in": 0.1, "weight_lb": null, "source": "version" - } + }, + "stored_in": null }, "452833:770724": { "bgg_id": 452833, @@ -9563,7 +9697,8 @@ "depth_in": null, "weight_lb": null, "source": "absent" - } + }, + "stored_in": null }, "104590:117256": { "bgg_id": 104590, @@ -9635,6 +9770,1097 @@ "depth_in": null, "weight_lb": null, "source": "absent" + }, + "stored_in": null + }, + "173634:266954": { + "bgg_id": 173634, + "type": "boardgame", + "name": "The Red Dragon Inn 5: The Character Trove", + "year": 2015, + "description": "The Red Dragon Inn 5: The Character Trove is a fast-paced, light-hearted card game for two or more players. You and your increasingly mighty party of adventuring companions have spent all day slogging through the dungeon, killing monsters and taking their stuff. Now you’re back in town, healed up, cleaned up, and ready to party at the Red Dragon Inn. Drink, gamble, and roughhouse with your friends. But don’t forget to keep an eye on your gold. If you run out, you’ll have to spend the night in the stables. Oh… and try not to get too beaten up or too drunk. If you black out, your friends will continue the party without you… after they loot your body for gold, of course! The last conscious adventurer with gold wins the game!\n\nThe Red Dragon Inn 5: The Character Trove is a standalone game for 2-4 players. It expands on \"The Red Dragon Inn\" family of box sets and single-character expansions called Allies. You can mix and match characters from any of these sets, letting you build the party composition of your choice! Each of the box sets includes four unique characters, a drink deck, gold pieces, and all the parts for 2-4 players to play right out of the box. Each of the Allies expansions includes a character deck as well as gold pieces and bits so you can add another character to a box set (thus making a 2-4 player collection playable by 2-5 players).\n\nSera the Fleetfooted: Sera is a stealthy rogue whose speed and agility allow her to take down roomfuls of bad guys before they even know what’s happening. The dungeon’s beefiest monsters are no match for her flying daggers! She didn’t get so skilled by slacking off, though. Even while she’s partying, she continues training to make sure she’s always at the top of her game.\n\n\n The Good: She hones her skills by sparring with her friends.\n The Bad: Sometimes she does this without warning them first…\n\n\nLizwick the Collector: Lizwick is a consummate problem solver with an unrivaled collection of gear. Her wondrous Bag of Holding contains rare and peculiar items of all descriptions. She is always on the lookout for the next amazing whatchamacallit to add to her collection. Lizwick has gotten The Party out of many a jam with the clever application of the wrong tool at the right time.\n\n\n The Good: Lizwick’s collection is the envy of academies, guilds and hoarders alike!\n The Bad: …and they’d like their stuff back.\n\n\nJoran the Trickster: Joran’s penchant for pranks earned him a student “sabbatical” from the Mage’s Collegium. Fortunately, Zot saw some potential in the boy, and decided to take him adventuring for some valuable field experience. The young mage’s humor has proven to be mostly harmless to his new friends. He puts his clever brain to good use by pulling fast ones on the bad guys.\n\n\n The Good: Joran’s talent for misdirection makes him the perfect weapon against enemy spell-casters.\n The Bad: It also makes him the perfect weapon against his friends’ gold, their sobriety, their patience…\n\n\nZakhan the Drunken Master: Zakhan’s father is a solemn elven noble and a guru of meditative martial combat techniques. His mother was a rowdy barbarian warchief with a penchant for throwing wild parties. This unique heritage has allowed Zakhan to hone a seemingly reckless hybrid fighting style of his own. His opponents who underestimate his “drunken” martial arts do so at their own peril!\n\n\n The Good: Zakhan’s drunken fighting techniques make him a formidable foe.\n The Bad: Sometimes he’s actually just drunk.\n\n\nBut wait, there's more! The Red Dragon Inn 5: The Character Trove is also a massive storage solution for all previous sets (with room for more). You get a massive storage box plus dividers, new play mats for all previously released characters, updated tokens and more! Check it out:\n\n\n 6 Unique Decks (4 40-card Character Decks, 1 18-card Item Deck, 1 30-card Drink Deck)\n 29 Character-specific Player Mats (with replacements for all previous sets!)\n 35 Cardboard Deck Dividers\n 1 Cardboard Chi Marker\n 4 Glass Fortitude Markers\n 4 Glass Alcohol Content Markers\n 9 Remastered Cardboard Fortitude Markers\n 9 Remastered Cardboard Alcohol Content Markers\n 55 Remastered Gold Coin Tokens\n 9 New Platinum Coin Tokens\n 10 Foam Spacer Blocks\n 2 Cloth Drawstring Bags\n Ziptop Baggies\n Rules for playing The Red Dragon Inn", + "image": "https://cf.geekdo-images.com/qUHk5BNYauq6qjmv7RLVoQ__original/img/b5I_w_KHanNze4ewkicl2GfZGl8=/0x0/filters:format(png)/pic2614687.png", + "thumbnail": "https://cf.geekdo-images.com/qUHk5BNYauq6qjmv7RLVoQ__small/img/e4pRbDphYf-sekPljHLEuLAdki4=/fit-in/200x150/filters:strip_icc()/pic2614687.png", + "min_players": 2, + "max_players": 4, + "best_player_counts": [ + "4", + "4+" + ], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Cliff Bohm", + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Michael Bear", + "Rose Besch", + "Sebastian Cheng", + "Cold FuZion Studios", + "Anthony Cournoyer", + "Brendan Der", + "Matt Franklin", + "Kennon James", + "Isobel Kelly", + "Asia Kendrick-Horton", + "Doug Kovacs", + "Rhonda Libbey", + "Drew Morrow", + "Jeromy Smith", + "Royce Southerland", + "Beth Trott", + "Erin Wong" + ], + "publishers": [ + "Hobby World", + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.5998, + "weight": 2.0714, + "rank": 3072, + "users_owned": 4170, + "version": { + "version_id": 266954, + "name": "English first edition", + "year": 2015, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 12.5984, + "length_in": 15.3543, + "depth_in": 4.13386, + "weight_lb": null + }, + "stored_in": null, + "dims": { + "width_in": 12.5984, + "length_in": 15.3543, + "depth_in": 4.13386, + "weight_lb": null, + "source": "version" + } + }, + "455834:791302": { + "bgg_id": 455834, + "type": "boardgame", + "name": "The Red Dragon Inn 10", + "year": 2026, + "description": "The Red Dragon Inn is the party after the adventure. You and your adventuring companions have spent all day slogging through the Dungeon, killing monsters and taking their stuff. Now you’re back in town, healed up, cleaned up, and ready to party at the Red Dragon Inn. Drink, gamble, and roughhouse with your friends all while keeping an eye on your Gold. The last conscious adventurer with a Gold still in their pocket wins the game!\n\nFor the last 18 years, The Red Dragon Inn has entertained and delighted fans of the fantasy genre with it's huge cast of colorful characters and individual game mechanics. The Red Dragon Inn 10 is a standalone game that expands this cast with 6 new characters and multiple new game modes.\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/_Q5oVZtUQ809i9ENP9nv0A__original/img/tLtECXLbsKmryUw3jyahO26P4O0=/0x0/filters:format(png)/pic9406794.png", + "thumbnail": "https://cf.geekdo-images.com/_Q5oVZtUQ809i9ENP9nv0A__small/img/bud3IvzdsqZ2KtFAlgjmR4ticGQ=/fit-in/200x150/filters:strip_icc()/pic9406794.png", + "min_players": 2, + "max_players": 6, + "best_player_counts": [], + "playtime": 100, + "min_playtime": 30, + "max_playtime": 100, + "min_age": 13, + "designers": [], + "artists": [], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Take That", + "Team-Based Game", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 8.2125, + "weight": 0.0, + "rank": null, + "users_owned": 174, + "version": { + "version_id": 791302, + "name": "English Eco-Kickstarter edition", + "year": 2026, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 11.7, + "length_in": 11.7, + "depth_in": 2.8, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 11.7, + "length_in": 11.7, + "depth_in": 2.8, + "weight_lb": null, + "source": "version" + } + }, + "33451:629314": { + "bgg_id": 33451, + "type": "boardgame", + "name": "The Red Dragon Inn 2", + "year": 2008, + "description": "The Red Dragon Inn 2 is a standalone game that can be combined with the original The Red Dragon Inn to create adventuring parties of up to eight drunken players. The Red Dragon Inn 2 includes its own drink deck, player mats, counters, Gold, markers, and the following heroic adventurers:\n\n\n Dimli the Dwarf: Grumpy, but tough and loyal, Dimli always seems to have a stash of gold secreted away somewhere. He can pretty much drink anyone else under the table. He's really, really good with his matched set of dwarven axes. He's not so good with darts, though. When he starts playing, duck. \n Eve the Illusionist: Eve defies description, mostly because we don't know what she really looks like. Her powers of illusion have saved her friends countless times from the extremely gullible monsters of the deep dungeon. She's been known to use her skills on her fellow party members when she gets bored. \n Fleck the Bard: Fleck is a dashing half-elf, ready with a smile or a song. His heroic tales and stirring lute-playing raises his friends' spirits, filling them with courage as they face the horrors of the deep dungeon. Fleck is always up for carousing, no matter the day or night. All the girls think he's so dreamy. \n Gog the Half-Ogre: A hulking brute from the flinty mountains who unfortunately doesn't know his own strength. He's not the brightest torch in the dungeon, but he's a nice guy and he tries hard. Never, ever dance with Gog.", + "image": "https://cf.geekdo-images.com/IN7_CaqjdA1y-wk83q4Ttg__original/img/uyi-5ug8cC7IGrGofB9gC3OsliY=/0x0/filters:format(jpeg)/pic8623829.jpg", + "thumbnail": "https://cf.geekdo-images.com/IN7_CaqjdA1y-wk83q4Ttg__small/img/65cyRKdoTWo6ukznkq74qSrQmj8=/fit-in/200x150/filters:strip_icc()/pic8623829.jpg", + "min_players": 2, + "max_players": 4, + "best_player_counts": [ + "4", + "4+" + ], + "playtime": 45, + "min_playtime": 45, + "max_playtime": 45, + "min_age": 13, + "designers": [ + "Cliff Bohm", + "Geoff Bottone", + "Colleen Skadl" + ], + "artists": [ + "Rose Besch", + "Cliff Bohm", + "Cold FuZion Studios", + "Kennon James", + "Doug Kovacs", + "Rhonda Libbey", + "Drew Morrow", + "Beth Trott" + ], + "publishers": [ + "SlugFest Games", + "Arclight Games", + "Hobby World", + "Pegasus Spiele" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 6.90826, + "weight": 1.8056, + "rank": 2057, + "users_owned": 8359, + "version": { + "version_id": 629314, + "name": "English eighth edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 11.7, + "length_in": 11.7, + "depth_in": 2.8, + "weight_lb": 2.1 + }, + "stored_in": "173634", + "dims": { + "width_in": 11.7, + "length_in": 11.7, + "depth_in": 2.8, + "weight_lb": 2.1, + "source": "version" + } + }, + "66510:629315": { + "bgg_id": 66510, + "type": "boardgame", + "name": "The Red Dragon Inn 3", + "year": 2011, + "description": "From the Publisher's Website:\n\nYou and your ever-expanding party of adventuring companions have spent another day slogging through the dungeon, killing monsters and taking their stuff. Now you're back in town, healed up, cleaned up, and ready once again to party at the Red Dragon Inn.\n\nDrink, gamble, and roughhouse with your friends. But don't forget to keep an eye on your Gold. If you run out, you'll have to spend the night in the stables. Oh... and try not to get too beaten up or too drunk. If you black out, your friends will continue the party without you... after they loot your body for Gold of course!\nThe Red Dragon Inn 3 \n The last conscious adventurer with Gold wins the game!\n\nThe Red Dragon Inn 3 introduces four new adventurers, each with a unique game mechanic to add new strategies to the original game. The Red Dragon Inn 3 may be played alone or in combination with other versions of The Red Dragon Inn to allow games of up to 12 players!\n\n\n Wizgille the Tinkerer : Wizgille is a Gnomish Artificer. Her brilliance with gadgets is surpassed only by her enthusiasm for tinkering with them--often with disastrous results. When Wizgille tests a new device, watch out! It could do something impressive, or it could blow up in everyone's faces!\n\n\nThe Good: Many of her creations are legendary among the Gnomish Inventors Guild and have been featured in Adventurer's Gazette.\nThe Bad: She thinks that a crowded tavern is an appropriate place to test new prototypes.\n\n\n Brewmaster Phrenk : Phrenk is a Troll Alchemist. His skill as a potionmaster is unmatched, but he's not above using his skills for the \"lowly\" art of creating specialty drinks for his friends. He is a laid-back, live-and-let-live kind of a guy. But don't make him angry, because he is, after all, a troll.\n\n\nThe Good: He's more than capable of brewing enough healing potions to keep his companions on their feet.\nThe Bad: He's just as capable of brewing enough drinks to knock them all back down.\n\n\n Kaylin the Renegade : Kaylin is a tiny Pixie Enchanter with a big chip on her shoulder. The whole cutesy pixie thing didn't suit her, so she left The Grove and set out on her own. Wulfric is a wolf who is neither tiny, nor has a chip on his shoulder. Between her magical skills and his brute strength, they are a match for any dungeon's monsters.\n\n\nThe Good: Wulfric is a noble companion who always helps his friends.\nThe Bad: Kaylin isn't always so noble.\n\n\n Serena the Pious : Serena would have died if she hadn't been such a cute baby. The Paladins who found her could not bring themselves to slay her as they did the other Orcs in her village. Seeing no other option, they took her in and tried to raise her as one of their own. Even with her training, she is always at risk of succumbing to her chaotic Orcish instincts, so she must be ever-vigilant to stay on the righteous path.\n\n\nThe Good: With her holy blade at her side, she lives to smite evil.\nThe Bad: Carousing in a tavern isn't exactly the best way for Serena to stay on that righteous path...", + "image": "https://cf.geekdo-images.com/v_A9anux7cv1kea3inNKFQ__original/img/oZ6oWb_8Dm46gT_Wl3c1vei1hK0=/0x0/filters:format(jpeg)/pic1022815.jpg", + "thumbnail": "https://cf.geekdo-images.com/v_A9anux7cv1kea3inNKFQ__small/img/j4u56DHgOY4DYld9kSymbhPPJg0=/fit-in/200x150/filters:strip_icc()/pic1022815.jpg", + "min_players": 2, + "max_players": 4, + "best_player_counts": [ + "4", + "4+" + ], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Cliff Bohm", + "Geoff Bottone", + "Jeff Morrow" + ], + "artists": [ + "Rose Besch", + "Kennon James", + "Doug Kovacs", + "Beth Trott" + ], + "publishers": [ + "Arclight Games", + "Hobby World", + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.19723, + "weight": 1.9535, + "rank": 2364, + "users_owned": 6251, + "version": { + "version_id": 629315, + "name": "English sixth edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 10.5, + "length_in": 10.5, + "depth_in": 2.1, + "weight_lb": 2.2 + }, + "stored_in": "173634", + "dims": { + "width_in": 10.5, + "length_in": 10.5, + "depth_in": 2.1, + "weight_lb": 2.2, + "source": "version" + } + }, + "142402:657689": { + "bgg_id": 142402, + "type": "boardgame", + "name": "The Red Dragon Inn 4", + "year": 2013, + "description": "In The Red Dragon Inn 4, you and your friends are a party of heroic, fantasy adventurers. You've raided the dungeon, killed the monsters, and taken their treasure. Now you're back in our homeland, and what better way to celebrate your most recent victory than to spend an evening at the Red Dragon Inn. You and your adventuring companions will spend the night drinking, gambling, and roughhousing. The last person who is both sober enough to remain conscious and shrewd enough to hold onto his Gold Coins wins the game.\n\nNow you've taken to the high seas aboard The Crimson Drake, a sturdy sailing vessel that the heroes you know and love use when their adventures take them to sea. Join the crew in the Captain Whitehawk's cabin for a pint and try to keep your sea legs!\n\n\n Captain Whitehawk: Captain Whitehawk is the stalwart master of the Crimson Drake. She's a natural leader with years of experience and a wit as sharp as her saber. She’ll take the crew to hell and back for adventure and loot, and make damn sure they have a roaring good time while they're at it.\n First Mate Remy: An elf from faraway lands, Remy is an honor-bound swashbuckler who keeps the crew in line; he’ll be the first to step in and break up a fight. The seasoned sailors know to back down before they get on his bad side. \n Bryn the Boatswain: Bryn is tough as nails and knows how to keep a ship afloat. When she's not making repairs or loading provisions, she enjoys sparring with the crew… all of them… at the same time...\n Tara the Navigator: Tara was born blind, but with the gift of second sight. With her knack for seeing the future, she is an invaluable, if unlikely, navigator for the Crimson Drake. After predicting countless storms and monster attacks she has earned the trust of Captain Whitehawk and her crew.\n\n\nThe Red Dragon Inn 4 includes a Sea Event Deck that provides a new way to play RDI. Instead of the relative safety of the inn, players are now partying in the Captain's cabin aboard the Crimson Drake – and because you're out on an adventure, the party runs the risk of being interrupted by random encounters. In game terms, at the start of the game you shuffle the Sea Event Deck and place it in the middle of the table with two Progress Counters on it. You then play RDI like normal, but at the end of each player's turn, that player removes a Progress Counter from the Sea Event Deck. When you remove the last Progress Counter, reveal the top card and an Event takes place. The Sea Event Deck adds a new level of complexity to the base game. Not only will you need to protect yourself from the other players, as well as the Drink Deck, but you may find yourself forced to defend against a Sea Event. You could even end up working alongside other players to get a bonus from the various Events you'll see throughout a game.", + "image": "https://cf.geekdo-images.com/2OuiXWuDhdQmOjkRGjYnmQ__original/img/qclrtAPBsxakggyswrJikcBHSKk=/0x0/filters:format(jpeg)/pic1746008.jpg", + "thumbnail": "https://cf.geekdo-images.com/2OuiXWuDhdQmOjkRGjYnmQ__small/img/uqJquslTCu6xwrlhrS4tjNpkT6w=/fit-in/200x150/filters:strip_icc()/pic1746008.jpg", + "min_players": 2, + "max_players": 4, + "best_player_counts": [ + "4", + "4+" + ], + "playtime": 60, + "min_playtime": 60, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Cliff Bohm", + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Rose Besch", + "Kennon James", + "Beth Trott" + ], + "publishers": [ + "Hobby World", + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.32869, + "weight": 1.8125, + "rank": 3371, + "users_owned": 4110, + "version": { + "version_id": 657689, + "name": "English fourth edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 10.5, + "length_in": 10.5, + "depth_in": 2.1, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 10.5, + "length_in": 10.5, + "depth_in": 2.1, + "weight_lb": null, + "source": "version" + } + }, + "212662:367695": { + "bgg_id": 212662, + "type": "boardgame", + "name": "The Red Dragon Inn 6: Villains", + "year": 2017, + "description": "Description from the publisher:\n\nYou’ve spent all day dealing with meddlesome adventurers slaying your monsters and taking your stuff. Now it’s high time you kicked back for an evening at the Black Dragon Depths, the Undercity’s counterpart to The Red Dragon Inn. And wouldn’t you know it, your wicked “arch-colleagues” have had the same idea!\n\nDrink, gamble and roughhouse with your frenemies. Just remember to keep an eye on your gold, because your tablemates will be trying to take it from you, and if you run out, you’ll be spending the night wandering the dungeon. Oh… and try not to get too beaten up or drunk, because these cutthroats won’t hesitate to keep the party going without you – after looting your body for gold, of course!\n\nThis standalone game is fully compatible with all other Red Dragon Inn expansions. In addition, it includes rules and components for the following game mode variants:\n\n• Dungeon Events: The new Dungeon Event Deck adds zany new events that’ll be sure to spice up your time at the tavern, or kill you all trying!\n• Boss Battle: Choose a villain, ramp up their power level with Boss cards, then play in this ruthless all-versus-one mode!\n• Team Games: In addition to Boss Battle, this game includes rules for other team variants, including Two-Headed Dragon and Leaders and Lackeys.\n\n\nDaareka the Mindbreaker\n\nDaareka earned her title by breaking the minds of “lesser creatures” – her term for “everyone other than me”. She insists that you are having a good time, even though you’ve been buying all of her drinks and haven’t won a hand of cards yet. And anyway, it was your idea to come down to the tavern tonight… wasn’t it?\n\nThe Bad: This femme fatale makes sure you make all the right choices in life.\n\nThe Worse: She’s the one making the decisions for you.\n\nBaron von Vlazlo\n\nVlazlo is an ancient vampire – a super-strong sanguinary shapeshifter. However, he also has a quick wit and jovial nature which make him the enthralling unlife of the party! Avoid his amiable charm, or you could find yourself down a pint or two!\n\nThe Bad: He’s not looking for a pint of ale.\n\nThe Worse: “Don’t vorry. It’s joost a nibble.”\n\nAmundyr the Cursed\n\nAmundyr’s mummifying curse of undeath came from a desperate – but successful – effort to defend the ancient world from an endless stream of demons and dragons. These days, she takes on the far more mundane task of defending her tomb’s treasures from an endless stream of pesky adventurers.\n\nThe Bad: Her pet scarabs help her take care of those greedy dungeon-delvers.\n\nThe Worse: Those scarabs can give you a bad case of mummy rot.\n\n\nTorglesnarf Duncleton, First of His Name\n\nThe self-proclaimed “King of All Goblins”, Torglesnarf has reigned over his relatively minor brood-clan with the ironclad fists of the minions he pays liberally to make sure that nobody else more qualified takes his throne.\n\nThe Bad: Torglesnarf isn’t particularly intimidating or powerful.\n\nThe Worse: He is, however, clever enough to hire thugs who are!\n\nYou Get:\n\n4 new character decks\n Special Boss Battle cards for each character\n Vlazlo’s form decks\n Oversize Dungeon Event deck,\n Fortitude and Alcohol Content markers,\n Gold pieces and other tokens\n\nIncludes player mats and deck dividers that are compatible with The Red Dragon Inn 5: The Character Trove!", + "image": "https://cf.geekdo-images.com/tQ30J_b7ZS83TtBwTgdFmw__original/img/8ols8_laTY7dhZbuo05Mgbn8rMA=/0x0/filters:format(jpeg)/pic3653424.jpg", + "thumbnail": "https://cf.geekdo-images.com/tQ30J_b7ZS83TtBwTgdFmw__small/img/HWGDSyuzXa0o4pAAYtNAAIEpp1w=/fit-in/200x150/filters:strip_icc()/pic3653424.jpg", + "min_players": 2, + "max_players": 4, + "best_player_counts": [ + "3", + "4", + "4+" + ], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Erin Wong" + ], + "publishers": [ + "Hobby World", + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.85395, + "weight": 2.4, + "rank": 4801, + "users_owned": 2516, + "version": { + "version_id": 367695, + "name": "Eco-Collector's edition", + "year": 2017, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ] + }, + "stored_in": "173634", + "dims": { + "width_in": null, + "length_in": null, + "depth_in": null, + "weight_lb": null, + "source": "absent" + } + }, + "244258:421810": { + "bgg_id": 244258, + "type": "boardgame", + "name": "The Red Dragon Inn 7: The Tavern Crew", + "year": 2018, + "description": "All the heroes have (finally) turned in for the night, so it’s time to kick back with a mug of ale, a fist of dice, and pouches lined with adventurers’ gold! The Wench joins the party at The Red Dragon Inn and she’s bringing the rest of the tavern crew—Jasper the Bouncer, Molly the Stablehand, and Warthorn Redbeard—with her!\n\nThe Red Dragon Inn 7 is a new, 2-4 player standalone expansion to The Red Dragon Inn series of games. In this game, you and up to three of your friends will play as the staff of our beloved tavern, enjoying the night after all the adventuring patrons have passed out in their rooms (or stables). Of course this won’t be a quiet night of relaxation! Gamble, brawl and drink the night away as you prove you have what it takes to keep up with the heroes you handle night after night. The Red Dragon Inn 7 can be combined with all of our previous releases, letting you mix up the characters (and the mayhem) for games with four or more players!\n\nThe Collector’s Edition includes content not found in the standard Kickstarter edition:\n\n\n 8 Promo Drinks Cards (includes 2 new Kickstarter Promos that will be in all backer rewards. The Collector’s Edition will also include 2 new Promo Drinks that will be released later on in 2019 or thereafter for other promotions plus an additional 4 reprints that were never offered on Kickstarter before):\n\n\n- Ettinbrau\n- The Good Stuff! (*)\n- Half-Ogre Brew (+)\n- Iron Guts Lager\n- Ozrik’s Powerale (+)\n- Purified Potent Pixie Power Punch (+)\n- Wizgille’s Phenomenale (+)\n- Ye Olde Drink ’n’ Dice (*)\n\n\n 4 Bonus Red Dragon Inn Drink Coasters\n Enamel Inlay Dragon’s Breath Ale Turn Marker\n Collector’s Edition Box (or not, if the Eco-Collector’s Edition)\n\n\n(*) Also in the Kickstarter Edition.\n(+) Previously released.", + "image": "https://cf.geekdo-images.com/KhSqEP_vIBwhOBH30VFCNA__original/img/A9mr-8g1BsActvH8LLEADL-0xaY=/0x0/filters:format(png)/pic4146595.png", + "thumbnail": "https://cf.geekdo-images.com/KhSqEP_vIBwhOBH30VFCNA__small/img/dpfl247FtV71mrgdg5H_FbuCRBo=/fit-in/200x150/filters:strip_icc()/pic4146595.png", + "min_players": 2, + "max_players": 4, + "best_player_counts": [ + "4" + ], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Erin Wong" + ], + "publishers": [ + "SlugFest Games", + "Hobby World" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.8535, + "weight": 1.6, + "rank": 5105, + "users_owned": 2062, + "version": { + "version_id": 421810, + "name": "Eco edition", + "year": 2018, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 10.4331, + "length_in": 10.4331, + "depth_in": 1.1811, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 10.4331, + "length_in": 10.4331, + "depth_in": 1.1811, + "weight_lb": null, + "source": "version" + } + }, + "330097:557415": { + "bgg_id": 330097, + "type": "boardgame", + "name": "The Red Dragon Inn 8: Pub Crawl", + "year": 2022, + "description": "A new standalone expansion to the award-winning series! Our illustrious heroes have spent many an hour (and many a coin!) at Greyport's legendary tavern, the Red Dragon Inn. But even the most loyal customers want a change in scenery once in a while...So what do our heroes do when the same four tavern walls are getting a little dull? Pub crawl!\n\nThe Red Dragon Inn 8 introduces five new characters—the proprietors of five brand new taverns, plus a new play variant where players can travel around to multiple taverns rather than staying at the Red Dragon Inn.\n\n-- description from the Kickstarter\n\nThe Red Dragon Inn characters bar hop to other taverns and inns of the town (The Black Dragon Depths, The Harmonious Cup, Lucky's Rolling Barrel, The Scurvy Dog, Startusk's), discovering new drinks and characters (the tavern owners: Father Farai, Lucky the Scofflaw, Nerodia the Petrifier, Phyll Startusk, Samantha the Bookie). Each pub adds its own twist to the rules. Whenever a player reveals a Drink that includes one or more Chasers, the party pawn moves to a different open tavern after the Drink and any other pending effects are finished. Each tavern has an event that is triggered as the party arrives there. It also has its own Drink deck, and once that is exhausted, the tavern closes. The party crawls back to the Red Dragon Inn only once all other taverns have closed.", + "image": "https://cf.geekdo-images.com/DA_qffgMoU54XdB2zVhq4A__original/img/vvpmOyOz1bBzQcTMd3zRrPT1_pY=/0x0/filters:format(png)/pic6979257.png", + "thumbnail": "https://cf.geekdo-images.com/DA_qffgMoU54XdB2zVhq4A__small/img/as5aQqXhIWyzpToEr4rCeBoV0X8=/fit-in/200x150/filters:strip_icc()/pic6979257.png", + "min_players": 2, + "max_players": 5, + "best_player_counts": [ + "4" + ], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Kevin Adelsberger", + "Mike Cooling", + "Wesley Fader", + "Roy Fisher", + "Michael Foster", + "William Glenn", + "Dave Joria", + "Jennifer Kitzman", + "Devon Lieske", + "Jordan Mathis", + "Jeff Morrow", + "Ryan Tur", + "Sam Waller", + "Erin Wong" + ], + "artists": [ + "Erin Wong" + ], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.98173, + "weight": 2.0, + "rank": 8025, + "users_owned": 1266, + "version": { + "version_id": 557415, + "name": "English Eco-Kickstarter edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 10.4331, + "length_in": 10.4331, + "depth_in": 2.16535, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 10.4331, + "length_in": 10.4331, + "depth_in": 2.16535, + "weight_lb": null, + "source": "version" + } + }, + "380868:800879": { + "bgg_id": 380868, + "type": "boardgame", + "name": "The Red Dragon Inn 9: The Undercity", + "year": 2023, + "description": "You and your heroic companions have celebrated, brawled, and spent your hard earned gold night after night at Greyport’s legendary tavern. But what of those daring souls who make their lives beneath the cobblestone roads that take you to The Red Dragon Inn? Let’s take a trip down below, and visit the Undercity!\n\nThe Red Dragon Inn 9 introduces four new characters, all hailing from the Undercity of Greyport, each with their own mechanics and distinctive RDI flair. Play RDI9 by itself as a stand alone game, or combine it with any other copy of RDI or RDI:Allies to expand your roster of playable characters!\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/0FgUYfx9EXagzibb_DSAcw__original/img/2ncyqX25AJlYuUN6rnkvg452wSQ=/0x0/filters:format(png)/pic7371963.png", + "thumbnail": "https://cf.geekdo-images.com/0FgUYfx9EXagzibb_DSAcw__small/img/jPv25ZXjNZjBA0uN7JOvZrbOKCs=/fit-in/200x150/filters:strip_icc()/pic7371963.png", + "min_players": 2, + "max_players": 5, + "best_player_counts": [], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Geoff Bottone", + "Jennifer Kitzman", + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Anthony Cournoyer", + "Megan Langan", + "Beth Trott", + "Erin Wong" + ], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Fantasy", + "Humor", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 8.28455, + "weight": 2.0, + "rank": 11438, + "users_owned": 745, + "version": { + "version_id": 800879, + "name": "English Eco-Kickstarter edition", + "year": 2023, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 10.5118, + "length_in": 10.5118, + "depth_in": 1.37795, + "weight_lb": 2.31926 + }, + "stored_in": "173634", + "dims": { + "width_in": 10.5118, + "length_in": 10.5118, + "depth_in": 1.37795, + "weight_lb": 2.31926, + "source": "version" + } + }, + "302181:629307": { + "bgg_id": 302181, + "type": "boardgameexpansion", + "name": "The Red Dragon Inn: Allies – Evil Pooky", + "year": 2021, + "description": "Ancient teleport spells and alcohol do not mix...\n\nA late-night \"research\" session has opened a portal to unknown realms. From that portal leaps Pooky's evil doppelganger, ready to wreak havoc in our heroes' beloved tavern!\n\nThis product includes Evil Pooky, the 50th character for The Red Dragon Inn, plus a new drink deck, with 8 brand-new drinks. Evil Pooky is, of course, a villain, so he may also be played as a Boss in the Boss Battle variant. In addition, this product includes cards needed to play the original Pooky as a Boss in a Boss Battle!", + "image": "https://cf.geekdo-images.com/iMF99GTMWoI0TGL2MwR_Vw__original/img/84ex4NEFtwR1A4RBx493YyIYtzY=/0x0/filters:format(png)/pic5843049.png", + "thumbnail": "https://cf.geekdo-images.com/iMF99GTMWoI0TGL2MwR_Vw__small/img/bsm9TZhwegxp-LDhuOk132-6kGs=/fit-in/200x150/filters:strip_icc()/pic5843049.png", + "min_players": 2, + "max_players": 4, + "best_player_counts": [], + "playtime": 60, + "min_playtime": 30, + "max_playtime": 60, + "min_age": 13, + "designers": [ + "Jennifer Kitzman", + "Jeff Morrow", + "Sam Waller", + "Erin Wong" + ], + "artists": [ + "Rose Besch", + "Megan Langan", + "Erin Wong" + ], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Expansion for Base-game", + "Card Game", + "Fantasy", + "Humor", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 8.0625, + "weight": 0.0, + "rank": null, + "users_owned": 922, + "version": { + "version_id": 629307, + "name": "Retail second edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 4.0, + "length_in": 8.625, + "depth_in": 1.25, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 4.0, + "length_in": 8.625, + "depth_in": 1.25, + "weight_lb": null, + "source": "version" + } + }, + "174922:657858": { + "bgg_id": 174922, + "type": "boardgameexpansion", + "name": "The Red Dragon Inn: Allies – Halden the Unhinged", + "year": 2015, + "description": "Halden is a totem-summoning shaman with an undying amount of work to do – his ghostly clientele provides him with plenty of unusual quests. Adventuring for the dead will take its toll on anyone. After all, wouldn’t you be a little off-kilter if you had to listen to restless spirits with unfinished business?\n\n\n The Good: Halden can draw on the wisdom and power of countless lifetimes.\n\n\n\n The Bad: His totems would like to remind you that he isn’t making up the voices in his head.\n\n\nThe Red Dragon Inn: Allies – Halden the Unhinged brings a totem shaman to The Red Dragon Inn. Will you be able to master chaining his totems to maximum effect, or will your totem combos whimper? Take this off-kilter adventurer for a spin and find out!\n\nThe Red Dragon Inn: Allies is a series of expansions for any standalone The Red Dragon Inn game. Each Allies set includes a single Character Deck, plus components to add a brand new character to your game.", + "image": "https://cf.geekdo-images.com/NqR4UvZn9wnnjii1NENRvA__original/img/1mUVCMHS-yZQvQMH7DfNkz6Nceo=/0x0/filters:format(png)/pic2618519.png", + "thumbnail": "https://cf.geekdo-images.com/NqR4UvZn9wnnjii1NENRvA__small/img/KImlr0ENQE5Fl0-aWE9O-thUBxU=/fit-in/200x150/filters:strip_icc()/pic2618519.png", + "min_players": 2, + "max_players": 5, + "best_player_counts": [ + "4" + ], + "playtime": 0, + "min_playtime": 45, + "max_playtime": 0, + "min_age": 13, + "designers": [], + "artists": [], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Expansion for Base-game", + "Fantasy", + "Humor" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.68642, + "weight": 2.0, + "rank": null, + "users_owned": 1559, + "version": { + "version_id": 657858, + "name": "English third edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 3.5, + "length_in": 5.0, + "depth_in": 1.0, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 3.5, + "length_in": 5.0, + "depth_in": 1.0, + "weight_lb": null, + "source": "version" + } + }, + "442637:752778": { + "bgg_id": 442637, + "type": "boardgameexpansion", + "name": "The Red Dragon Inn: Allies – Jin vs Greppa", + "year": 2025, + "description": "It’s the battle of the bards at the Red Dragon Inn! Two new bards storm into the tavern—one who encourages patrons to get up on stage and sing, the other who’ll get on stage herself to dish out insults.\n\nThe friendly and popular Jin joins the hardcore snark-master Greppa in this new two-character expansion!\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/d-OikNeqC_2SXRStAed06w__original/img/VaiaFa5u_lvDREjBjzeR-YeeaqQ=/0x0/filters:format(png)/pic8795782.png", + "thumbnail": "https://cf.geekdo-images.com/d-OikNeqC_2SXRStAed06w__small/img/RwOBjjYI-RW2KVf4dEthcO6tMK8=/fit-in/200x150/filters:strip_icc()/pic8795782.png", + "min_players": 2, + "max_players": 4, + "best_player_counts": [], + "playtime": 0, + "min_playtime": 0, + "max_playtime": 0, + "min_age": 0, + "designers": [], + "artists": [], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Expansion for Base-game", + "Card Game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Take That", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 8.2, + "weight": 0.0, + "rank": null, + "users_owned": 245, + "version": { + "version_id": 752778, + "name": "English Kickstarter edition", + "year": 2025, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 8.26772, + "length_in": 3.93701, + "depth_in": 1.29921, + "weight_lb": 0.79366 + }, + "stored_in": "173634", + "dims": { + "width_in": 8.26772, + "length_in": 3.93701, + "depth_in": 1.29921, + "weight_lb": 0.79366, + "source": "version" + } + }, + "403503:712612": { + "bgg_id": 403503, + "type": "boardgameexpansion", + "name": "The Red Dragon Inn: Allies – Melvyn vs. Marah", + "year": 2024, + "description": "The Greyport Mages' Collegium is the premiere school of magic in all the land. But what happens when one of its professors goes rogue? Well, then, it's up to our heroes to stop her!\n\nThis new two-character expansion includes the friendly Collegium librarian, Melvyn, as well as the turncoat teacher of defensive magic, Marah!\n\nThis mod shows off the work in progress decks for both Melvyn and Marah, as well as select other characters from other expansions. Try out the new characters in classic free for all play, or with the Pub Crawl or Boss Battle mechanics!\n\n—description from the publisher\n\nThere is also a Kickstarter Edition that, alongside alternate box printing, has the bonus drink card Thirsty Thirsty Dragons! and three bonus prize cards:\n\n\n Arcane MacGuffin\n Certificate of Guffin\n Zot's Lucky Dice", + "image": "https://cf.geekdo-images.com/2F3s0L8rJIcVSi4V6LFgUA__original/img/Tf2AEBMBRSz__3JqWPjPVMWBizw=/0x0/filters:format(png)/pic7796760.png", + "thumbnail": "https://cf.geekdo-images.com/2F3s0L8rJIcVSi4V6LFgUA__small/img/_z3mKychtGi-UYnJbBbZiWooUp8=/fit-in/200x150/filters:strip_icc()/pic7796760.png", + "min_players": 2, + "max_players": 5, + "best_player_counts": [], + "playtime": 90, + "min_playtime": 30, + "max_playtime": 90, + "min_age": 13, + "designers": [ + "Geoff Bottone", + "Jennifer Kitzman", + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Andrew Caputo", + "Cold FuZion Studios", + "Megan Langan", + "Drew Morrow", + "Beth Trott", + "Erin Wong" + ], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Expansion for Base-game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Player Elimination", + "Take That", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 8.56522, + "weight": 0.0, + "rank": null, + "users_owned": 372, + "version": { + "version_id": 712612, + "name": "English Kickstarter edition", + "year": 2024, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 8.46457, + "length_in": 4.01575, + "depth_in": 1.5748, + "weight_lb": 0.92594 + }, + "stored_in": "173634", + "dims": { + "width_in": 8.46457, + "length_in": 4.01575, + "depth_in": 1.5748, + "weight_lb": 0.92594, + "source": "version" + } + }, + "125472:629302": { + "bgg_id": 125472, + "type": "boardgameexpansion", + "name": "The Red Dragon Inn: Allies – Pooky", + "year": 2012, + "description": "While the master's away, the familiar will play! Zot's turning in early for the night, but Pooky's not done with the party. With a stash of gold and a big chip on his wee shoulder, this strange little rabbit-thing is looking to prove he's more than just Zot's whipping bunny.\n\n\n The Good: In the dungeon, Pooky's psychotic behavior has gotten the party out of some pretty nasty jams.\n The Bad: That rabbit is even more insane without Zot's influence. Seriously.\n\n\nThe Red Dragon Inn: Allies - Pooky lets the little white rabbit wreck havoc all on his own! This forty-card deck isn't an expansion for Zot the Wizard from The Red Dragon Inn, but rather allows Pooky to be a fifth character at the table and party with The Party. Bringing all his nature and vices to the table, get ready to see Pooky start partying a bit too hard for the rest of the table.\n\nThe Red Dragon Inn: Allies is a new series of expansions for any standalone The Red Dragon Inn game. Each Allies set includes a single Character Deck, plus components to add a brand new character to your game.", + "image": "https://cf.geekdo-images.com/pzsWiHixQ3QLEq364gcn8A__original/img/uXfTJe7bZAF3h8Hz8t31Mc6I850=/0x0/filters:format(jpeg)/pic1328448.jpg", + "thumbnail": "https://cf.geekdo-images.com/pzsWiHixQ3QLEq364gcn8A__small/img/YUEf0HzIH7633QCUjqnRGJHIf1g=/fit-in/200x150/filters:strip_icc()/pic1328448.jpg", + "min_players": 2, + "max_players": 5, + "best_player_counts": [ + "4", + "5" + ], + "playtime": 45, + "min_playtime": 45, + "max_playtime": 45, + "min_age": 13, + "designers": [ + "Cliff Bohm", + "Jeff Morrow", + "Sam Waller" + ], + "artists": [ + "Kennon James", + "Drew Morrow", + "Beth Trott" + ], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Expansion for Base-game", + "Fantasy", + "Humor", + "Medieval", + "Party Game" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.64921, + "weight": 2.0, + "rank": null, + "users_owned": 3502, + "version": { + "version_id": 629302, + "name": "English fourth edition", + "year": 2021, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 3.5, + "length_in": 5.0, + "depth_in": 1.0, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 3.5, + "length_in": 5.0, + "depth_in": 1.0, + "weight_lb": null, + "source": "version" + } + }, + "168857:657857": { + "bgg_id": 168857, + "type": "boardgameexpansion", + "name": "The Red Dragon Inn: Allies – Wrench", + "year": 2015, + "description": "Wrench is a kobold artificer who has always been interested in gadgets and engineering. His voracious appetite for learning led him to the writings of Wizgille the Tinkerer, and eventually, to study with Wizgille herself.\n\n*The Good: He can quickly build gizmos that can do amazing things.\n*The Bad: Those gizmos are very fragile!\n\nThe Red Dragon Inn: Allies – Wrench expands the party at the Red Dragon Inn with an ingenious kobold whose gizmo cards stick around to help him out on later turns! Those gizmos will gradually break down, though, and the other players at the table can cause them to break down even faster!\n\nThe Red Dragon Inn: Allies is a series of expansions for any standalone The Red Dragon Inn game. Each Allies set includes a single Character Deck, plus components to add a brand new character to your game.", + "image": "https://cf.geekdo-images.com/HEc3AoMbW2giNA2NjTpRpg__original/img/5N7gCQ1Nt9YeQL3XzkEqYdnE4zc=/0x0/filters:format(png)/pic2423335.png", + "thumbnail": "https://cf.geekdo-images.com/HEc3AoMbW2giNA2NjTpRpg__small/img/KEZVtyubwWZOl-HDUnxW1MuNIs4=/fit-in/200x150/filters:strip_icc()/pic2423335.png", + "min_players": 2, + "max_players": 20, + "best_player_counts": [], + "playtime": 45, + "min_playtime": 45, + "max_playtime": 45, + "min_age": 13, + "designers": [], + "artists": [], + "publishers": [ + "SlugFest Games" + ], + "categories": [ + "Card Game", + "Expansion for Base-game", + "Fantasy", + "Humor", + "Medieval" + ], + "mechanics": [ + "Betting and Bluffing", + "Hand Management", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 7.67591, + "weight": 2.0, + "rank": null, + "users_owned": 1849, + "version": { + "version_id": 657857, + "name": "English third edition", + "year": 2020, + "publishers": [ + "SlugFest Games" + ], + "languages": [ + "English" + ], + "width_in": 3.5, + "length_in": 5.0, + "depth_in": 1.0, + "weight_lb": null + }, + "stored_in": "173634", + "dims": { + "width_in": 3.5, + "length_in": 5.0, + "depth_in": 1.0, + "weight_lb": null, + "source": "version" } } } diff --git a/src/bggpipe/templates/pages/help.html b/src/bggpipe/templates/pages/help.html index 1fd68a6..28c7a96 100644 --- a/src/bggpipe/templates/pages/help.html +++ b/src/bggpipe/templates/pages/help.html @@ -42,7 +42,7 @@

wrong match (inside the edit panel) — an auto-match landed on the wrong game (same-name impostors happen). This clears the match, re-searches immediately, and returns the title to Review as a fresh ballot of candidates (including same-named sibling editions); manual-id entry is there too for games BGG's search can't find. Note BGG sometimes splits one game's lineage across entries — Wiz-War's early editions and its FFG remake are separate games — so a copy whose edition isn't on the ballot may belong to the sibling entry.

add a game (top of the Titles page) — a game no photo shows: an expansion stored inside a base box, a game away from the shelves. It joins the list like any read (BGG wants base game and expansion as separate collection entries, so boxes that hold both need this for the hidden half), and if a later photo shows it, the sighting merges instead of duplicating.

change edition (on any matched line whose printing is set) — reopens the full edition list in Review; the current pick stays until you choose, so backing out loses nothing. Note the pipeline never edits a version already set on your BGG collection entry (strictly additive): if diff reports a "version disagreement", either fix the pipeline's pick here, or fix the entry by hand on BGG — the pipeline won't overwrite it.

-

search BGG and tick them off (inside the add panel) — for a box holding many games at once, like a compilation of two dozen expansions: search BGG once, tick every one that's in your box, and optionally name the container they all live inside. Each tick lands already matched — you picked it off BGG's own list, so resolve has nothing to re-derive; a pick whose name matches an undecided photo line decides that line instead of duplicating it. Contained games show "where it lives" in the Library, the container lists what's in it, and the shelf-space report knows they take no shelf of their own.

+

search BGG and tick them off (inside the add panel) — for a box holding many games at once, like a compilation of two dozen expansions: search BGG once, tick every one that's in your box, and optionally name the container they all live inside. Each tick lands already matched — you picked it off BGG's own list, so resolve has nothing to re-derive; a pick whose name matches an undecided photo line decides that line instead of duplicating it. Contained games show "where it lives" in the Library, the container lists what's in it, and the shelf-space report knows they take no shelf of their own. Containment is editable after the fact: every game's Library detail page has a "where it lives" card — change it, clear it, or declare it there anytime.

remove (inside the edit panel) — for lines that shouldn't exist at all: a book read as a game, box art misread as a title, or a duplicate read — the same physical copy read differently from two photos, leaving two lines for one box (remove the worse read; the survivor keeps its own photos). This is different from reject on the Review page, which keeps the line visible as "no BGG match" — right for real games BGG doesn't know. And the mirror case — ONE line that's really several physical copies — wants split, not remove.

Undo: each decision is one record in data/title_edits.json, data/title_splits.json, or data/title_removals.json — delete the record and the next rebuild restores the old state.

diff --git a/src/bggpipe/templates/pages/librarygame.html b/src/bggpipe/templates/pages/librarygame.html index c66ab86..ea0c53f 100644 --- a/src/bggpipe/templates/pages/librarygame.html +++ b/src/bggpipe/templates/pages/librarygame.html @@ -62,6 +62,33 @@ function localForm(g) { `; } +function wireStored(g) { + const btn = document.getElementById("editstored"); + if (!btn) return; + btn.addEventListener("click", async () => { + const form = document.getElementById("storedform"); + form.hidden = false; + btn.disabled = true; + const all = await fetchJSON("/api/library"); + const pick = document.getElementById("storedpick"); + pick.innerHTML = `` + all + .filter(o => o.bgg_id && o.bgg_id !== g.bgg_id) + .sort((a, b) => (a.name || "").localeCompare(b.name || "")) + .map(o => ``).join(""); + }); + document.getElementById("storedsave")?.addEventListener("click", async () => { + const res = await apiPost("/api/stored-in", { + key: KEY, container: document.getElementById("storedpick").value, + }); + if (res) { + showToast("saved — the shelf math knows"); + refresh(); + } + }); +} + function wireLocal(g) { const form = document.getElementById("localform"); if (form) form.addEventListener("submit", async e => { @@ -159,16 +186,24 @@ function render(g) {

No specific edition recorded — set one from the Titles page if you know it.

`; - const boxed = g.stored_in_game - ? `

Where it lives

-

This one has no box of its own — it lives - inside - ${esc(g.stored_in_game.name)}.

` - : g.stored_in - ? `

Where it lives

-

Stored inside BGG game - ${esc(g.stored_in)} (not in the library yet — run enrich).

` - : ""; + const boxed = `

Where it lives

+
+ ${g.stored_in_game + ? `

This one has no box of its own — it lives inside + + ${esc(g.stored_in_game.name)}. +

` + : g.stored_in + ? `

Stored inside BGG game ${esc(g.stored_in)} + (not in the library yet — run enrich). +

` + : `

In its own box on a shelf. +

`} + +
`; const contains = (g.contains || []).length ? `

In this box

${g.contains.map(c => @@ -195,6 +230,7 @@ function render(g) { ${g.description && !local ? `

About

${esc(g.description)}

` : ""}`; wireLocal(g); + wireStored(g); } async function refresh() { diff --git a/src/bggpipe/webreview.py b/src/bggpipe/webreview.py index 8be15a1..09b300d 100644 --- a/src/bggpipe/webreview.py +++ b/src/bggpipe/webreview.py @@ -211,6 +211,11 @@ class ResearchBody(BaseModel): types: str | None = None # e.g. "rpgitem" to search RPGGeek +class StoredInBody(BaseModel): + key: str # games.json key of the game being housed + container: str = "" # container's bgg_id; "" = its own box again + + class PickBody(BaseModel): picks: list[dict] # {bgg_id, name, year, type} straight from search stored_in: str = "" # container's bgg_id: all picks live in ONE box @@ -955,6 +960,61 @@ def create_app( raise HTTPException(404, "no such image") return FileResponse(target) + @app.post("/api/stored-in") + def api_stored_in(body: StoredInBody) -> dict: + """Declare (or clear) which box an already-cataloged game lives + inside. Updates the match rows (the durable record) and the + library entry in place, so the page reflects it immediately.""" + with lock: + revision["n"] += 1 + _refuse_if_rewriting() + freshen() + games = read_games() + entry = games.get(body.key) + if entry is None: + raise HTTPException(404, "no such game in the library") + container = body.container.strip() + if container: + if str(entry.get("bgg_id")) == container: + raise HTTPException(400, "a box cannot live inside itself") + holder = next( + (e for e in games.values() if str(e.get("bgg_id")) == container), + None, + ) + if holder is None: + raise HTTPException(400, "the container must be a cataloged game") + if str(holder.get("stored_in") or "") == str(entry.get("bgg_id")): + raise HTTPException(400, "that box already lives inside THIS one") + rows = read_matches(cfg.matches_path) + bgg_id = str(entry.get("bgg_id") or "") + version_id = str((entry.get("version") or {}).get("version_id") or "") + hit = False + for row in rows: + if bgg_id and row["bgg_id"] == bgg_id: + if version_id and row.get("version_id") != version_id: + continue + row["stored_in"] = container + hit = True + elif not bgg_id and body.key.startswith("local:"): + norm = body.key.split(":", 2)[1] + if ( + row["match_status"] == "local" + and normalize_title(row["title_raw"]) == norm + ): + row["stored_in"] = container + hit = True + if not hit: + raise HTTPException( + 409, "no match row backs this entry — re-run enrich first" + ) + write_matches(cfg.matches_path, rows) + entry["stored_in"] = container or None + atomic_write_text( + cfg.games_path, + json.dumps(games, indent=2, ensure_ascii=False) + "\n", + ) + return {"stored_in": container or None} + @app.get("/api/library/{key:path}") def api_library_game(key: str) -> dict: entries = library_entries() diff --git a/tests/test_webreview.py b/tests/test_webreview.py index faae47d..2ddf78f 100644 --- a/tests/test_webreview.py +++ b/tests/test_webreview.py @@ -1540,3 +1540,28 @@ def test_library_detail_shows_containment_both_ways(tmp_path): assert inside["stored_in_game"] == {"key": "173634", "name": "The Trove"} box = web.get("/api/library/173634").json() assert box["contains"] == [{"key": "999", "name": "Witchdoctor"}] + + # containment is editable after the fact: clear it, then set it back + assert web.post("/api/stored-in", json={"key": "999", "container": ""}).json() == { + "stored_in": None + } + rows2 = {r["bgg_id"]: r for r in read_matches(cfg.matches_path)} + assert rows2["999"]["stored_in"] == "" + assert "stored_in_game" not in web.get("/api/library/999").json() + + assert web.post( + "/api/stored-in", json={"key": "999", "container": "173634"} + ).json() == {"stored_in": "173634"} + assert read_matches(cfg.matches_path)[-1]["stored_in"] == "173634" + + # guards: self-containment and direct cycles refuse + assert ( + web.post("/api/stored-in", json={"key": "999", "container": "999"}).status_code + == 400 + ) + assert ( + web.post( + "/api/stored-in", json={"key": "173634", "container": "999"} + ).status_code + == 400 + )