Refonte du système JDR + système de personnage joueurs / non joueurs :
Some checks failed
E2E Tests / e2e (push) Failing after 21s

- Système de templating dans le game system : en effet, les templates sont liés au game system car les fiches personnages ne sont pas forcément les même selon les jeux (perso Dnd possède + de compétences que Nimble par exemple)
- changement des fiches personnages pour adapter le templating au niveau des campagnes et remplir des pages de perso
This commit is contained in:
2026-04-30 10:42:09 +02:00
parent efaf5a3794
commit 52e389db24
67 changed files with 1610 additions and 255 deletions

View File

@@ -1,18 +1,27 @@
/**
* Fiche de personnage joueur (PJ) d'une campagne.
* MVP : markdownContent libre. Évolution prévue vers des fiches templatées
* par GameSystem (stats structurées selon le JDR joué).
* Refonte 2026-04-30 : abandon du markdownContent au profit d'un systeme
* template-based pilote par le GameSystem de la campagne.
* - portraitImageId / headerImageId : champs universels hard-codes
* - values : Map<champ template TEXT/NUMBER, valeur>
* - imageValues : Map<champ template IMAGE, liste d'IDs d'images>
*/
export interface Character {
id?: string;
name: string;
markdownContent?: string | null;
portraitImageId?: string | null;
headerImageId?: string | null;
values?: Record<string, string>;
imageValues?: Record<string, string[]>;
campaignId: string;
order?: number;
}
export interface CharacterCreate {
name: string;
markdownContent?: string | null;
portraitImageId?: string | null;
headerImageId?: string | null;
values?: Record<string, string>;
imageValues?: Record<string, string[]>;
campaignId: string;
}

View File

@@ -1,24 +1,30 @@
import { TemplateField } from './template-field.model';
/**
* Interface TypeScript pour GameSystemDTO (jumeau du DTO Java).
*
* rulesMarkdown : markdown monolithique, sections découpées par titres H2
* (## Combat, ## Classes, etc.). Le découpage et la sélection des sections
* à injecter dans le prompt IA sont faits côté backend Java.
* rulesMarkdown : markdown monolithique, sections decoupees par titres H2.
* characterTemplate / npcTemplate : champs templates pilotant le rendu des
* fiches PJ / PNJ d'une campagne adossee a ce systeme (cf. refonte 2026-04-30).
*/
export interface GameSystem {
id?: string;
name: string;
description?: string | null;
rulesMarkdown?: string | null;
characterTemplate?: TemplateField[];
npcTemplate?: TemplateField[];
author?: string | null;
isPublic?: boolean;
}
/** Payload de création/mise à jour (sans id). */
/** Payload de creation/mise a jour (sans id). */
export interface GameSystemCreate {
name: string;
description?: string | null;
rulesMarkdown?: string | null;
characterTemplate?: TemplateField[];
npcTemplate?: TemplateField[];
author?: string | null;
isPublic: boolean;
}

View File

@@ -1,18 +1,23 @@
/**
* Fiche de personnage non-joueur (PNJ) d'une campagne.
* MVP : markdownContent libre (description, motivation, stats, notes MJ).
* Évolution prévue : templating partagé PJ/PNJ piloté par GameSystem.
* Refonte 2026-04-30 : meme structure que Character (template-based).
*/
export interface Npc {
id?: string;
name: string;
markdownContent?: string | null;
portraitImageId?: string | null;
headerImageId?: string | null;
values?: Record<string, string>;
imageValues?: Record<string, string[]>;
campaignId: string;
order?: number;
}
export interface NpcCreate {
name: string;
markdownContent?: string | null;
portraitImageId?: string | null;
headerImageId?: string | null;
values?: Record<string, string>;
imageValues?: Record<string, string[]>;
campaignId: string;
}

View File

@@ -0,0 +1,15 @@
/**
* Interface TypeScript pour TemplateFieldDTO (kernel partage cote backend).
* Decrit un champ d'un template (PJ, PNJ, Lore Page).
*
* type : "TEXT" | "IMAGE" | "NUMBER"
* layout : "GALLERY" | "HERO" | "MASONRY" | "CAROUSEL", null sauf si type=IMAGE
*/
export type FieldType = 'TEXT' | 'IMAGE' | 'NUMBER';
export type ImageLayout = 'GALLERY' | 'HERO' | 'MASONRY' | 'CAROUSEL';
export interface TemplateField {
name: string;
type: FieldType;
layout?: ImageLayout | null;
}