export class RdDItemArme extends Item { /* -------------------------------------------- */ static getArmeData(item) { switch (item ? item.data.type : '') { case 'arme': return item.data; case 'competencecreature': return RdDItemArme._getArmeCompetenceCreature(item); } return RdDItemArme.mainsNues(); } /* -------------------------------------------- */ static _getArmeCompetenceCreature(competenceCreature) { let armeData = duplicate(competenceCreature.data); armeData.data.resistance = 100; armeData.data.competence = armeData.name; armeData.data.dommagesReels = armeData.data.dommagesReels || armeData.data.dommages; return armeData; } /* -------------------------------------------- */ static getCategorieParade(arme) { if (arme.data.categorie_parade) { return arme.data.categorie_parade; } // pour compatibilité avec des personnages existants if (arme.type == 'competencecreature') { return arme.data.categorie_parade || (arme.data.isparade ? 'sans-armes' : ''); } if (!arme.type.match(/arme|competencecreature/)) { return ''; } if (arme.data.competence == undefined) { return 'competencecreature'; } let compname = arme.data.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 (arme.name.toLowerCase().match(/(gnome)/)) return 'epees-courtes'; if (arme.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 isArmeParade(arme) { return RdDItemArme.getCategorieParade(arme); } /* -------------------------------------------- */ static needParadeSignificative(armeAttaque, armeParade) { let attCategory = RdDItemArme.getCategorieParade(armeAttaque); let defCategory = RdDItemArme.getCategorieParade(armeParade); // bouclier et mêmes catégorie: peuvent se parer sans difficulté if (defCategory == 'bouclier') { return false; } if (attCategory == defCategory) { return false; } // les épées se parent entre elles if (attCategory.match(/epees-/) && defCategory.match(/epees-/)) { return false; } if (attCategory == 'dagues' && defCategory == 'epees-courtes') { return false; } if (attCategory.match(/epees-(courtes|legeres)/) && defCategory == 'dagues') { return false; } // Manage weapon categories when parrying (cf. page 115 ) return true; } /* -------------------------------------------- */ static armeUneOuDeuxMains(arme, aUneMain) { if (arme) { arme.data.unemain = arme.data.unemain || !arme.data.deuxmains; const uneOuDeuxMains = arme.data.unemain && arme.data.deuxmains; const containsSlash = !Number.isInteger(arme.data.dommages) && arme.data.dommages.includes("/"); if (containsSlash) { // Sanity check arme = duplicate(arme); const tableauDegats = arme.data.dommages.split("/"); if (aUneMain) arme.data.dommagesReels = Number(tableauDegats[0]); else // 2 mains arme.data.dommagesReels = Number(tableauDegats[1]); } else { arme.data.dommagesReels = Number(arme.data.dommages); } if (uneOuDeuxMains != containsSlash) { ui.notifications.info("Les dommages de l'arme à 1/2 mains " + arme.name + " ne sont pas corrects (ie sous la forme X/Y)"); } } return arme; } static mainsNues() { const mainsNues = { name: 'Mains nues', data: { unemain: true, deuxmains: false, dommages: 0, dommagesReels: 0, mortalite: 'non-mortel', competence: 'Corps à corps', categorie_parade: 'sans-armes' } }; return mainsNues } }