- Fix Loreline parsing: escape quotes in dialogue, remove [if] bracket syntax, remove # in text conflicting with tags - Add French accents to all 9 .fr.lor translation files (hundreds of fixes) - Fix cosmetic equip display: use item nameKey lookup instead of constructing key from cosmeticValue (fixes StardustLegendary MISSING) - Deduplicate cosmetics in appearance menu - Localize all hardcoded strings (welcome, inventory, adventure, cosmetic) - Add new tests: Loreline parsing (19), cosmetic slot keys, slot+value uniqueness (302 total, 0 failures)
2.4 KiB
2.4 KiB
Open The Box
Project Overview
A console-based incremental/idle game built in C# (.NET 9) where players open boxes to discover items, unlock features, and progress through themed adventures. Uses Spectre.Console for rich terminal rendering and Loreline for interactive narrative scripting.
Architecture
See specifications.md for detailed content organization.
Key Directories
src/OpenTheBox/— Main game source codecontent/data/— JSON data files (items, boxes, crafting recipes)content/adventures/— Loreline.loradventure scripts (one folder per theme)content/localization/— Translation files
Source Code Structure
Core/— Game state, enums, item/character modelsCore/Enums/— All enum types (StatType, ResourceType, AdventureTheme, CosmeticSlot, etc.)Adventures/— AdventureEngine (Loreline bridge + custom functions)Simulation/— Game engines (BoxEngine, MetaEngine, ResourceEngine, CraftingEngine, GameSimulation)Rendering/— IRenderer interface, SpectreRenderer, RenderContext, panel componentsRendering/Panels/— Individual UI panels (PortraitPanel, ResourcePanel, StatsPanel, etc.)Data/— ContentRegistry, ItemDefinition, BoxDefinition data loadingPersistence/— SaveManager, SaveData (JSON serialization)Localization/— LocalizationManager, Locale enum
Build & Run
dotnet build
dotnet run --project src/OpenTheBox
Test
dotnet test
Adventure System
Adventures use Loreline .lor script format. Custom functions available in scripts:
- Inventory:
grantItem(id, qty),hasItem(id),removeItem(id) - Resources:
hasResource(name, min),getResourceValue(name),addResource(name, amount) - Stats:
hasStat(name, min),getStatValue(name) - Cosmetics:
hasCosmetic(id),hasEquipped(slot, style) - Progression:
hasCompletedAdventure(theme),markSecretBranch(id),hasSecretBranch(id),countSecretBranches(),allSecretBranches()
Hints for disabled choices use ||| separator: Option text|||Hint text #label [if condition]
full documentation: https://loreline.app/fr/docs/
Conventions
- C# 12 with file-scoped namespaces, primary constructors where appropriate
- Immutable records for value types, sealed classes for services
- GameState is mutable, passed by reference to engines
- All user-facing strings go through LocalizationManager
- Enum names match JSON string values (PascalCase)