Compare commits
9 commits
master
...
branche-in
Author | SHA1 | Date | |
---|---|---|---|
|
5e6ab270ce | ||
|
6eaea78f67 | ||
|
66c2dca2d6 | ||
|
888a22395f | ||
|
2cffd0476a | ||
|
b91cf7d758 | ||
|
3d5867564c | ||
|
8dd5943d5a | ||
|
93201f3425 |
20 changed files with 1022 additions and 712 deletions
1449
package-lock.json
generated
1449
package-lock.json
generated
File diff suppressed because it is too large
Load diff
30
public/datas/creatures/animaux.json
Normal file
30
public/datas/creatures/animaux.json
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"nom":"Chèvre",
|
||||||
|
"classe":"Troupeau",
|
||||||
|
"carrure":"Médium Commun",
|
||||||
|
"min":1,
|
||||||
|
"max":5,
|
||||||
|
"armes":["cornes"],
|
||||||
|
"armures":["Cuir Naturel"],
|
||||||
|
"pouvoirs":["Rendre Chèvre"],
|
||||||
|
"elements":[],
|
||||||
|
"type":"",
|
||||||
|
"replace":[],
|
||||||
|
"overrideStats":[]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nom":"Bélier",
|
||||||
|
"classe":"Troupeau",
|
||||||
|
"carrure":"Médium Commun",
|
||||||
|
"min":1,
|
||||||
|
"max":5,
|
||||||
|
"armes":["cornes"],
|
||||||
|
"armures":["Laine"],
|
||||||
|
"pouvoirs":["Rendre Chèvre"],
|
||||||
|
"elements":[],
|
||||||
|
"type":"",
|
||||||
|
"replace":[],
|
||||||
|
"overrideStats":[]
|
||||||
|
}
|
||||||
|
]
|
|
@ -1,11 +1,9 @@
|
||||||
# À propos
|
# À propos
|
||||||
|
|
||||||
Pélican est un système générique de jeu de rôle basé sur le système D100, ayant pour objectif de créer un système de jeu de rôle simple mais efficace, se basant sur les dés les plus générique d’un rôliste. Il vise plutôt les débutants dans le JDR, et/ou ceux qui veulent ne pas se prendre la tête avec de nombreux calculs. Il provient en grande partie de ma frustration avec des systèmes comme celui de Pathfinder ou de tout les systèmes D6, qui n'étaient pas adapté à mes besoins.
|
Pélican est un bestiaire créé pour mon jeu de rôle Erratum, mais réutilisable potentiellement dans d'autres jeux de rôles utilisant un système similaire. Ce bestiaire à pour but de contenir pas mal de créatures à terme de l'imaginaire collectif afin de pouvoir gérer plus facilement les rencontres dans mon JDR.
|
||||||
|
|
||||||
Il est à noter que toutes les règles dans ces pages doivent être vu comme servant avant tout à servir la construction d'une histoire, et le RP.
|
Erratum est lui un JDR basé sur le système D100, ayant pour objectif de créer un système de jeu de rôle simple mais efficace, se basant sur les dés les plus générique d’un rôliste. Il vise plutôt les débutants dans le JDR, et/ou ceux qui veulent ne pas se prendre la tête avec de nombreux calculs. Il se déroule dans un univers de fantasy urbaine (mais peut être adapté à plusieurs époques et ambiances).
|
||||||
|
|
||||||
Pourquoi cette page ? Et bien, faisant un petit JDR avec mes amis, je me suis retrouvé comme beaucoup de MJ avec une situation qui peut être parfois casse-pied... Devoir gérer 300 versions du livre de règles différentes parce que le fichier .odt a été passé à plusieurs personnes, modifié sur le tas, etc.
|
Pourquoi cette page ? Et bien, faisant un petit JDR avec mes amis, je me suis retrouvé comme beaucoup de MJ avec une situation qui peut être parfois casse-pied... Devoir gérer 300 versions du livre de règles différentes parce que le fichier .odt a été passé à plusieurs personnes, modifié sur le tas, etc. Et pour les monstres ? C'est encore pire. Genre je fais la moitié sur le tas, mais sont jamais adapté.
|
||||||
|
|
||||||
Étant particulièrement feinéant, j'ai commencé à me dire que toute possibilité de moins avoir à réfléchir étant la plus belle chose qui pouvait m'arriver. En plus, je voulais m'entrainer à dev sous vue3 (la technologie utilisée pour générer ce site), et donc paf voilà le site de Pélican !
|
Ce site vise donc à présenter les créatures et les rendre facilement accessible et explorable, et les utiliser dans mes campagnes homebrew. Le site est codé en vue3, et a ses données stockées juste en tant que fichiers json.
|
||||||
|
|
||||||
Ce site vise donc à présenter les règles et les rendre facilement accessible et explorable, et présenter quelques un de mes JDR fait avec pour des campagnes homebrew.
|
|
3
public/pages/creatures/animaux.md
Normal file
3
public/pages/creatures/animaux.md
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# Animaux communs
|
||||||
|
|
||||||
|
Les animaux sont les créatures les plus communes que vous pouvez trouver. Ces créatures peuvent parfois êtres domestiquées par les êtres humains, pour diverses raisons. Elles n'ont souvent pas de pouvoirs magiques, ni des niveaux très haut.
|
|
@ -1,9 +1,5 @@
|
||||||
# Bienvenue sur le site de Pélican
|
# Bienvenue sur le site de Pélican
|
||||||
|
|
||||||
Pélican est un système générique de jeu de rôle basé sur le système D100, ayant pour objectif de créer un système de jeu de rôle simple mais efficace, se basant sur les dés les plus générique d’un rôliste. Il ne s'agit cependant que d'une base de système, à partir de laquelle vous pourrez construire des systèmes adaptés à votre univers et vos concepts.
|
Pélican est un bestiaire pour Erratum, présentant les différents types de monstres présent dans le JDR, ainsi que les PNJs génériques (et certains spéciaux, plus tard). Les monstres réutilisent le système de niveau et le système D100 d'Erratum.
|
||||||
|
|
||||||
Le système pélican à pour objectif de mettre en avant l'imagination et le RP plus que des règles complexes et un gameplay hyper peaufiné. Il vise à être simple à apprendre et à retenir, tout en offrant pas mal de cas de figure et possibilité. Il contient également des recommendation en terme de bienveillance envers les joueurs.
|
Ce set de monstre est fourni par [Kazhnuz](https://kazhnuz.space), et est basé sur des monstres communs et sortant souvent du domaine public. Le set complet est distribué sous la [Creative Common BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/), mais les concepts de base des monstres sont du domaine public du coup.
|
||||||
|
|
||||||
Cette page vous donne accès au set de base et aux différents set de règle que j'ai fait pour mes différentes campagnes.
|
|
||||||
|
|
||||||
Ce set de règle est fourni par [Kazhnuz](https://kazhnuz.space), avec certaines règles reprise des systèmes de mon groupe de JDR. Il est distribué sous la [Creative Common BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/).
|
|
|
@ -27,6 +27,5 @@ onMounted(() => {
|
||||||
<RouterView v-if="loaded" />
|
<RouterView v-if="loaded" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<TableOfContent />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -1,34 +1,24 @@
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { useConfigStore } from "@/stores/config";
|
|
||||||
import { computed } from "vue";
|
import { computed } from "vue";
|
||||||
|
import { LISTE_CREATURES } from "@/utils/constantes";
|
||||||
|
import { toURI } from "@/utils/urls";
|
||||||
|
|
||||||
const store = useConfigStore();
|
const creatures = computed(() => {
|
||||||
|
return LISTE_CREATURES;
|
||||||
const sidebar = computed(() => {
|
|
||||||
return store.getSidebar() ?? [{ title: "", id: 0, links: [] }];
|
|
||||||
});
|
|
||||||
|
|
||||||
const linkBase = computed(() => {
|
|
||||||
if (store.isJdrLoaded()) {
|
|
||||||
return `jdr/${store.currentJdr}`;
|
|
||||||
} else {
|
|
||||||
return `jdr`;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<aside id="sidebar" class="bg-dark fg-light menu">
|
<aside id="sidebar" class="bg-dark fg-light menu">
|
||||||
<h1 class="title-5 fg-light">Navigation</h1>
|
<h1 class="title-5 fg-light">Navigation</h1>
|
||||||
<ul v-for="item in sidebar" :key="item.id">
|
<ul>
|
||||||
<div class="menu-divider" v-if="item.title">{{ item.title }}</div>
|
<div class="menu-divider">Créatures</div>
|
||||||
<li v-for="(link, index) in item.links" :key="index">
|
<li v-for="(creature, index) in creatures" :key="index">
|
||||||
<router-link
|
<router-link
|
||||||
:to="`/${linkBase}/${link.path}`"
|
:to="`/creatures/${toURI(creature)}`"
|
||||||
class="menu-item"
|
class="menu-item"
|
||||||
:replace="true"
|
:replace="true"
|
||||||
v-if="!link.isHidden"
|
>{{ creature }}</router-link
|
||||||
>{{ link.title }}</router-link
|
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
|
@ -2,15 +2,14 @@
|
||||||
<header class="bg-primary" id="topbar">
|
<header class="bg-primary" id="topbar">
|
||||||
<div class="menu toolbar fg-light d-block d-flex-sm">
|
<div class="menu toolbar fg-light d-block d-flex-sm">
|
||||||
<ul>
|
<ul>
|
||||||
<li><router-link to="/" class="menu-item">Home</router-link></li>
|
<li><router-link to="/" class="menu-item">Accueil</router-link></li>
|
||||||
<li>
|
<li>
|
||||||
<router-link to="/about" class="menu-item">À propos</router-link>
|
<router-link to="/pages/about" class="menu-item"
|
||||||
|
>À propos</router-link
|
||||||
|
>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
<ul class="f-end">
|
<ul class="f-end">
|
||||||
<li>
|
|
||||||
<router-link to="/fiches" class="menu-item">Fiches</router-link>
|
|
||||||
</li>
|
|
||||||
<li>
|
<li>
|
||||||
<a
|
<a
|
||||||
href="https://git.kobold.cafe/pelican/pelican-jdr"
|
href="https://git.kobold.cafe/pelican/pelican-jdr"
|
||||||
|
@ -19,7 +18,7 @@
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="https://kazhnuz.space" class="menu-item">Retour</a>
|
<a href="https://erratum.kazhnuz.space" class="menu-item">Erratum</a>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
|
|
49
src/components/tableaux/TableCreature.vue
Normal file
49
src/components/tableaux/TableCreature.vue
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import { computed, defineProps } from "vue";
|
||||||
|
import { useCreaturesStore } from "@/stores/creatures";
|
||||||
|
import { toURI } from "@/utils/urls";
|
||||||
|
|
||||||
|
const store = useCreaturesStore();
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
group: string;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const creatures = computed(() => {
|
||||||
|
return store.datas ?? [];
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<p>
|
||||||
|
Il y a en tout {{ creatures?.length ?? 0 }} créatures dans cette catégories.
|
||||||
|
</p>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Nom</th>
|
||||||
|
<th>Type</th>
|
||||||
|
<th>Classe</th>
|
||||||
|
<th>Carrure</th>
|
||||||
|
<th>Niv. Min</th>
|
||||||
|
<th>Niv. Max</th>
|
||||||
|
<th>Voir</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr v-for="(creature, index) in creatures" :key="index">
|
||||||
|
<td>{{ creature.nom }}</td>
|
||||||
|
<td>{{ creature.type }}</td>
|
||||||
|
<td>{{ creature.classe }}</td>
|
||||||
|
<td>{{ creature.carrure }}</td>
|
||||||
|
<td>{{ creature.min }}</td>
|
||||||
|
<td>{{ creature.max }}</td>
|
||||||
|
<td>
|
||||||
|
<router-link :to="`/creatures/${group}/${toURI(creature.nom)}`"
|
||||||
|
>Voir</router-link
|
||||||
|
>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</template>
|
|
@ -1,11 +1,7 @@
|
||||||
import { createRouter, createWebHashHistory } from "vue-router";
|
import { createRouter, createWebHashHistory } from "vue-router";
|
||||||
import HomeView from "../views/HomeView.vue";
|
import HomeView from "../views/HomeView.vue";
|
||||||
import RuleView from "../views/RuleView.vue";
|
import RuleView from "../views/RuleView.vue";
|
||||||
import JdrView from "../views/JdrView.vue";
|
import CreaturesView from "../views/CreatureListView.vue";
|
||||||
import FichesView from "../views/FichesView.vue";
|
|
||||||
import ObjetsView from "../views/ObjetsView.vue";
|
|
||||||
import EquipView from "../views/EquipView.vue";
|
|
||||||
import ElementsView from "../views/ElementsView.vue";
|
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHashHistory(import.meta.env.BASE_URL),
|
history: createWebHashHistory(import.meta.env.BASE_URL),
|
||||||
|
@ -16,39 +12,15 @@ const router = createRouter({
|
||||||
component: HomeView,
|
component: HomeView,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/jdr/:jdr/rules/:category/:filepath",
|
path: "/pages/:filepath",
|
||||||
component: RuleView,
|
component: RuleView,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
path: "/jdr/:jdr/",
|
path: "/creatures/:group",
|
||||||
component: JdrView,
|
component: CreaturesView,
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/fiches",
|
|
||||||
component: FichesView,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/about",
|
|
||||||
name: "about",
|
|
||||||
// route level code-splitting
|
|
||||||
// this generates a separate chunk (About.[hash].js) for this route
|
|
||||||
// which is lazy-loaded when the route is visited.
|
|
||||||
component: () => import("../views/AboutView.vue"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/jdr/:jdr/inventaire/objets/",
|
|
||||||
component: ObjetsView,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/jdr/:jdr/inventaire/equipements/",
|
|
||||||
component: EquipView,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: "/jdr/:jdr/elements/",
|
|
||||||
component: ElementsView,
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
scrollBehavior(to, from, savedPosition) {
|
scrollBehavior(to) {
|
||||||
if (to.hash) {
|
if (to.hash) {
|
||||||
return {
|
return {
|
||||||
el: to.hash,
|
el: to.hash,
|
||||||
|
|
33
src/stores/creatures.ts
Normal file
33
src/stores/creatures.ts
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
import { ref } from "vue";
|
||||||
|
import { defineStore } from "pinia";
|
||||||
|
import type Creature from "@/types/Creature";
|
||||||
|
import axios from "axios";
|
||||||
|
|
||||||
|
const FOLDER = "creatures";
|
||||||
|
|
||||||
|
export const useCreaturesStore = defineStore("creatures", () => {
|
||||||
|
const current = ref("");
|
||||||
|
const datas = ref([] as Creature[]);
|
||||||
|
|
||||||
|
function load(filepath: string) {
|
||||||
|
if (filepath !== current.value) {
|
||||||
|
axios.get(`/datas/${FOLDER}/${filepath}.json`).then((response) => {
|
||||||
|
datas.value = response.data;
|
||||||
|
current.value = filepath;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function reset() {
|
||||||
|
datas.value = [];
|
||||||
|
current.value = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
function get(name: string): Creature | undefined {
|
||||||
|
return datas.value.filter((data: Creature) => {
|
||||||
|
return data.nom === name;
|
||||||
|
})[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
return { load, reset, get, current, datas };
|
||||||
|
});
|
|
@ -11,6 +11,9 @@ article .table-auto table, table.table-auto {
|
||||||
table {
|
table {
|
||||||
display: table;
|
display: table;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.fixed {
|
||||||
table-layout: fixed;
|
table-layout: fixed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,10 +12,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#sidebar {
|
#sidebar {
|
||||||
|
padding:0.5rem;
|
||||||
padding-top:1rem;
|
padding-top:1rem;
|
||||||
padding-left:0.75rem;
|
padding-left:0.75rem;
|
||||||
width:17rem;
|
width:17rem;
|
||||||
position: fixed;
|
|
||||||
height: calc(100vh - 3rem);
|
height: calc(100vh - 3rem);
|
||||||
overflow: scroll;
|
overflow: scroll;
|
||||||
h1 {
|
h1 {
|
||||||
|
@ -30,8 +30,10 @@
|
||||||
|
|
||||||
#page {
|
#page {
|
||||||
flex-grow:1;
|
flex-grow:1;
|
||||||
padding-left:18rem;
|
margin:auto;
|
||||||
padding-right: 18rem;
|
margin-top:0;
|
||||||
|
max-width:1200px;
|
||||||
|
padding: 1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#toc {
|
#toc {
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
// FONTS
|
// FONTS
|
||||||
// Define how looks the text
|
// Define how looks the text
|
||||||
|
|
||||||
$fontsize: 4.75mm;
|
$fontsize: 4.25mm;
|
||||||
|
|
||||||
$fontweight_big: 300;
|
$fontweight_big: 300;
|
||||||
$fontweight_base: 400;
|
$fontweight_base: 400;
|
||||||
$fontweight_bold: 600;
|
$fontweight_bold: 600;
|
||||||
$fontweight_hyper: 800;
|
$fontweight_hyper: 800;
|
||||||
|
|
||||||
$basefont: Open Sans, sans-serif;
|
$basefont: -apple-system, system-ui, sans-serif;
|
||||||
$titlefont: Open Sans, sans-serif;
|
$titlefont: -apple-system, system-ui, sans-serif;
|
||||||
|
|
14
src/types/Creature.ts
Normal file
14
src/types/Creature.ts
Normal file
|
@ -0,0 +1,14 @@
|
||||||
|
export default interface Creature {
|
||||||
|
nom: string;
|
||||||
|
classe: string;
|
||||||
|
carrure: string;
|
||||||
|
min: number;
|
||||||
|
max: number;
|
||||||
|
armes: string[];
|
||||||
|
armures: string;
|
||||||
|
pouvoirs: string[];
|
||||||
|
elements: string[];
|
||||||
|
type: string;
|
||||||
|
replace: { level: number; nom: string; description: string }[];
|
||||||
|
overrideStat: { stat: string; new: number }[];
|
||||||
|
}
|
8
src/utils/constantes.ts
Normal file
8
src/utils/constantes.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
export const LISTE_CREATURES = [
|
||||||
|
"Animaux",
|
||||||
|
"Animaux sauvages",
|
||||||
|
"Animaux magiques",
|
||||||
|
"Démons",
|
||||||
|
"Petit peuples",
|
||||||
|
"Morts-Vivants",
|
||||||
|
];
|
8
src/utils/urls.ts
Normal file
8
src/utils/urls.ts
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
export function toURI(str: string): string {
|
||||||
|
return str
|
||||||
|
.toLowerCase()
|
||||||
|
.trim()
|
||||||
|
.replace(/\s+/g, "-")
|
||||||
|
.normalize("NFD")
|
||||||
|
.replace(/[\u0300-\u036f]/g, "");
|
||||||
|
}
|
21
src/views/CreatureListView.vue
Normal file
21
src/views/CreatureListView.vue
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { useCreaturesStore } from "@/stores/creatures";
|
||||||
|
import { onMounted } from "vue";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
import MarkdownFile from "../components/MarkdownFile.vue";
|
||||||
|
import TableCreature from "@/components/tableaux/TableCreature.vue";
|
||||||
|
|
||||||
|
const store = useCreaturesStore();
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
store.load(`${route.params.group}`);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main>
|
||||||
|
<MarkdownFile :path="`pages/creatures/${$route.params.group}`" />
|
||||||
|
<TableCreature :group="`${$route.params.group}`" />
|
||||||
|
</main>
|
||||||
|
</template>
|
|
@ -17,8 +17,6 @@ onMounted(() => {
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<main>
|
<main>
|
||||||
<MarkdownFile
|
<MarkdownFile :path="`pages/${$route.params.filepath}`" />
|
||||||
:path="`rules/${$route.params.category}/${$route.params.filepath}`"
|
|
||||||
/>
|
|
||||||
</main>
|
</main>
|
||||||
</template>
|
</template>
|
||||||
|
|
|
@ -14,4 +14,6 @@
|
||||||
"path": "./tsconfig.config.json"
|
"path": "./tsconfig.config.json"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"resolveJsonModule": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue