No description
Find a file
Samuel Bouchet 83270ed4a0 Implement TODO.md: deterministic meta order, pity system, UX fixes
- Play time tracking: accumulate TotalPlayTime each game loop iteration
- Return to menu: split _running into _appRunning/_gameRunning so quit
  returns to main menu instead of exiting the app
- Deterministic meta unlock order: ArrowKeySelection first (accessibility),
  then TextColors, AutoSave, InventoryPanel, etc. (13-step sequence)
- Merge KeyboardShortcuts into ArrowKeySelection
- Meta box pity system: guarantee a meta box every 10 openings
- Inventory flickering: buffer-based rendering with ANSI cursor repositioning
- Non-readable symbols: use ASCII abbreviations instead of emoji in footer
- Resource/stats confusion: rename Resource Panel to Characteristics Panel
  in all user-facing text (EN/FR), update specs and descriptions
- Block consumable use before inventory panel unlock
- Remove obsolete proposal/suggestion files, clean up Spectre-only renderer
2026-03-14 20:21:18 +01:00
content Implement TODO.md: deterministic meta order, pity system, UX fixes 2026-03-14 20:21:18 +01:00
docs Initial project setup: Open The Box CLI game 2026-03-10 18:24:01 +01:00
src/OpenTheBox Implement TODO.md: deterministic meta order, pity system, UX fixes 2026-03-14 20:21:18 +01:00
tests/OpenTheBox.Tests Fix test for early-game box counter and add refactoring plan 2026-03-14 09:56:53 +01:00
.gitignore Fix runtime deserialization bugs, add test suite and publish support 2026-03-10 19:25:02 +01:00
bugs.md Fix layout, portrait cosmetics, add TUI renderer, snapshots, and playthrough analysis 2026-03-13 21:37:09 +01:00
CLAUDE.md Implement TODO.md: deterministic meta order, pity system, UX fixes 2026-03-14 20:21:18 +01:00
global.json Add complete content: recipes, French translations, music/cookie events 2026-03-10 18:45:54 +01:00
init.ps1 Add init.ps1 setup script, remove Loreline binaries from repo 2026-03-10 18:49:26 +01:00
OpenTheBox.slnx Fix runtime deserialization bugs, add test suite and publish support 2026-03-10 19:25:02 +01:00
publish.ps1 Fix runtime deserialization bugs, add test suite and publish support 2026-03-10 19:25:02 +01:00
README.md Implement TODO.md: deterministic meta order, pity system, UX fixes 2026-03-14 20:21:18 +01:00
refactoring_plan.md Fix test for early-game box counter and add refactoring plan 2026-03-14 09:56:53 +01:00
specifications.md Implement TODO.md: deterministic meta order, pity system, UX fixes 2026-03-14 20:21:18 +01:00
TODO.md Implement TODO.md: deterministic meta order, pity system, UX fixes 2026-03-14 20:21:18 +01:00

Open The Box

A CLI box-opening game where curiosity is the engine and every box is a mystery. Built in C# on .NET 10 with a progressive interface that evolves as you play.

Open a box. It contains another box. That one has a key. The key opens a chest. The chest holds a story fragment. The story unlocks a character. The character reveals a place. The place offers an adventure. The adventure rewards... a box.

Features

  • Progressive CLI -- Start with bare Console.ReadLine numbered menus. Unlock colors, arrow-key navigation, panels, portraits, and full layouts by finding Meta Boxes.
  • 25+ box types with weighted loot tables, conditional drops, and nested auto-opening boxes.
  • 9 interactive adventures powered by Loreline scripting (Space, Medieval, Pirate, Contemporary, Sentimental, Prehistoric, Cosmic, Microscopic, Dark Fantasy).
  • 160+ items -- cosmetics, materials, consumables, adventure tokens, lore fragments, fortune cookies.
  • 34 crafting recipes across 16 workstation types.
  • Auto-activation system -- items interact automatically (key + chest, badge + adventure).
  • Character customization -- hair, eyes, body, legs, arms, tints with ASCII portrait.
  • Bilingual -- full English and French support (UI + adventures).
  • Save/Load -- JSON-based save files.
  • Music Box -- Console.Beep melodies (Windows).
  • Fortune Cookies -- 20 box-themed wisdom messages.

Architecture

The game follows the Black Box Sim pattern (Brian Cronin): strict separation between simulation and presentation.

Input (keyboard)
      |
      v
  GameAction         -- command sent to the simulation
      |
      v
+----------------+
| GameSimulation |   -- BLACK BOX: zero I/O, pure logic
|  (GameState)   |
+-------+--------+
        |
        v
   GameEvent[]       -- events describing what happened
        |
        v
+----------------+
|   IRenderer    |   -- BasicRenderer (phase 0) or SpectreRenderer (phases 1-8)
+----------------+

The simulation never reads input or writes output. It receives actions and returns events. The game loop in Program.cs bridges input/renderer to simulation.

Prerequisites

  • Windows 10/11
  • .NET 10 SDK -- install via winget install Microsoft.DotNet.SDK.10

Setup

git clone <repo-url>
cd openthebox
.\init.ps1

The init script will:

  1. Check for .NET 10 SDK (offers to install if missing)
  2. Download Loreline v0.7.1 DLL
  3. Restore NuGet packages (Spectre.Console)

Build & Run

dotnet build
dotnet run --project src/OpenTheBox

Distribute

dotnet publish -c Release -r win-x64

This produces a self-contained single-file executable in publish/<runtime>/. The target machine does not need .NET installed. Distribute the entire folder (exe + content/).

Tests

dotnet test

43 content validation tests verify all JSON data files deserialize correctly, cross-references are valid, and localization keys exist.

Project Structure

openthebox/
+-- src/OpenTheBox/
|   +-- Program.cs              # Entry point, game loop
|   +-- Core/                   # Pure models, enums, no dependencies
|   +-- Simulation/             # BLACK BOX: GameSimulation, engines, actions, events
|   +-- Rendering/              # IRenderer, BasicRenderer, SpectreRenderer, Panels
|   +-- Adventures/             # Loreline integration
|   +-- Persistence/            # Save/Load
|   +-- Localization/           # JSON string manager
+-- content/
|   +-- data/                   # boxes.json, items.json, interactions.json, recipes.json
|   +-- strings/                # en.json, fr.json
|   +-- adventures/             # 9 themes, each with .lor + .fr.lor files
+-- docs/GDD.md                 # Game Design Document (French)
+-- init.ps1                    # Setup script
+-- global.json                 # Pins .NET 10 SDK

Tech Stack

Component Technology
Runtime .NET 10, C# 14
CLI rendering Spectre.Console
Interactive fiction Loreline (.lor scripts)
Serialization System.Text.Json
Localization JSON string tables + Loreline translation files

Terminal GUI

All content is expected to be renderer in a 120x30 characters frame.

License

All rights reserved.