Initial MVP

This commit is contained in:
Aodhan Collins
2026-01-26 02:57:40 +00:00
commit b42521a008
33 changed files with 1004 additions and 0 deletions

View File

@@ -0,0 +1,112 @@
# Storyteller - Technical Architecture
## 1. System Overview
The game follows a **Client-Server** model where the Godot game client acts as the frontend and state manager, while the LLM (via OpenRouter) acts as the narrative engine and intent parser.
```mermaid
graph TD
User[User Input] -->|Text| UI[UI Layer]
UI -->|Signal| GM[GameManager]
GM -->|Context + Input| LLM[LLM Service]
LLM -->|OpenRouter API| Cloud[AI Model]
Cloud -->|JSON Response| LLM
LLM -->|Parsed Action| GM
GM -->|Update| State[GameState]
State -->|Signal| UI
State -->|Signal| Visuals[Visual/Audio System]
```
## 2. Core Components
### 2.1 LLM Service (`LLMService.gd`)
* **Responsibility:** Handles HTTP requests to OpenRouter.
* **Pattern:** Adapter pattern to allow future swapping to local LLM (Ollama).
* **Key Functions:**
* `send_prompt(system_prompt: String, user_input: String) -> Dictionary`
* `_parse_json(response: String) -> Dictionary`
* **Configuration:** API Key stored in `user://secrets.cfg` (not in version control).
### 2.2 Game Manager (`GameManager.gd`)
* **Responsibility:** Central coordinator.
* **Logic:**
1. Receives user text.
2. Constructs a prompt including:
* Current Room Description.
* Visible Items/Enemies.
* Player Inventory.
* Valid Actions (Rules).
3. Sends to `LLMService`.
4. Executes the returned Action (e.g., `move_player`, `pickup_item`, `start_combat`).
### 2.3 State Manager
* **Responsibility:** Single source of truth.
* **Implementation:** Godot `Resource` based system for easy saving/loading.
## 3. Data Architecture
### 3.1 Game State (`GameState.gd` - Resource)
```gdscript
class_name GameState extends Resource
@export var current_room_id: String
@export var player_hp: int
@export var player_max_hp: int
@export var inventory: Array[ItemData] # List of Item Resources
@export var world_flags: Dictionary # For tracking puzzle states
```
### 3.2 Room Data (`RoomData.gd` - Resource)
```gdscript
class_name RoomData extends Resource
@export var id: String
@export var name: String
@export var description: String # Base description for LLM context
@export var image_path: String # Path to static background
@export var exits: Dictionary # { "north": "room_id_2", ... }
@export var items: Array[ItemData]
@export var enemies: Array[EnemyData]
```
### 3.3 LLM Protocol (JSON Structure)
The LLM will be instructed to return JSON in this format:
```json
{
"narrative": "You step into the dark cave. The air is damp...",
"action": {
"type": "MOVE",
"target": "north"
},
"state_changes": {
"player_hp": -5
}
}
```
## 4. Core Systems
### 4.1 Navigation (The 4x4 Grid)
* **Map:** A 4x4 grid of `RoomData` resources.
* **Minimap:** A UI GridContainer that highlights the `current_room_id`.
* **Movement:** Validated against `RoomData.exits`.
### 4.2 Combat System (Dragon Quest Style)
* **Trigger:** When `action.type == "COMBAT"` or player encounters an enemy.
* **View:** Switches Main Display to "Combat Mode" (Enemy sprite front & center).
* **Flow:**
1. **Player Turn:** Choose Attack/Item/Flee.
2. **Resolution:** Calculate damage (Simple: `Atk - Def`).
3. **Enemy Turn:** Enemy attacks player.
4. **Loop:** Until HP <= 0.
* **LLM Role:** Describes the combat moves ("You swing your sword...", "The slime wobbles aggressively..."), but the *math* is handled by Godot.
### 4.3 Inventory
* **Data:** Array of `ItemData` resources.
* **UI:** List of items. Clicking an item adds "Use [Item Name]" to the input field or triggers a context menu.
## 5. Tech Stack
* **Engine:** Godot 4.2+
* **Language:** GDScript
* **AI Provider:** OpenRouter (Model: `google/gemini-2.0-flash-exp` or `meta-llama/llama-3-8b-instruct` for speed/cost).
* **Version Control:** Git