fix: JSON repair, WS thread pool, switch to DeepSeek V4 Flash, funnel Lv0
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
This commit is contained in:
1 parent
6b048dc0cc
commit
eacc946868
23 files changed
+1786
-61
No files matched your search
@@ -0,0 +1,159 @@
|
||||
# Adventure Data
|
||||
|
||||
**Avventura**: La Tomba del Mago Guerriero
|
||||
**File**: `data/adventure/avventura.json` (~790 righe)
|
||||
|
||||
## Struttura JSON
|
||||
|
||||
```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:
|
||||
|
||||
```json
|
||||
{
|
||||
"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)
|
||||
|
||||
```json
|
||||
{
|
||||
"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
|
||||
|
||||
```json
|
||||
{
|
||||
"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
|
||||
|
||||
```json
|
||||
{
|
||||
"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.
|
||||
Reference in new issue
Block a user