From 93747cbc9365ab11efbef129193d58a35e04b54d Mon Sep 17 00:00:00 2001 From: LATCHIMY Nicolas Date: Mon, 16 Feb 2026 01:38:49 +0400 Subject: [PATCH] classe et espece --- src/content/config.ts | 21 +++- src/content/personnages/bulle.md | 10 ++ src/content/personnages/gmas.md | 10 ++ src/content/personnages/gurdill.md | 10 ++ src/content/personnages/jinn.md | 10 ++ src/content/personnages/nyrae.md | 10 ++ src/pages/creation.astro | 182 +++++++++++++++++++++++------ 7 files changed, 215 insertions(+), 38 deletions(-) create mode 100644 src/content/personnages/bulle.md create mode 100644 src/content/personnages/gmas.md create mode 100644 src/content/personnages/gurdill.md create mode 100644 src/content/personnages/jinn.md create mode 100644 src/content/personnages/nyrae.md diff --git a/src/content/config.ts b/src/content/config.ts index 6e24deb..b1637da 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -41,4 +41,23 @@ const especes = defineCollection({ .passthrough(), }); -export const collections = { journal, classes, especes }; +const personnages = defineCollection({ + loader: obsidianLoader("personnages"), + schema: z + .object({ + nom: z.string(), + espece: z.string(), + niveau_global: z.number().default(1), + classes_detail: z + .array( + z.object({ + nom: z.string(), + niveau: z.number(), + }), + ) + .default([]), + }) + .passthrough(), +}); + +export const collections = { journal, classes, especes, personnages }; diff --git a/src/content/personnages/bulle.md b/src/content/personnages/bulle.md new file mode 100644 index 0000000..f6c1fcb --- /dev/null +++ b/src/content/personnages/bulle.md @@ -0,0 +1,10 @@ +--- +nom: "Bulle" +espece: "fee" +niveau_global: 2 +classes_detail: + - nom: "clerc" + niveau: 1 +--- + +Fille de la lune et du savoir ancestral. diff --git a/src/content/personnages/gmas.md b/src/content/personnages/gmas.md new file mode 100644 index 0000000..7383a61 --- /dev/null +++ b/src/content/personnages/gmas.md @@ -0,0 +1,10 @@ +--- +nom: "G'Mas" +espece: "grung" +niveau_global: 2 +classes_detail: + - nom: "moine" + niveau: 1 +--- + +Fille de la lune et du savoir ancestral. diff --git a/src/content/personnages/gurdill.md b/src/content/personnages/gurdill.md new file mode 100644 index 0000000..a8b9252 --- /dev/null +++ b/src/content/personnages/gurdill.md @@ -0,0 +1,10 @@ +--- +nom: "Gurdill" +espece: "nain" +niveau_global: 2 +classes_detail: + - nom: "barbare" + niveau: 1 +--- + +Brute au grand coeur, forgé dans les montagnes. diff --git a/src/content/personnages/jinn.md b/src/content/personnages/jinn.md new file mode 100644 index 0000000..549acbc --- /dev/null +++ b/src/content/personnages/jinn.md @@ -0,0 +1,10 @@ +--- +nom: "Jinn" +espece: "genasi" +niveau_global: 2 +classes_detail: + - nom: "barde" + niveau: 1 +--- + +Brute au grand coeur, forgé dans les montagnes. diff --git a/src/content/personnages/nyrae.md b/src/content/personnages/nyrae.md new file mode 100644 index 0000000..7681ccd --- /dev/null +++ b/src/content/personnages/nyrae.md @@ -0,0 +1,10 @@ +--- +nom: "Nyrae" +espece: "tabaxi" +niveau_global: 2 +classes_detail: + - nom: "druide" + niveau: 1 +--- + +Brute au grand coeur, forgé dans les montagnes. diff --git a/src/pages/creation.astro b/src/pages/creation.astro index fa51c52..c4880c4 100644 --- a/src/pages/creation.astro +++ b/src/pages/creation.astro @@ -4,57 +4,131 @@ import GameLayout from "../layouts/GameLayout.astro"; const classes = await getCollection("classes"); const especes = await getCollection("especes"); +const personnages = await getCollection("personnages"); + +// Groupement pour les classes (Gestion multiclassage) +const classData = personnages.reduce((acc, p) => { + // On vérifie si classes_detail existe, sinon on simule un tableau avec la classe de base + const details = p.data.classes_detail || [ + { nom: p.data.classe, niveau: p.data.niveau_global || 1 }, + ]; + + details.forEach((c) => { + if (!c.nom) return; + const key = c.nom.toLowerCase(); + if (!acc[key]) acc[key] = []; + + acc[key].push({ + nom: p.data.nom, + niveau_classe: c.niveau, + niveau_total: p.data.niveau_global || c.niveau, + }); + }); + return acc; +}, {}); + +// Groupement pour l'espèce +const especeData = personnages.reduce((acc, p) => { + if (!p.data.espece) return acc; + const key = p.data.espece.toLowerCase(); + if (!acc[key]) acc[key] = []; + acc[key].push({ + nom: p.data.nom, + niveau: p.data.niveau_global || 1, + }); + return acc; +}, {}); ---
-

Choisissez votre Classe

La classe définit vos compétences et votre rôle dans l'aventure.

+
{ - classes.map((charClass) => ( -
-

{charClass.data.title}

-

{charClass.data.description}

- - Détails - -
- )) + classes.map((charClass) => { + const charactersInClass = + classData[charClass.id.toLowerCase()] || []; + return ( +
+

{charClass.data.title}

+ +
+ {charactersInClass.map((p) => ( +
+ {p.nom} + + Niv.{p.niveau_classe} + + {p.niveau_total > + p.niveau_classe && ( + + + + + )} +
+ ))} +
+ +

{charClass.data.description}

+ + Détails + +
+ ); + }) }
-

Choisissez votre Espèce

- L'espèce influence votre apparence, votre histoire et certaines - de vos aptitudes. + L'espèce influence votre apparence et votre histoire.

+
{ - especes.map((espece) => ( -
-

{espece.data.title}

-

{espece.data.description}

- - Détails - -
- )) + especes.map((espece) => { + const charactersInEspece = + especeData[espece.id.toLowerCase()] || []; + return ( +
+

{espece.data.title}

+ +
+ {charactersInEspece.map((p) => ( +
+ {p.nom} + + Niv.{p.niveau} + +
+ ))} +
+ +

{espece.data.description}

+ + Détails + +
+ ); + }) }
@@ -95,12 +169,10 @@ const especes = await getCollection("especes"); .dnd-intro { font-family: "Cinzel", serif; font-size: 0.9rem; - margin-top: 1rem; + margin: 1rem auto; opacity: 0.8; text-align: center; max-width: 600px; - margin-left: auto; - margin-right: auto; } .class-grid { @@ -133,7 +205,47 @@ const especes = await getCollection("especes"); font-family: "Playfair Display", serif; font-size: 1.8rem; color: #c89b3c; - margin: 0 0 1rem 0; + margin: 0 0 0.5rem 0; + } + + .bubble-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 6px; + margin-bottom: 1.5rem; + min-height: 28px; + } + + .notification-bubble { + background: #3a352a; + color: white; + font-family: "Cinzel", serif; + font-size: 0.7rem; + padding: 2px 10px; + border-radius: 20px; + display: inline-flex; + align-items: center; + gap: 5px; + transition: transform 0.2s ease; + } + + .notification-bubble:hover { + transform: scale(1.05); + cursor: pointer; + } + + .p-lvl { + font-size: 0.6rem; + opacity: 0.8; + padding-left: 5px; + border-left: 1px solid rgba(255, 255, 255, 0.3); + } + + .multiclass-dot { + color: #c89b3c; + font-weight: bold; + margin-left: 2px; } .class-card p { @@ -152,12 +264,8 @@ const especes = await getCollection("especes"); border: 1px solid #c89b3c; padding: 0.5rem 1rem; border-radius: 3px; - cursor: pointer; - transition: - background-color 0.3s, - color 0.3s; text-decoration: none; - display: inline-block; + transition: all 0.3s; } .select-button:hover {