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.
This commit is contained in:
Samuel Bouchet 2026-03-10 19:35:57 +01:00
parent f88a3cc3f6
commit d09bf72a90

View file

@ -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": []
}