Files
dcc-rpg/docs/adventure-data.md
truetype eacc946868 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
2026-06-28 08:18:24 +02:00

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.