2021-02-09 23:23:40 +01:00
|
|
|
|
import { Grammar } from "./grammar.js";
|
2021-03-29 18:08:18 +02:00
|
|
|
|
import { Misc } from "./misc.js";
|
2021-03-17 01:21:37 +01:00
|
|
|
|
|
2023-11-04 03:42:39 +01:00
|
|
|
|
const TABLE_CARACTERISTIQUES_DERIVEES = {
|
2021-03-17 01:21:37 +01:00
|
|
|
|
// xp: coût pour passer du niveau inférieur à ce niveau
|
2024-12-18 17:26:28 +01:00
|
|
|
|
1: { xp: 3, niveau: -5, poids: "moins de 1kg", poidsMin: 0, poidsMax: 1, plusdom: -5, sconst: 0.5, sust: 0.1 },
|
|
|
|
|
2: { xp: 3, niveau: -4, poids: "1-5", poidsMin: 1, poidsMax: 5, plusdom: -4, sconst: 0.5, sust: 0.3 },
|
|
|
|
|
3: { xp: 4, niveau: -3, poids: "6-10", poidsMin: 6, poidsMax: 10, plusdom: -3, sconst: 1, sust: 0.5, beaute: 'hideux' },
|
|
|
|
|
4: { xp: 4, niveau: -2, poids: "11-20", poidsMin: 11, poidsMax: 20, plusdom: -3, sconst: 1, sust: 1, beaute: 'repoussant' },
|
|
|
|
|
5: { xp: 5, niveau: -1, poids: "21-30", poidsMin: 21, poidsMax: 30, plusdom: -2, sconst: 1, sust: 1, beaute: 'franchement très laid' },
|
|
|
|
|
6: { xp: 5, niveau: 0, poids: "31-40", poidsMin: 31, poidsMax: 40, plusdom: -1, sconst: 2, sust: 2, beaute: 'laid' },
|
|
|
|
|
7: { xp: 6, niveau: 0, poids: "41-50", poidsMin: 41, poidsMax: 50, plusdom: -1, sconst: 2, sust: 2, beaute: 'très désavantagé' },
|
|
|
|
|
8: { xp: 6, niveau: 0, poids: "51-60", poidsMin: 51, poidsMax: 60, plusdom: 0, sconst: 2, sust: 2, beaute: 'désavantagé' },
|
|
|
|
|
9: { xp: 7, niveau: 0, poids: "61-65", poidsMin: 61, poidsMax: 65, plusdom: 0, sconst: 3, sust: 2, beaute: 'pas terrible' },
|
|
|
|
|
10: { xp: 7, niveau: 0, poids: "66-70", poidsMin: 66, poidsMax: 70, plusdom: 0, sconst: 3, sust: 3, beaute: 'commun' },
|
|
|
|
|
11: { xp: 8, niveau: 1, poids: "71-75", poidsMin: 71, poidsMax: 75, plusdom: 0, sconst: 3, sust: 3, beaute: 'pas mal' },
|
|
|
|
|
12: { xp: 8, niveau: 1, poids: "76-80", poidsMin: 76, poidsMax: 80, plusdom: +1, sconst: 4, sust: 3, beaute: 'avantagé' },
|
|
|
|
|
13: { xp: 9, niveau: 2, poids: "81-90", poidsMin: 81, poidsMax: 90, plusdom: +1, sconst: 4, sust: 3, beaute: 'mignon' },
|
|
|
|
|
14: { xp: 9, niveau: 2, poids: "91-100", poidsMin: 91, poidsMax: 100, plusdom: +2, sconst: 4, sust: 4, beaute: 'beau' },
|
|
|
|
|
15: { xp: 10, niveau: 3, poids: "101-110", poidsMin: 101, poidsMax: 110, plusdom: +2, sconst: 5, sust: 4, beaute: 'très beau' },
|
|
|
|
|
16: { xp: 20, niveau: 3, poids: "111-120", poidsMin: 111, poidsMax: 120, plusdom: +3, sconst: 5, sust: 4, beaute: 'éblouissant' },
|
|
|
|
|
17: { xp: 30, niveau: 4, poids: "121-131", poidsMin: 121, poidsMax: 131, plusdom: +3, sconst: 5, sust: 5 },
|
|
|
|
|
18: { xp: 40, niveau: 4, poids: "131-141", poidsMin: 131, poidsMax: 141, plusdom: +4, sconst: 6, sust: 5 },
|
|
|
|
|
19: { xp: 50, niveau: 5, poids: "141-150", poidsMin: 141, poidsMax: 150, plusdom: +4, sconst: 6, sust: 5 },
|
|
|
|
|
20: { xp: 60, niveau: 5, poids: "151-160", poidsMin: 151, poidsMax: 160, plusdom: +4, sconst: 6, sust: 6 },
|
|
|
|
|
21: { xp: 70, niveau: 6, poids: "161-180", poidsMin: 161, poidsMax: 180, plusdom: +5, sconst: 7, sust: 6 },
|
|
|
|
|
22: { xp: 80, niveau: 6, poids: "181-200", poidsMin: 181, poidsMax: 200, plusdom: +5, sconst: 7, sust: 7 },
|
|
|
|
|
23: { xp: 90, niveau: 7, poids: "201-300", poidsMin: 201, poidsMax: 300, plusdom: +6, sconst: 7, sust: 8 },
|
|
|
|
|
24: { xp: 100, niveau: 7, poids: "301-400", poidsMin: 301, poidsMax: 400, plusdom: +6, sconst: 8, sust: 9 },
|
|
|
|
|
25: { xp: 110, niveau: 8, poids: "401-500", poidsMin: 401, poidsMax: 500, plusdom: +7, sconst: 8, sust: 10 },
|
|
|
|
|
26: { xp: 120, niveau: 8, poids: "501-600", poidsMin: 501, poidsMax: 600, plusdom: +7, sconst: 8, sust: 11 },
|
|
|
|
|
27: { xp: 130, niveau: 9, poids: "601-700", poidsMin: 601, poidsMax: 700, plusdom: +8, sconst: 9, sust: 12 },
|
|
|
|
|
28: { xp: 140, niveau: 9, poids: "701-800", poidsMin: 701, poidsMax: 800, plusdom: +8, sconst: 9, sust: 13 },
|
|
|
|
|
29: { xp: 150, niveau: 10, poids: "801-900", poidsMin: 801, poidsMax: 900, plusdom: +9, sconst: 9, sust: 14 },
|
|
|
|
|
30: { xp: 160, niveau: 10, poids: "901-1000", poidsMin: 901, poidsMax: 1000, plusdom: +9, sconst: 10, sust: 15 },
|
|
|
|
|
31: { xp: 170, niveau: 11, poids: "1001-1500", poidsMin: 1001, poidsMax: 1500, plusdom: +10, sconst: 10, sust: 16 },
|
|
|
|
|
32: { xp: 180, niveau: 11, poids: "1501-2000", poidsMin: 1501, poidsMax: 2000, plusdom: +11, sconst: 10, sust: 17 }
|
2021-03-17 01:21:37 +01:00
|
|
|
|
};
|
2021-02-09 23:23:40 +01:00
|
|
|
|
|
2021-01-05 18:43:13 +01:00
|
|
|
|
export class RdDCarac {
|
|
|
|
|
|
2023-01-13 01:48:00 +01:00
|
|
|
|
static isAgiliteOuDerobee(selectedCarac) {
|
2021-01-05 18:43:13 +01:00
|
|
|
|
return selectedCarac?.label.match(/(Agilité|Dérobée)/);
|
|
|
|
|
}
|
2023-01-13 01:48:00 +01:00
|
|
|
|
|
2021-01-05 18:43:13 +01:00
|
|
|
|
static isVolonte(selectedCarac) {
|
|
|
|
|
return selectedCarac?.label == 'Volonté';
|
|
|
|
|
}
|
|
|
|
|
static isChance(selectedCarac) {
|
|
|
|
|
return selectedCarac?.label?.toLowerCase()?.match(/chance( actuelle)?/);
|
|
|
|
|
}
|
|
|
|
|
static isReve(selectedCarac) {
|
|
|
|
|
return selectedCarac?.label?.toLowerCase()?.match(/r(e|ê)ve(( |-)actuel)?/);
|
|
|
|
|
}
|
|
|
|
|
|
2024-11-25 22:16:52 +01:00
|
|
|
|
/**
|
|
|
|
|
* L’appel à la chance n’est possible que pour recommencer les jets d’actions physiques :
|
|
|
|
|
* tous les jets de combat, de FORCE, d’AGILITÉ, de DEXTÉRITÉ, de Dérobée, d’APPARENCE,
|
|
|
|
|
* ainsi que de Perception active et volontaire.
|
|
|
|
|
*/
|
2022-11-23 22:34:39 +01:00
|
|
|
|
static isActionPhysique(selectedCarac) {
|
2024-11-25 22:16:52 +01:00
|
|
|
|
return Grammar.toLowerCaseNoAccent(selectedCarac?.label)
|
|
|
|
|
?.match(/(apparence|force|agilite|dexterite|vue|ouie|gout|odorat|empathie|melee|tir|lancer|derobee)/) != null
|
2022-11-23 22:34:39 +01:00
|
|
|
|
}
|
|
|
|
|
|
2023-11-04 03:42:39 +01:00
|
|
|
|
static getCaracDerivee(value) {
|
2024-12-04 15:55:09 +01:00
|
|
|
|
return TABLE_CARACTERISTIQUES_DERIVEES[Math.min(Math.max(Math.floor(Number(value)), 1), 32)];
|
2023-11-04 03:42:39 +01:00
|
|
|
|
}
|
|
|
|
|
|
2021-03-17 01:21:37 +01:00
|
|
|
|
static computeTotal(carac, beaute = undefined) {
|
2022-10-05 19:29:16 +02:00
|
|
|
|
const total = Object.values(carac ?? {}).filter(c => !c.derivee)
|
2021-03-17 01:21:37 +01:00
|
|
|
|
.map(it => parseInt(it.value))
|
2021-03-29 18:08:18 +02:00
|
|
|
|
.reduce(Misc.sum(), 0);
|
2021-03-17 01:21:37 +01:00
|
|
|
|
const beauteSuperieur10 = Math.max((beaute ?? 10) - 10, 0);
|
|
|
|
|
return total + beauteSuperieur10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static levelUp(it) {
|
|
|
|
|
it.xpNext = RdDCarac.getCaracNextXp(it.value);
|
|
|
|
|
it.isLevelUp = (it.xp >= it.xpNext);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static calculSConst(constitution) {
|
2023-11-04 03:42:39 +01:00
|
|
|
|
return RdDCarac.getCaracDerivee(constitution).sconst;
|
2021-03-17 01:21:37 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
|
static getCaracNextXp(value) {
|
|
|
|
|
const nextValue = Number(value) + 1;
|
|
|
|
|
// xp est le coût pour atteindre cette valeur, on regarde donc le coût de la valeur+1
|
|
|
|
|
return RdDCarac.getCaracXp(nextValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static getCaracXp(targetValue) {
|
2023-11-04 03:42:39 +01:00
|
|
|
|
return RdDCarac.getCaracDerivee(targetValue)?.xp ?? 200;
|
2021-03-17 01:21:37 +01:00
|
|
|
|
}
|
2021-02-09 23:23:40 +01:00
|
|
|
|
}
|