{p.data.nom}
+ {p.data.titre &&{p.data.titre}
} + +{p.data.description_physique}
+ ) + } ++ +
diff --git a/src/content/config.ts b/src/content/config.ts index ebc1c03..ae4b7dc 100644 --- a/src/content/config.ts +++ b/src/content/config.ts @@ -52,16 +52,19 @@ const personnages = defineCollection({ schema: z .object({ nom: z.string(), + titre: z.string().optional(), espece: z.string(), niveau_global: z.number().default(1), - classes_detail: z - .array( - z.object({ - nom: z.string(), - niveau: z.number(), - }), - ) - .default([]), + classes_detail: z.array( + z.object({ + nom: z.string(), + niveau: z.number(), + }), + ), + // Ajout des stats et listes + stats: z.record(z.number()).optional(), + equipement: z.array(z.string()).default([]), + traits: z.array(z.string()).default([]), }) .passthrough(), }); diff --git a/src/content/personnages/gmas.md b/src/content/personnages/gmas.md index 7383a61..103ec46 100644 --- a/src/content/personnages/gmas.md +++ b/src/content/personnages/gmas.md @@ -1,10 +1,43 @@ --- nom: "G'Mas" -espece: "grung" +titre: "Gueux des Mers Arides et Sableuses d'Outre-Tombe" +espece: "Grung" niveau_global: 2 +maitrise: 2 +inspiration: true classes_detail: - - nom: "moine" + - nom: "Moine" niveau: 1 +stats: + force: 10 + dexterite: 16 + constitution: 14 + intelligence: 12 + sagesse: 14 + charisme: 8 +sauvegardes: ["dexterite", "sagesse"] +traits_espece: ["Peau toxique", "Saut de grenouille", "Amphibie", "Vigilance Arboricole"] +capacites_classe: ["Méditation", "Arts Martiaux", "Marchand de sable"] +armes: ["Souffle-Quart"] +outils: ["Matériel d'alchimiste", "Tenue de rechange", "Sac à dos", "Sac de couchage", "Gamelle", "Boîte à Amadou", "10 torches", "10 jours de rations", "Outre", "15m de cordes" ] +sorts: ["Sommeil (Marchand de Sable)"] +description_physique: "Un Grung à la peau tannée par le sable, portant un sablier en bandoulière et des vêtements de voyage usés mais fonctionnels." --- -Fille de la lune et du savoir ancestral. +Permettez-moi de commencer par mon titre, celui qui m'a été donné dans mon ancienne patrie, car il en dit plus sur moi. Je suis **G'Mas**, le **Gueux des Mers Arides et Sableuses d'Outre-Tombe**. + +D'où je viens, là où mon peuple de batraciens anthropomorphes existe, l'ordre établi n'est pas le vôtre. Là-bas, l'eau n'est qu'un souvenir lointain. Nos mers sont faites de sable. Cependant, un sable sombre, dépourvu de toute essence vitale, a fait son apparition. Pour mon peuple, ce fut un fléau, une abomination... + +L'eau n'est qu'un souvenir que chaque grain crie à ceux qui peuvent l'entendre. Ce sable est la matière même de nos rêves les plus profonds. + +## Le Pèlerinage du Sable + +Mon voyage a commencé parce que ce granulé ancien, encore plus vieux que notre peuple, prend de plus en plus de place et menace notre survie. Je suis un pèlerin, un collecteur, un **Marchand de Sable** dont la tâche est de s'assurer que les cycles de sommeil et d'éveil de mon peuple puissent se poursuivre, en cherchant la source de ce fléau ou un remède. + +C'est du sable que je tire toutes mes capacités : +* **Conteur :** Le sable est un catalyseur de sommeil et nous n'arrivons pas à nous endormir sans une histoire. +* **Navigateur expert :** La marche et les bonds sur les dunes mouvantes demandent une connaissance sans faille de la topographie. + +> "Mon métier est Marchand de Sable, mais avec un peu d'art et d'attention, je passe volontiers à Marchand de Rêves pour vous offrir un repos profond et réparateur." + +J'ai toujours sur moi mon petit kit d'herboristerie et, plus important encore, un **sablier**. Il me permet de définir la granularité et de classer les sables nouveaux que je rencontre selon leur couleur et leur teneur. diff --git a/src/pages/creation.astro b/src/pages/creation.astro index da5082d..5a840c7 100644 --- a/src/pages/creation.astro +++ b/src/pages/creation.astro @@ -14,7 +14,7 @@ const SPECTRUM = { primal: "rgba(42, 157, 143, 1)", hybride: "rgba(100, 100, 100, 1)", - // Spectres (Espèces) - Opacité 0.25 + // Spectres (Espèces) - Opacité 0.4 (pour une meilleure visibilité) solaire: "rgba(200, 155, 60, 0.4)", elementaire: "rgba(0, 171, 255, 0.4)", terrestre: "rgba(139, 69, 19, 0.4)", @@ -29,13 +29,13 @@ const classData = personnages.reduce((acc, p) => { ); const spectreKey = pEspeceData?.data.spectre?.toLowerCase(); - // On itère sur chaque classe du personnage pour qu'il apparaisse partout p.data.classes_detail.forEach((c) => { if (!c.nom) return; const key = c.nom.toLowerCase(); if (!acc[key]) acc[key] = []; acc[key].push({ + id: p.id, // ID nécessaire pour le lien nom: p.data.nom, niveau_classe: c.niveau, colorSpectre: SPECTRUM[spectreKey] || "rgba(200, 200, 200, 0.5)", @@ -50,9 +50,7 @@ const especeData = personnages.reduce((acc, p) => { const key = p.data.espece.toLowerCase(); if (!acc[key]) acc[key] = []; - // On prend la première classe de la liste comme classe principale const mainClassName = p.data.classes_detail?.[0]?.nom; - const pClassData = classes.find( (cl) => cl.id.toLowerCase() === mainClassName?.toLowerCase() || @@ -61,6 +59,7 @@ const especeData = personnages.reduce((acc, p) => { const encreKey = pClassData?.data.encre?.toLowerCase(); acc[key].push({ + id: p.id, // ID nécessaire pour le lien nom: p.data.nom, niveau: p.data.niveau_global || 1, colorEncre: SPECTRUM[encreKey] || "#ffffff", @@ -96,7 +95,8 @@ const especeData = personnages.reduce((acc, p) => {
{charClass.data.description}
@@ -145,7 +145,8 @@ const especeData = personnages.reduce((acc, p) => {{espece.data.description}
@@ -210,7 +211,6 @@ const especeData = personnages.reduce((acc, p) => { grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 2rem; } - .class-card { background-color: white; padding: 2rem 1.5rem; @@ -221,7 +221,6 @@ const especeData = personnages.reduce((acc, p) => { justify-content: space-between; transition: all 0.3s ease; } - .dynamic-title { color: var(--accent-color) !important; font-family: "Playfair Display", serif; @@ -230,7 +229,6 @@ const especeData = personnages.reduce((acc, p) => { .species-card { background-color: var(--bg-color) !important; } - .notification-bubble { background: #1a1a1a !important; color: white !important; @@ -242,20 +240,21 @@ const especeData = personnages.reduce((acc, p) => { align-items: center; gap: 5px; border: 1px solid rgba(255, 255, 255, 0.1); + text-decoration: none; /* Important pour les liens */ + transition: transform 0.2s ease; + } + .notification-bubble:hover { + transform: translateY(-2px); + filter: brightness(1.2); } - - /* Correction Bordure BAS (Espèce) : On ajoute un shadow interne pour renforcer la couleur à 0.25 */ .bubble-species-border { background-color: var(--p-color) !important; border-bottom: 3px solid var(--p-color) !important; box-shadow: inset 0 -2px 0 0 var(--p-color); } - - /* Correction Bordure HAUT (Classe) */ .bubble-class-border { border-top: 3px solid var(--p-color) !important; } - .p-lvl { font-size: 0.6rem; opacity: 0.7; @@ -270,18 +269,16 @@ const especeData = personnages.reduce((acc, p) => { margin-bottom: 1.5rem; min-height: 30px; } - .select-button { font-family: "Cinzel", serif; text-decoration: none; padding: 0.5rem 1rem; - border: 1px solid var(--p-color); - color: var(--p-color); + border: 1px solid var(--accent-color); + color: var(--accent-color); transition: all 0.3s; } .select-button:hover { background: var(--accent-color); - border: 1px solid var(--p-color); color: white; } .species-button { diff --git a/src/pages/personnages/[id].astro b/src/pages/personnages/[id].astro new file mode 100644 index 0000000..42fb849 --- /dev/null +++ b/src/pages/personnages/[id].astro @@ -0,0 +1,348 @@ +--- +import { getCollection, render } from "astro:content"; +import GameLayout from "../../layouts/GameLayout.astro"; + +export async function getStaticPaths() { + const personnages = await getCollection("personnages"); + return personnages.map((p) => ({ + params: { id: p.id }, + props: { p }, + })); +} + +const { p } = Astro.props; +const { Content } = await render(p); + +// Logique métier +const getMod = (score) => Math.floor((score - 10) / 2); +const formatMod = (mod) => (mod >= 0 ? `+${mod}` : mod); +const statsOrder = [ + "force", + "dexterite", + "constitution", + "intelligence", + "sagesse", + "charisme", +]; +const classesLabel = p.data.classes_detail + ?.map((c) => `${c.nom} (Niv.${c.niveau})`) + .join(" / "); +--- + +{p.data.titre}
} + +{p.data.description_physique}
+ ) + } +