From d09bf72a90b68fb897afc86a6b978d4ef1ba64cd Mon Sep 17 00:00:00 2001 From: Samuel Bouchet Date: Tue, 10 Mar 2026 19:35:57 +0100 Subject: [PATCH] Guarantee box_of_boxes in every non-auto-opening box Every box now always drops a box_of_boxes (auto-open) alongside its normal loot, ensuring the core loop never breaks. The player always has at least one box to open next. Only auto-opening boxes (box_of_boxes itself, box_adventure) are excluded to prevent infinite recursion. --- content/data/boxes.json | 46 ++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/content/data/boxes.json b/content/data/boxes.json index b5b265a..34b9222 100644 --- a/content/data/boxes.json +++ b/content/data/boxes.json @@ -44,7 +44,7 @@ "rarity": "Common", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 1, "entries": [ {"itemDefinitionId": "material_wood_raw", "weight": 5}, @@ -67,7 +67,7 @@ "rarity": "Uncommon", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "material_iron_raw", "weight": 4}, @@ -91,7 +91,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 3, "entries": [ {"itemDefinitionId": "material_steel_raw", "weight": 3}, @@ -117,7 +117,7 @@ "rarity": "Epic", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": ["box_meta"], + "guaranteedRolls": ["box_meta", "box_of_boxes"], "rollCount": 3, "entries": [ {"itemDefinitionId": "material_titanium_raw", "weight": 2}, @@ -146,7 +146,7 @@ "rarity": "Legendary", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": ["cosmetic_hair_stardust"], + "guaranteedRolls": ["cosmetic_hair_stardust", "box_of_boxes"], "rollCount": 1, "entries": [ {"itemDefinitionId": "cosmetic_hair_fire", "weight": 3}, @@ -163,7 +163,7 @@ "rarity": "Legendary", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 4, "entries": [ {"itemDefinitionId": "material_diamond_raw", "weight": 3}, @@ -194,7 +194,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 1, "entries": [ {"itemDefinitionId": "meta_colors", "weight": 5}, @@ -235,7 +235,7 @@ "rarity": "Uncommon", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "cosmetic_hair_short", "weight": 3}, @@ -288,7 +288,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "space_badge", "weight": 3}, @@ -308,7 +308,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "medieval_crest", "weight": 3}, @@ -327,7 +327,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": ["pirate_map"], + "guaranteedRolls": ["pirate_map", "box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "pirate_compass", "weight": 3}, @@ -346,7 +346,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "contemporary_phone", "weight": 3}, @@ -365,7 +365,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "sentimental_letter", "weight": 3}, @@ -383,7 +383,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "prehistoric_tooth", "weight": 4}, @@ -401,7 +401,7 @@ "rarity": "Epic", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "cosmic_shard", "weight": 4}, @@ -419,7 +419,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "microscopic_bacteria", "weight": 4}, @@ -437,7 +437,7 @@ "rarity": "Epic", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "darkfantasy_ring", "weight": 3}, @@ -456,7 +456,7 @@ "rarity": "Uncommon", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 1, "entries": [ {"itemDefinitionId": "resource_max_health", "weight": 3}, @@ -477,7 +477,7 @@ "rarity": "Common", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "health_potion_small", "weight": 5}, @@ -498,7 +498,7 @@ "rarity": "Mythic", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 3, "entries": [ {"itemDefinitionId": "mysterious_key", "weight": 3}, @@ -521,7 +521,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": [], + "guaranteedRolls": ["box_of_boxes"], "rollCount": 2, "entries": [ {"itemDefinitionId": "lore_1", "weight": 2}, @@ -544,7 +544,7 @@ "rarity": "Rare", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": ["music_melody"], + "guaranteedRolls": ["music_melody", "box_of_boxes"], "rollCount": 0, "entries": [] } @@ -556,7 +556,7 @@ "rarity": "Uncommon", "isAutoOpen": false, "lootTable": { - "guaranteedRolls": ["cookie_fortune"], + "guaranteedRolls": ["cookie_fortune", "box_of_boxes"], "rollCount": 0, "entries": [] }