3.8 KiB
3.8 KiB
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.
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:
- Receives user text.
- Constructs a prompt including:
- Current Room Description.
- Visible Items/Enemies.
- Player Inventory.
- Valid Actions (Rules).
- Sends to
LLMService. - Executes the returned Action (e.g.,
move_player,pickup_item,start_combat).
2.3 State Manager
- Responsibility: Single source of truth.
- Implementation: Godot
Resourcebased system for easy saving/loading.
3. Data Architecture
3.1 Game State (GameState.gd - Resource)
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)
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:
{
"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
RoomDataresources. - 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:
- Player Turn: Choose Attack/Item/Flee.
- Resolution: Calculate damage (Simple:
Atk - Def). - Enemy Turn: Enemy attacks player.
- 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
ItemDataresources. - 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-expormeta-llama/llama-3-8b-instructfor speed/cost). - Version Control: Git