LLM fixes: - _try_repair_json() — ripara JSON malformato (apici, virgole trailing) - _strip_json_from_text() — rimuove residui JSON dalla narration - parse_tool_call() — rimuove troncamento 200 caratteri dal fallback DM fixes: - Fallback euristico quando params vuoti (dm.py) - Estrazione narrazione da dm_override/narrate params.params.text Prompt (prompts.py): - Vietati termini tecnici/scientifici/anacronistici (HPLC, laser, ...) - Aggiunto vocabolario fantasy obbligatorio Server (server.py): - dm_cycle in ThreadPoolExecutor per non bloccare WS ping - WebSocketDisconnect gestiti - Rimosso import inesistente db_schema Frontend (index.html): - Nascosti tool name dalla chat - Personaggio -> PG, connessioni aree con nomi Infrastruttura: - Switch da openrouter/free a DeepSeek V4 Flash via OpenCode Go - pyproject.toml, Dockerfile, docker-compose.yml, start.sh - .env auto-load (start.sh) - Funnel Lv0 (funnel.py) — creazione PG livello 0 Docs: architecture, database, setup, game mechanics, codebase ref
4.3 KiB
4.3 KiB
Adventure Data
Avventura: La Tomba del Mago Guerriero
File: data/adventure/avventura.json (~790 righe)
Struttura JSON
{
"meta": {
"name": "La Tomba del Mago Guerriero",
"description": "Avventura per personaggi di livello 0/1",
"setting": "dungeon sotterraneo di un antico mago guerriero",
"theme": "Weird Fantasy / sci-fantasy",
"level_range": "0-1",
"warrior_mage_name": "Vorkhul Ksh'tharan",
"warrior_mage_epithet": "Il Vincolato alle Stelle",
"structure": "9 aree numerate (1.1-1.9)",
"mortality_style": "DCC classico: alta mortalita, perdita media 7-8 PG su 15"
},
"areas": [...],
"monsters": [...],
"quests": [...],
"special_items": [...]
}
Aree (9 totali)
| ID | Nome | Collegamenti | PG? | Mostri | Enigmi |
|---|---|---|---|---|---|
| 1.1 | Portale | 1.2 | Sì | - | Allineamento stellare |
| 1.2 | Sala del Guardiano | 1.1, 1.3 | Sì | Statua lanciafiamme | Nome mago guerriero |
| 1.3 | Sala Monumentale | 1.2, 1.4 | Sì | Guardiano spettrale | Colonna centrale (frammento nome) |
| 1.4 | Fucina del Demone-Serpente | 1.3, 1.5 | Sì | Demone-serpente | - |
| 1.5 | Camera della Mente Senza Tempo | 1.4, 1.6 | Sì | - | Prova mentale |
| 1.6 | La Forgia delle Anime | 1.5, 1.7 | Sì | Anima forgiata | - |
| 1.7 | Ossario | 1.6, 1.8 | Sì | Non-morti | - |
| 1.8 | Anticamera del Potere | 1.7, 1.9 | Sì | Golem guardiano | - |
| 1.9 | Sala del Tesoro | 1.8 | Sì | - | Tomo del nome completo |
Ogni area contiene:
{
"id": "1.1",
"name": "Portale",
"order": 1,
"description": "Corridoio d'ingresso visibile soltanto attraverso il portale stellare...",
"atmosphere": "Aria stantia, polvere millenaria, silenzio pressante...",
"connections": ["1.2"],
"features": [
"Porta rinforzata in ferro con gioielli incastonati",
"Lastricato di pietra",
"Iscrizioni stellari"
],
"puzzles": [
{
"name": "Apertura della Porta",
"description": "...",
"solution": "Attendere 2 ore l'allineamento",
"skill_checks": [
{"skill": "Intelligenza", "dc": 14, "description": "Accorgersi dell'allineamento"}
]
}
],
"traps": [
{
"name": "Luce Bruciante",
"trigger": "Forzare la porta",
"effect": "Luce accecante, 1d8 danni",
"detect_dc": 20,
"damage": "1d8",
"save": {"type": "Riflessi", "dc": 10, "effect_on_save": "danno dimezzato"}
}
],
"monsters": [{"ref_id": "statue_guardian", "count": 1, "tactics": "attacca chi entra"}],
"items": [],
"treasure": []
}
Mostri (stat block)
{
"monsters": [
{
"id": "statue_guardian",
"name": "Statua Guardiana",
"level": 2,
"stats": {
"ac": 16,
"hp": 25,
"attack": "d20+4",
"damage": "1d8+2",
"saves": {"Tempra": 5, "Riflessi": 2, "Volontà": 0},
"move": "nessuno (fissa)"
},
"special": "Lanciafiamme ogni 1d4 round (d8+2 danni, Riflessi CD 12 dimezza)",
"xp": 75,
"loot": []
}
]
}
Quest
{
"quests": [
{
"name": "Il Nome Perduto",
"description": "Scopri il vero nome del mago guerriero per placare le difese del dungeon",
"objectives": [
"Trova il frammento nella Colonna Centrale (area 1.3)",
"Trova il nome completo nel Tomo (area 1.9)",
"Pronuncia il nome nella Sala del Guardiano (area 1.2)"
]
}
]
}
Special Items
{
"special_items": [
{
"id": "tomo_antico",
"name": "Tomo dalla Rilegatura di Pelle",
"location": "1.9",
"description": "Contiene la seconda meta del nome del mago guerriero",
"type": "quest"
}
]
}
Tabelle Critici / Fumble
File: data/crit_fumble_tables.json (207 righe)
Tabella Fumble (fumble)
- Dado determinato da armatura: nessuna=d4, leggera=d8, media=d12, pesante=d16
- Modificatore: -Fortuna (sfortuna = peggior fumble)
- 17 entries (da ≤0 a 16+)
Tabelle Critici (crit_I → crit_V)
- crit_I: Personaggi lv0 e Maghi (d4)
- crit_II: Ladri, Elfi (d6)
- crit_III: Chierici, Halfling, Guerrieri lv1-2, Nani lv1-3 (d8)
- crit_IV: Guerrieri lv3-4, Nani lv4-5 (d10)
- crit_V: Guerrieri lv5+, Nani lv6+ (d12)
- Modificatore: +Fortuna
Ogni tabella ha ~19 entries su range diverso.