diff --git a/module/actor-sheet.js b/module/actor-sheet.js index a9fcc32e..29170dc2 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -62,9 +62,6 @@ export class RdDActorSheet extends ActorSheet { if (this.actor.data.type == 'creature') return formData; // Shortcut - // toujours avoir une liste d'armes (pour mettre esquive et corps à corps) - formData.itemsByType.arme = formData.itemsByType.arme ?? []; - formData.competenceByCategory = Misc.classify(formData.data.competences, item => item.data.categorie); formData.calc = { @@ -93,38 +90,15 @@ export class RdDActorSheet extends ActorSheet { }); - // Force empty arme, at least for Esquive - if (formData.itemsByType.arme == undefined) formData.itemsByType.arme = []; - for (const arme of formData.itemsByType.arme) { - arme.data.niveau = 0; // Per default, TODO to be fixed - for (const melee of formData.competenceByCategory.melee) { - if (melee.name == arme.data.competence) - arme.data.niveau = melee.data.niveau - } - for (const tir of formData.competenceByCategory.tir) { - if (tir.name == arme.data.competence) - arme.data.niveau = tir.data.niveau - } - for (const lancer of formData.competenceByCategory.lancer) { - if (lancer.name == arme.data.competence) - arme.data.niveau = lancer.data.niveau - } - } - - // To avoid armour and so on... - formData.data.combat = duplicate(RdDUtility.checkNull(formData.itemsByType['arme'])); + // toujours avoir une liste d'armes (pour mettre esquive et corps à corps) + formData.data.combat = duplicate(formData.itemsByType.arme ?? []); + RdDItemArme.computeNiveauArmes(formData.data.combat, formData.data.competences); + RdDItemArme.ajoutCorpsACorps(formData.data.combat, formData.data.competences, formData.data.carac ); + formData.esquive = RdDItemCompetence.getEsquive(formData.data.competences); formData.data.combat = RdDCombatManager.finalizeArmeList(formData.data.combat, formData.itemsByType.competence, formData.data.carac); - formData.esquive = { name: "Esquive", niveau: formData.competenceByCategory?.melee.find(it => it.name == 'Esquive')?.data.niveau ?? -6 }; - let corpsACorps = formData.competenceByCategory?.melee.find(it => it.name == 'Corps à corps'); - if (corpsACorps) { - let cc_init = RdDCombatManager.calculInitiative(corpsACorps.data.niveau, formData.data.carac['melee'].value); - formData.data.combat.push(RdDItemArme.mainsNues({ niveau: corpsACorps.data.niveau, initiative: cc_init })); - } - this.armesList = duplicate(formData.data.combat); - formData.data.carac.taille.isTaille = true; // To avoid button link; - formData.data.blessures.resume = this.actor.computeResumeBlessure(formData.data.blessures); + this.armesList = formData.data.combat; // Mise à jour de l'encombrement total et du prix de l'équipement @@ -140,14 +114,18 @@ export class RdDActorSheet extends ActorSheet { html: "" + RdDUtility.makeHTMLfatigueMatrix(formData.data.sante.fatigue.value, formData.data.sante.endurance.max).html() + "
" } - RdDUtility.filterItemsPerTypeForSheet(formData); - formData.data.sortReserve = formData.data.reve.reserve.list; - formData.data.rencontres = duplicate(formData.data.reve.rencontre.list); - formData.data.caseSpeciales = formData.itemsByType['casetmr']; + formData.hautreve = { + sortsReserve: formData.data.reve.reserve.list, + rencontres: duplicate(formData.data.reve.rencontre.list), + casesTmr: formData.itemsByType.casetmr + } + RdDUtility.buildArbreDeConteneur(this, formData); - formData.data.vehiculesList = this.actor.buildVehiculesList(); - formData.data.monturesList = this.actor.buildMonturesList(); - formData.data.suivantsList = this.actor.buildSuivantsList(); + formData.subacteurs = { + vehicules: this.actor.listeVehicules(), + montures: this.actor.listeMontures(), + suivants: this.actor.listeSuivants() + } return formData; } diff --git a/module/actor.js b/module/actor.js index 8b046d36..30a01d16 100644 --- a/module/actor.js +++ b/module/actor.js @@ -3007,7 +3007,7 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - buildVehiculesList() { + listeVehicules() { return this._buildActorLinksList( this.data.data.subacteurs?.vehicules ?? [], vehicle => { @@ -3019,12 +3019,12 @@ export class RdDActor extends Actor { } /* -------------------------------------------- */ - buildSuivantsList() { + listeSuivants() { return this._buildActorLinksList(this.data.data.subacteurs?.suivants ?? []); } /* -------------------------------------------- */ - buildMonturesList() { + listeMontures() { return this._buildActorLinksList(this.data.data.subacteurs?.montures ?? []); } diff --git a/module/item-arme.js b/module/item-arme.js index fa3428a5..0d6ea65d 100644 --- a/module/item-arme.js +++ b/module/item-arme.js @@ -1,4 +1,5 @@ import { RdDItemCompetenceCreature } from "./item-competencecreature.js" +import { RdDCombatManager } from "./rdd-combat.js"; const nomCategorieParade = { "sans-armes": "Sans arme / armes naturelles", @@ -30,6 +31,17 @@ export class RdDItemArme extends Item { return RdDItemArme.mainsNues(); } + static computeNiveauArmes(armes, competences) { + for (const arme of armes) { + arme.data.niveau = RdDItemArme.niveauCompetenceArme(arme, competences); + } + } + + static niveauCompetenceArme(arme, competences) { + const compArme = competences.find(it => it.name == arme.data.competence); + return compArme?.data.niveau ?? -8; + } + /* -------------------------------------------- */ static getNomCategorieParade(arme) { const categorie = arme?.data ? RdDItemArme.getCategorieParade(arme) : arme; @@ -38,7 +50,7 @@ export class RdDItemArme extends Item { /* -------------------------------------------- */ static needArmeResist(armeAttaque, armeParade) { - if (!armeAttaque || !armeParade){ + if (!armeAttaque || !armeParade) { return false; } // Epées parant une arme de bois (cf. page 115 ), une résistance est nécessaire @@ -54,7 +66,7 @@ export class RdDItemArme extends Item { return arme.data.categorie_parade; } // pour compatibilité avec des personnages existants - if (arme.type == 'competencecreature' || arme.data.categorie == 'creature' ) { + if (arme.type == 'competencecreature' || arme.data.categorie == 'creature') { return arme.data.categorie_parade || (arme.data.isparade ? 'sans-armes' : ''); } if (!arme.type.match(/arme|competencecreature/)) { @@ -86,7 +98,7 @@ export class RdDItemArme extends Item { /* -------------------------------------------- */ static needParadeSignificative(armeAttaque, armeParade) { - if (!armeAttaque || !armeParade){ + if (!armeAttaque || !armeParade) { return false; } // categories d'armes à la parade (cf. page 115 ) @@ -145,10 +157,16 @@ export class RdDItemArme extends Item { } static isArmeUtilisable(item) { - return item.type == 'arme' && item.data.equipe && (item.data.resistance > 0 || item.data.portee_courte>0); + return item.type == 'arme' && item.data.equipe && (item.data.resistance > 0 || item.data.portee_courte > 0); } - static mainsNues(actorData={}) { + static ajoutCorpsACorps(armes, competences, carac) { + let corpsACorps = competences.find(it => it.name == 'Corps à corps') ?? { data: { niveau: -6 } }; + let init = RdDCombatManager.calculInitiative(corpsACorps.data.niveau, carac['melee'].value); + armes.push(RdDItemArme.mainsNues({ niveau: corpsACorps.data.niveau, initiative: init })); + } + + static mainsNues(actorData = {}) { const mainsNues = { name: 'Mains nues', data: { @@ -163,8 +181,8 @@ export class RdDItemArme extends Item { } }; if (actorData) { - mergeObject( mainsNues.data, actorData, {overwrite:false}); + mergeObject(mainsNues.data, actorData, { overwrite: false }); } return mainsNues } -} +} diff --git a/module/item-competence.js b/module/item-competence.js index 2f947f17..c7be84c7 100644 --- a/module/item-competence.js +++ b/module/item-competence.js @@ -56,11 +56,15 @@ export class RdDItemCompetence extends Item { return categorieCompetences[category].label; } + static getEsquive(competences) { + return { name: 'Esquive', niveau: RdDItemCompetence.findCompetence(competences, 'Esquive')?.data.niveau ?? -6 }; + } + /* -------------------------------------------- */ static isCompetenceArme(competence) { switch (competence.data.categorie) { case 'melee': - return competence.name.toLowerCase() != 'esquive'; + return competence.name != 'Esquive'; case 'tir': case 'lancer': return true; diff --git a/templates/actor-sheet.html b/templates/actor-sheet.html index 84b0b5a8..056359c8 100644 --- a/templates/actor-sheet.html +++ b/templates/actor-sheet.html @@ -541,6 +541,7 @@ {{!-- hautreve Tab --}} + {{log 'Haut reve' hautreve}}

Haut rêve:

@@ -599,7 +600,7 @@

Sorts en Réserve: