Co-MJ v1 : quêtes de première classe, guidage de préparation, assistant IA,
All checks were successful
All checks were successful
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:
@@ -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[];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user