diff --git a/data/furniture.json b/data/furniture.json index 91c3729..78d8e78 100644 --- a/data/furniture.json +++ b/data/furniture.json @@ -25,7 +25,8 @@ "zone": "party", "width_in": 13.25, "height_in": 13.25, - "depth_in": 15.4 + "depth_in": 15.4, + "description": "big boxes a-m" }, { "id": "library-kallax-b2", @@ -33,7 +34,8 @@ "zone": "party", "width_in": 13.25, "height_in": 13.25, - "depth_in": 15.4 + "depth_in": 15.4, + "description": "big boxes n-z" }, { "id": "library-kallax-b3", @@ -41,7 +43,8 @@ "zone": "party", "width_in": 13.25, "height_in": 13.25, - "depth_in": 15.4 + "depth_in": 15.4, + "description": "card rows standing" }, { "id": "library-kallax-b4", diff --git a/data/games.json b/data/games.json index 86dacac..c0b90c6 100644 --- a/data/games.json +++ b/data/games.json @@ -10862,5 +10862,568 @@ "weight_lb": null, "source": "version" } + }, + "291130:475387": { + "bgg_id": 291130, + "type": "boardgameexpansion", + "name": "Etherfields: 5th Player Expansion", + "year": 2020, + "description": "This expansion allows you to add a 5th player.\n\nThis is not only a 5th player expansion, but also an additional character to choose from for any other player count game. We called this character archetype Reaper.\n\nThis archetype will be based on wounds that this character has taken - the more, the better combos she will be able to execute. There will be multiple ways of using this to your advantage - either by full-on risky play or perhaps more focused on balance and getting a good healing deck build. The Reaper will provide quite interesting mechanics for the whole team!\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/irNTpn32rkT1BbR0cvbcvg__original/img/ASaUeBCashp4Y2PtS1NFMmxaAh0=/0x0/filters:format(jpeg)/pic5792667.jpg", + "thumbnail": "https://cf.geekdo-images.com/irNTpn32rkT1BbR0cvbcvg__small/img/6TczoQDunTYpVZAU6pAf_FzCsW8=/fit-in/200x150/filters:strip_icc()/pic5792667.jpg", + "min_players": 1, + "max_players": 5, + "best_player_counts": [ + "1", + "2" + ], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 14, + "designers": [], + "artists": [ + "Ewa Labak", + "Michał Sałata" + ], + "publishers": [ + "Albi", + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [ + "Cooperative Game", + "Deck, Bag, and Pool Building" + ], + "producers": [], + "series": [], + "rating": 8.08151, + "weight": 3.0, + "rank": null, + "users_owned": 4083, + "version": { + "version_id": 475387, + "name": "English edition", + "year": 2020, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ], + "width_in": 12.2047, + "length_in": 12.2047, + "depth_in": 1.5748, + "weight_lb": 1.67551 + }, + "stored_in": null, + "dims": { + "width_in": 12.2047, + "length_in": 12.2047, + "depth_in": 1.5748, + "weight_lb": 1.67551, + "source": "version" + } + }, + "355873:597861": { + "bgg_id": 355873, + "type": "boardgameexpansion", + "name": "Etherfields: Awakened Items & Actions", + "year": 2022, + "description": "Originally available as part of Pack D from the Dice Tower 2021 Kickstarter campaign.\n\nA couple of new Actions and Items inspired by other games from the publisher.\n\nRules: To add these cards to the game, shuffle them into corresponding markets while setting up the game. They can be bought during the game using the normal rules.\n\nIncludes 5 cards:\nGrowing Crystals, Hibernation, Flick of Determination, A Great Wall, Menhir", + "image": "https://cf.geekdo-images.com/yHRhOGjndW2ZiAr0kajCrw__original/img/41Q110pcbM3sQ8rZO6wjk0tBp1Q=/0x0/filters:format(png)/pic9122177.png", + "thumbnail": "https://cf.geekdo-images.com/yHRhOGjndW2ZiAr0kajCrw__small/img/-bs7koBkaPPACqWNQneRVctXzIc=/fit-in/200x150/filters:strip_icc()/pic9122177.png", + "min_players": 1, + "max_players": 4, + "best_player_counts": [ + "1" + ], + "playtime": 0, + "min_playtime": 0, + "max_playtime": 0, + "min_age": 0, + "designers": [], + "artists": [ + "Ewa Labak", + "Michał Sałata" + ], + "publishers": [ + "Awaken Realms" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [], + "producers": [], + "series": [], + "rating": 7.40938, + "weight": 2.0, + "rank": null, + "users_owned": 425, + "version": { + "version_id": 597861, + "name": "English edition", + "year": 2022, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ], + "width_in": 3.54331, + "length_in": 2.44094, + "depth_in": 0.07874, + "weight_lb": 0.02205 + }, + "stored_in": null, + "dims": { + "width_in": 3.54331, + "length_in": 2.44094, + "depth_in": 0.07874, + "weight_lb": 0.02205, + "source": "version" + } + }, + "291131:475388": { + "bgg_id": 291131, + "type": "boardgameexpansion", + "name": "Etherfields: Funeral Witch Campaign", + "year": 2022, + "description": "Story\n\nFuneral Witch is a very mysterious and dark figure, representing, among other things, sadness, pain and regret after a loss. She can be moody, chaotic, temperamental but still seeks solace - at each encounter her behaviour changes completely from the previous one. Will we discover the key to these changes? If so, will it be easier for us to prepare for the next encounter with her?\n\nFluctuation, but also cyclicality is the rhythm in which this campaign will be played. Will we drown in the depths of black sorrow, or will we find a ray of light that will lead us to a mysterious goal?\n\nIn this story we will be accompanied by drabness, darkness and ruins.\n\nGameplay\n\nIn this campaign, one of the main attractions, distinguishing it from the others, is a special additional 48-page Book of Scripts. Normally, in Etherfields, all adventures, scripts, conversations, scenes, etc. are placed directly on cards and tiles, and the amount of text is heavily balanced by graphics. Here, much more is pure text, and it is mainly used to conduct very extensive dialogues with the characters of this campaign.\n\nFeatured dream locations\n\nWe will climb the stairs and ride up in the old elevator to the highest floors of a crumbling, half-broken, block of flats.\n\nWe will come across a strange cemetery, located on the roof of a building.\n\nWe will visit the Museum of Death and the Great Cathedral.\n\nWe will struggle with the snow void.\n\nAnd we will take part in a game of hide and seek.\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/f7y3OmX7gPDntwh3MoILVQ__original/img/1difMUpNk3Plm2gRU9XoDDFsw4s=/0x0/filters:format(jpeg)/pic7021519.jpg", + "thumbnail": "https://cf.geekdo-images.com/f7y3OmX7gPDntwh3MoILVQ__small/img/hMaVrSJU8FkIC49I8qN4p1dQ4OU=/fit-in/200x150/filters:strip_icc()/pic7021519.jpg", + "min_players": 1, + "max_players": 4, + "best_player_counts": [ + "2" + ], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 14, + "designers": [ + "Andrzej Betkiewicz", + "Michał Oracz" + ], + "artists": [ + "Piotr Gacek" + ], + "publishers": [ + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Adventure", + "Expansion for Base-game", + "Exploration", + "Fantasy", + "Miniatures" + ], + "mechanics": [ + "Cooperative Game", + "Deck, Bag, and Pool Building", + "Grid Movement", + "Modular Board", + "Role Playing", + "Storytelling" + ], + "producers": [], + "series": [], + "rating": 8.36117, + "weight": 3.0, + "rank": null, + "users_owned": 4014, + "version": { + "version_id": 475388, + "name": "English edition", + "year": 2022, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ] + }, + "stored_in": null, + "dims": { + "width_in": null, + "length_in": null, + "depth_in": null, + "weight_lb": null, + "source": "absent" + } + }, + "309202:507805": { + "bgg_id": 309202, + "type": "boardgameexpansion", + "name": "Etherfields: Search Mini Deck", + "year": 2020, + "description": "The World of Dreams is vast and ever changing. In order to make your dreamy adventures easier, you have learned how to search for the tiniest of clues. The Search mini-deck will allow you to look deeper into your own dreams. But will you like what you will find?\n\nContents: 1 Rules card and new Search mini-deck consisting of 8 cards.\n\nAvailable as part of the 2020 Dice Tower Kickstarter Contenders Pack.", + "image": "https://cf.geekdo-images.com/-_IQS09ZDOz2zE2C0YQPcw__original/img/3Xhfx0WTSNDRr3bKqGH4lcgklME=/0x0/filters:format(jpeg)/pic5930951.jpg", + "thumbnail": "https://cf.geekdo-images.com/-_IQS09ZDOz2zE2C0YQPcw__small/img/TLrgJs2e_qxcJHLi1HQQuyY9peE=/fit-in/200x150/filters:strip_icc()/pic5930951.jpg", + "min_players": 1, + "max_players": 4, + "best_player_counts": [ + "1" + ], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 12, + "designers": [ + "Michał Oracz" + ], + "artists": [ + "Piotr Gacek", + "Ewa Labak" + ], + "publishers": [ + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [ + "Deck, Bag, and Pool Building" + ], + "producers": [], + "series": [], + "rating": 7.57886, + "weight": 3.0, + "rank": null, + "users_owned": 612, + "version": { + "version_id": 507805, + "name": "English edition", + "year": 2020, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ], + "width_in": 3.50394, + "length_in": 2.48031, + "depth_in": 0.15748, + "weight_lb": 0.03968 + }, + "stored_in": null, + "dims": { + "width_in": 3.50394, + "length_in": 2.48031, + "depth_in": 0.15748, + "weight_lb": 0.03968, + "source": "version" + } + }, + "381209:651213": { + "bgg_id": 381209, + "type": "boardgameexpansion", + "name": "Etherfields: Shifting Story Promo Deck", + "year": 2023, + "description": "Originally available as part of the Man vs. Meeple Season 4 Kickstarter.\n\nAdd the Shifting Story card to the Wisdom card holder. Place the rest of the cards from this deck as a separate deck in the box - referred to as the Shifting Deck.\n\nYour goal is to look for the displayed objects on the Old Dreams. If you see an objection on the board, you may read the associated card in the Shifting deck. If you find all the objects in the Dreamworld, you will be able to read the story's conclusion.\n\nContains 8 cards (63x87mm):\n7 Object cards (B-H)\n1 Rules/Reference card (A)", + "image": "https://cf.geekdo-images.com/_T6cKdo8PfKVt175Sjqh9w__original/img/LEbdjO9H10aW4tDOKNef3nHCukU=/0x0/filters:format(jpeg)/pic7370593.jpg", + "thumbnail": "https://cf.geekdo-images.com/_T6cKdo8PfKVt175Sjqh9w__small/img/L1aHDe7zKnLeVeYsdc6FUqDNMtY=/fit-in/200x150/filters:strip_icc()/pic7370593.jpg", + "min_players": 1, + "max_players": 4, + "best_player_counts": [], + "playtime": 0, + "min_playtime": 0, + "max_playtime": 0, + "min_age": 0, + "designers": [], + "artists": [ + "Ewa Labak", + "Michał Sałata" + ], + "publishers": [ + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [], + "producers": [], + "series": [], + "rating": 7.0, + "weight": 0.0, + "rank": null, + "users_owned": 177, + "version": { + "version_id": 651213, + "name": "English edition", + "year": 2023, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ], + "width_in": 3.54331, + "length_in": 2.51969, + "depth_in": 0.07874, + "weight_lb": 0.03307 + }, + "stored_in": null, + "dims": { + "width_in": 3.54331, + "length_in": 2.51969, + "depth_in": 0.07874, + "weight_lb": 0.03307, + "source": "version" + } + }, + "290840:474978": { + "bgg_id": 290840, + "type": "boardgameexpansion", + "name": "Etherfields: Sphinx Campaign", + "year": 2022, + "description": "The Sphinx is one of the oldest cults and a symbol of wisdom and mystery. Since ancient times, this magnificent creature was a guardian of secret knowledge. In this campaign you will be on a quest to discover a deeply hidden mystery that will bring a revolution to the world ruled under the Sphinx entity... What will it be...? What answers will you need to find...?\n\nIn this campaign, gameplay will be an endless maze that players will need to go through. From a components standpoint, you will have labyrinth tiles that you will be able to connect to one another in many different ways to try to pass through. However, if you end up at a dead end, you will need to go back to the start and try again.\n\nSecret knowledge will be very handy here as these tiles will have a lot of hidden mechanics of which you will have no knowledge at the start of the campaign. Only after unlocking some of the Sphinx mysteries, will you see a path in a place you previously thought was a dead end.", + "image": "https://cf.geekdo-images.com/XUWGdPg-EMto9ODlBnGE3w__original/img/FuJq6qLrxLqgelZyD0exXecPgMk=/0x0/filters:format(jpeg)/pic7021586.jpg", + "thumbnail": "https://cf.geekdo-images.com/XUWGdPg-EMto9ODlBnGE3w__small/img/DrAvXaXk1ougO-jbsulRG34e4qo=/fit-in/200x150/filters:strip_icc()/pic7021586.jpg", + "min_players": 1, + "max_players": 4, + "best_player_counts": [ + "2" + ], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 14, + "designers": [ + "Michał Oracz" + ], + "artists": [ + "Piotr Gacek" + ], + "publishers": [ + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [ + "Cooperative Game", + "Deck, Bag, and Pool Building" + ], + "producers": [], + "series": [], + "rating": 8.00075, + "weight": 3.0, + "rank": null, + "users_owned": 3933, + "version": { + "version_id": 474978, + "name": "English edition", + "year": 2022, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ] + }, + "stored_in": null, + "dims": { + "width_in": null, + "length_in": null, + "depth_in": null, + "weight_lb": null, + "source": "absent" + } + }, + "386805:658656": { + "bgg_id": 386805, + "type": "boardgameexpansion", + "name": "Etherfields: Story Dice Expansion", + "year": 2024, + "description": "Introducing our latest innovation, the AR Vault: Story Dice. Elevate your gaming experience with fresh twists on storytelling, stunning dice, and unpredictable outcomes. Whether you're a tabletop RPG fanatic or a board game enthusiast, we've got you covered! Our Story Dice are 5e compatible, making them perfect for RPG players seeking something new and exciting. For Awaken Realms board game lovers, we offer dice expansions to bring an extra level of gameplay to your favorite games. Join us for the crowdfunding campaign and stay tuned for more exciting dice reveals. Get ready to roll with the AR Vault: Story Dice!\n\nLuck Die:\nWith this alternate Luck Die with a „high-risk, high-reward“ basis, players have a greater chance of rolling a critically good result, but be warned – the stakes are high, and there is also a greater chance of rolling a critically negative result.\n\nMovement Die: \nWith this alternative Movement Die there is an increased chance, that the opponent move less. But beware – this advantage comes at a cost. Using the alternate die will also buff the Entity, raising the stakes and adding a extra layer of tension to every move.\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/32-Zex3SY2iONm6YoHFOXg__original/img/xSAPlaWAm-eOBDA1mjyaNV1zaR4=/0x0/filters:format(jpeg)/pic8124079.jpg", + "thumbnail": "https://cf.geekdo-images.com/32-Zex3SY2iONm6YoHFOXg__small/img/aongQ-Yn_oftxbk14Zs2G9NW2aY=/fit-in/200x150/filters:strip_icc()/pic8124079.jpg", + "min_players": 1, + "max_players": 5, + "best_player_counts": [], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 12, + "designers": [ + "Michał Oracz" + ], + "artists": [], + "publishers": [ + "Awaken Realms" + ], + "categories": [ + "Expansion for Base-game", + "Adventure", + "Exploration", + "Fantasy", + "Miniatures" + ], + "mechanics": [ + "Cooperative Game", + "Deck, Bag, and Pool Building", + "Dice Rolling", + "Grid Movement", + "Modular Board", + "Role Playing", + "Solo / Solitaire Game", + "Storytelling", + "Variable Player Powers" + ], + "producers": [], + "series": [], + "rating": 8.175, + "weight": 0.0, + "rank": null, + "users_owned": 240, + "version": { + "version_id": 658656, + "name": "English edition", + "year": 2024, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ] + }, + "stored_in": null, + "dims": { + "width_in": null, + "length_in": null, + "depth_in": null, + "weight_lb": null, + "source": "absent" + } + }, + "351544:588185": { + "bgg_id": 351544, + "type": "boardgameexpansion", + "name": "Etherfields: Stretch Goals – Harpy & She-Wolf Campaigns", + "year": 2022, + "description": "The Harpy Campaign adds 30+ hours of game play and exploration and the Harpy miniature.", + "image": "https://cf.geekdo-images.com/4mOB7GMg4bWVtcNui4QV2w__original/img/NM8npv-uifjP1EbjyzPojJQjrAE=/0x0/filters:format(jpeg)/pic7021596.jpg", + "thumbnail": "https://cf.geekdo-images.com/4mOB7GMg4bWVtcNui4QV2w__small/img/DmUWOsnpF6-II8ZpaOYOfRoBweU=/fit-in/200x150/filters:strip_icc()/pic7021596.jpg", + "min_players": 1, + "max_players": 4, + "best_player_counts": [ + "2", + "3", + "4" + ], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 12, + "designers": [ + "Michał Oracz" + ], + "artists": [ + "Ewa Labak", + "Michał Sałata" + ], + "publishers": [ + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [], + "producers": [], + "series": [], + "rating": 8.14725, + "weight": 4.0, + "rank": null, + "users_owned": 4755, + "version": { + "version_id": 588185, + "name": "English edition", + "year": 2022, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ], + "width_in": 11.7, + "length_in": 11.7, + "depth_in": 2.8, + "weight_lb": 4.5327 + }, + "stored_in": null, + "dims": { + "width_in": 11.7, + "length_in": 11.7, + "depth_in": 2.8, + "weight_lb": 4.5327, + "source": "version" + } + }, + "291126:475383": { + "bgg_id": 291126, + "type": "boardgameexpansion", + "name": "Etherfields: Thorn Knight", + "year": 2020, + "description": "The Thorn Knight is not a standard additional character, such as the 4 basic ones (Gambler, Specialist, Tough Guy, Free Spirit) or fifth with the 5-player expansion(Reaper).\n\nThe Thorn Knight is an alternative and very specific character available to ALL players at any time. During any given game, any player may decide to play the Thorn Knight as his normal in-game character.\n\nDuring that particular game, the player will not be using his standard character. Instead, his character's soul will enter this empty shell and guide this soulless Golem into its next adventure. The Ether acquired by this player will be an Ether belonging to the Thorn Knight. After the game, you will be able to spend that Eather to buy additional cards for the Thorn Knight (from the overall Action cards). The same goes for The Action cards won by this player during this game - they will enter the Thorn Knight's deck.\n\nPlayers can take turns playing the Thorn Knight through different games, jointly and gradually expanding his starting deck, using his starting special abilities, and finally turning him into a powerful, full of combos, common weapon for special challenges.\n\n—description from the publisher", + "image": "https://cf.geekdo-images.com/kMb10YpuAZJZrT7ijArCbQ__original/img/si0dJo9JHr9d7h3r1QMKU6Uc-y8=/0x0/filters:format(jpeg)/pic5055223.jpg", + "thumbnail": "https://cf.geekdo-images.com/kMb10YpuAZJZrT7ijArCbQ__small/img/iMH7IdUdahv6Rxx_jsc4rE5kxvs=/fit-in/200x150/filters:strip_icc()/pic5055223.jpg", + "min_players": 1, + "max_players": 4, + "best_player_counts": [], + "playtime": 180, + "min_playtime": 90, + "max_playtime": 180, + "min_age": 14, + "designers": [ + "Michał Oracz" + ], + "artists": [ + "Piotr Gacek" + ], + "publishers": [ + "Awaken Realms", + "YOKA Games" + ], + "categories": [ + "Expansion for Base-game" + ], + "mechanics": [ + "Cooperative Game", + "Deck, Bag, and Pool Building" + ], + "producers": [], + "series": [], + "rating": 7.33862, + "weight": 3.0, + "rank": null, + "users_owned": 2804, + "version": { + "version_id": 475383, + "name": "English edition", + "year": 2020, + "publishers": [ + "Awaken Realms" + ], + "languages": [ + "English" + ] + }, + "stored_in": null, + "dims": { + "width_in": null, + "length_in": null, + "depth_in": null, + "weight_lb": null, + "source": "absent" + } } } diff --git a/data/locations.json b/data/locations.json new file mode 100644 index 0000000..ba37b49 --- /dev/null +++ b/data/locations.json @@ -0,0 +1,510 @@ +{ + "104590:117256": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "104710:117685": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "116:28201": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "1197:78624": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "1219:488621": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "124548:165214": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "125675:167657": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "125921:476263": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "1260:156689": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "1269:29705": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "128554:207529": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "1339:34390": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "137909:216474": { + "note": "", + "opening_id": "library-kallax-a2" + }, + "139443:202519": { + "note": "", + "opening_id": "library-kallax-b2" + }, + "13:347121": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "143884:453051": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "14535:29075": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "147370:231664": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "150925:225659": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "153999:280845": { + "note": "", + "opening_id": "library-kallax-b4" + }, + "156994:236280": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "157969:237864": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "160477:269392": { + "note": "", + "opening_id": "library-kallax-b4" + }, + "161928:245124": { + "note": "", + "opening_id": "library-kallax-a2" + }, + "163412:495998": { + "note": "", + "opening_id": "library-kallax-b4" + }, + "164:28465": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "165986:277137": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "166109:253058": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "166976:410382": { + "note": "", + "opening_id": "library-kallax-b4" + }, + "169124:451577": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "169784:260454": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "172225:296012": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "172503:265107": { + "note": "", + "opening_id": "library-kallax-b4" + }, + "173057:266044": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "173634:266954": { + "note": "", + "opening_id": "library-kallax-b2" + }, + "174430:520054": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "176:27673": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "177:24972": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "181304:536289": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "18755:284056": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "188614:779792": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "1927:28144": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "193485:300446": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "193621:300682": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "194655:668826": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "195314:525268": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "196105:304900": { + "note": "", + "opening_id": "library-kallax-b2" + }, + "201248:313478": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "202982:316090": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "2058:28041": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "207830:344075": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "208428:325455": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "20866:40025": { + "note": "", + "opening_id": "library-kallax-a2" + }, + "2197:42495": { + "note": "", + "opening_id": "library-kallax-b4" + }, + "220199:369805": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "224:20727": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "226065:353389": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "231302:361880": { + "note": "", + "opening_id": "library-kallax-a2" + }, + "2387:91428": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "240:24621": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "2452:288640": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "252153:404702": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "2524:219137": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "2529:98655": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "255984:701034": { + "note": "", + "opening_id": "library-kallax-d4" + }, + "257:520364": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "258:20840": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "269564:439948": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "26:28607": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "273240:446069": { + "note": "", + "opening_id": "library-kallax-b2" + }, + "27710:606657": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "280794:458300": { + "note": "", + "opening_id": "library-kallax-d3" + }, + "283155:462049": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "283766:463140": { + "note": "", + "opening_id": "library-kallax-d4" + }, + "291457:476060": { + "note": "", + "opening_id": "library-kallax-d3" + }, + "291847:476820": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "2980:138013": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "3090:25782": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "31260:297589": { + "note": "", + "opening_id": "library-kallax-d3" + }, + "312786:514050": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "3181:87931": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "320202:528008": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "324937:537230": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "329230:547518": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "332398:553061": { + "note": "", + "opening_id": "library-kallax-a2" + }, + "334011:701315": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "334065:759453": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "340420:567183": { + "note": "", + "opening_id": "library-kallax-b2" + }, + "352819:591147": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "35505:781669": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "358320:602661": { + "note": "", + "opening_id": "library-kallax-d4" + }, + "3585:211154": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "358880:603694": { + "note": "", + "opening_id": "library-kallax-d3" + }, + "362205:612448": { + "note": "", + "opening_id": "library-kallax-d4" + }, + "380837:650545": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "389113:662372": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "393672:669782": { + "note": "", + "opening_id": "library-kallax-d3" + }, + "39856:296529": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "40508:644326": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "40529:27692": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "40692:294178": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "419687:711400": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "42063:191736": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "4324:26859": { + "note": "", + "opening_id": "library-kallax-a2" + }, + "432858:734890": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "43443:103068": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "442312:752105": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "452833:770724": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "453845:772660": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "483:48522": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "50381:134539": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "57215:295423": { + "note": "", + "opening_id": "library-kallax-b1" + }, + "589:27352": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "65244:31208": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "71:24006": { + "note": "", + "opening_id": "library-kallax-d2" + }, + "822:187468": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "9209:294188": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "95386:290572": { + "note": "", + "opening_id": "library-kallax-a1" + }, + "9666:215137": { + "note": "", + "opening_id": "library-kallax-b3" + }, + "97903:231971": { + "note": "", + "opening_id": "library-kallax-d1" + }, + "local:cat crimes:IMG_4499.jpeg;IMG_4505.jpeg;shelf-20260803-215723.jpg": { + "note": "", + "opening_id": "library-kallax-c1" + }, + "local:cat stax:IMG_4544.jpeg": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "local:elite sportz equipment table top curling:IMG_4526.jpeg": { + "note": "", + "opening_id": "library-kallax-c2" + }, + "local:gravity maze:IMG_4510.jpeg": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "local:laser maze beam bending logic game:IMG_4516.jpeg": { + "note": "", + "opening_id": "library-kallax-c3" + }, + "local:ouija:IMG_4529.jpeg": { + "note": "", + "opening_id": "library-kallax-c4" + }, + "local:super mario checkers collector s edition:IMG_4508.jpeg": { + "note": "", + "opening_id": "library-kallax-c4" + } +} diff --git a/data/matches.csv b/data/matches.csv index 4d2c388..2897835 100644 --- a/data/matches.csv +++ b/data/matches.csv @@ -150,3 +150,12 @@ The Red Dragon Inn: Allies – Jin vs Greppa,442637,The Red Dragon Inn: Allies The Red Dragon Inn: Allies – Melvyn vs. Marah,403503,The Red Dragon Inn: Allies – Melvyn vs. Marah,2024,boardgameexpansion,approved,712612,English Kickstarter edition,version_approved,[],"[{""version_id"": 685052, ""name"": ""English edition"", ""year"": 2024, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 712612, ""name"": ""English Kickstarter edition"", ""year"": 2024, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 2}]",,,,173634 The Red Dragon Inn: Allies – Pooky,125472,The Red Dragon Inn: Allies – Pooky,2012,boardgameexpansion,approved,629302,English fourth edition,version_approved,[],"[{""version_id"": 167237, ""name"": ""English first edition"", ""year"": 2012, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 401403, ""name"": ""English second edition"", ""year"": 2015, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 0}, {""version_id"": 580866, ""name"": ""English third edition"", ""year"": 2018, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 0}, {""version_id"": 629302, ""name"": ""English fourth edition"", ""year"": 2021, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 0}, {""version_id"": 781893, ""name"": ""English fifth edition"", ""year"": 2025, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 0}]",,,,173634 The Red Dragon Inn: Allies – Wrench,168857,The Red Dragon Inn: Allies – Wrench,2015,boardgameexpansion,approved,657857,English third edition,version_approved,[],"[{""version_id"": 258498, ""name"": ""English first edition"", ""year"": 2015, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 657857, ""name"": ""English third edition"", ""year"": 2020, ""publishers"": [""SlugFest Games""], ""languages"": [""English""], ""score"": 0}]",,,,173634 +Etherfields: 5th Player Expansion,291130,Etherfields: 5th Player Expansion,2020,boardgameexpansion,approved,475387,English edition,version_approved,[],"[{""version_id"": 475387, ""name"": ""English edition"", ""year"": 2020, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 758501, ""name"": ""Chinese edition"", ""year"": 2021, ""publishers"": [""YOKA Games""], ""languages"": [""Chinese""], ""score"": 0}, {""version_id"": 518873, ""name"": ""French edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 0}, {""version_id"": 518875, ""name"": ""German edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 0}, {""version_id"": 518876, ""name"": ""Italian edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 0}, {""version_id"": 518878, ""name"": ""Polish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 0}, {""version_id"": 518879, ""name"": ""Spanish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 0}, {""version_id"": 762887, ""name"": ""Czech edition"", ""year"": 2024, ""publishers"": [""Albi""], ""languages"": [""Czech""], ""score"": 0}]",,,, +Etherfields: Awakened Items & Actions,355873,Etherfields: Awakened Items & Actions,2022,boardgameexpansion,approved,597861,English edition,version_approved,[],"[{""version_id"": 597861, ""name"": ""English edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}]",,,, +Etherfields: Funeral Witch Campaign,291131,Etherfields: Funeral Witch Campaign,2022,boardgameexpansion,approved,475388,English edition,version_approved,[],"[{""version_id"": 722494, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Awaken Realms"", ""YOKA Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 475388, ""name"": ""English edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 518859, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 518861, ""name"": ""German edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 518863, ""name"": ""Italian edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 518865, ""name"": ""Polish edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 518866, ""name"": ""Spanish edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}]",,,, +Etherfields: Search Mini Deck,309202,Etherfields: Search Mini Deck,2020,boardgameexpansion,approved,507805,English edition,version_approved,[],"[{""version_id"": 507805, ""name"": ""English edition"", ""year"": 2020, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 758508, ""name"": ""Chinese edition"", ""year"": 2023, ""publishers"": [""YOKA Games""], ""languages"": [""Chinese""], ""score"": 0}]",,,, +Etherfields: Shifting Story Promo Deck,381209,Etherfields: Shifting Story Promo Deck,2023,boardgameexpansion,approved,651213,English edition,version_approved,[],"[{""version_id"": 758494, ""name"": ""Chinese edition"", ""year"": 2023, ""publishers"": [""YOKA Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 651213, ""name"": ""English edition"", ""year"": 2023, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}]",,,, +Etherfields: Sphinx Campaign,290840,Etherfields: Sphinx Campaign,2022,boardgameexpansion,approved,474978,English edition,version_approved,[],"[{""version_id"": 722495, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Awaken Realms"", ""YOKA Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 474978, ""name"": ""English edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 518849, ""name"": ""French edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 518850, ""name"": ""German edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 518851, ""name"": ""Italian edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 518853, ""name"": ""Spanish edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 518852, ""name"": ""Polish edition"", ""year"": 2023, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 0}]",,,, +Etherfields: Story Dice Expansion,386805,Etherfields: Story Dice Expansion,2024,boardgameexpansion,approved,658656,English edition,version_approved,[],"[{""version_id"": 658656, ""name"": ""English edition"", ""year"": 2024, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 658660, ""name"": ""French edition"", ""year"": 2024, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 2}, {""version_id"": 658658, ""name"": ""German edition"", ""year"": 2024, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 2}, {""version_id"": 658661, ""name"": ""Italian edition"", ""year"": 2024, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 2}, {""version_id"": 658659, ""name"": ""Polish edition"", ""year"": 2024, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 2}, {""version_id"": 658657, ""name"": ""Spanish edition"", ""year"": 2024, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}]",,,, +Etherfields: Stretch Goals – Harpy & She-Wolf Campaigns,351544,Etherfields: Stretch Goals – Harpy & She-Wolf Campaigns,2022,boardgameexpansion,approved,588185,English edition,version_approved,[],"[{""version_id"": 722493, ""name"": ""Chinese edition"", ""year"": 2022, ""publishers"": [""Awaken Realms"", ""YOKA Games""], ""languages"": [""Chinese""], ""score"": 2}, {""version_id"": 588185, ""name"": ""English edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 669930, ""name"": ""Spanish edition"", ""year"": 2022, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 2}, {""version_id"": 640104, ""name"": ""French edition"", ""year"": 2023, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 0}, {""version_id"": 653469, ""name"": ""German edition"", ""year"": 2023, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 0}, {""version_id"": 647233, ""name"": ""Italian edition"", ""year"": 2023, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 0}, {""version_id"": 653623, ""name"": ""Polish edition"", ""year"": 2023, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 0}]",,,, +Etherfields: Thorn Knight,291126,Etherfields: Thorn Knight,2020,boardgameexpansion,approved,475383,English edition,version_approved,[],"[{""version_id"": 475383, ""name"": ""English edition"", ""year"": 2020, ""publishers"": [""Awaken Realms""], ""languages"": [""English""], ""score"": 2}, {""version_id"": 758493, ""name"": ""Chinese edition"", ""year"": 2021, ""publishers"": [""YOKA Games""], ""languages"": [""Chinese""], ""score"": 0}, {""version_id"": 518880, ""name"": ""French edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""French""], ""score"": 0}, {""version_id"": 518881, ""name"": ""German edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""German""], ""score"": 0}, {""version_id"": 518882, ""name"": ""Italian edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Italian""], ""score"": 0}, {""version_id"": 518884, ""name"": ""Polish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Polish""], ""score"": 0}, {""version_id"": 518886, ""name"": ""Spanish edition"", ""year"": 2021, ""publishers"": [""Awaken Realms""], ""languages"": [""Spanish""], ""score"": 0}]",,,, diff --git a/data/title_additions.json b/data/title_additions.json index 5c9c434..aeb3883 100644 --- a/data/title_additions.json +++ b/data/title_additions.json @@ -178,5 +178,95 @@ "language_hint": "", "art_notes": "", "source_photos": [] + }, + { + "title_raw": "Etherfields: 5th Player Expansion", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2020, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Awakened Items & Actions", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Funeral Witch Campaign", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Search Mini Deck", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2020, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Shifting Story Promo Deck", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2023, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Sphinx Campaign", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Story Dice Expansion", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2024, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Stretch Goals – Harpy & She-Wolf Campaigns", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [] + }, + { + "title_raw": "Etherfields: Thorn Knight", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2020, + "language_hint": "", + "art_notes": "", + "source_photos": [] } ] diff --git a/data/titles.json b/data/titles.json index 5a5f28b..f0cf075 100644 --- a/data/titles.json +++ b/data/titles.json @@ -1944,5 +1944,104 @@ "art_notes": "", "source_photos": [], "title_normalized": "red dragon inn allies wrench" + }, + { + "title_raw": "Etherfields: 5th Player Expansion", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2020, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields 5th player expansion" + }, + { + "title_raw": "Etherfields: Awakened Items & Actions", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields awakened items and actions" + }, + { + "title_raw": "Etherfields: Funeral Witch Campaign", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields funeral witch campaign" + }, + { + "title_raw": "Etherfields: Search Mini Deck", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2020, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields search mini deck" + }, + { + "title_raw": "Etherfields: Shifting Story Promo Deck", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2023, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields shifting story promo deck" + }, + { + "title_raw": "Etherfields: Sphinx Campaign", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields sphinx campaign" + }, + { + "title_raw": "Etherfields: Story Dice Expansion", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2024, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields story dice expansion" + }, + { + "title_raw": "Etherfields: Stretch Goals – Harpy & She-Wolf Campaigns", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2022, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields stretch goals harpy and she wolf campaigns" + }, + { + "title_raw": "Etherfields: Thorn Knight", + "confidence": "high", + "publisher_hint": "", + "edition_hint": "", + "year_hint": 2020, + "language_hint": "", + "art_notes": "", + "source_photos": [], + "title_normalized": "etherfields thorn knight" } ] diff --git a/data/upload_log.csv b/data/upload_log.csv index dc1a692..e884be5 100644 --- a/data/upload_log.csv +++ b/data/upload_log.csv @@ -194,3 +194,12 @@ add,442637,,The Red Dragon Inn: Allies – Jin vs Greppa,752778,,added,2026-08-0 add,403503,,The Red Dragon Inn: Allies – Melvyn vs. Marah,712612,,added,2026-08-09T16:25:40+00:00, add,125472,,The Red Dragon Inn: Allies – Pooky,629302,,added,2026-08-09T16:25:47+00:00, add,168857,,The Red Dragon Inn: Allies – Wrench,657857,,added,2026-08-09T16:25:54+00:00, +add,291130,,Etherfields: 5th Player Expansion,475387,,added,2026-08-09T18:47:14+00:00, +add,355873,,Etherfields: Awakened Items & Actions,597861,,added,2026-08-09T18:47:22+00:00, +add,291131,,Etherfields: Funeral Witch Campaign,475388,,added,2026-08-09T18:47:30+00:00, +add,309202,,Etherfields: Search Mini Deck,507805,,added,2026-08-09T18:47:37+00:00, +add,381209,,Etherfields: Shifting Story Promo Deck,651213,,added,2026-08-09T18:47:46+00:00, +add,290840,,Etherfields: Sphinx Campaign,474978,,added,2026-08-09T18:47:54+00:00, +add,386805,,Etherfields: Story Dice Expansion,658656,,added,2026-08-09T18:48:00+00:00, +add,351544,,Etherfields: Stretch Goals – Harpy & She-Wolf Campaigns,588185,,added,2026-08-09T18:48:08+00:00, +add,291126,,Etherfields: Thorn Knight,475383,,added,2026-08-09T18:48:17+00:00, diff --git a/data/zones_draft.csv b/data/zones_draft.csv new file mode 100644 index 0000000..a4fd1e9 --- /dev/null +++ b/data/zones_draft.csv @@ -0,0 +1,131 @@ +name,opening +Gloomhaven,A1 +History of the World,A1 +Age of Renaissance,A1 +Simon's Cat Card Game,A1 +Skip-Bo,A1 +Snappy Dressers,A1 +Tem-Purr-A,A1 +Everdell: The Complete Collection,A2 +Bugs in the Kitchen,A2 +Risk: The Lord of the Rings,A2 +The Cat Game,A2 +The Rocky Horror Trivia Game,A2 +Utter Nonsense,A2 +Dixit,B1 +Flick 'em Up!,B1 +Googly Eyes,B1 +Meteor,B1 +Mysterium,B1 +Sheriff of Nottingham,B1 +Sheriff of Nottingham: Merry Men,B1 +Speechless,B2 +Superfight,B2 +The Red Dragon Inn,B2 +The Red Dragon Inn 5: The Character Trove,B2 +The Red Dragon Inn Smorgasbox,B2 +Throw Throw Avocado,B2 +"Before I Kill You, Mister Spy...",B3 +Bluffaneer,B3 +Captain Marvel: Secret Skrulls,B3 +Cards Against Humanity,B3 +Code Master,B3 +Farkle,B3 +Fluxx,B3 +Give Me the Brain!,B3 +Go Fish Yourself,B3 +Greed Quest,B3 +Jenga,B3 +Joking Hazard,B3 +Kill Doctor Lucky,B3 +Poetry for Neanderthals,B3 +Rook,B3 +Scrawl,B3 +"...and then, we held hands.",B4 +Consentacle,B4 +Kensington,B4 +Mage Wars Academy,B4 +Onitama,B4 +Patchwork,B4 +5-Minute Dungeon,C1 +A Gentle Rain,C1 +Artistry,C1 +Artistry: Delightful Doorways Mini Expansion,C1 +Blink,C1 +Botany,C1 +Botany: Perilous Perfumes,C1 +Botany: Tantalizing Trees,C1 +Calico,C1 +Carcassonne,C1 +Castle Panic,C1 +Castle Panic: The Dark Titan,C1 +Castle Panic: The Wizard's Tower,C1 +CAT CRIMES,C1 +CAT STAX,C2 +Catan,C2 +Catan Dice Game,C2 +Catan: Junior,C2 +Cosmic Encounter,C2 +Dastardly Dirigibles,C2 +Deadly Doodles,C2 +Doctor Who: The Card Game,C2 +Doctor Who: The Game of Time & Space,C2 +Dragon Land,C2 +Dungeon!,C2 +Elite Sportz Equipment Table Top Curling,C2 +Evolution: The Beginning,C2 +Exploding Kittens,C2 +Forbidden Island,C3 +GRAVITY MAZE,C3 +Guillotine,C3 +Herbaceous,C3 +Hold Your Breath!,C3 +Huggermugger,C3 +Labyrinth,C3 +LASER MAZE BEAM-BENDING LOGIC GAME,C3 +Machi Koro,C3 +Mantis Falls,C3 +Munchkin,C3 +Munchkin Big Box,C3 +Murder at the Manor,C3 +"No Thank You, Evil!",C3 +Ouija,C4 +Pie Face!,C4 +Rivals,C4 +Robot Turtles,C4 +Royals,C4 +Santorini,C4 +Scrabble Slam!,C4 +Skylanders Portal Master,C4 +Small World,C4 +Sorcerer: The Game of Magical Conflict,C4 +SPANC: Space Pirate Amazon Ninja Catgirls,C4 +Super Mario Checkers Collector's Edition,C4 +Tang Garden,C4 +Terror in Meeple City,D1 +The Doom That Came to Atlantic City,D1 +The Office Trivia Game,D1 +The Simpsons Trivia Game,D1 +Ticket to Ride,D1 +Verdant,D1 +Völuspá,D1 +Walk the Plank!,D1 +Wiz-War,D1 +Wiz-War (Eighth Edition),D1 +Wiz-War (9th Edition),D1 +Advanced Civilization,D2 +Britannia,D2 +Civilization,D2 +Civilization: West Extension Map,D2 +Diplomacy,D2 +Flat Top,D2 +StarForce 'Alpha Centauri': Interstellar Conflict in the 25th Century,D2 +Agricola,D3 +Etherfields,D3 +Etherfields: Kittenburg Expansion,D3 +Gloomhaven: Buttons & Bugs,D3 +Gloomhaven: Jaws of the Lion,D3 +Sleeping Gods,D4 +Sleeping Gods: Distant Skies,D4 +Sleeping Gods: Primeval Peril,D4 +Sleeping Gods: Tides of Ruin,D4 diff --git a/docs/guide.md b/docs/guide.md index 474374b..ea8620c 100644 --- a/docs/guide.md +++ b/docs/guide.md @@ -145,14 +145,24 @@ chains (minis in an insert in a big box live where the big box does). On a phone over `--lan`, the opening view docks as a bottom sheet — the moving-day loop is search, tap, done. +When you publish with `bggpipe export`, the shelves come too: game pages +say where each box lives, containers list their contents, and a shelves +page draws the wall as it physically stands, every opening linking its +residents. Publishing your shelf layout is a choice — `--no-shelves` +keeps the whole layer out of the export. + Bulk-load a reviewed plan with `bggpipe shelve --import plan.csv` (columns `name,opening`, accepting opening ids or labels) — rejects are reported (unknown name, ambiguous copies, unknown opening, doesn't fit, lives inside another box), never guessed, and re-imports preserve hand-entered notes. `bggpipe dims` reports per-opening capacity, overfull warnings, and -misfits against your real furniture. Fill bars measure stacked thickness -against interior height (boxes lying flat); unmeasured boxes are counted -and shown, never silently assumed to fit. +misfits against your real furniture. Capacity uses a **two-lane packing +model**: each opening holds a flat stack (thinnest axes summing against +interior height, claiming the widest flat box's width) and a standing lane +beside it (boxes on edge against the remaining width) — the largest boxes +lie flat, smaller ones stand, and you can flip any box's lane in the +opening's view. An opening warns only when *no* packing fits. Unmeasured +boxes are counted and shown, never silently assumed to fit. ## Shelf-space planning diff --git a/src/bggpipe/cli.py b/src/bggpipe/cli.py index 6796b6e..64043ab 100644 --- a/src/bggpipe/cli.py +++ b/src/bggpipe/cli.py @@ -229,13 +229,21 @@ def export( str, typer.Option("--title", help="Site title shown on every page"), ] = "My Game Library", + no_shelves: Annotated[ + bool, + typer.Option( + "--no-shelves", + help="Omit the shelves page and locations (publishing your " + "shelf layout is a choice)", + ), + ] = False, config: ConfigOpt = None, ) -> None: """Export the library as self-contained static pages (for a blog etc.).""" from bggpipe.export import run_export cfg = load_config(config) - summary = run_export(cfg, out, title=title) + summary = run_export(cfg, out, title=title, include_shelves=not no_shelves) if summary["failures"]: # scripted `export && rsync` must not publish an incomplete site raise typer.Exit(code=1) diff --git a/src/bggpipe/dims.py b/src/bggpipe/dims.py index 21435fc..ae2a111 100644 --- a/src/bggpipe/dims.py +++ b/src/bggpipe/dims.py @@ -118,16 +118,22 @@ def run_dims_report(cfg: Config) -> dict: f" {opening['unit']} · {opening['label']}" f" ({dims_note}): {report['games']} game(s)" ) - if report["stacked_in"]: - line += f', {report["stacked_in"]:g}" stacked' + if report["flat_in"]: + line += f', {report["flat_in"]:g}" flat stack' + if report["standing_in"]: + line += f', {report["standing_in"]:g}" standing' if report["unmeasured"]: line += f", {report['unmeasured']} unmeasured" if report["overfull"]: - line += " ⚠ OVERFULL" + line += " ⚠ NO PACKING FITS" typer.echo(line) - for name in report["misfits"]: + for name in report["laneless"]: misfit_names.append(name) - typer.echo(f" ⚠ doesn't fit: {name}") + typer.echo(f" ⚠ no lane can take: {name}") + for name in report["misfits"]: + if name not in misfit_names: + misfit_names.append(name) + typer.echo(f" ⚠ doesn't fit this opening at all: {name}") homeless = [ entry.get("name") or "?" for key, entry in games.items() diff --git a/src/bggpipe/export.py b/src/bggpipe/export.py index b5db5ce..3051012 100644 --- a/src/bggpipe/export.py +++ b/src/bggpipe/export.py @@ -26,6 +26,12 @@ import typer from bggpipe.config import Config from bggpipe.fsio import atomic_write_bytes, atomic_write_text +from bggpipe.shelves import ( + effective_location, + load_furniture, + load_locations, + opening_index, +) # records which slugs THIS export owns, and their key assignments: slug # stability across runs (a published URL never changes or is stolen) and @@ -61,8 +67,9 @@ def _slugs(games: dict[str, dict], prior: dict[str, str]) -> dict[str, str]: rename), and a new key can never steal one — collisions take -2, -3... in sorted-key order.""" out: dict[str, str] = {k: v for k, v in prior.items() if k in games} - # "art" is the asset directory: a game named Art must not move in - taken: set[str] = set(out.values()) | {"art"} + # "art" is the asset directory and "shelves" is the wall page: games + # named Art or Shelves must not move in + taken: set[str] = set(out.values()) | {"art", "shelves"} for key in sorted(games): if key in out: continue @@ -211,6 +218,12 @@ main > .meta { color:var(--ink-soft-on-sky); } .card { background:var(--board); border:1px solid var(--line); border-radius:.8rem; padding:.9rem 1.1rem; margin-top:1rem; } .desc { white-space:pre-wrap; } +.wall { display:flex; flex-direction:column; gap:.5rem; margin:.7rem 0 1.4rem; } +.orow { display:flex; gap:.5rem; } +.ocell { flex-basis:0; min-width:0; background:#fff; + border:1px solid var(--line); border-radius:.6rem; padding:.5rem .6rem; } +.ozone { font-size:.72rem; color:var(--accent); margin-left:.3rem; } +.ogames { margin:.3rem 0 0; font-size:.82rem; line-height:1.5; } footer { margin:2rem 0 1rem; color:var(--ink-soft-on-sky); font-size:.8rem; text-align:center; } footer a { color:var(--accent); } @@ -372,6 +385,83 @@ def _card(g: dict, slug: str, art: dict[str, str]) -> str: """ +def _rows_of(openings: list[dict]) -> list[list[dict]]: + # mirror of unitRows() in templates/pages/shelves.html — keep in sync + rows: list[list[dict]] = [] + key = None + for o in openings: + m = re.match(r"^([A-Za-z]+)\d+$", o.get("label") or "") + row_key = m.group(1).upper() if m else f"single-{o['id']}" + if row_key != key: + rows.append([]) + key = row_key + rows[-1].append(o) + return rows + + +def _shelves_body( + units: list[dict], + locations: dict, + games: dict[str, dict], + slugs: dict[str, str], +) -> str: + """The wall, drawn for the public page: units as their physical rows, + each opening listing its residents as links.""" + openings = opening_index(units) + residents: dict[str, list[tuple[str, dict]]] = {} + for key, entry in games.items(): + oid, _, _via = effective_location(key, entry, games, locations) + if oid and oid in openings: + residents.setdefault(oid, []).append((key, entry)) + parts = [] + for unit in units: + cells_rows = [] + for row in _rows_of(unit.get("openings", [])): + cells = [] + for o in row: + here = sorted( + residents.get(o["id"], []), + key=lambda p: (p[1].get("name") or "").casefold(), + ) + links = " · ".join( + f'{html.escape(e.get("name") or "?")}' + for k, e in here + ) + zone = ( + f'{html.escape(o.get("zone") or "")}' + if o.get("zone") + else "" + ) + desc = ( + f'
' + if o.get("description") + else "" + ) + width = (o.get("width_in") or 13.25) * 4 + cells.append( + f'{links or ""}
' + "see the shelves — where everything lives →
' + 'Titles — every read off your shelves, alphabetized, with its status and photos. This is the proofread checkpoint: edit, split, remove. Its badge counts shaky read lines — the model wasn't sure and nothing has verified them; filter to them, then press ✓ looks right or edit each one.
Review — the decisions only you can make: which game a title is, which edition a copy is, whether two same-game reads are really one box (merges show a veto), and whether an unmatched title is a real game BGG simply doesn't have (keep locally: it joins the Library, never uploads). Keyboard-first; see shortcuts.
Queue — exactly what upload will do (new entries and version upgrades) and the log of everything it has done. Nothing reaches BGG that isn't visible here first. A job that fails is skipped by later runs (so one broken game can't loop forever); when any exist, the Pipeline's upload card offers a retry N failed checkbox. Each queued row shows what upload did with it — pending, done, failed, or retired (a review decision since the last diff withdrew it). Finished rows stay listed until the next diff rebuilds the queue; the log below them is the permanent record.
-Shelves — where everything physically lives, drawn as it really stands: openings group into rows by label letter with widths proportional to their interiors, so the page is a diagram of your wall. Describe furniture once (presets for Kallax cubes and Billy shelves, grids of rows × columns — a later grid continues the row letters — custom sizes, and no-size spots like a travel case); units and openings both take a free-text description beside the zone keyword. Suggestions rank an opening holding a series-mate or base game first (marked ♥ — every placement you confirm teaches the suggester your organization), always against the remaining room, then tightest verified fit; a measured game with nowhere suitable says "no matching openings yet", and unmeasured games get no suggestions because can't-verify ≠ fits. Assign by tapping suggestions, searching inside an opening, or from any game's detail page. Fill bars show stacked thickness against interior height; ⚠ flags overfull openings and boxes that can't fit; games stored inside another box ride along with their container, through whole chains. Your layout is local data only — never sent anywhere. Bulk-load a plan with bggpipe shelve --import plan.csv (name,opening) and check capacity anytime with bggpipe dims.
Shelves — where everything physically lives, drawn as it really stands: openings group into rows by label letter with widths proportional to their interiors, so the page is a diagram of your wall. Describe furniture once (presets for Kallax cubes and Billy shelves, grids of rows × columns — a later grid continues the row letters — custom sizes, and no-size spots like a travel case); units and openings both take a free-text description beside the zone keyword. Suggestions rank an opening holding a series-mate or base game first (marked ♥ — every placement you confirm teaches the suggester your organization), always against the remaining room, then tightest verified fit; a measured game with nowhere suitable says "no matching openings yet", and unmeasured games get no suggestions because can't-verify ≠ fits. Assign by tapping suggestions, searching inside an opening, or from any game's detail page. Capacity is a two-lane model — a flat stack against interior height plus a standing lane against the remaining width; the largest boxes lie flat, smaller ones stand, and each box's lane is flippable in the opening's view. ⚠ means no packing fits, not merely "tall stack"; games stored inside another box ride along with their container, through whole chains. Your layout is local data only — never sent anywhere. Bulk-load a plan with bggpipe shelve --import plan.csv (name,opening) and check capacity anytime with bggpipe dims.
Library — your enriched collection. Search titles, designers, mechanics and categories at once; filter by kind (board games, RPGs, off-BGG) or by how many people are playing tonight; sort by name, year, BGG rank, weight, or playing time. Click any game for its full detail: art, the usual stats, designers and mechanics, your edition, the shelf photos it was read from, and a link to its BGG page. RPG and off-BGG games live here too — identified and enriched, never uploaded. RPGs pull their designers, publishers and genres from RPGGeek; an off-BGG game's detail page lets you write its facts yourself and add a cover photo, since nothing else will ever have them (both are saved under data/ and folded in by the next enrich).