diff --git a/db.sqlite b/db.sqlite index 5029786..a3b8409 100644 Binary files a/db.sqlite and b/db.sqlite differ diff --git a/db.sqlite-shm b/db.sqlite-shm index f35daa8..3c18602 100644 Binary files a/db.sqlite-shm and b/db.sqlite-shm differ diff --git a/db.sqlite-wal b/db.sqlite-wal index 8c48a87..9137541 100644 Binary files a/db.sqlite-wal and b/db.sqlite-wal differ diff --git a/pages/character/[id]/edit.client.vue b/pages/character/[id]/edit.client.vue index 3ea156a..65da917 100644 --- a/pages/character/[id]/edit.client.vue +++ b/pages/character/[id]/edit.client.vue @@ -85,7 +85,7 @@ const trainingSpent = computed(() => Object.values(maxTraining.value).reduce((p, const modifiers = computed(() => Object.entries(maxTraining.value).reduce((p, v) => { p[v[0] as MainStat] = Math.floor(v[1] / 3) + (data.value.progress.modifiers ? (data.value.progress.modifiers[v[0] as MainStat] ?? 0) : 0); return p; }, {} as Record)) const modifierPoints = computed(() => (selectedRaceOptions.value ? selectedRaceOptions.value.reduce((p, v) => p + (v?.modifier ?? 0), 0) : 0) + training.value.reduce((p, v) => p + v[1].reduce((_p, _v) => _p + (_v?.modifier ?? 0), 0), 0)); const modifierSpent = computed(() => Object.values(data.value.progress.modifiers ?? {}).reduce((p, v) => p + v, 0)); -const abilityPoints = computed(() => training.value.flatMap(e => e[1].filter(_e => _e.ability !== undefined)).reduce((p, v) => p + v.ability!, 0)); +const abilityPoints = computed(() => (selectedRaceOptions.value ? selectedRaceOptions.value.reduce((p, v) => p + (v?.abilities ?? 0), 0) : 0) + training.value.flatMap(e => e[1].filter(_e => _e.ability !== undefined)).reduce((p, v) => p + v.ability!, 0)); const abilityMax = computed(() => Object.entries(characterConfig.abilities).reduce((p, v) => { p[v[0] as Ability] = abilitySpecialFeatures("max", data.value.progress.training.curiosity, Math.floor(maxTraining.value[v[1].max[0]] / 3) + Math.floor(maxTraining.value[v[1].max[1]] / 3)); return p; }, {} as Record)); const abilitySpent = computed(() => Object.values(data.value.progress.abilities ?? {}).reduce((p, v) => p + v[0], 0)); @@ -119,9 +119,9 @@ function selectRaceOption(level: Level, choice: number) return; } - if(character.progress.race.progress.some(e => e[0] === level)) + if(character.progress.race.progress.some(e => e[0] == level)) { - character.progress.race.progress.splice(character.progress.race.progress.findIndex(e => e[0] === level), 1, [level, choice]); + character.progress.race.progress.splice(character.progress.race.progress.findIndex(e => e[0] == level), 1, [level, choice]); } else { @@ -143,9 +143,9 @@ function switchTrainingOption(stat: MainStat, level: TrainingLevel, choice: numb return; } - if(character.progress.training[stat].some(e => e[0] === level)) + if(character.progress.training[stat].some(e => e[0] == level)) { - if(character.progress.training[stat].some(e => e[0] === level && e[1] === choice)) + if(character.progress.training[stat].some(e => e[0] == level && e[1] === choice)) { for(let i = 15; i >= level; i --) //Invalidate higher levels { @@ -155,7 +155,7 @@ function switchTrainingOption(stat: MainStat, level: TrainingLevel, choice: numb } } else - character.progress.training[stat].splice(character.progress.training[stat].findIndex(e => e[0] === level), 1, [level, choice]); + character.progress.training[stat].splice(character.progress.training[stat].findIndex(e => e[0] == level), 1, [level, choice]); } else if(trainingPoints.value && trainingPoints.value > 0) { diff --git a/pages/character/index.client.vue b/pages/character/index.client.vue index 2bd22d5..4c12977 100644 --- a/pages/character/index.client.vue +++ b/pages/character/index.client.vue @@ -19,6 +19,14 @@ async function deleteCharacter(id: number) add({ content: 'Personnage supprimé', type: 'info', duration: 25000, timer: true, }); characters.value = characters.value?.filter(e => e.id !== id); } +async function duplicateCharacter(id: number) +{ + loading.value = true; + const newId = await useRequestFetch()(`/api/character/${id}/duplicate`, { method: 'post' }); + loading.value = false; + add({ content: 'Personnage dupliqué', type: 'info', duration: 25000, timer: true, }); + useRouter().push({ name: 'character-id', params: { id: newId } }); +}