foundryvtt-reve-de-dragon/module/item-arme.js

210 lines
7.3 KiB
JavaScript
Raw Normal View History

import { RdDItemCompetenceCreature } from "./item-competencecreature.js"
import { Misc } from "./misc.js";
import { RdDCombatManager } from "./rdd-combat.js";
const nomCategorieParade = {
2021-06-28 15:52:20 +02:00
"sans-armes": "Sans arme",
"armes-naturelles": "Sans arme",
"hast": "Armes d'hast",
"batons": "Bâtons",
"boucliers": "Boucliers",
"dagues": "Dagues",
"epees-courtes": "Epées courtes",
"epees-longues": "Epées longues",
"epees-lourdes": "Epées lourdes",
"haches": "Haches",
"lances": "Lances",
}
/* -------------------------------------------- */
export class RdDItemArme extends Item {
static isArme(itemData) {
2022-06-12 09:46:58 +02:00
itemData = itemData
2022-05-03 09:01:10 +02:00
return (itemData.type == 'competencecreature' && itemData.system.iscombat) || itemData.type == 'arme';
}
/* -------------------------------------------- */
static getArmeData(armeData) {
2022-06-12 09:46:58 +02:00
armeData = armeData
switch (armeData ? armeData.type : '') {
case 'arme': return armeData;
2021-01-01 22:25:32 +01:00
case 'competencecreature':
return RdDItemCompetenceCreature.toArme(armeData);
2021-01-01 22:25:32 +01:00
}
return RdDItemArme.mainsNues();
}
static computeNiveauArmes(armes, competences) {
for (const arme of armes) {
2022-06-12 08:17:59 +02:00
arme.system.niveau = RdDItemArme.niveauCompetenceArme(arme, competences);
}
}
static niveauCompetenceArme(arme, competences) {
2022-04-30 23:42:55 +02:00
const compArme = competences.find(it => it.name == arme.system.competence);
return compArme?.system.niveau ?? -8;
}
/* -------------------------------------------- */
static getNomCategorieParade(arme) {
2022-06-12 08:17:59 +02:00
const categorie = arme?.system ? RdDItemArme.getCategorieParade(arme) : arme;
return nomCategorieParade[categorie];
}
/* -------------------------------------------- */
static needArmeResist(armeAttaque, armeParade) {
if (!armeAttaque || !armeParade) {
return false;
}
// Epées parant une arme de bois (cf. page 115 ), une résistance est nécessaire
let attCategory = RdDItemArme.getCategorieParade(armeAttaque);
let defCategory = RdDItemArme.getCategorieParade(armeParade);
return attCategory.match(/epees-/) && defCategory.match(/(haches|lances)/);
}
/* -------------------------------------------- */
static getCategorieParade(armeData) {
2022-06-12 08:17:59 +02:00
if (armeData.system.categorie_parade) {
return armeData.system.categorie_parade;
}
// pour compatibilité avec des personnages existants
2022-06-12 08:17:59 +02:00
if (armeData.type == 'competencecreature' || armeData.system.categorie == 'creature') {
return armeData.system.categorie_parade || (armeData.system.isparade ? 'armes-naturelles' : '');
}
if (!armeData.type.match(/arme|competencecreature/)) {
return '';
}
2022-06-12 08:17:59 +02:00
if (armeData.system.competence == undefined) {
return 'competencecreature';
}
2022-06-12 08:17:59 +02:00
let compname = armeData.system.competence.toLowerCase();
if (compname.match(/^(dague de jet|javelot|fouet|arc|arbalête|fronde|hache de jet|fléau)$/)) return '';
if (compname.match('hache')) return 'haches';
if (compname.match('hast')) return 'hast';
if (compname.match('lance')) return 'lances';
if (compname.match('bouclier')) return 'boucliers';
if (compname.match('masse')) return 'masses';
if (compname.match('epée') || compname.match('épée')) {
if (armeData.name.toLowerCase().match(/(gnome)/))
return 'epees-courtes';
if (armeData.name.toLowerCase().match(/((e|é)pée dragone|esparlongue|demi-dragonne)/))
return 'epees-longues';
return 'epees-lourdes';
}
if (compname.match('dague')) {
return 'dagues';
}
return 'sans-armes';
}
/* -------------------------------------------- */
static needParadeSignificative(armeAttaque, armeParade) {
if (!armeAttaque || !armeParade) {
return false;
}
// categories d'armes à la parade (cf. page 115 )
let attCategory = RdDItemArme.getCategorieParade(armeAttaque);
let defCategory = RdDItemArme.getCategorieParade(armeParade);
// bouclier et mêmes catégorie: peuvent se parer sans difficulté
if (defCategory == 'boucliers') {
return false;
}
// Parer avec une hache ou une arme dhast exige toujours une significative
if (defCategory.match(/(hast|haches)/)) {
return true;
}
if (defCategory == attCategory) {
return false;
}
// les épées se parent entre elles
if (defCategory.match(/epees-/) && attCategory.match(/epees-/)) {
return false;
}
// l'épée gnome pare la dague
if (defCategory == 'epees-courtes' && attCategory == 'dagues') {
return false;
}
// la dague pare les épées courtes et légères
if (defCategory == 'dagues' && attCategory.match(/epees-(courtes|legeres)/)) {
return false;
}
return true;
}
/* -------------------------------------------- */
static armeUneOuDeuxMains(armeData, aUneMain) {
2022-06-12 08:17:59 +02:00
if (armeData && !armeData.system.cac) {
armeData.system.unemain = armeData.system.unemain || !armeData.system.deuxmains;
const uneOuDeuxMains = armeData.system.unemain && armeData.system.deuxmains;
const containsSlash = !Number.isInteger(armeData.system.dommages) && armeData.system.dommages.includes("/");
if (containsSlash) { // Sanity check
armeData = duplicate(armeData);
2022-06-12 08:17:59 +02:00
const tableauDegats = armeData.system.dommages.split("/");
if (aUneMain)
2022-06-12 08:17:59 +02:00
armeData.system.dommagesReels = Number(tableauDegats[0]);
else // 2 mains
2022-06-12 08:17:59 +02:00
armeData.system.dommagesReels = Number(tableauDegats[1]);
}
else {
2022-06-12 08:17:59 +02:00
armeData.system.dommagesReels = Number(armeData.system.dommages);
}
if (uneOuDeuxMains != containsSlash) {
ui.notifications.info("Les dommages de l'arme à 1/2 mains " + armeData.name + " ne sont pas corrects (ie sous la forme X/Y)");
}
}
return armeData;
}
static isArmeUtilisable(itemData) {
2022-06-12 08:17:59 +02:00
return itemData.type == 'arme' && itemData.system.equipe && (itemData.system.resistance > 0 || itemData.system.portee_courte > 0);
}
static ajoutCorpsACorps(armes, competences, carac) {
2022-06-12 08:17:59 +02:00
let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { system: { niveau: -6 } };
let init = RdDCombatManager.calculInitiative(corpsACorps.system.niveau, carac['melee'].value);
armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.system.niveau, initiative: init }));
//armes.push(RdDItemArme.empoignade({ niveau: corpsACorps.data.niveau, initiative: init }));
}
2021-06-28 16:08:45 +02:00
static corpsACorps(actorData) {
const corpsACorps = {
name: 'Corps à corps',
img: 'systems/foundryvtt-reve-de-dragon/icons/competence_corps_a_corps.webp',
2022-05-01 00:38:09 +02:00
system: {
equipe: true,
rapide: true,
force: 0,
dommages: 0,
dommagesReels: 0,
mortalite: 'non-mortel',
competence: 'Corps à corps',
categorie_parade: 'sans-armes'
}
2020-12-17 00:23:40 +01:00
};
2022-05-01 00:38:09 +02:00
mergeObject(corpsACorps.system, actorData ??{}, { overwrite: false });
2021-06-28 16:08:45 +02:00
return corpsACorps;
}
static mainsNues(actorData) {
2022-06-12 08:17:59 +02:00
const mainsNues = RdDItemArme.corpsACorps(actorData)
mainsNues.name = 'Mains nues'
mainsNues.system.cac = 'pugilat'
mainsNues.system.baseInit = 4
return mainsNues;
}
2021-06-28 16:08:45 +02:00
static empoignade(actorData) {
2022-06-12 08:17:59 +02:00
const empoignade = RdDItemArme.corpsACorps(actorData)
empoignade.name = 'Empoignade'
empoignade.system.cac = 'empoignade'
empoignade.system.baseInit = 3
empoignade.system.mortalite = 'empoignade'
return empoignade
2021-06-28 16:08:45 +02:00
}
}