WIP: Ajout des pouvoirs et des classes #246
8 changed files with 225 additions and 1 deletions
53
src/components/CapaciteFile.vue
Normal file
53
src/components/CapaciteFile.vue
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import { ref, onMounted, onBeforeUpdate } from "vue";
|
||||||
|
|
||||||
|
import axios from "axios";
|
||||||
|
import type CapaciteList from "@/types/CapaciteList";
|
||||||
|
import MarkdownFile from "./MarkdownFile.vue";
|
||||||
|
import CapaciteCategory from "./capacites/CapaciteCategory.vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
path: string;
|
||||||
|
json: string;
|
||||||
|
order?: number;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const loadedPage = ref("");
|
||||||
|
const categories = ref([] as CapaciteList[]);
|
||||||
|
|
||||||
|
function refresh() {
|
||||||
|
const capacitesFileUrl = `/${props.json}.json`;
|
||||||
|
if (loadedPage.value === capacitesFileUrl) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
loadedPage.value = capacitesFileUrl;
|
||||||
|
console.log(`Chargement du json ${capacitesFileUrl}`);
|
||||||
|
axios
|
||||||
|
.get(capacitesFileUrl)
|
||||||
|
.then((response) => {
|
||||||
|
categories.value = response.data;
|
||||||
|
})
|
||||||
|
.catch();
|
||||||
|
}
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
refresh();
|
||||||
|
});
|
||||||
|
|
||||||
|
onBeforeUpdate(() => {
|
||||||
|
refresh();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<article>
|
||||||
|
<MarkdownFile :path="path">
|
||||||
|
<div v-for="(category, index) in categories" :key="index">
|
||||||
|
<CapaciteCategory
|
||||||
|
:order="index"
|
||||||
|
:capacite-list="category"
|
||||||
|
></CapaciteCategory>
|
||||||
|
</div>
|
||||||
|
</MarkdownFile>
|
||||||
|
</article>
|
||||||
|
</template>
|
67
src/components/capacites/CapaciteCard.vue
Normal file
67
src/components/capacites/CapaciteCard.vue
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type Capacite from "@/types/Capacite";
|
||||||
|
|
||||||
|
defineProps<{
|
||||||
|
capacite: Capacite;
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="card">
|
||||||
|
<h3 class="title-3">{{ capacite.nom }}</h3>
|
||||||
|
<div class="badges">
|
||||||
|
<span
|
||||||
|
v-for="(statName, index) in capacite.stats"
|
||||||
|
:key="index"
|
||||||
|
class="btn-small pill bg-primary"
|
||||||
|
>
|
||||||
|
{{ statName }}
|
||||||
|
</span>
|
||||||
|
<span
|
||||||
|
v-for="(costName, index) in capacite.couts"
|
||||||
|
:key="index"
|
||||||
|
class="btn-small pill bg-danger"
|
||||||
|
>
|
||||||
|
{{ costName }}
|
||||||
|
</span>
|
||||||
|
<span v-if="capacite.type == 'passif'" class="btn-small pill bg-success">
|
||||||
|
Passif
|
||||||
|
</span>
|
||||||
|
<span v-if="capacite.type == 'posture'" class="btn-small pill bg-success">
|
||||||
|
Posture
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<p class="pouvoir-desc" v-html="capacite.description"></p>
|
||||||
|
<ul
|
||||||
|
class="niveaux"
|
||||||
|
v-for="(levelupSet, index) in capacite.levelups"
|
||||||
|
:key="index"
|
||||||
|
>
|
||||||
|
<li v-for="(levelup, index) in levelupSet" :key="index">
|
||||||
|
<strong>Niveau {{ levelup.niveau }} :</strong> {{ levelup.effet }}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.card {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
h3 {
|
||||||
|
font-size: 1.2rem;
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.badges {
|
||||||
|
font-size: 0.8rem;
|
||||||
|
text-align: center;
|
||||||
|
padding-bottom: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pouvoir-desc {
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
</style>
|
54
src/components/capacites/CapaciteCategory.vue
Normal file
54
src/components/capacites/CapaciteCategory.vue
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import type Capacite from "@/types/Capacite";
|
||||||
|
import type CapaciteList from "@/types/CapaciteList";
|
||||||
|
import axios from "axios";
|
||||||
|
import { ref, onMounted } from "vue";
|
||||||
|
import CapaciteCard from "./CapaciteCard.vue";
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
capaciteList: CapaciteList;
|
||||||
|
order: number;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const toLoad = ref(1);
|
||||||
|
const capacites = ref([] as Capacite[]);
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
setTimeout(() => {
|
||||||
|
refresh();
|
||||||
|
}, 100);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function refresh() {
|
||||||
|
toLoad.value = props.capaciteList.capacites.length;
|
||||||
|
for (const file of props.capaciteList.capacites) {
|
||||||
|
var fileName = file;
|
||||||
|
var currentName = "";
|
||||||
|
if (file.includes(":")) {
|
||||||
|
const splittedFilename = file.split(":");
|
||||||
|
fileName = splittedFilename[0];
|
||||||
|
currentName = splittedFilename[1];
|
||||||
|
}
|
||||||
|
const capaciteFile = `/jdr/pouvoirs/${fileName}.json`;
|
||||||
|
const response = await axios.get(capaciteFile);
|
||||||
|
if (response.data) {
|
||||||
|
toLoad.value = toLoad.value - 1;
|
||||||
|
if (currentName !== "") {
|
||||||
|
response.data.nom = currentName;
|
||||||
|
}
|
||||||
|
capacites.value = capacites.value.concat(response.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="pouvoir-category" :v-if="toLoad == 0">
|
||||||
|
<h2>{{ capaciteList.title }}</h2>
|
||||||
|
<div class="columns">
|
||||||
|
<div class="col-4" v-for="(capacite, index) in capacites" :key="index">
|
||||||
|
<CapaciteCard :capacite="capacite"></CapaciteCard>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
|
@ -6,6 +6,7 @@ import FichesView from "../views/FichesView.vue";
|
||||||
import ObjetsView from "../views/ObjetsView.vue";
|
import ObjetsView from "../views/ObjetsView.vue";
|
||||||
import EquipView from "../views/EquipView.vue";
|
import EquipView from "../views/EquipView.vue";
|
||||||
import ElementsView from "../views/ElementsView.vue";
|
import ElementsView from "../views/ElementsView.vue";
|
||||||
|
import CapaciteView from "../views/CapaciteView.vue";
|
||||||
|
|
||||||
const router = createRouter({
|
const router = createRouter({
|
||||||
history: createWebHashHistory(import.meta.env.BASE_URL),
|
history: createWebHashHistory(import.meta.env.BASE_URL),
|
||||||
|
@ -47,6 +48,10 @@ const router = createRouter({
|
||||||
path: "/jdr/:jdr/elements/",
|
path: "/jdr/:jdr/elements/",
|
||||||
component: ElementsView,
|
component: ElementsView,
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "/jdr/:jdr/pouvoirs/:filepath",
|
||||||
|
component: CapaciteView,
|
||||||
|
},
|
||||||
],
|
],
|
||||||
scrollBehavior(to, from, savedPosition) {
|
scrollBehavior(to, from, savedPosition) {
|
||||||
if (to.hash) {
|
if (to.hash) {
|
||||||
|
|
|
@ -62,7 +62,9 @@ export const useConfigStore = defineStore("config", () => {
|
||||||
|
|
||||||
function getSidebar(): LinkList[] {
|
function getSidebar(): LinkList[] {
|
||||||
if (isJdrLoaded()) {
|
if (isJdrLoaded()) {
|
||||||
return sidebar.value;
|
return (
|
||||||
|
sidebar.value.sort((a, b) => a.id - b.id) ?? [{ id: 0, links: [] }]
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
return (
|
return (
|
||||||
config.value?.jdr?.sort((a, b) => a.id - b.id) ?? [{ id: 0, links: [] }]
|
config.value?.jdr?.sort((a, b) => a.id - b.id) ?? [{ id: 0, links: [] }]
|
||||||
|
|
13
src/types/Capacite.ts
Normal file
13
src/types/Capacite.ts
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
export default interface Capacite {
|
||||||
|
nom: string;
|
||||||
|
description: string;
|
||||||
|
stats?: string[];
|
||||||
|
couts?: string[];
|
||||||
|
type?: "posture" | "passif";
|
||||||
|
levelups?: LevelUp[][];
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LevelUp {
|
||||||
|
niveau: number;
|
||||||
|
effet: string;
|
||||||
|
}
|
4
src/types/CapaciteList.ts
Normal file
4
src/types/CapaciteList.ts
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
export default interface CapaciteList {
|
||||||
|
title: string;
|
||||||
|
capacites: string[];
|
||||||
|
}
|
26
src/views/CapaciteView.vue
Normal file
26
src/views/CapaciteView.vue
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
<script setup lang="ts">
|
||||||
|
import CapaciteFile from "@/components/CapaciteFile.vue";
|
||||||
|
import { useConfigStore } from "@/stores/config";
|
||||||
|
import { useTocStore } from "@/stores/toc";
|
||||||
|
import { onMounted } from "vue";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
|
const store = useConfigStore();
|
||||||
|
const toc = useTocStore();
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
onMounted(() => {
|
||||||
|
toc.resetToc();
|
||||||
|
store.loadJdr(`${route.params.jdr}`);
|
||||||
|
console.log(`${route.params.filepath}`);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<main>
|
||||||
|
<CapaciteFile
|
||||||
|
:path="`rules/pouvoirs/${$route.params.filepath}`"
|
||||||
|
:json="`jdr/pouvoirs/${$route.params.filepath}`"
|
||||||
|
></CapaciteFile>
|
||||||
|
</main>
|
||||||
|
</template>
|
Loading…
Reference in a new issue