Co-MJ v1 : quêtes de première classe, guidage de préparation, assistant IA,
All checks were successful
Build & Push Images / build (brain) (push) Successful in 1m38s
Build & Push Images / build (web) (push) Successful in 1m53s
Build & Push Images / build (core) (push) Successful in 3m40s
Build & Push Images / build-switcher (push) Successful in 16s

mode séance, battlemaps multiples et export Foundry ciblé

- Quêtes (Niveau 1) : entité Quest orthogonale à l'arbre, rattachée à un arc HUB
  ou libre (migrations V9-V12, V18, V20 ; réconciliation des jumeaux V10).
  Fusion quête/conteneur dans la sidebar, progression par partie (statuts
  disponible/en cours/terminée), et quêtes libres avec espace de scènes créé
  automatiquement (arc technique « Quêtes libres », V21 : levée de la
  contrainte arcs.type héritée du baseline).
- Guidage (Pilier B) : bilan de préparation 100 % dérivé (règles arc/chapitre/
  scène/quête), panneau « Prochaines étapes » avec boutons « Corriger », et
  pastilles détaillées (tooltip des manques) dans l'arbre.
- Assistant IA (Pilier A) : étoffage champ par champ (scène, chapitre, arc) et
  brouillons de scènes en propose→applique (brain : narrative-fields,
  scene-drafts).
- Horloges & menaces (V15-V17) : clocks à segments avec déclencheurs, fronts.
- Mode séance : préparation de séance (readiness + quêtes dispo), scène
  épinglée (V19), récap « précédemment » (brain : session-recap), onglet
  « Partie » du panneau de référence, graphe amélioré (pan/zoom, éditeur de
  liens).
- Perf : endpoint agrégé GET /api/campaigns/{id}/tree — la sidebar charge en
  1 requête au lieu de ~15.
- Battlemaps multiples par scène (variantes jour/nuit, étages…) : liste JSON
  étiquetée (V22, reprise automatique de la carte existante), rendu PDF avec
  légendes, export/import rétro-compatible.
- Export Foundry ciblé : modale de périmètre (cartes+ennemis / journaux /
  tables), bundle filtré côté serveur (zip allégé), module Foundry à jour
  (respect du périmètre + une Scene Foundry par variante de carte,
  rétro-compatible anciens bundles).
This commit is contained in:
2026-07-03 15:29:23 +02:00
parent 268f4721ce
commit b2c3800bf8
278 changed files with 15570 additions and 1451 deletions

View File

@@ -21,8 +21,11 @@ export interface CampaignCreate {
gameSystemId?: string | null;
}
/** Type structurel d'un Arc (miroir de l'enum Java ArcType). */
export type ArcType = 'LINEAR' | 'HUB';
/**
* Type structurel d'un Arc (miroir de l'enum Java ArcType).
* SYSTEM = arc technique « Quêtes libres » (conteneurs des quêtes hors arc), masqué de la narration.
*/
export type ArcType = 'LINEAR' | 'HUB' | 'SYSTEM';
/** Statut de progression piloté manuellement par le MJ (persisté). */
export type ProgressionStatus = 'NOT_STARTED' | 'IN_PROGRESS' | 'COMPLETED';
@@ -89,6 +92,65 @@ export interface ArcCreate {
illustrationImageIds?: string[];
}
/** Type de nœud narratif référencé par une quête (miroir Java NodeType). */
export type NodeType = 'CHAPTER' | 'SCENE';
/** Lien faible d'une quête vers un nœud narratif (miroir Java QuestNodeRef). */
export interface QuestNodeRef {
nodeType: NodeType;
nodeId: string;
order: number;
}
/**
* Quête (Niveau 1) — entité de première classe, ORTHOGONALE à l'arbre
* Arc→Chapitre→Scène, rattachée à la campagne. Porte ses prérequis (réutilise
* l'union Prerequisite) et référence des nœuds via QuestNodeRef.
*/
export interface Quest {
id?: string;
campaignId: string;
/** Arc de rattachement (nullable). Non nul ⇒ quête d'un arc HUB ; null ⇒ transverse. */
arcId?: string | null;
name: string;
description?: string;
icon?: string | null;
order?: number;
/** Conditions de déblocage (ET logique). Donnée de SCÉNARIO. */
prerequisites?: Prerequisite[];
/** Nœuds narratifs (Chapitres / Scènes) traversés par la quête. */
nodes?: QuestNodeRef[];
/** Read-only — peuplé par le backend quand un playthroughId est passé. */
progressionStatus?: ProgressionStatus;
effectiveStatus?: QuestStatus;
gmNotes?: string;
playerObjectives?: string;
narrativeStakes?: string;
relatedPageIds?: string[];
illustrationImageIds?: string[];
}
export interface QuestCreate {
name: string;
/** Arc de rattachement (nullable). Renseigné quand la quête est créée depuis un arc HUB. */
arcId?: string | null;
description?: string;
icon?: string | null;
order?: number;
prerequisites?: Prerequisite[];
nodes?: QuestNodeRef[];
gmNotes?: string;
playerObjectives?: string;
narrativeStakes?: string;
relatedPageIds?: string[];
illustrationImageIds?: string[];
}
export interface Chapter {
id?: string;
name: string;
@@ -97,20 +159,6 @@ export interface Chapter {
order?: number;
icon?: string | null;
/** Conditions de déblocage (ET logique). Donnée de SCÉNARIO. */
prerequisites?: Prerequisite[];
/**
* Statut de progression read-only — peuplé par le backend uniquement quand
* un playthroughId est passé en query param. Ne pas inclure en écriture.
*/
progressionStatus?: ProgressionStatus;
/**
* Statut effectif read-only — idem, dépend du Playthrough.
*/
effectiveStatus?: QuestStatus;
// Champs narratifs enrichis
gmNotes?: string;
playerObjectives?: string;
@@ -127,8 +175,6 @@ export interface ChapterCreate {
order: number;
icon?: string | null;
prerequisites?: Prerequisite[];
gmNotes?: string;
playerObjectives?: string;
narrativeStakes?: string;
@@ -166,6 +212,12 @@ export interface PlaythroughFlag {
value: boolean;
}
/** Type narratif d'un nœud (Scène) — Niveau 2. Miroir de l'enum Java SceneType. */
export type SceneType = 'GENERIC' | 'LOCATION' | 'ENCOUNTER' | 'NPC' | 'EVENT' | 'REVELATION';
/** Type d'un lien narratif entre scènes — Niveau 2. Miroir de l'enum Java LinkType. */
export type LinkType = 'EXIT' | 'CLUE' | 'LEAD';
/**
* Branche narrative : sortie possible d'une scène vers une autre du même chapitre.
* Pendant TS du Value Object Java SceneBranch.
@@ -174,6 +226,21 @@ export interface SceneBranch {
label: string;
targetSceneId: string;
condition?: string;
/** Type de lien (Niveau 2). Absent => EXIT côté backend. */
kind?: LinkType;
}
/**
* Battlemap étiquetée d'une scène (export Foundry) : variante Jour/Nuit, étage…
* Pendant TS du record domaine SceneBattlemap.
*/
export interface SceneBattlemap {
/** Libellé libre de la variante (ex : "Jour", "Nuit"). Peut être vide. */
label: string;
/** ID du fichier media (image/video). Null = carte sans fond. */
mediaFileId: string | null;
/** ID du fichier sidecar Universal VTT (.json/.dd2vtt). Null si absent. */
dataFileId: string | null;
}
/**
@@ -217,6 +284,9 @@ export interface Scene {
order?: number;
icon?: string | null;
/** Type narratif du nœud (Niveau 2). Absent => GENERIC. */
type?: SceneType;
// Champs narratifs enrichis
location?: string;
timing?: string;
@@ -234,11 +304,15 @@ export interface Scene {
illustrationImageIds?: string[];
/**
* Battlemap Foundry : ID du fichier media (image/video) + ID du sidecar JSON
* Universal VTT. Non affichee dans l'appli ; transportee a l'export Foundry.
* Battlemaps Foundry : variantes étiquetées (Jour/Nuit, étages…), chacune =
* media (image/video) + sidecar JSON Universal VTT. Non affichées dans
* l'appli ; transportées à l'export Foundry.
*/
battlemapMediaFileId?: string | null;
battlemapDataFileId?: string | null;
battlemaps?: SceneBattlemap[];
/** Position du nœud dans la vue graphe du chapitre (Niveau 2). Absent => layout auto. */
graphX?: number;
graphY?: number;
/** Sorties narratives (graphe intra-chapitre). */
branches?: SceneBranch[];
@@ -254,6 +328,9 @@ export interface SceneCreate {
order: number;
icon?: string | null;
/** Type narratif du nœud (Niveau 2). */
type?: SceneType;
location?: string;
timing?: string;
atmosphere?: string;
@@ -268,8 +345,9 @@ export interface SceneCreate {
relatedPageIds?: string[];
illustrationImageIds?: string[];
battlemapMediaFileId?: string | null;
battlemapDataFileId?: string | null;
battlemaps?: SceneBattlemap[];
graphX?: number;
graphY?: number;
branches?: SceneBranch[];
rooms?: Room[];
}