Blood → Ink

This commit is contained in:
Samuel Bouchet 2026-03-18 19:04:06 +01:00
parent 0a499d947e
commit 16b3fd0950
17 changed files with 70 additions and 59 deletions

View file

@ -15,6 +15,17 @@ jobs:
with: with:
dotnet-version: '10.0.x' dotnet-version: '10.0.x'
- name: Download Loreline dependency
run: |
mkdir -p lib
curl -sL https://github.com/Loreline/loreline/releases/download/v0.7.1/loreline-csharp.zip -o lib/loreline-csharp.zip
unzip -o lib/loreline-csharp.zip -d lib/_extract
cp lib/_extract/*/Loreline.dll lib/ || cp lib/_extract/Loreline.dll lib/
cp lib/_extract/*/Loreline.xml lib/ 2>/dev/null || cp lib/_extract/Loreline.xml lib/ 2>/dev/null || true
cp lib/_extract/*/Loreline.deps.json lib/ 2>/dev/null || cp lib/_extract/Loreline.deps.json lib/ 2>/dev/null || true
rm -rf lib/_extract lib/loreline-csharp.zip
ls -la lib/
- name: Publish Blazor WASM - name: Publish Blazor WASM
run: dotnet publish src/OpenTheBox.Web -c Release -o publish run: dotnet publish src/OpenTheBox.Web -c Release -o publish

View file

@ -65,11 +65,11 @@ Hints for disabled choices use `|||` separator: `Option text|||Hint text #label
full documentation: https://loreline.app/fr/docs/ full documentation: https://loreline.app/fr/docs/
## Resources (Characteristics) ## Resources (Characteristics)
Only 2 resource types exist: **Gold** and **Blood**. Both have adventure secret branch gates: Only 2 resource types exist: **Gold** and **Ink**. Both have adventure secret branch gates:
- Gold ≥ 30 → Contemporary VIP branch - Gold ≥ 30 → Contemporary VIP branch
- Blood ≥ 20 → DarkFantasy Blood Communion branch - Ink ≥ 20 → DarkFantasy Ink Communion branch
Consumables: `gold_pouch` (+50 Gold), `blood_vial` (+5 Blood), `resource_max_gold`, `resource_max_blood`. Consumables: `gold_pouch` (+50 Gold), `ink_vial` (+5 Ink), `resource_max_gold`, `resource_max_ink`.
Other resources (Health, Mana, Food, etc.) were removed as they had no gameplay impact. Other resources (Health, Mana, Food, etc.) were removed as they had no gameplay impact.
## Ephemeral Items ## Ephemeral Items

10
GDD.md
View file

@ -329,7 +329,7 @@ Chaque sous-boite d'aventure contient :
| Stamina (endurance) | 15 | Restaure de l'endurance | | Stamina (endurance) | 15 | Restaure de l'endurance |
| Gold (or) | 15 | Ajoute de l'or | | Gold (or) | 15 | Ajoute de l'or |
| Energy (energie) | 10 | Restaure de l'energie | | Energy (energie) | 10 | Restaure de l'energie |
| Blood (sang) | 3 | Restaure du sang (ressource rare) | | Ink (encre) | 3 | Restaure de l'encre (ressource rare) |
| Oxygen (oxygene) | 2 | Restaure de l'oxygene (ressource rare) | | Oxygen (oxygene) | 2 | Restaure de l'oxygene (ressource rare) |
> **Note** : Seules les ressources deja debloquees par le joueur peuvent apparaitre dans le tirage. Les poids sont recalcules dynamiquement. > **Note** : Seules les ressources deja debloquees par le joueur peuvent apparaitre dans le tirage. Les poids sont recalcules dynamiquement.
@ -692,7 +692,7 @@ Le joueur gere 8 ressources qui influencent sa capacite a explorer, combattre, c
| Mana | MP | Points de magie | Sorts, enchantements | | Mana | MP | Points de magie | Sorts, enchantements |
| Food | FD | Nourriture | Exploration, stamina | | Food | FD | Nourriture | Exploration, stamina |
| Stamina | ST | Endurance | Actions physiques, craft | | Stamina | ST | Endurance | Actions physiques, craft |
| Blood | BL | Sang | Rituels, magie noire | | Ink | IN | Encre | Rituels, magie noire |
| Gold | GD | Or | Commerce, ameliorations | | Gold | GD | Or | Commerce, ameliorations |
| Oxygen | O2 | Oxygene | Exploration spatiale/sous-marine| | Oxygen | O2 | Oxygene | Exploration spatiale/sous-marine|
| Energy | EN | Energie | Machines, stations de craft | | Energy | EN | Energie | Machines, stations de craft |
@ -702,7 +702,7 @@ Le joueur gere 8 ressources qui influencent sa capacite a explorer, combattre, c
- Chaque ressource a un **maximum** (cap) qui peut etre ameliore via la Boite d'amelioration. - Chaque ressource a un **maximum** (cap) qui peut etre ameliore via la Boite d'amelioration.
- Les ressources se consomment lors des aventures, du craft et des interactions. - Les ressources se consomment lors des aventures, du craft et des interactions.
- Les ressources se restaurent via la Boite de fourniture, les consommables et certaines interactions. - Les ressources se restaurent via la Boite de fourniture, les consommables et certaines interactions.
- Certaines ressources sont conditionnelles : **Blood** n'apparait qu'avec le theme DarkFantasy, **Oxygen** qu'avec le theme Space ou des aventures sous-marines. - Certaines ressources sont conditionnelles : **Ink** n'apparait qu'avec le theme DarkFantasy, **Oxygen** qu'avec le theme Space ou des aventures sous-marines.
### Deblocage des ressources ### Deblocage des ressources
@ -714,7 +714,7 @@ Les ressources ne sont pas toutes disponibles des le debut :
| Mana | Premiere rencontre avec un personnage magique | | Mana | Premiere rencontre avec un personnage magique |
| Food | Premiere aventure exploree | | Food | Premiere aventure exploree |
| Stamina | Premiere action physique (combat, craft) | | Stamina | Premiere action physique (combat, craft) |
| Blood | Deblocage du theme DarkFantasy | | Ink | Deblocage du theme DarkFantasy |
| Gold | Premier lieu de commerce decouvert | | Gold | Premier lieu de commerce decouvert |
| Oxygen | Deblocage du theme Space OU aventure sous-marine | | Oxygen | Deblocage du theme Space OU aventure sous-marine |
| Energy | Premiere station de craft construite | | Energy | Premiere station de craft construite |
@ -800,7 +800,7 @@ Les aventures interactives sont des sequences narratives jouables en CLI, chacun
- **Ambiance** : fantasy sombre, horreur gothique - **Ambiance** : fantasy sombre, horreur gothique
- **Lieux typiques** : cryptes, forets maudites, tours sombres - **Lieux typiques** : cryptes, forets maudites, tours sombres
- **Ressource cle** : Blood, Mana - **Ressource cle** : Ink, Mana
- **Personnages associes** : Malkith (version sombre) - **Personnages associes** : Malkith (version sombre)
- **Mood possible** : Dark, Spooky, Tragedy - **Mood possible** : Dark, Spooky, Tragedy
- **Environnement** : Nature, Town - **Environnement** : Nature, Town

View file

@ -271,11 +271,11 @@ Ouvrir une boîte et voir ce qui se passe
#opt-convince // "Convince Mordecai to open them together" #opt-convince // "Convince Mordecai to open them together"
Convaincre Mordecai de les ouvrir ensemble Convaincre Mordecai de les ouvrir ensemble
#opt-blood // "Press your hand to the boxes and offer your blood as a bridge|||You feel a strange warmth in your veins, as though something ancient recognizes you..." #opt-blood // "Press your hand to the boxes and offer your ink as a bridge|||You feel a strange warmth in your veins, as though something ancient recognizes you..."
Poser votre main sur les boîtes et offrir votre sang comme pont|||Vous ressentez une étrange chaleur dans vos veines, comme si quelque chose d'ancien vous reconnaissait... Poser votre main sur les boîtes et offrir votre encre comme pont|||Vous ressentez une étrange chaleur dans vos veines, comme si quelque chose d'ancien vous reconnaissait...
#blood-press // "You press your palm against the nearest box. Your blood sings. The box answers." #blood-press // "You press your palm against the nearest box. The ink sings. The box answers."
Vous pressez votre paume contre la boîte la plus proche. Votre sang chante. La boîte répond. Vous pressez votre paume contre la boîte la plus proche. L'encre chante. La boîte répond.
#blood-voices // "Every box in the vault flickers -- not with light, but with voices. Twelve thousand souls, speaking at once." #blood-voices // "Every box in the vault flickers -- not with light, but with voices. Twelve thousand souls, speaking at once."
Chaque boîte du caveau scintille -- pas de lumière, mais de voix. Douze mille âmes, parlant en même temps. Chaque boîte du caveau scintille -- pas de lumière, mais de voix. Douze mille âmes, parlant en même temps.
@ -286,8 +286,8 @@ Elles ne crient pas. Elles... se présentent.
#mordecai-impossible // "Impossible. I've tried to speak with them for decades. They never answered ME." #mordecai-impossible // "Impossible. I've tried to speak with them for decades. They never answered ME."
Impossible. J'ai essayé de leur parler pendant des décennies. Elles ne m'ont jamais répondu. Impossible. J'ai essayé de leur parler pendant des décennies. Elles ne m'ont jamais répondu.
#pierrick-jailer // "Maybe they didn't trust you. You're their jailer. I'm just a baker with strange blood." #pierrick-jailer // "Maybe they didn't trust you. You're their jailer. I'm just a baker with strange ink."
Peut-être qu'elles ne vous faisaient pas confiance. Vous êtes leur geôlier. Moi je suis juste un boulanger au sang étrange. Peut-être qu'elles ne vous faisaient pas confiance. Vous êtes leur geôlier. Moi je suis juste un boulanger à l'encre étrange.
#blood-consensus // "The souls whisper a consensus: half wish to stay, half wish to leave. They've voted. Through cardboard. Democracy at its most absurd." #blood-consensus // "The souls whisper a consensus: half wish to stay, half wish to leave. They've voted. Through cardboard. Democracy at its most absurd."
Les âmes chuchotent un consensus : la moitié souhaite rester, l'autre moitié souhaite partir. Elles ont voté. À travers du carton. La démocratie dans ce qu'elle a de plus absurde. Les âmes chuchotent un consensus : la moitié souhaite rester, l'autre moitié souhaite partir. Elles ont voté. À travers du carton. La démocratie dans ce qu'elle a de plus absurde.

View file

@ -189,16 +189,16 @@ beat TheVault
-> OpenOneBox -> OpenOneBox
Convince Mordecai to open them together #opt-convince if corruption < 30 Convince Mordecai to open them together #opt-convince if corruption < 30
-> ConvinceMordecai -> ConvinceMordecai
Press your hand to the boxes and offer your blood as a bridge|||You feel a strange warmth in your veins, as though something ancient recognizes you... #opt-blood if hasResource("Blood", 20) Press your hand to the boxes and offer your ink as a bridge|||You feel a strange warmth in your veins, as though something ancient recognizes you... #opt-blood if hasResource("Ink", 20)
-> BloodCommunion -> InkCommunion
beat BloodCommunion beat InkCommunion
markSecretBranch("darkfantasy_blood_communion") markSecretBranch("darkfantasy_ink_communion")
You press your palm against the nearest box. Your blood sings. The box answers. #blood-press You press your palm against the nearest box. The ink sings. The box answers. #blood-press
Every box in the vault flickers -- not with light, but with voices. Twelve thousand souls, speaking at once. #blood-voices Every box in the vault flickers -- not with light, but with voices. Twelve thousand souls, speaking at once. #blood-voices
pierrick: They're not screaming. They're... introducing themselves. #pierrick-introduce pierrick: They're not screaming. They're... introducing themselves. #pierrick-introduce
mordecai: Impossible. I've tried to speak with them for decades. They never answered ME. #mordecai-impossible mordecai: Impossible. I've tried to speak with them for decades. They never answered ME. #mordecai-impossible
pierrick: Maybe they didn't trust you. You're their jailer. I'm just a baker with strange blood. #pierrick-jailer pierrick: Maybe they didn't trust you. You're their jailer. I'm just a baker with strange ink. #pierrick-jailer
The souls whisper a consensus: half wish to stay, half wish to leave. They've voted. Through cardboard. Democracy at its most absurd. #blood-consensus The souls whisper a consensus: half wish to stay, half wish to leave. They've voted. Through cardboard. Democracy at its most absurd. #blood-consensus
mordecai: They VOTED? Without a suggestion box? Wait -- they ARE the suggestion boxes. #mordecai-voted mordecai: They VOTED? Without a suggestion box? Wait -- they ARE the suggestion boxes. #mordecai-voted
boxesFreed += 50 boxesFreed += 50

View file

@ -106,8 +106,8 @@ Le Charmeur de Dragons. Tu as choisi le feu plutôt que la peur, et le dragon t'
#secret-darkfantasy // "A drop of crimson hangs suspended in the air, neither falling nor fading." #secret-darkfantasy // "A drop of crimson hangs suspended in the air, neither falling nor fading."
Une goutte de pourpre reste suspendue dans l'air, ne tombant ni ne s'effaçant. Une goutte de pourpre reste suspendue dans l'air, ne tombant ni ne s'effaçant.
#secret-darkfantasy-words // "The Blood Communion. You drank from the dark box and survived. Changed, but whole." #secret-darkfantasy-words // "The Ink Communion. You drank from the dark box and survived. Changed, but whole."
La Communion de Sang. Tu as bu à la boîte sombre et survécu. Changé, mais entier. La Communion d'Encre. Tu as bu à la boîte sombre et survécu. Changé, mais entier.
#secret-pirate // "A coin spins endlessly on an invisible surface, never landing." #secret-pirate // "A coin spins endlessly on an invisible surface, never landing."
Une pièce tourne sans fin sur une surface invisible, sans jamais retomber. Une pièce tourne sans fin sur une surface invisible, sans jamais retomber.

View file

@ -82,9 +82,9 @@ beat Alcove
A scale glimmers on the ground, iridescent and warm to the touch. #secret-medieval A scale glimmers on the ground, iridescent and warm to the touch. #secret-medieval
destiny: The Dragon Charmer. You chose fire over fear, and the dragon chose you back. #secret-medieval-words destiny: The Dragon Charmer. You chose fire over fear, and the dragon chose you back. #secret-medieval-words
if hasSecretBranch("darkfantasy_blood_communion") if hasSecretBranch("darkfantasy_ink_communion")
A drop of crimson hangs suspended in the air, neither falling nor fading. #secret-darkfantasy A drop of crimson hangs suspended in the air, neither falling nor fading. #secret-darkfantasy
destiny: The Blood Communion. You drank from the dark box and survived. Changed, but whole. #secret-darkfantasy-words destiny: The Ink Communion. You drank from the dark box and survived. Changed, but whole. #secret-darkfantasy-words
if hasSecretBranch("pirate_one_of_us") if hasSecretBranch("pirate_one_of_us")
A coin spins endlessly on an invisible surface, never landing. #secret-pirate A coin spins endlessly on an invisible surface, never landing. #secret-pirate

View file

@ -122,7 +122,7 @@
"entries": [ "entries": [
{"itemDefinitionId": "material_titanium_raw", "weight": 2}, {"itemDefinitionId": "material_titanium_raw", "weight": 2},
{"itemDefinitionId": "material_steel_ingot", "weight": 3}, {"itemDefinitionId": "material_steel_ingot", "weight": 3},
{"itemDefinitionId": "blood_vial", "weight": 2}, {"itemDefinitionId": "ink_vial", "weight": 2},
{"itemDefinitionId": "cosmetic_hair_cyberpunk", "weight": 2}, {"itemDefinitionId": "cosmetic_hair_cyberpunk", "weight": 2},
{"itemDefinitionId": "cosmetic_eyes_pilotglasses", "weight": 2}, {"itemDefinitionId": "cosmetic_eyes_pilotglasses", "weight": 2},
{"itemDefinitionId": "cosmetic_body_suit", "weight": 2}, {"itemDefinitionId": "cosmetic_body_suit", "weight": 2},
@ -256,7 +256,7 @@
"rollCount": 1, "rollCount": 1,
"entries": [ "entries": [
{"itemDefinitionId": "meta_resource_gold", "weight": 2}, {"itemDefinitionId": "meta_resource_gold", "weight": 2},
{"itemDefinitionId": "meta_resource_blood", "weight": 1}, {"itemDefinitionId": "meta_resource_ink", "weight": 1},
{"itemDefinitionId": "box_meta_mastery", "weight": 1} {"itemDefinitionId": "box_meta_mastery", "weight": 1}
] ]
} }
@ -497,7 +497,7 @@
{"itemDefinitionId": "darkfantasy_gem", "weight": 1}, {"itemDefinitionId": "darkfantasy_gem", "weight": 1},
{"itemDefinitionId": "darkfantasy_key", "weight": 3}, {"itemDefinitionId": "darkfantasy_key", "weight": 3},
{"itemDefinitionId": "mysterious_key", "weight": 2}, {"itemDefinitionId": "mysterious_key", "weight": 2},
{"itemDefinitionId": "blood_vial", "weight": 3} {"itemDefinitionId": "ink_vial", "weight": 3}
] ]
} }
}, },
@ -512,7 +512,7 @@
"rollCount": 1, "rollCount": 1,
"entries": [ "entries": [
{"itemDefinitionId": "resource_max_gold", "weight": 2}, {"itemDefinitionId": "resource_max_gold", "weight": 2},
{"itemDefinitionId": "resource_max_blood", "weight": 1}, {"itemDefinitionId": "resource_max_ink", "weight": 1},
{"itemDefinitionId": "blueprint_foundry", "weight": 4, "condition": {"type": "HasUIFeature", "targetId": "CraftingPanel"}}, {"itemDefinitionId": "blueprint_foundry", "weight": 4, "condition": {"type": "HasUIFeature", "targetId": "CraftingPanel"}},
{"itemDefinitionId": "blueprint_workbench", "weight": 4, "condition": {"type": "HasUIFeature", "targetId": "CraftingPanel"}}, {"itemDefinitionId": "blueprint_workbench", "weight": 4, "condition": {"type": "HasUIFeature", "targetId": "CraftingPanel"}},
{"itemDefinitionId": "blueprint_furnace", "weight": 4, "condition": {"type": "HasUIFeature", "targetId": "CraftingPanel"}}, {"itemDefinitionId": "blueprint_furnace", "weight": 4, "condition": {"type": "HasUIFeature", "targetId": "CraftingPanel"}},
@ -532,7 +532,7 @@
"rollCount": 2, "rollCount": 2,
"entries": [ "entries": [
{"itemDefinitionId": "gold_pouch", "weight": 4}, {"itemDefinitionId": "gold_pouch", "weight": 4},
{"itemDefinitionId": "blood_vial", "weight": 1} {"itemDefinitionId": "ink_vial", "weight": 1}
] ]
} }
}, },

View file

@ -11,7 +11,7 @@
{"id": "meta_animation", "nameKey": "meta.animation", "descriptionKey": "meta.animation.desc", "category": "Meta", "rarity": "Uncommon", "tags": ["Meta"], "metaUnlock": "BoxAnimation"}, {"id": "meta_animation", "nameKey": "meta.animation", "descriptionKey": "meta.animation.desc", "category": "Meta", "rarity": "Uncommon", "tags": ["Meta"], "metaUnlock": "BoxAnimation"},
{"id": "meta_crafting", "nameKey": "meta.crafting", "descriptionKey": "meta.crafting.desc", "category": "Meta", "rarity": "Epic", "tags": ["Meta"], "metaUnlock": "CraftingPanel"}, {"id": "meta_crafting", "nameKey": "meta.crafting", "descriptionKey": "meta.crafting.desc", "category": "Meta", "rarity": "Epic", "tags": ["Meta"], "metaUnlock": "CraftingPanel"},
{"id": "meta_autosave", "nameKey": "meta.autosave", "descriptionKey": "meta.autosave.desc", "category": "Meta", "rarity": "Uncommon", "tags": ["Meta"], "metaUnlock": "AutoSave"}, {"id": "meta_autosave", "nameKey": "meta.autosave", "descriptionKey": "meta.autosave.desc", "category": "Meta", "rarity": "Uncommon", "tags": ["Meta"], "metaUnlock": "AutoSave"},
{"id": "meta_resource_blood", "nameKey": "resource.blood", "category": "Meta", "rarity": "Rare", "tags": ["Meta", "ResourceVisibility"], "resourceType": "Blood"}, {"id": "meta_resource_ink", "nameKey": "resource.ink", "category": "Meta", "rarity": "Rare", "tags": ["Meta", "ResourceVisibility"], "resourceType": "Ink"},
{"id": "meta_resource_gold", "nameKey": "resource.gold", "category": "Meta", "rarity": "Uncommon", "tags": ["Meta", "ResourceVisibility"], "resourceType": "Gold"}, {"id": "meta_resource_gold", "nameKey": "resource.gold", "category": "Meta", "rarity": "Uncommon", "tags": ["Meta", "ResourceVisibility"], "resourceType": "Gold"},
{"id": "meta_stat_strength", "nameKey": "stat.strength", "category": "Meta", "rarity": "Rare", "tags": ["Meta", "StatVisibility"], "statType": "Strength"}, {"id": "meta_stat_strength", "nameKey": "stat.strength", "category": "Meta", "rarity": "Rare", "tags": ["Meta", "StatVisibility"], "statType": "Strength"},
{"id": "meta_stat_intelligence", "nameKey": "stat.intelligence", "category": "Meta", "rarity": "Rare", "tags": ["Meta", "StatVisibility"], "statType": "Intelligence"}, {"id": "meta_stat_intelligence", "nameKey": "stat.intelligence", "category": "Meta", "rarity": "Rare", "tags": ["Meta", "StatVisibility"], "statType": "Intelligence"},
@ -62,7 +62,7 @@
{"id": "tint_gold", "nameKey": "tint.gold", "category": "Cosmetic", "rarity": "Epic", "tags": ["Tint"], "tintColor": "Gold"}, {"id": "tint_gold", "nameKey": "tint.gold", "category": "Cosmetic", "rarity": "Epic", "tags": ["Tint"], "tintColor": "Gold"},
{"id": "tint_void", "nameKey": "tint.void", "category": "Cosmetic", "rarity": "Legendary", "tags": ["Tint"], "tintColor": "Void"}, {"id": "tint_void", "nameKey": "tint.void", "category": "Cosmetic", "rarity": "Legendary", "tags": ["Tint"], "tintColor": "Void"},
{"id": "blood_vial", "nameKey": "item.blood_vial", "category": "Consumable", "rarity": "Rare", "tags": ["Consumable"], "resourceType": "Blood", "resourceAmount": 5}, {"id": "ink_vial", "nameKey": "item.ink_vial", "category": "Consumable", "rarity": "Rare", "tags": ["Consumable"], "resourceType": "Ink", "resourceAmount": 5},
{"id": "gold_pouch", "nameKey": "item.gold_pouch", "category": "Consumable", "rarity": "Common", "tags": ["Consumable"], "resourceType": "Gold", "resourceAmount": 50}, {"id": "gold_pouch", "nameKey": "item.gold_pouch", "category": "Consumable", "rarity": "Common", "tags": ["Consumable"], "resourceType": "Gold", "resourceAmount": 50},
{"id": "space_badge", "nameKey": "item.space.badge", "category": "AdventureToken", "rarity": "Rare", "tags": ["Adventure", "Space"], "adventureTheme": "Space"}, {"id": "space_badge", "nameKey": "item.space.badge", "category": "AdventureToken", "rarity": "Rare", "tags": ["Adventure", "Space"], "adventureTheme": "Space"},
@ -140,7 +140,7 @@
{"id": "material_carbonfiber_sheet", "nameKey": "material.carbonfiber", "category": "Material", "rarity": "Epic", "tags": ["Material"], "materialType": "CarbonFiber", "materialForm": "Sheet"}, {"id": "material_carbonfiber_sheet", "nameKey": "material.carbonfiber", "category": "Material", "rarity": "Epic", "tags": ["Material"], "materialType": "CarbonFiber", "materialForm": "Sheet"},
{"id": "resource_max_gold", "nameKey": "item.resource_max_gold", "category": "Consumable", "rarity": "Rare", "tags": ["Improvement", "ResourceMax"], "resourceType": "Gold", "resourceMaxIncrease": 50}, {"id": "resource_max_gold", "nameKey": "item.resource_max_gold", "category": "Consumable", "rarity": "Rare", "tags": ["Improvement", "ResourceMax"], "resourceType": "Gold", "resourceMaxIncrease": 50},
{"id": "resource_max_blood", "nameKey": "item.resource_max_blood", "category": "Consumable", "rarity": "Rare", "tags": ["Improvement", "ResourceMax"], "resourceType": "Blood", "resourceMaxIncrease": 5}, {"id": "resource_max_ink", "nameKey": "item.resource_max_ink", "category": "Consumable", "rarity": "Rare", "tags": ["Improvement", "ResourceMax"], "resourceType": "Ink", "resourceMaxIncrease": 5},
{"id": "music_melody", "nameKey": "item.music_melody", "category": "Consumable", "rarity": "Rare", "tags": ["Music", "Fun"], "description": "A melody plays from the box. Console.Beep never sounded so good."}, {"id": "music_melody", "nameKey": "item.music_melody", "category": "Consumable", "rarity": "Rare", "tags": ["Music", "Fun"], "description": "A melody plays from the box. Console.Beep never sounded so good."},
{"id": "cookie_fortune", "nameKey": "item.cookie_fortune", "category": "Consumable", "rarity": "Common", "tags": ["Cookie", "Fun"], "description": "A fortune cookie with wisdom of questionable origin."}, {"id": "cookie_fortune", "nameKey": "item.cookie_fortune", "category": "Consumable", "rarity": "Common", "tags": ["Cookie", "Fun"], "description": "A fortune cookie with wisdom of questionable origin."},

View file

@ -132,7 +132,7 @@
"item.rarity.legendary": "Legendary", "item.rarity.legendary": "Legendary",
"item.rarity.mythic": "Mythic", "item.rarity.mythic": "Mythic",
"resource.blood": "Blood", "resource.ink": "Ink",
"resource.gold": "Gold", "resource.gold": "Gold",
"stat.strength": "Strength", "stat.strength": "Strength",
@ -215,7 +215,7 @@
"material.form.dust": "Dust", "material.form.dust": "Dust",
"material.form.gem": "Gem", "material.form.gem": "Gem",
"item.blood_vial": "Blood Vial", "item.ink_vial": "Ink Vial",
"item.gold_pouch": "Gold Pouch", "item.gold_pouch": "Gold Pouch",
"item.space.badge": "Astronaut Badge", "item.space.badge": "Astronaut Badge",
@ -263,7 +263,7 @@
"item.microscopic.mitochondria": "Hyperactive Mitochondria", "item.microscopic.mitochondria": "Hyperactive Mitochondria",
"item.microscopic.prion": "Friendly Prion (probably)", "item.microscopic.prion": "Friendly Prion (probably)",
"item.darkfantasy.ring": "Cursed Ring", "item.darkfantasy.ring": "Cursed Ring",
"item.darkfantasy.rune": "Blood Rune", "item.darkfantasy.rune": "Ink Rune",
"item.darkfantasy.cloak": "Shadow Cloak", "item.darkfantasy.cloak": "Shadow Cloak",
"item.darkfantasy.grimoire": "Necromancer's Grimoire", "item.darkfantasy.grimoire": "Necromancer's Grimoire",
"item.darkfantasy.gem": "Soul Gem", "item.darkfantasy.gem": "Soul Gem",
@ -274,7 +274,7 @@
"item.stat_boost": "{0} +1", "item.stat_boost": "{0} +1",
"item.resource_max_gold": "Gold Capacity Upgrade", "item.resource_max_gold": "Gold Capacity Upgrade",
"item.resource_max_blood": "Blood Capacity Upgrade", "item.resource_max_ink": "Ink Capacity Upgrade",
"item.music_melody": "Box Melody", "item.music_melody": "Box Melody",
"item.cookie_fortune": "Fortune Cookie", "item.cookie_fortune": "Fortune Cookie",

View file

@ -132,7 +132,7 @@
"item.rarity.legendary": "Légendaire", "item.rarity.legendary": "Légendaire",
"item.rarity.mythic": "Mythique", "item.rarity.mythic": "Mythique",
"resource.blood": "Sang", "resource.ink": "Encre",
"resource.gold": "Or", "resource.gold": "Or",
"stat.strength": "Force", "stat.strength": "Force",
@ -215,7 +215,7 @@
"material.form.dust": "Poudre", "material.form.dust": "Poudre",
"material.form.gem": "Gemme", "material.form.gem": "Gemme",
"item.blood_vial": "Fiole de sang", "item.ink_vial": "Fiole d'encre",
"item.gold_pouch": "Bourse d'or", "item.gold_pouch": "Bourse d'or",
"item.space.badge": "Badge d'astronaute", "item.space.badge": "Badge d'astronaute",
@ -263,7 +263,7 @@
"item.microscopic.mitochondria": "Mitochondrie hyperactive", "item.microscopic.mitochondria": "Mitochondrie hyperactive",
"item.microscopic.prion": "Prion amical (probablement)", "item.microscopic.prion": "Prion amical (probablement)",
"item.darkfantasy.ring": "Anneau maudit", "item.darkfantasy.ring": "Anneau maudit",
"item.darkfantasy.rune": "Rune de sang", "item.darkfantasy.rune": "Rune d'encre",
"item.darkfantasy.cloak": "Cape d'ombre", "item.darkfantasy.cloak": "Cape d'ombre",
"item.darkfantasy.grimoire": "Grimoire du nécromancien", "item.darkfantasy.grimoire": "Grimoire du nécromancien",
"item.darkfantasy.gem": "Gemme d'âme", "item.darkfantasy.gem": "Gemme d'âme",
@ -274,7 +274,7 @@
"item.stat_boost": "{0} +1", "item.stat_boost": "{0} +1",
"item.resource_max_gold": "Amélioration Capacité Or", "item.resource_max_gold": "Amélioration Capacité Or",
"item.resource_max_blood": "Amélioration Capacité Sang", "item.resource_max_ink": "Amélioration Capacité Encre",
"item.music_melody": "Mélodie de boîte", "item.music_melody": "Mélodie de boîte",
"item.cookie_fortune": "Fortune Cookie", "item.cookie_fortune": "Fortune Cookie",

View file

@ -20,7 +20,7 @@ Special properties:
- `adventureTheme` — Links token to an adventure theme - `adventureTheme` — Links token to an adventure theme
- `cosmeticSlot` / `cosmeticValue` — Cosmetic equipment data - `cosmeticSlot` / `cosmeticValue` — Cosmetic equipment data
- `statType` / `statValue` — Stat modification - `statType` / `statValue` — Stat modification
- `resourceType` / `resourceAmount` — Resource modification (Gold, Blood only) - `resourceType` / `resourceAmount` — Resource modification (Gold, Ink only)
- `metaUnlock` — UI feature to unlock - `metaUnlock` — UI feature to unlock
- `workstationType` — Workstation blueprint - `workstationType` — Workstation blueprint
@ -40,7 +40,7 @@ content/adventures/
├── prehistoric/ — Stone age theme ├── prehistoric/ — Stone age theme
├── cosmic/ — Cosmic/divine theme ├── cosmic/ — Cosmic/divine theme
├── microscopic/ — Micro-world theme ├── microscopic/ — Micro-world theme
├── darkfantasy/ — Gothic horror theme (Key resource: Blood) ├── darkfantasy/ — Gothic horror theme (Key resource: Ink)
└── destiny/ — Final adventure (acknowledges all other adventures) └── destiny/ — Final adventure (acknowledges all other adventures)
``` ```
@ -62,7 +62,7 @@ Each regular adventure (not Destiny) has ONE secret branch gated by stats, resou
| Prehistoric | `hasStat("Strength", 10)` | `prehistoric_champion` | | Prehistoric | `hasStat("Strength", 10)` | `prehistoric_champion` |
| Cosmic | `hasStat("Intelligence", 10)` | `cosmic_enlightened` | | Cosmic | `hasStat("Intelligence", 10)` | `cosmic_enlightened` |
| Microscopic | `hasStat("Dexterity", 10)` | `microscopic_surgeon` | | Microscopic | `hasStat("Dexterity", 10)` | `microscopic_surgeon` |
| DarkFantasy | `hasResource("Blood", 20)` | `darkfantasy_blood_communion`| | DarkFantasy | `hasResource("Ink", 20)` | `darkfantasy_ink_communion`|
### Destiny Adventure (Final) ### Destiny Adventure (Final)
- Triggered by `destiny_token` from `box_endgame` - Triggered by `destiny_token` from `box_endgame`
@ -80,7 +80,7 @@ Boxes ──► Items ──► Inventory
│ ├──► Cosmetics ──► Appearance ──┐ │ ├──► Cosmetics ──► Appearance ──┐
│ ├──► Stat Items ──► Stats ──────┤ │ ├──► Stat Items ──► Stats ──────┤
│ └──► Consumables ──► Resources ─┤ │ └──► Consumables ──► Resources ─┤
│ (Gold, Blood only) │ (Gold, Ink only)
│ │ │ │
│ ┌───────────────────────────────┘ │ ┌───────────────────────────────┘
│ ▼ │ ▼
@ -106,8 +106,8 @@ Space, Medieval, Pirate, Contemporary, Sentimental, Prehistoric, Cosmic, Microsc
Strength, Intelligence, Luck, Charisma, Dexterity, Wisdom Strength, Intelligence, Luck, Charisma, Dexterity, Wisdom
### ResourceType (Characteristics) ### ResourceType (Characteristics)
Blood, Gold Ink, Gold
Only resources with actual adventure gates are kept. Blood gates the DarkFantasy secret branch (≥20), Gold gates the Contemporary secret branch (≥30). Only resources with actual adventure gates are kept. Ink gates the DarkFantasy secret branch (≥20), Gold gates the Contemporary secret branch (≥30).
Resources are displayed as "Characteristics" to the player with current/max values (e.g., Gold 50/100). Resources are displayed as "Characteristics" to the player with current/max values (e.g., Gold 50/100).
### CosmeticSlot ### CosmeticSlot
@ -125,7 +125,7 @@ UI features are unlocked in a fixed order regardless of which meta box drops. Th
3. **AutoSave** — Automatic saving 3. **AutoSave** — Automatic saving
4. **InventoryPanel** — Interactive inventory table 4. **InventoryPanel** — Interactive inventory table
5. **StatsPanel** — Progression stats and character attributes 5. **StatsPanel** — Progression stats and character attributes
6. **ResourcePanel** — Characteristics bars (Gold, Blood) 6. **ResourcePanel** — Characteristics bars (Gold, Ink)
7. **PortraitPanel** — ASCII art portrait 7. **PortraitPanel** — ASCII art portrait
8. **ChatPanel** — Event log panel 8. **ChatPanel** — Event log panel
9. **ExtendedColors** — 256-color palette 9. **ExtendedColors** — 256-color palette

View file

@ -31,7 +31,7 @@ public enum AdventureTheme
/// <summary>Microscopic world of cells, atoms, and circuits. Key resources: Energy, Oxygen.</summary> /// <summary>Microscopic world of cells, atoms, and circuits. Key resources: Energy, Oxygen.</summary>
Microscopic, Microscopic,
/// <summary>Dark fantasy with gothic horror elements. Key resources: Blood, Mana. Unlocks Blood resource.</summary> /// <summary>Dark fantasy with gothic horror elements. Key resources: Ink, Mana. Unlocks Ink resource.</summary>
DarkFantasy, DarkFantasy,
/// <summary>The final adventure. Acknowledges all previous adventures and secret branches. Unlocked by the endgame box.</summary> /// <summary>The final adventure. Acknowledges all previous adventures and secret branches. Unlocked by the endgame box.</summary>

View file

@ -6,8 +6,8 @@ namespace OpenTheBox.Core.Enums;
/// </summary> /// </summary>
public enum ResourceType public enum ResourceType
{ {
/// <summary>Blood resource. Unlocked with the DarkFantasy theme. Gates the Blood Communion secret branch (≥20).</summary> /// <summary>Ink resource. Unlocked with the DarkFantasy theme. Gates the Ink Communion secret branch (≥20).</summary>
Blood, Ink,
/// <summary>Currency. Unlocked when a trading location is discovered. Gates the Corporate VIP secret branch (≥30).</summary> /// <summary>Currency. Unlocked when a trading location is discovered. Gates the Corporate VIP secret branch (≥30).</summary>
Gold Gold

View file

@ -219,8 +219,8 @@ public class ResourcePanelTests
public void Render_ZeroMax_DoesNotThrow() public void Render_ZeroMax_DoesNotThrow()
{ {
var state = GameState.Create("Test", Locale.EN); var state = GameState.Create("Test", Locale.EN);
state.VisibleResources.Add(ResourceType.Blood); state.VisibleResources.Add(ResourceType.Ink);
state.Resources[ResourceType.Blood] = new ResourceState(0, 0); state.Resources[ResourceType.Ink] = new ResourceState(0, 0);
var result = RenderHelper.RenderToString(ResourcePanel.Render(state)); var result = RenderHelper.RenderToString(ResourcePanel.Render(state));
Assert.NotEmpty(result); Assert.NotEmpty(result);
} }
@ -239,7 +239,7 @@ public class ResourcePanelTests
public void Render_VisibleButNotInDict_Skipped() public void Render_VisibleButNotInDict_Skipped()
{ {
var state = GameState.Create("Test", Locale.EN); var state = GameState.Create("Test", Locale.EN);
state.VisibleResources.Add(ResourceType.Blood); state.VisibleResources.Add(ResourceType.Ink);
// Not adding to Resources dict → should skip without crash // Not adding to Resources dict → should skip without crash
var result = RenderHelper.RenderToString(ResourcePanel.Render(state)); var result = RenderHelper.RenderToString(ResourcePanel.Render(state));
Assert.NotEmpty(result); Assert.NotEmpty(result);

View file

@ -1158,7 +1158,7 @@ public class ContentValidationTests
"prehistoric_champion", "prehistoric_champion",
"cosmic_enlightened", "cosmic_enlightened",
"microscopic_surgeon", "microscopic_surgeon",
"darkfantasy_blood_communion" "darkfantasy_ink_communion"
}; };
// All 9 regular adventure themes (excluding Destiny) // All 9 regular adventure themes (excluding Destiny)

View file

@ -174,9 +174,9 @@
## Consumable (6 items) ## Consumable (6 items)
──────────────────────────────────────────────────────────────────────────────── ────────────────────────────────────────────────────────────────────────────────
[**] blood_vial (Rare) — Fiole de sang [**] ink_vial (Rare) — Fiole d'encre
Loot: box_epic, box_adventure_darkfantasy, box_supply Loot: box_epic, box_adventure_darkfantasy, box_supply
Consume: +5 Blood Consume: +5 Ink
[**] gold_pouch (Common) — Bourse d'or [**] gold_pouch (Common) — Bourse d'or
Loot: box_ok_tier, box_adventure_pirate, box_supply Loot: box_ok_tier, box_adventure_pirate, box_supply
@ -186,9 +186,9 @@
Loot: box_improvement Loot: box_improvement
Upgrade: max Gold Upgrade: max Gold
[**] resource_max_blood (Rare) — Amélioration Capacité Sang [**] resource_max_ink (Rare) — Amélioration Capacité Encre
Loot: box_improvement Loot: box_improvement
Upgrade: max Blood Upgrade: max Ink
[**] music_melody (Rare) — Mélodie de boîte [**] music_melody (Rare) — Mélodie de boîte
Loot: box_music(G) Loot: box_music(G)
@ -603,7 +603,7 @@
[*] meta_shortcuts (Rare) — Raccourcis clavier [*] meta_shortcuts (Rare) — Raccourcis clavier
Unlock: KeyboardShortcuts Unlock: KeyboardShortcuts
[*] meta_resource_blood (Rare) — Sang [*] meta_resource_ink (Rare) — Encre
Loot: box_meta_resources Loot: box_meta_resources
[*] meta_resource_gold (Uncommon) — Or [*] meta_resource_gold (Uncommon) — Or