diff --git a/module/actor-creature-sheet.js b/module/actor-creature-sheet.js index acfd115f..d8187818 100644 --- a/module/actor-creature-sheet.js +++ b/module/actor-creature-sheet.js @@ -27,15 +27,15 @@ export class RdDActorCreatureSheet extends RdDActorSheet { if (!this.options.editable) return; // On competence change - html.find('.creature-carac').change(async event => { + this.html.find('.creature-carac').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCreatureCompetence(compName, "carac_value", parseInt(event.target.value)); }); - html.find('.creature-niveau').change(async event => { + this.html.find('.creature-niveau').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCreatureCompetence(compName, "niveau", parseInt(event.target.value)); }); - html.find('.creature-dommages').change(async event => { + this.html.find('.creature-dommages').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCreatureCompetence(compName, "dommages", parseInt(event.target.value)); }); diff --git a/module/actor-entite-sheet.js b/module/actor-entite-sheet.js index 42577475..0b0e54c2 100644 --- a/module/actor-entite-sheet.js +++ b/module/actor-entite-sheet.js @@ -23,15 +23,15 @@ export class RdDActorEntiteSheet extends RdDActorSheet { if (!this.options.editable) return; // On competence change - html.find('.creature-carac').change(async event => { + this.html.find('.creature-carac').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCreatureCompetence( compName, "carac_value", parseInt(event.target.value) ); } ); - html.find('.creature-niveau').change(async event => { + this.html.find('.creature-niveau').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCreatureCompetence( compName, "niveau", parseInt(event.target.value) ); } ); - html.find('.creature-dommages').change(async event => { + this.html.find('.creature-dommages').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCreatureCompetence( compName, "dommages", parseInt(event.target.value) ); } ); diff --git a/module/actor-sheet.js b/module/actor-sheet.js index 7965a19d..6be3f32a 100644 --- a/module/actor-sheet.js +++ b/module/actor-sheet.js @@ -118,58 +118,26 @@ export class RdDActorSheet extends ActorSheet { return formData; } - isCompetenceAffichable(competence) { - return !this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(competence); - } - - /* -------------------------------------------- */ - async _onDropActor(event, dragData) { - const dropActor = fromUuidSync(dragData.uuid); - this.actor.addSubActeur(dropActor); - super._onDropActor(event, dragData); - } - - /* -------------------------------------------- */ - async _onDropItem(event, dragData) { - const destItemId = $(event.target)?.closest('.item').attr('data-item-id') - const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor, dragData, this.objetVersConteneur) - if (dropParams) { - const callSuper = await this.actor.processDropItem(dropParams) - if (callSuper) { - await super._onDropItem(event, dragData) - } - } - } - - /* -------------------------------------------- */ - async createItem(name, type) { - await this.actor.createEmbeddedDocuments('Item', [{ name: name, type: type }], { renderSheet: true }); - } - - /* -------------------------------------------- */ - async createEmptyTache() { - await this.createItem('Nouvelle tache', 'tache'); - } - /* -------------------------------------------- */ /** @override */ activateListeners(html) { super.activateListeners(html); + this.html = html; - HtmlUtility._showControlWhen($(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue")); + HtmlUtility._showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue")); // Everything below here is only needed if the sheet is editable if (!this.options.editable) return; - html.find('.item-split').click(async event => { + this.html.find('.item-split').click(async event => { const item = RdDSheetUtility.getItem(event, this.actor); RdDSheetUtility.splitItem(item, this.actor); }); - html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true)) - html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor))); - html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente()); - html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem()); - html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor)); - html.find('.subacteur-delete').click(async event => { + this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true)) + this.html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor))); + this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente()); + this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem()); + this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor)); + this.html.find('.subacteur-delete').click(async event => { const li = RdDSheetUtility.getEventElement(event); const actorId = li.data("actor-id"); if (actorId) { @@ -177,54 +145,54 @@ export class RdDActorSheet extends ActorSheet { RdDUtility.confirmerSuppressionSubacteur(this, subActor, li); } }); - html.find('.experiencelog-delete').click(async event => { - const li = $(event.currentTarget)?.parents(".experiencelog"); + this.html.find('.experiencelog-delete').click(async event => { + const li = this.html.find(event.currentTarget)?.parents(".experiencelog"); const key = Number(li.data("key") ?? -1); await this.actor.deleteExperienceLog(key, 1); }); - html.find('.experiencelog-delete-previous').click(async event => { - const li = $(event.currentTarget)?.parents(".experiencelog"); + this.html.find('.experiencelog-delete-previous').click(async event => { + const li = this.html.find(event.currentTarget)?.parents(".experiencelog"); const key = Number(li.data("key") ?? -1); await this.actor.deleteExperienceLog(0, key + 1); }); - html.find('.encaisser-direct').click(async event => { + this.html.find('.encaisser-direct').click(async event => { this.actor.encaisser(); }) - html.find('.sheet-possession-attack').click(async event => { + this.html.find('.sheet-possession-attack').click(async event => { const poss = RdDSheetUtility.getItem(event, this.actor) this.actor.conjurerPossession(poss) }) - html.find('.remise-a-neuf').click(async event => { + this.html.find('.remise-a-neuf').click(async event => { if (game.user.isGM) { this.actor.remiseANeuf(); } }); - html.find('.creer-tache').click(async event => { + this.html.find('.creer-tache').click(async event => { this.createEmptyTache(); }); - html.find('.creer-un-objet').click(async event => { + this.html.find('.creer-un-objet').click(async event => { RdDUtility.selectObjetType(this); }); - html.find('.creer-une-oeuvre').click(async event => { + this.html.find('.creer-une-oeuvre').click(async event => { RdDUtility.selectTypeOeuvre(this); }); - html.find('.nettoyer-conteneurs').click(async event => { + this.html.find('.nettoyer-conteneurs').click(async event => { this.actor.nettoyerConteneurs(); }); // Blessure control - html.find('.blessure-control').click(async event => { - const tr = $(event.currentTarget).parents(".item"); + this.html.find('.blessure-control').click(async event => { + const tr = this.html.find(event.currentTarget).parents(".item"); let btype = tr.data("blessure-type"); let index = tr.data('blessure-index'); - let active = $(event.currentTarget).data('blessure-active'); + let active = this.html.find(event.currentTarget).data('blessure-active'); //console.log(btype, index, active); await this.actor.manageBlessureFromSheet(btype, index, active); }); // Blessure data - html.find('.blessure-soins').change(async event => { - const tr = $(event.currentTarget).parents(".item"); + this.html.find('.blessure-soins').change(async event => { + const tr = this.html.find(event.currentTarget).parents(".item"); let btype = tr.data('blessure-type'); let index = tr.data('blessure-index'); let psoins = tr.find('.blessure-premiers_soins').val(); @@ -238,57 +206,57 @@ export class RdDActorSheet extends ActorSheet { }); // Equip Inventory Item - html.find('.item-equip').click(async event => { + this.html.find('.item-equip').click(async event => { this.actor.equiperObjet(RdDSheetUtility.getItemId(event)); }); // Roll Carac - html.find('.carac-label a').click(async event => { + this.html.find('.carac-label a').click(async event => { let caracName = event.currentTarget.attributes.name.value; this.actor.rollCarac(caracName.toLowerCase()); }); - html.find('.chance-actuelle').click(async event => { + this.html.find('.chance-actuelle').click(async event => { this.actor.rollCarac('chance-actuelle'); }); - html.find('.chance-appel').click(async event => { + this.html.find('.chance-appel').click(async event => { this.actor.rollAppelChance(); }); - html.find('#jet-astrologie').click(async event => { + this.html.find('[name="jet-astrologie"]').click(async event => { this.actor.astrologieNombresAstraux(); }); // Roll Skill - html.find('a.competence-label').click(async event => { + this.html.find('a.competence-label').click(async event => { this.actor.rollCompetence(RdDSheetUtility.getItemId(event)); }); - html.find('.tache-label a').click(async event => { + this.html.find('.tache-label a').click(async event => { this.actor.rollTache(RdDSheetUtility.getItemId(event)); }); - html.find('.meditation-label a').click(async event => { + this.html.find('.meditation-label a').click(async event => { this.actor.rollMeditation(RdDSheetUtility.getItemId(event)); }); - html.find('.chant-label a').click(async event => { + this.html.find('.chant-label a').click(async event => { this.actor.rollChant(RdDSheetUtility.getItemId(event)); }); - html.find('.danse-label a').click(async event => { + this.html.find('.danse-label a').click(async event => { this.actor.rollDanse(RdDSheetUtility.getItemId(event)); }); - html.find('.musique-label a').click(async event => { + this.html.find('.musique-label a').click(async event => { this.actor.rollMusique(RdDSheetUtility.getItemId(event)); }); - html.find('.oeuvre-label a').click(async event => { + this.html.find('.oeuvre-label a').click(async event => { this.actor.rollOeuvre(RdDSheetUtility.getItemId(event)); }); - html.find('.jeu-label a').click(async event => { + this.html.find('.jeu-label a').click(async event => { this.actor.rollJeu(RdDSheetUtility.getItemId(event)); }); - html.find('.recettecuisine-label a').click(async event => { + this.html.find('.recettecuisine-label a').click(async event => { this.actor.rollRecetteCuisine(RdDSheetUtility.getItemId(event)); }); - html.find('.subacteur-label a').click(async event => { + this.html.find('.subacteur-label a').click(async event => { let actorId = RdDSheetUtility.getEventItemData(event, 'actor-id'); let actor = game.actors.get(actorId); if (actor) { @@ -297,25 +265,25 @@ export class RdDActorSheet extends ActorSheet { }); // Boutons spéciaux MJs - html.find('.forcer-tmr-aleatoire').click(async event => { + this.html.find('.forcer-tmr-aleatoire').click(async event => { this.actor.reinsertionAleatoire("Action MJ"); }); - html.find('.afficher-tmr').click(async event => { + this.html.find('.afficher-tmr').click(async event => { this.actor.changeTMRVisible(); }); // Points de reve actuel - html.find('.ptreve-actuel a').click(async event => { + this.html.find('.ptreve-actuel a').click(async event => { this.actor.rollCarac('reve-actuel'); }); // Roll Weapon1 - html.find('.arme-label a').click(async event => { + this.html.find('.arme-label a').click(async event => { let arme = this._getEventArmeCombat(event); this.actor.rollArme(duplicate(arme)); }); // Initiative pour l'arme - html.find('.arme-initiative a').click(async event => { + this.html.find('.arme-initiative a').click(async event => { let combatant = game.combat.combatants.find(c => c.actor.id == this.actor.id); if (combatant) { let action = this._getEventArmeCombat(event); @@ -325,88 +293,88 @@ export class RdDActorSheet extends ActorSheet { } }); // Display TMR, visualisation - html.find('.visu-tmr').click(async event => { + this.html.find('.visu-tmr').click(async event => { this.actor.displayTMR("visu"); }); // Display TMR, normal - html.find('.monte-tmr').click(async event => { + this.html.find('.monte-tmr').click(async event => { this.actor.displayTMR("normal"); }); // Display TMR, fast - html.find('.monte-tmr-rapide').click(async event => { + this.html.find('.monte-tmr-rapide').click(async event => { this.actor.displayTMR("rapide"); }); - html.find('.repos').click(async event => { + this.html.find('.repos').click(async event => { await DialogRepos.create(this.actor); }); - html.find('.delete-active-effect').click(async event => { + this.html.find('.delete-active-effect').click(async event => { if (game.user.isGM) { - let effect = $(event.currentTarget).parents(".active-effect").data('effect'); + let effect = this.html.find(event.currentTarget).parents(".active-effect").data('effect'); this.actor.removeEffect(effect); } }); - html.find('.enlever-tous-effets').click(async event => { + this.html.find('.enlever-tous-effets').click(async event => { if (game.user.isGM) { await this.actor.removeEffects(); } }); - html.find('.conteneur-name a').click(async event => { + this.html.find('.conteneur-name a').click(async event => { RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event)); this.render(true); }); - html.find('.carac-xp-augmenter').click(async event => { + this.html.find('.carac-xp-augmenter').click(async event => { let caracName = event.currentTarget.name.replace("augmenter.", ""); this.actor.updateCaracXPAuto(caracName); }); - html.find('.competence-xp-augmenter').click(async event => { + this.html.find('.competence-xp-augmenter').click(async event => { this.actor.updateCompetenceXPAuto(RdDSheetUtility.getItemId(event)); }); - html.find('.competence-stress-augmenter').click(async event => { + this.html.find('.competence-stress-augmenter').click(async event => { this.actor.updateCompetenceStress(RdDSheetUtility.getItemId(event)); }); if (this.options.vueDetaillee) { // On carac change - html.find('.carac-value').change(async event => { + this.html.find('.carac-value').change(async event => { let caracName = event.currentTarget.name.replace(".value", "").replace("system.carac.", ""); this.actor.updateCarac(caracName, parseInt(event.target.value)); }); - html.find('input.carac-xp').change(async event => { + this.html.find('input.carac-xp').change(async event => { let caracName = event.currentTarget.name.replace(".xp", "").replace("system.carac.", ""); this.actor.updateCaracXP(caracName, parseInt(event.target.value)); }); // On competence change - html.find('.competence-value').change(async event => { + this.html.find('.competence-value').change(async event => { let compName = event.currentTarget.attributes.compname.value; //console.log("Competence changed :", compName); this.actor.updateCompetence(compName, parseInt(event.target.value)); }); // On competence xp change - html.find('input.competence-xp').change(async event => { + this.html.find('input.competence-xp').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCompetenceXP(compName, parseInt(event.target.value)); }); // On competence xp change - html.find('input.competence-xp-sort').change(async event => { + this.html.find('input.competence-xp-sort').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCompetenceXPSort(compName, parseInt(event.target.value)); }); // On competence archetype change - html.find('.competence-archetype').change(async event => { + this.html.find('.competence-archetype').change(async event => { let compName = event.currentTarget.attributes.compname.value; this.actor.updateCompetenceArchetype(compName, parseInt(event.target.value)); }); } - html.find('.show-hide-competences').click(async event => { + this.html.find('.show-hide-competences').click(async event => { this.options.showCompNiveauBase = !this.options.showCompNiveauBase; this.render(true); }); - html.find('.recherche') + this.html.find('.recherche') .each((index, field) => { if (this.options.recherche) { field.focus(); @@ -429,92 +397,125 @@ export class RdDActorSheet extends ActorSheet { .change(async event => this.options.recherche = this._optionRecherche(event.currentTarget) ); - html.find('.vue-detaillee').click(async event => { + this.html.find('.vue-detaillee').click(async event => { this.options.vueDetaillee = !this.options.vueDetaillee; this.render(true); }); // On pts de reve change - html.find('.pointsreve-value').change(async event => { + this.html.find('.pointsreve-value').change(async event => { let reveValue = event.currentTarget.value; this.actor.update({ "system.reve.reve.value": reveValue }); }); // On seuil de reve change - html.find('.seuil-reve-value').change(async event => { + this.html.find('.seuil-reve-value').change(async event => { console.log("seuil-reve-value", event.currentTarget) this.actor.setPointsDeSeuil(event.currentTarget.value); }); - html.find('#attribut-protection-edit').change(async event => { + this.html.find('#attribut-protection-edit').change(async event => { this.actor.updateAttributeValue(event.currentTarget.attributes.name.value, parseInt(event.target.value)); }); // On stress change - html.find('.compteur-edit').change(async event => { + this.html.find('.compteur-edit').change(async event => { let fieldName = event.currentTarget.attributes.name.value; this.actor.updateCompteurValue(fieldName, parseInt(event.target.value)); }); - html.find('#ethylisme').change(async event => { + this.html.find('#ethylisme').change(async event => { this.actor.setEthylisme(parseInt(event.target.value)); }); - html.find('.stress-test').click(async event => { + this.html.find('.stress-test').click(async event => { this.actor.transformerStress(); }); - html.find('.moral-malheureux').click(async event => { + this.html.find('.moral-malheureux').click(async event => { this.actor.jetDeMoral('malheureuse'); }); - html.find('.moral-neutre').click(async event => { + this.html.find('.moral-neutre').click(async event => { this.actor.jetDeMoral('neutre'); }); - html.find('.moral-heureux').click(async event => { + this.html.find('.moral-heureux').click(async event => { this.actor.jetDeMoral('heureuse'); }); - html.find('.ethylisme-test').click(async event => { + this.html.find('.ethylisme-test').click(async event => { this.actor.jetEthylisme(); }); - html.find('.jet-vie').click(async event => { + this.html.find('.jet-vie').click(async event => { this.actor.jetVie(); }); - html.find('.jet-endurance').click(async event => { + this.html.find('.jet-endurance').click(async event => { this.actor.jetEndurance(); }); - html.find('.monnaie-plus').click(async event => { + this.html.find('.monnaie-plus').click(async event => { this.actor.monnaieIncDec(RdDSheetUtility.getItemId(event), 1); }); - html.find('.monnaie-moins').click(async event => { + this.html.find('.monnaie-moins').click(async event => { this.actor.monnaieIncDec(RdDSheetUtility.getItemId(event), -1); }); - html.find('.vie-plus').click(async event => { + this.html.find('.vie-plus').click(async event => { this.actor.santeIncDec("vie", 1); }); - html.find('.vie-moins').click(async event => { + this.html.find('.vie-moins').click(async event => { this.actor.santeIncDec("vie", -1); }); - html.find('.endurance-plus').click(async event => { + this.html.find('.endurance-plus').click(async event => { this.actor.santeIncDec("endurance", 1); }); - html.find('.endurance-moins').click(async event => { + this.html.find('.endurance-moins').click(async event => { this.actor.santeIncDec("endurance", -1); }); - html.find('.ptreve-actuel-plus').click(async event => { + this.html.find('.ptreve-actuel-plus').click(async event => { this.actor.reveActuelIncDec(1); }); - html.find('.ptreve-actuel-moins').click(async event => { + this.html.find('.ptreve-actuel-moins').click(async event => { this.actor.reveActuelIncDec(-1); }); - html.find('.fatigue-plus').click(async event => { + this.html.find('.fatigue-plus').click(async event => { this.actor.santeIncDec("fatigue", 1); }); - html.find('.fatigue-moins').click(async event => { + this.html.find('.fatigue-moins').click(async event => { this.actor.santeIncDec("fatigue", -1); }); } + isCompetenceAffichable(competence) { + return !this.options.showCompNiveauBase || !RdDItemCompetence.isNiveauBase(competence); + } + + /* -------------------------------------------- */ + async _onDropActor(event, dragData) { + const dropActor = fromUuidSync(dragData.uuid); + this.actor.addSubActeur(dropActor); + super._onDropActor(event, dragData); + } + + /* -------------------------------------------- */ + async _onDropItem(event, dragData) { + const destItemId = this.html.find(event.target)?.closest('.item').attr('data-item-id') + const dropParams = RdDSheetUtility.prepareItemDropParameters(destItemId, this.actor, dragData, this.objetVersConteneur) + if (dropParams) { + const callSuper = await this.actor.processDropItem(dropParams) + if (callSuper) { + await super._onDropItem(event, dragData) + } + } + } + + /* -------------------------------------------- */ + async createItem(name, type) { + await this.actor.createEmbeddedDocuments('Item', [{ name: name, type: type }], { renderSheet: true }); + } + + /* -------------------------------------------- */ + async createEmptyTache() { + await this.createItem('Nouvelle tache', 'tache'); + } + _optionRecherche(target) { if (!target.value?.length){ return undefined; @@ -527,7 +528,7 @@ export class RdDActorSheet extends ActorSheet { } _getEventArmeCombat(event) { - const li = $(event.currentTarget)?.parents(".item"); + const li = this.html.find(event.currentTarget)?.parents(".item"); let armeName = li.data("arme-name"); let compName = li.data('competence-name'); const arme = this.armesList.find(a => a.name == armeName && a.system.competence == compName); diff --git a/module/actor-vehicule-sheet.js b/module/actor-vehicule-sheet.js index 5803f3f7..0124de0c 100644 --- a/module/actor-vehicule-sheet.js +++ b/module/actor-vehicule-sheet.js @@ -22,16 +22,16 @@ export class RdDActorVehiculeSheet extends RdDActorSheet { super.activateListeners(html); if (!this.options.editable) return; - html.find('.resistance-moins').click(async event => { + this.html.find('.resistance-moins').click(async event => { this.actor.vehicleIncDec("resistance", -1); }); - html.find('.resistance-plus').click(async event => { + this.html.find('.resistance-plus').click(async event => { this.actor.vehicleIncDec("resistance", 1); }); - html.find('.structure-moins').click(async event => { + this.html.find('.structure-moins').click(async event => { this.actor.vehicleIncDec("structure", -1); }); - html.find('.structure-plus').click(async event => { + this.html.find('.structure-plus').click(async event => { this.actor.vehicleIncDec("structure", 1); }); } diff --git a/module/actor.js b/module/actor.js index f8c6ea1c..d4106077 100644 --- a/module/actor.js +++ b/module/actor.js @@ -150,17 +150,6 @@ export class RdDActor extends Actor { this.computeEtatGeneral(); } - /* -------------------------------------------- */ - setRollWindowsOpened(flag) { - // TODO: résoudre le souci lié aux ids dans les fenêtres roll - this.rollWindowsOpened = flag; - } - - /* -------------------------------------------- */ - isRollWindowsOpened() { - return this.rollWindowsOpened; - } - /* -------------------------------------------- */ _prepareCreatureData(actorData) { this.computeEncombrementTotalEtMalusArmure(); @@ -601,11 +590,14 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async _jetRecuperationConstitution(bonusSoins, message = undefined) { - const tData = this.system; - let difficulte = Misc.toInt(bonusSoins) + Math.min(0, tData.sante.vie.value - tData.sante.vie.max); - let rolled = await RdDResolutionTable.roll(tData.carac.constitution.value, difficulte); + let difficulte = Misc.toInt(bonusSoins) + Math.min(0, this.system.sante.vie.value - this.system.sante.vie.max); + let rolled = await RdDResolutionTable.roll(this.system.carac.constitution.value, difficulte); if (message) { - message.content += RdDResolutionTable.explain(rolled).replace(/Jet :/, "Constitution :"); + message.content = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/roll/explain.hbs", { + actor: this, + carac: this.system.carac.constitution, + rolled + }) } return rolled; } @@ -3422,9 +3414,7 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async encaisser() { - let dialogData = { ajustementsEncaissement: RdDUtility.getAjustementsEncaissement() }; - let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-encaisser.html', dialogData); - new RdDEncaisser(html, this).render(true); + await RdDEncaisser.encaisser(this); } /* -------------------------------------------- */ @@ -3600,17 +3590,17 @@ export class RdDActor extends Actor { /* -------------------------------------------- */ async accorder(entite, when = 'avant-encaissement') { if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar") + || entite == undefined || !entite.isEntite([ENTITE_INCARNE]) || entite.isEntiteAccordee(this)) { return true; } - const tplData = this.system; - let rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.system.carac.niveau.value)); + const rolled = await RdDResolutionTable.roll(this.getReveActuel(), - Number(entite.system.carac.niveau.value)); const rollData = { alias: this.name, rolled: rolled, entite: entite.name, - selectedCarac: tplData.carac.reve + selectedCarac: this.system.carac.reve }; if (rolled.isSuccess) { diff --git a/module/dialog-chronologie.js b/module/dialog-chronologie.js index 98762087..c86dd519 100644 --- a/module/dialog-chronologie.js +++ b/module/dialog-chronologie.js @@ -62,6 +62,7 @@ export class DialogChronologie extends Dialog { activateListeners(html) { super.activateListeners(html); + this.html = html; } async ajouter() { @@ -74,11 +75,11 @@ export class DialogChronologie extends Dialog { } async forceValidation() { - await $("form.rdddialogchrono :input").change(); + await this.html.find("form.rdddialogchrono :input").change(); } findJournal() { - const journalId = $("form.rdddialogchrono :input[name='journalId']").val(); + const journalId = this.html.find("form.rdddialogchrono :input[name='journalId']").val(); const journalEntry = game.journal.get(journalId); return { journalId, journalEntry }; } @@ -89,15 +90,15 @@ export class DialogChronologie extends Dialog { extractJournalParameters() { return { - auteur: $("form.rdddialogchrono :input[name='auteur']").val(), - information: $("form.rdddialogchrono :input[name='information']").val(), + auteur: this.html.find("form.rdddialogchrono :input[name='auteur']").val(), + information: this.html.find("form.rdddialogchrono :input[name='information']").val(), dateRdD: { - jour: $("form.rdddialogchrono :input[name='jourRdD']").val(), - moisRdD: $("form.rdddialogchrono :input[name='dateRdD.moisRdD.key']").val(), - annee: $("form.rdddialogchrono :input[name='dateRdD.annee']").val() + jour: this.html.find("form.rdddialogchrono :input[name='jourRdD']").val(), + moisRdD: this.html.find("form.rdddialogchrono :input[name='dateRdD.moisRdD.key']").val(), + annee: this.html.find("form.rdddialogchrono :input[name='dateRdD.annee']").val() }, - heureRdD: $("form.rdddialogchrono :input[name='heureRdD']").val(), - dateReel: $("form.rdddialogchrono :input[name='dateReel']").val().replace('T', ' ') + heureRdD: this.html.find("form.rdddialogchrono :input[name='heureRdD']").val(), + dateReel: this.html.find("form.rdddialogchrono :input[name='dateReel']").val().replace('T', ' ') } } diff --git a/module/dialog-create-signedraconique.js b/module/dialog-create-signedraconique.js index 2b4aa444..86b98d45 100644 --- a/module/dialog-create-signedraconique.js +++ b/module/dialog-create-signedraconique.js @@ -35,16 +35,16 @@ export class DialogCreateSigneDraconique extends Dialog { super(conf, options); this.dialogData = dialogData; } - + async _onCreerSigneActeurs() { - await $("[name='signe.system.ephemere']").change(); - await $(".signe-xp-sort").change(); + await this.html.find("[name='signe.system.ephemere']").change(); + await this.html.find(".signe-xp-sort").change(); this.validerSigne(); this.dialogData.actors.filter(it => it.selected) - .map(it => game.actors.get(it.id)) - .forEach(actor => this._createSigneForActor(actor, this.dialogData.signe)); + .map(it => game.actors.get(it.id)) + .forEach(actor => this._createSigneForActor(actor, this.dialogData.signe)); } - + async _createSigneForActor(actor, signe) { actor.createEmbeddedDocuments("Item", [signe]); ChatMessage.create({ @@ -57,19 +57,20 @@ export class DialogCreateSigneDraconique extends Dialog { } validerSigne() { - this.dialogData.signe.name = $("[name='signe.name']").val(); - this.dialogData.signe.system.valeur.norm = $("[name='signe.system.valeur.norm']").val(); - this.dialogData.signe.system.valeur.sign = $("[name='signe.system.valeur.sign']").val(); - this.dialogData.signe.system.valeur.part = $("[name='signe.system.valeur.part']").val(); - this.dialogData.signe.system.difficulte = $("[name='signe.system.difficulte']").val(); - this.dialogData.signe.system.ephemere = $("[name='signe.system.ephemere']").prop("checked"); - this.dialogData.signe.system.duree = $("[name='signe.system.duree']").val(); + this.dialogData.signe.name = this.html.find("[name='signe.name']").val(); + this.dialogData.signe.system.valeur.norm = this.html.find("[name='signe.system.valeur.norm']").val(); + this.dialogData.signe.system.valeur.sign = this.html.find("[name='signe.system.valeur.sign']").val(); + this.dialogData.signe.system.valeur.part = this.html.find("[name='signe.system.valeur.part']").val(); + this.dialogData.signe.system.difficulte = this.html.find("[name='signe.system.difficulte']").val(); + this.dialogData.signe.system.ephemere = this.html.find("[name='signe.system.ephemere']").prop("checked"); + this.dialogData.signe.system.duree = this.html.find("[name='signe.system.duree']").val(); this.dialogData.signe.system.typesTMR = TMRUtility.buildListTypesTMRSelection(this.dialogData.tmrs); } - + /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); + this.html = html; this.setEphemere(this.dialogData.signe.system.ephemere); html.find(".signe-aleatoire").click(event => this.setSigneAleatoire()); html.find("[name='signe.system.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked)); @@ -81,27 +82,27 @@ export class DialogCreateSigneDraconique extends Dialog { async setSigneAleatoire() { const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true}); - $("[name='signe.name']").val(newSigne.name); - $("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm); - $("[name='signe.system.valeur.sign']").val(newSigne.system.valeur.sign); - $("[name='signe.system.valeur.part']").val(newSigne.system.valeur.part); - $("[name='signe.system.difficulte']").val(newSigne.system.difficulte); - $("[name='signe.system.duree']").val(newSigne.system.duree); - $("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere); + this.html.find("[name='signe.name']").val(newSigne.name); + this.html.find("[name='signe.system.valeur.norm']").val(newSigne.system.valeur.norm); + this.html.find("[name='signe.system.valeur.sign']").val(newSigne.system.valeur.sign); + this.html.find("[name='signe.system.valeur.part']").val(newSigne.system.valeur.part); + this.html.find("[name='signe.system.difficulte']").val(newSigne.system.difficulte); + this.html.find("[name='signe.system.duree']").val(newSigne.system.duree); + this.html.find("[name='signe.system.ephemere']").prop("checked", newSigne.system.ephemere); this.dialogData.tmrs = TMRUtility.buildSelectionTypesTMR(newSigne.system.typesTMR); this.dialogData.tmrs.forEach(t => { - $(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected); + this.html.find(`[data-tmr-name='${t.name}']`).prop( "checked", t.selected); }) this.setEphemere(newSigne.system.ephemere); } async setEphemere(ephemere) { this.dialogData.signe.system.ephemere = ephemere; - HtmlUtility._showControlWhen($(".signe-system-duree"), ephemere); + HtmlUtility._showControlWhen(this.html.find(".signe-system-duree"), ephemere); } async onSelectActor(event) { - const actorId = $(event.currentTarget)?.data("actor-id"); + const actorId = this.html.find(event.currentTarget)?.data("actor-id"); const actor = this.dialogData.actors.find(it => it.id == actorId); if (actor) { actor.selected = event.currentTarget.checked; @@ -109,7 +110,7 @@ export class DialogCreateSigneDraconique extends Dialog { } onSelectTmr(event) { - const tmrName = $(event.currentTarget)?.data("tmr-name"); + const tmrName = this.html.find(event.currentTarget)?.data("tmr-name"); const onTmr = this.tmrs.find(it => it.name == tmrName); if (onTmr){ onTmr.selected = event.currentTarget.checked; diff --git a/module/dialog-fabriquer-potion.js b/module/dialog-fabriquer-potion.js index a8571c5a..3d3dd236 100644 --- a/module/dialog-fabriquer-potion.js +++ b/module/dialog-fabriquer-potion.js @@ -13,18 +13,12 @@ export class DialogFabriquerPotion extends Dialog { } let potionData = DialogFabriquerPotion.prepareData(actor, item); - let conf = { - title: `Fabriquer une potion de ${potionData.system.categorie}`, - content: await renderTemplate(dialogConfig.html, potionData), - default: potionData.buttonName, - }; + const html = await renderTemplate(dialogConfig.html, potionData); let options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 }; mergeObject(options, dialogConfig.options ?? {}, { overwrite: true }) - const dialog = new DialogFabriquerPotion(actor, potionData, conf, options); - dialog.render(true); - return dialog; + new DialogFabriquerPotion(actor, potionData, html, options).render(true); } /* -------------------------------------------- */ @@ -40,10 +34,15 @@ export class DialogFabriquerPotion extends Dialog { } /* -------------------------------------------- */ - constructor(actor, potionData, conf, options) { - conf.buttons = { - [potionData.buttonName]: { - label: potionData.buttonName, callback: it => this.onFabriquer(it) + constructor(actor, potionData, html, options) { + const conf = { + title: `Fabriquer une potion de ${potionData.system.categorie}`, + content: html, + default: 'fabriquer', + buttons: { + 'fabriquer': { + label: potionData.buttonName, callback: it => this.onFabriquer(html) + } } }; @@ -53,6 +52,24 @@ export class DialogFabriquerPotion extends Dialog { this.potionData = potionData; } + /* -------------------------------------------- */ + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.html.find("[name='nbBrins']").change(event => { + this.potionData.nbBrins = Misc.toInt(event.currentTarget.value); + const brinsManquants = Math.max(0, DialogFabriquerPotion.nombreBrinsOptimal(this.potionData) - this.potionData.nbBrins); + this.potionData.herbebonus = Math.max(0, this.potionData.system.niveau - brinsManquants) + }); + } + + /* -------------------------------------------- */ + async onFabriquer(html) { + await this.html.find("[name='nbBrins']").change(); + this.actor.fabriquerPotion(this.potionData); + this.close(); + } + static nombreBrinsMinimum(herbeData) { switch (herbeData.system.categorie ?? '') { case "Soin": return 1 + Math.max(0, 12 - 2 * herbeData.system.niveau); @@ -68,22 +85,4 @@ export class DialogFabriquerPotion extends Dialog { } return 1; } - - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - html.find("#nbBrins").change(event => { - this.potionData.nbBrins = Misc.toInt(event.currentTarget.value); - const brinsManquants = Math.max(0, DialogFabriquerPotion.nombreBrinsOptimal(this.potionData) - this.potionData.nbBrins); - this.potionData.herbebonus = Math.max(0, this.potionData.system.niveau - brinsManquants) - }); - } - - /* -------------------------------------------- */ - async onFabriquer(it) { - await $("#nbBrins").change(); - this.actor.fabriquerPotion(this.potionData); - this.close(); - } } \ No newline at end of file diff --git a/module/dialog-item-achat.js b/module/dialog-item-achat.js index 649b1545..01162e97 100644 --- a/module/dialog-item-achat.js +++ b/module/dialog-item-achat.js @@ -42,8 +42,7 @@ export class DialogItemAchat extends Dialog { static async onAcheter(venteData) { const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.html`, venteData); - const dialog = new DialogItemAchat(html, venteData); - dialog.render(true); + new DialogItemAchat(html, venteData).render(true); } constructor(html, venteData) { @@ -65,12 +64,11 @@ export class DialogItemAchat extends Dialog { }; super(conf, options); - this.venteData = venteData; } async onAchat() { - await $(".nombreLots").change(); + await this.html.find(".nombreLots").change(); (this.venteData.vendeur ?? this.venteData.acheteur).achatVente({ userId: game.user.id, vendeurId: this.venteData.vendeur?.id, @@ -90,9 +88,9 @@ export class DialogItemAchat extends Dialog { /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - - html.find(".nombreLots").change(event => this.setNombreLots(Number(event.currentTarget.value))); - html.find(".se-forcer").change(event => this.setSeForcer(event)); + this.html = html; + this.html.find(".nombreLots").change(event => this.setNombreLots(Number(event.currentTarget.value))); + this.html.find(".se-forcer").change(event => this.setSeForcer(event)); } setSeForcer(event) { @@ -105,8 +103,8 @@ export class DialogItemAchat extends Dialog { } this.venteData.choix.nombreLots = Math.min(nombreLots, this.venteData.quantiteNbLots); this.venteData.prixTotal = (nombreLots * this.venteData.prixLot).toFixed(2); - $(".nombreLots").val(this.venteData.choix.nombreLots); - $(".prixTotal").text(this.venteData.prixTotal); + this.html.find(".nombreLots").val(this.venteData.choix.nombreLots); + this.html.find(".prixTotal").text(this.venteData.prixTotal); } } \ No newline at end of file diff --git a/module/dialog-item-consommer.js b/module/dialog-item-consommer.js index 69642e7d..d669b5e9 100644 --- a/module/dialog-item-consommer.js +++ b/module/dialog-item-consommer.js @@ -17,7 +17,7 @@ export class DialogConsommer extends Dialog { buttons: { [consommerData.buttonName]: { label: consommerData.buttonName, callback: async it => { - await this.onConsommer(it); + await this.onConsommer(); await onActionItem(); } } @@ -31,9 +31,16 @@ export class DialogConsommer extends Dialog { this.consommerData = consommerData; } - async onConsommer(event) { - await $(".se-forcer").change(); - await $(".consommer-doses").change(); + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.html.find(".se-forcer").change(event => this.setSeForcer(event)); + this.html.find(".consommer-doses").change(event => this.selectDoses(event)); + } + + async onConsommer() { + await this.html.find(".se-forcer").change(); + await this.html.find(".consommer-doses").change(); await this.actor.consommer(this.item, this.consommerData.choix); } @@ -92,14 +99,6 @@ export class DialogConsommer extends Dialog { } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - html.find(".se-forcer").change(event => this.setSeForcer(event)); - html.find(".consommer-doses").change(event => this.selectDoses(event)); - } - - setSeForcer(event) { this.consommerData.choix.seForcer = event.currentTarget.checked; } @@ -107,7 +106,7 @@ export class DialogConsommer extends Dialog { selectDoses(event) { this.consommerData.choix.doses = Number(event.currentTarget.value); DialogConsommer.calculDoses(this.consommerData, this.item); - $(".total-sust").text(this.consommerData.totalSust); - $(".total-desaltere").text(this.consommerData.totalDesaltere); + this.html.find(".total-sust").text(this.consommerData.totalSust); + this.html.find(".total-desaltere").text(this.consommerData.totalDesaltere); } } \ No newline at end of file diff --git a/module/dialog-item-vente.js b/module/dialog-item-vente.js index 32639eef..2b09b60b 100644 --- a/module/dialog-item-vente.js +++ b/module/dialog-item-vente.js @@ -37,26 +37,26 @@ export class DialogItemVente extends Dialog { this.venteData = venteData; } - async onProposer(it) { - await $(".tailleLot").change(); - await $(".quantiteNbLots").change(); - await $(".quantiteIllimite").change(); - await $(".prixLot").change(); - this.callback(this.venteData); - } - - /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); + this.html = html; + HtmlUtility._showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite) - HtmlUtility._showControlWhen($(".quantiteNbLots"), !this.venteData.quantiteIllimite) - - html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value))); - html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value))); - html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked)); - html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value))); + this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value))); + this.html.find(".quantiteNbLots").change(event => this.setNbLots(Number(event.currentTarget.value))); + this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked)); + this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value))); } + async onProposer(it) { + await this.html.find(".tailleLot").change(); + await this.html.find(".quantiteNbLots").change(); + await this.html.find(".quantiteIllimite").change(); + await this.html.find(".prixLot").change(); + this.callback(this.venteData); + } + + /* -------------------------------------------- */ setPrixLot(prixLot) { this.venteData.prixLot = prixLot; } @@ -65,15 +65,15 @@ export class DialogItemVente extends Dialog { // recalculer le prix du lot if (tailleLot != this.venteData.tailleLot) { this.venteData.prixLot = (tailleLot * this.venteData.prixOrigine).toFixed(2); - $(".prixLot").val(this.venteData.prixLot); + this.html.find(".prixLot").val(this.venteData.prixLot); } this.venteData.tailleLot = tailleLot; if (this.venteData.isOwned) { // recalculer le nombre de lots max this.venteData.quantiteMaxLots = Math.floor(this.venteData.quantiteMax / tailleLot); this.venteData.quantiteNbLots = Math.min(this.venteData.quantiteMaxLots, this.venteData.quantiteNbLots); - $(".quantiteNbLots").val(this.venteData.quantiteNbLots); - $(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots) + this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots); + this.html.find(".quantiteNbLots").attr("max", this.venteData.quantiteMaxLots) } } @@ -82,12 +82,12 @@ export class DialogItemVente extends Dialog { nbLots = Math.max(0, Math.min(nbLots, this.venteData.quantiteMaxLots)); } this.venteData.quantiteNbLots = nbLots; - $(".quantiteNbLots").val(this.venteData.quantiteNbLots); + this.html.find(".quantiteNbLots").val(this.venteData.quantiteNbLots); } setQuantiteIllimite(checked) { this.venteData.quantiteIllimite = checked; - $(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles"); - HtmlUtility._showControlWhen($(".quantiteNbLots"), !this.venteData.quantiteIllimite) + this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles"); + HtmlUtility._showControlWhen(this.html.find(".quantiteNbLots"), !this.venteData.quantiteIllimite) } } \ No newline at end of file diff --git a/module/dialog-repos.js b/module/dialog-repos.js index 324b6d91..e5e10576 100644 --- a/module/dialog-repos.js +++ b/module/dialog-repos.js @@ -21,13 +21,18 @@ export class DialogRepos extends Dialog { super(conf, options); this.actor = actor; } + activateListeners(html) { + super.activateListeners(html); + this.html = html; + } + /* -------------------------------------------- */ async repos() { - await $("[name='nb-heures']").change(); - await $("[name='nb-jours']").change(); - const selection = await $("[name='repos']:checked").val(); - const nbHeures = Number.parseInt(await $("[name='nb-heures']").val()); - const nbJours = Number.parseInt(await $("[name='nb-jours']").val()); + await this.html.find("[name='nb-heures']").change(); + await this.html.find("[name='nb-jours']").change(); + const selection = await this.html.find("[name='repos']:checked").val(); + const nbHeures = Number.parseInt(await this.html.find("[name='nb-heures']").val()); + const nbJours = Number.parseInt(await this.html.find("[name='nb-jours']").val()); switch (selection) { case "sieste": { await this.actor.dormir(nbHeures); @@ -35,7 +40,7 @@ export class DialogRepos extends Dialog { } case "nuit": { let heuresDormies = await this.actor.dormir(nbHeures); - if (heuresDormies == nbHeures){ + if (heuresDormies == nbHeures) { await this.actor.dormirChateauDormant(); } return; @@ -49,8 +54,4 @@ export class DialogRepos extends Dialog { } } } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - } } \ No newline at end of file diff --git a/module/dialog-select-target.js b/module/dialog-select-target.js index 87f504f3..dd6140ff 100644 --- a/module/dialog-select-target.js +++ b/module/dialog-select-target.js @@ -20,8 +20,9 @@ export class DialogSelectTarget extends Dialog { activateListeners(html) { super.activateListeners(html); - html.find("li.select-target").click((event) => { - this.targetSelected($(event.currentTarget)?.data("token-id")); + this.html = html; + this.html.find("li.select-target").click((event) => { + this.targetSelected(this.html.find(event.currentTarget)?.data("token-id")); }); } diff --git a/module/dialog-split-item.js b/module/dialog-split-item.js index d5ba3298..4b21c6ef 100644 --- a/module/dialog-split-item.js +++ b/module/dialog-split-item.js @@ -13,39 +13,33 @@ export class DialogSplitItem extends Dialog { constructor(item, splitData, html, callback) { let options = { classes: ["dialogsplit"], width: 300, height: 160, 'z-index': 99999 }; - let conf = { title: "Séparer en deux", content: html, default: "separer", buttons: { - "separer": { - label: "Séparer", callback: it => { - this.onSplit(); - } - } + "separer": { label: "Séparer", callback: it => this.onSplit() } } }; - super(conf, options); - + this.callback = callback; this.item = item; this.splitData = splitData; } - async onSplit(){ - await $(".choix-quantite").change(); - this.callback(this.item, this.splitData.choix.quantite); - } - - /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - - html.find(".choix-quantite").change(event => { + this.html = html; + this.html.find(".choix-quantite").change(event => { this.splitData.choix.quantite = Number(event.currentTarget.value); }); } + /* -------------------------------------------- */ + async onSplit() { + await this.html.find(".choix-quantite").change(); + this.callback(this.item, this.splitData.choix.quantite); + } + } \ No newline at end of file diff --git a/module/dialog-stress.js b/module/dialog-stress.js index 6ec1efb5..f0b9b8e6 100644 --- a/module/dialog-stress.js +++ b/module/dialog-stress.js @@ -37,24 +37,24 @@ export class DialogStress extends Dialog { this.dialogData = dialogData; } + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.html.find("input.select-actor").change((event) => this.onSelectActor(event)); + } + async onStress() { - const motif = $("form.rdddialogstress input[name='motif']").val(); - const stress = Number($("form.rdddialogstress input[name='stress']").val()); - const compteur = ($("form.rdddialogstress input[name='immediat']").prop("checked")) ? 'experience' : 'stress'; + const motif = this.html.find("form.rdddialogstress input[name='motif']").val(); + const stress = Number(this.html.find("form.rdddialogstress input[name='stress']").val()); + const compteur = (this.html.find("form.rdddialogstress input[name='immediat']").prop("checked")) ? 'experience' : 'stress'; this.dialogData.actors.filter(it => it.selected) .map(it => game.actors.get(it.id)) .forEach(actor => actor.distribuerStress(compteur, stress, motif)); } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - html.find("input.select-actor").change((event) => this.onSelectActor(event)); - } - async onSelectActor(event) { - const actorId = $(event.currentTarget)?.data("actor-id"); + const actorId = this.html.find(event.currentTarget)?.data("actor-id"); const actor = this.dialogData.actors.find(it => it.id == actorId); if (actor) { actor.selected = event.currentTarget.checked; diff --git a/module/dialog-validation-encaissement.js b/module/dialog-validation-encaissement.js index addcf45c..a5d092ea 100644 --- a/module/dialog-validation-encaissement.js +++ b/module/dialog-validation-encaissement.js @@ -35,7 +35,7 @@ export class DialogValidationEncaissement extends Dialog { } let dialogOptions = { - classes: ["rdddialog"], + classes: ["rdd-roll-dialog"], width: 350, height: 290 } @@ -55,11 +55,12 @@ export class DialogValidationEncaissement extends Dialog { /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - html.find('input.encaissement-roll-result').keyup(async event => { + this.html = html; + this.html.find('input.encaissement-roll-result').keyup(async event => { this.forceDiceResult.total = event.currentTarget.value; this.encaissement = await RdDUtility.jetEncaissement(this.rollData, this.armure, { showDice: HIDE_DICE, forceDiceResult: this.forceDiceResult}); - $('label.encaissement-total').text(this.encaissement.total); - $('label.encaissement-blessure').text(this.encaissement.blessures) + this.html.find('label.encaissement-total').text(this.encaissement.total); + this.html.find('label.encaissement-blessure').text(this.encaissement.blessures) }); } diff --git a/module/environnement.js b/module/environnement.js index eebc6834..0f278278 100644 --- a/module/environnement.js +++ b/module/environnement.js @@ -147,29 +147,29 @@ export class EnvironmentSheetHelper { }); } - static activateListeners(sheet, html) { + static activateListeners(sheet) { if (!sheet.options.editable) return; - html.find("input.input-selection-milieu").keypress(event => { + sheet.html.find("input.input-selection-milieu").keypress(event => { if (event.keyCode == '13') { - EnvironmentSheetHelper.onAddMilieu(html, sheet, event); + EnvironmentSheetHelper.onAddMilieu(sheet, event); } event.stopPropagation(); }) - html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(html, sheet, event)); - html.find("div.environnement-milieu a.milieu-delete").click(event => EnvironmentSheetHelper.onDeleteMilieu(sheet, event)); - html.find("div.environnement-milieu select.environnement-rarete").change(event => EnvironmentSheetHelper.onChange(sheet, event, - updated => EnvironmentSheetHelper.$changeRarete(event, updated))); - html.find("div.environnement-milieu input[name='environnement-frequence']").change(event => EnvironmentSheetHelper.onChange(sheet, event, - updated => EnvironmentSheetHelper.$changeFrequence(updated, event))); + sheet.html.find("a.milieu-add").click(event => EnvironmentSheetHelper.onAddMilieu(sheet, event)); + sheet.html.find("div.environnement-milieu a.milieu-delete").click(event => EnvironmentSheetHelper.onDeleteMilieu(sheet, event)); + sheet.html.find("div.environnement-milieu select.environnement-rarete").change(event => EnvironmentSheetHelper.onChange(sheet, event, + updated => EnvironmentSheetHelper.$changeRarete(sheet, event, updated))); + sheet.html.find("div.environnement-milieu input[name='environnement-frequence']").change(event => EnvironmentSheetHelper.onChange(sheet, event, + updated => EnvironmentSheetHelper.$changeFrequence(sheet, event, updated))); } - static $changeFrequence(updated, event) { - updated.frequence = Number($(event.currentTarget).val()); + static $changeFrequence(sheet, event, updated) { + updated.frequence = Number(sheet.html.find(event.currentTarget).val()); } - static $changeRarete(event, updated) { - const name = $(event.currentTarget).val(); + static $changeRarete(sheet, event, updated) { + const name = sheet.html.find(event.currentTarget).val(); const rarete = Environnement.getRarete(name); updated.rarete = rarete.name; updated.frequence = rarete.frequence; @@ -178,8 +178,8 @@ export class EnvironmentSheetHelper { // rarete.max); } - static async onAddMilieu(html, sheet, event) { - const milieu = html.find('input.input-selection-milieu').val(); + static async onAddMilieu(sheet, event) { + const milieu = sheet.html.find('input.input-selection-milieu').val(); if (!milieu) { ui.notifications.warn(`Choisissez le milieu dans lequel se trouve le/la ${sheet.item.name}`); return @@ -206,7 +206,7 @@ export class EnvironmentSheetHelper { static async onChange(sheet, event, doMutation) { const list = sheet.item.system.environnement; - const milieu = EnvironmentSheetHelper.$getEventMilieu(event); + const milieu = EnvironmentSheetHelper.$getEventMilieu(sheet, event); const updated = list.find(it => it.milieu == milieu); if (updated) { doMutation(updated); @@ -216,8 +216,8 @@ export class EnvironmentSheetHelper { } } - static $getEventMilieu(event) { - return $(event.currentTarget)?.parents("div.environnement-milieu").data("milieu"); + static $getEventMilieu(sheet, event) { + return sheet.html.find(event.currentTarget)?.parents("div.environnement-milieu").data("milieu"); } } \ No newline at end of file diff --git a/module/html-utility.js b/module/html-utility.js index 1566039c..c4754cc5 100644 --- a/module/html-utility.js +++ b/module/html-utility.js @@ -1,10 +1,10 @@ export class HtmlUtility{ - static _showControlWhen(control, condition) { + static _showControlWhen(jQuerySelector, condition) { if (condition) { - control.show(); + jQuerySelector.show(); } else { - control.hide(); + jQuerySelector.hide(); } } } \ No newline at end of file diff --git a/module/item-conteneur-sheet.js b/module/item-conteneur-sheet.js index 4cb398fb..0df3121a 100644 --- a/module/item-conteneur-sheet.js +++ b/module/item-conteneur-sheet.js @@ -16,9 +16,10 @@ export class RdDConteneurItemSheet extends RdDItemSheet { activateListeners(html) { super.activateListeners(html); + if (!this.options.editable) return; - html.find('.conteneur-name a').click(async event => { + this.html.find('.conteneur-name a').click(async event => { RdDUtility.toggleAfficheContenu(RdDSheetUtility.getItemId(event)); this.render(true); }); diff --git a/module/item-faune-sheet.js b/module/item-faune-sheet.js index 3b97d7ca..f49d2317 100644 --- a/module/item-faune-sheet.js +++ b/module/item-faune-sheet.js @@ -23,7 +23,7 @@ export class RdDFauneItemSheet extends RdDItemSheet { super.activateListeners(html); if (!this.options.editable) return; - EnvironmentSheetHelper.activateListeners(this, html); + EnvironmentSheetHelper.activateListeners(this); html.find("a.linked-actor-delete").click(event => this.onDeleteLinkedActor()); html.find("a.preparer-nourriture").click(event => this.preparerNourriture(event)); diff --git a/module/item-herbe-sheet.js b/module/item-herbe-sheet.js index 940eec58..0cc0c36b 100644 --- a/module/item-herbe-sheet.js +++ b/module/item-herbe-sheet.js @@ -20,6 +20,6 @@ export class RdDHerbeItemSheet extends RdDItemSheet { activateListeners(html) { super.activateListeners(html); - EnvironmentSheetHelper.activateListeners(this, html); + EnvironmentSheetHelper.activateListeners(this); } } diff --git a/module/item-ingredient-sheet.js b/module/item-ingredient-sheet.js index fe78bc68..fdfc66ae 100644 --- a/module/item-ingredient-sheet.js +++ b/module/item-ingredient-sheet.js @@ -20,6 +20,6 @@ export class RdDIngredientItemSheet extends RdDItemSheet { activateListeners(html) { super.activateListeners(html); - EnvironmentSheetHelper.activateListeners(this, html); + EnvironmentSheetHelper.activateListeners(this); } } diff --git a/module/item-rencontre-sheet.js b/module/item-rencontre-sheet.js index d4b74a98..e806222c 100644 --- a/module/item-rencontre-sheet.js +++ b/module/item-rencontre-sheet.js @@ -51,15 +51,15 @@ export class RdDRencontreItemSheet extends RdDItemSheet { activateListeners(html) { super.activateListeners(html); if (!this.options.editable) return; - html.find("a.effet-add").click(event => this.onAddEffet(event)); - html.find("a.effet-delete").click(event => this.onDeleteEffet(event)); + this.html.find("a.effet-add").click(event => this.onAddEffet(event)); + this.html.find("a.effet-delete").click(event => this.onDeleteEffet(event)); } async onAddEffet(event) { - const resultat = $(event.currentTarget)?.data("effet-resultat"); + const resultat = this.html.find(event.currentTarget)?.data("effet-resultat"); const keyEffets = `system.${resultat}.effets`; - const code = $(event.currentTarget)?.data("effet-code"); + const code = this.html.find(event.currentTarget)?.data("effet-code"); const liste = RdDRencontre.getListeEffets(this.item, resultat); liste.push(code); @@ -67,10 +67,10 @@ export class RdDRencontreItemSheet extends RdDItemSheet { } async onDeleteEffet(event) { - const resultat = $(event.currentTarget)?.data("effet-resultat"); + const resultat = this.html.find(event.currentTarget)?.data("effet-resultat"); const keyEffets = `system.${resultat}.effets`; - const pos = $(event.currentTarget)?.data("effet-pos"); + const pos = this.html.find(event.currentTarget)?.data("effet-pos"); const liste = RdDRencontre.getListeEffets(this.item, resultat); liste.splice(pos, 1); diff --git a/module/item-sheet.js b/module/item-sheet.js index baeb40e5..b928d36d 100644 --- a/module/item-sheet.js +++ b/module/item-sheet.js @@ -157,36 +157,39 @@ export class RdDItemSheet extends ItemSheet { /** @override */ activateListeners(html) { super.activateListeners(html); + this.html = html; + let itemSheetDialog = this; - HtmlUtility._showControlWhen($(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned); - HtmlUtility._showControlWhen($(".item-magique"), this.item.isMagique()); + HtmlUtility._showControlWhen(this.html.find(".item-cout"), ReglesOptionelles.isUsing('afficher-prix-joueurs') || game.user.isGM || !this.item.isOwned); + HtmlUtility._showControlWhen(this.html.find(".item-magique"), this.item.isMagique()); // Everything below here is only needed if the sheet is editable if (!this.options.editable) return; + this.form.ondragstart = (event) => this._onDragStart(event); this.form.ondrop = (event) => this._onDrop(event); // Select competence categorie - html.find(".categorie").change(event => this._onSelectCategorie(event)); + this.html.find(".categorie").change(event => this._onSelectCategorie(event)); - html.find('.sheet-competence-xp').change((event) => { + this.html.find('.sheet-competence-xp').change((event) => { if (this.item.isCompetencePersonnage()) { RdDUtility.checkThanatosXP(this.item.name); } }); - html.find('.enchanteDate').change((event) => { - let jour = Number($('#jourMois').val()); - let mois = $('#nomMois').val(); + this.html.find('.enchanteDate').change((event) => { + let jour = Number(this.html.find('[name="splitDate.day"]').val()); + let mois = this.html.find('[name="splitDate.month"]').val(); this.dateUpdated = game.system.rdd.calendrier.getIndexFromDate(jour, mois); }); - html.find('.creer-tache-livre').click((event) => this._getEventActor(event).creerTacheDepuisLivre(this.item)); - html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item)); - html.find('.creer-potion-base').click((event) => this._getEventActor(event).dialogFabriquerPotion(this.item)); + this.html.find('.creer-tache-livre').click((event) => this._getEventActor(event).creerTacheDepuisLivre(this.item)); + this.html.find('.consommer-potion').click((event) => this._getEventActor(event).consommerPotion(this.item)); + this.html.find('.creer-potion-base').click((event) => this._getEventActor(event).dialogFabriquerPotion(this.item)); - html.find('.alchimie-tache a').click((event) => { + this.html.find('.alchimie-tache a').click((event) => { let actor = this._getEventActor(event); if (actor) { let recetteId = event.currentTarget.attributes['data-recette-id'].value; @@ -198,12 +201,12 @@ export class RdDItemSheet extends ItemSheet { } }); - html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => itemSheetDialog.render(true))); - html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true)); - html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor))); - html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente()); - html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem()); - html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => itemSheetDialog.render(true))); + this.html.find('.item-split').click(async event => RdDSheetUtility.splitItem(RdDSheetUtility.getItem(event, this.actor), this.actor, async () => itemSheetDialog.render(true))); + this.html.find('.item-edit').click(async event => RdDSheetUtility.getItem(event, this.actor)?.sheet.render(true)); + this.html.find('.item-delete').click(async event => RdDUtility.confirmerSuppressionItem(this, RdDSheetUtility.getItem(event, this.actor))); + this.html.find('.item-vendre').click(async event => RdDSheetUtility.getItem(event, this.actor)?.proposerVente()); + this.html.find('.item-montrer').click(async event => RdDSheetUtility.getItem(event, this.actor)?.postItem()); + this.html.find('.item-action').click(async event => RdDSheetUtility.getItem(event, this.actor)?.actionPrincipale(this.actor, async () => itemSheetDialog.render(true))); } _getEventActor(event) { @@ -219,7 +222,7 @@ export class RdDItemSheet extends ItemSheet { if (this.item.isCompetence()) { let level = RdDItemCompetence.getNiveauBase(event.currentTarget.value); this.item.system.base = level; - $("#base").val(level); + this.html.find('[name="system.base"]').val(level); } } diff --git a/module/rdd-astrologie-editeur.js b/module/rdd-astrologie-editeur.js index 75913483..b2dd6260 100644 --- a/module/rdd-astrologie-editeur.js +++ b/module/rdd-astrologie-editeur.js @@ -15,13 +15,19 @@ // Common conf let dialogConf = { content: html, title: "Editeur d'Astrologie", buttons: myButtons, default: "saveButton" }; - let dialogOptions = { classes: ["rdddialog"], width: 600, height: 300, 'z-index': 99999 } + let dialogOptions = { classes: ["rdd-roll-dialog"], width: 600, height: 300, 'z-index': 99999 } super(dialogConf, dialogOptions) this.calendrier = calendrier; this.updateData( calendrierData ); } + activateListeners(html) { + super.activateListeners(html); + this.html = html; + } + + /* -------------------------------------------- */ async resetNombreAstraux() { game.system.rdd.calendrier.resetNombreAstral(); @@ -39,15 +45,4 @@ this.calendrierData = duplicate(calendrierData); } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - let astrologieData = this.astrologieData; - - $(function () { - }); - - } - } diff --git a/module/rdd-astrologie-joueur.js b/module/rdd-astrologie-joueur.js index 5c520d6a..5ec5660d 100644 --- a/module/rdd-astrologie-joueur.js +++ b/module/rdd-astrologie-joueur.js @@ -20,7 +20,7 @@ export class RdDAstrologieJoueur extends Dialog { astrologie: RdDItemCompetence.findCompetence(actor.items, 'Astrologie') } const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-astrologie-joueur.html', dialogData); - let options = { classes: ["rdddialog"], width: 600, height: 500, 'z-index': 99999 }; + let options = { classes: ["rdd-roll-dialog"], width: 600, height: 500, 'z-index': 99999 }; if (dialogConfig.options) { mergeObject(options, dialogConfig.options, { overwrite: true }); } @@ -29,21 +29,35 @@ export class RdDAstrologieJoueur extends Dialog { /* -------------------------------------------- */ constructor(html, actor, dialogData) { - - let myButtons = { - saveButton: { label: "Fermer", callback: html => this.quitDialog() } + const dialogConf = { + title: "Nombres Astraux", + content: html, + default: "saveButton", + buttons: { + saveButton: { label: "Fermer", callback: html => this.quitDialog() } + }, }; - - // Get all n - // Common conf - let dialogConf = { content: html, title: "Nombres Astraux", buttons: myButtons, default: "saveButton" }; - let dialogOptions = { classes: ["rdddialog"], width: 600, height: 300, 'z-index': 99999 }; + const dialogOptions = { classes: ["rdd-roll-dialog"], width: 600, height: 300, 'z-index': 99999 }; super(dialogConf, dialogOptions); this.actor = actor; this.dataNombreAstral = duplicate(dialogData); } + /* -------------------------------------------- */ + activateListeners(html) { + super.activateListeners(html); + this.html = html; + + this.html.find(function () { + this.html.find("[name='diffConditions']").val(0); + }); + + this.html.find('[name="jet-astrologie"]').click((event) => { + this.requestJetAstrologie(); + }); + } + /* -------------------------------------------- */ static organizeNombres(actor) { let itemNombres = actor.listItemsData('nombreastral'); @@ -68,8 +82,8 @@ export class RdDAstrologieJoueur extends Dialog { carac_vue: this.actor.system.carac['vue'].value, etat: this.dataNombreAstral.etat, astrologie: this.dataNombreAstral.astrologie, - conditions: $("#diffConditions").val(), - date: $("#joursAstrologie").val(), + conditions: this.html.find('[name="diffConditions"]').val(), + date: this.html.find('[name="joursAstrologie"]').val(), userId: game.user.id } if (Misc.isUniqueConnectedGM()) { @@ -87,17 +101,4 @@ export class RdDAstrologieJoueur extends Dialog { quitDialog() { } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - $(function () { - $("#diffConditions").val(0); - }); - - html.find('#jet-astrologie').click((event) => { - this.requestJetAstrologie(); - }); - } - } diff --git a/module/rdd-calendrier-editeur.js b/module/rdd-calendrier-editeur.js index 6a740d5c..936dee45 100644 --- a/module/rdd-calendrier-editeur.js +++ b/module/rdd-calendrier-editeur.js @@ -23,15 +23,24 @@ export class RdDCalendrierEditeur extends Dialog { this.calendrierData = calendrierData; } + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.html.find("input[name='nomMois']").val(this.calendrierData.moisKey); + this.html.find("select[name='nomHeure']").val(this.calendrierData.heureKey); + this.html.find("select[name='jourMois']").val(this.calendrierData.jourMois); + this.html.find("select[name='minutesRelative']").val(calendrierData.minutesRelative); + this.html.find("select[name='annee']").val(this.calendrierData.annee); + } + /* -------------------------------------------- */ fillData() { - this.calendrierData.annee = $("input[name='annee']").val(); - this.calendrierData.moisKey = $("select[name='nomMois']").val(); - this.calendrierData.heureKey = $("select[name='nomHeure']").val(); - this.calendrierData.jourMois = $("select[name='jourMois']").val(); - this.calendrierData.minutesRelative = $("select[name='minutesRelative']").val(); + this.calendrierData.annee = this.html.find("input[name='annee']").val(); + this.calendrierData.moisKey = this.html.find("select[name='nomMois']").val(); + this.calendrierData.heureKey = this.html.find("select[name='nomHeure']").val(); + this.calendrierData.jourMois = this.html.find("select[name='jourMois']").val(); + this.calendrierData.minutesRelative = this.html.find("select[name='minutesRelative']").val(); - console.log("UPDATE ", this.calendrierData); this.calendrier.saveEditeur(this.calendrierData) } @@ -40,21 +49,4 @@ export class RdDCalendrierEditeur extends Dialog { this.calendrierData = duplicate(calendrierData); } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - let calendrierData = this.calendrierData; - - $(function () { - console.log(calendrierData); - $("input[name='nomMois']").val(calendrierData.moisKey); - $("select[name='nomHeure']").val(calendrierData.heureKey); - $("select[name='jourMois']").val(calendrierData.jourMois); - $("select[name='minutesRelative']").val(calendrierData.minutesRelative); - $("select[name='annee']").val(calendrierData.annee); - }); - - } - } diff --git a/module/rdd-calendrier.js b/module/rdd-calendrier.js index f47ca3fd..554a11e2 100644 --- a/module/rdd-calendrier.js +++ b/module/rdd-calendrier.js @@ -43,6 +43,14 @@ const MAX_NOMBRE_ASTRAL = 12; /* -------------------------------------------- */ export class RdDCalendrier extends Application { + static get defaultOptions() { + return mergeObject(super.defaultOptions, { + template: "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html", + popOut: false, + resizable: false + }); + } + static createCalendrierPos() { return { top: 200, left: 200 }; } @@ -121,20 +129,103 @@ export class RdDCalendrier extends Application { console.log('RdDCalendrier.constructor()', this.calendrier, this.calendrierPos, this.listeNombreAstral); } + /* -------------------------------------------- */ + /** @override */ + async activateListeners(html) { + super.activateListeners(html); + this.html = html; + + this.updateDisplay(); + + this.html.find('.ajout-chronologie').click(ev => DialogChronologie.create()); + + this.html.find('.calendar-btn').click(ev => this.onCalendarButton(ev)); + + this.html.find('.calendar-btn-edit').click(ev => { + ev.preventDefault(); + this.showCalendarEditor(); + }); + + this.html.find('.astrologie-btn-edit').click(ev => { + ev.preventDefault(); + this.showAstrologieEditor(); + }); + + this.html.find('#calendar-move-handle').mousedown(ev => { + ev.preventDefault(); + ev = ev || window.event; + let isRightMB = false; + if ("which" in ev) { // Gecko (Firefox), WebKit (Safari/Chrome) & Opera + isRightMB = ev.which == 3; + } else if ("button" in ev) { // IE, Opera + isRightMB = ev.button == 2; + } + + if (!isRightMB) { + dragElement(document.getElementById("calendar-time-container")); + let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; + + function dragElement(elmnt) { + elmnt.onmousedown = dragMouseDown; + function dragMouseDown(e) { + e = e || window.event; + e.preventDefault(); + pos3 = e.clientX; + pos4 = e.clientY; + + document.onmouseup = closeDragElement; + document.onmousemove = elementDrag; + } + + function elementDrag(e) { + e = e || window.event; + e.preventDefault(); + // calculate the new cursor position: + pos1 = pos3 - e.clientX; + pos2 = pos4 - e.clientY; + pos3 = e.clientX; + pos4 = e.clientY; + // set the element's new position: + elmnt.style.bottom = undefined + elmnt.style.top = (elmnt.offsetTop - pos2) + "px"; + elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"; + } + + function closeDragElement() { + // stop moving when mouse button is released: + elmnt.onmousedown = undefined; + document.onmouseup = undefined; + document.onmousemove = undefined; + let xPos = (elmnt.offsetLeft - pos1) > window.innerWidth ? window.innerWidth - 200 : (elmnt.offsetLeft - pos1); + let yPos = (elmnt.offsetTop - pos2) > window.innerHeight - 20 ? window.innerHeight - 100 : (elmnt.offsetTop - pos2) + xPos = xPos < 0 ? 0 : xPos; + yPos = yPos < 0 ? 0 : yPos; + if (xPos != (elmnt.offsetLeft - pos1) || yPos != (elmnt.offsetTop - pos2)) { + elmnt.style.top = (yPos) + "px"; + elmnt.style.left = (xPos) + "px"; + } + game.system.rdd.calendrier.calendrierPos.top = yPos; + game.system.rdd.calendrier.calendrierPos.left = xPos; + if (game.user.isGM) { + game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos)); + } + } + } + } else if (isRightMB) { + game.system.rdd.calendrier.calendrierPos.top = 200; + game.system.rdd.calendrier.calendrierPos.left = 200; + if (game.user.isGM) { + game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos)); + } + this.setPos(game.system.rdd.calendrier.calendrierPos); + } + }); + } /* -------------------------------------------- */ getListeNombreAstral() { return game.settings.get(SYSTEM_RDD, "liste-nombre-astral") ?? []; } - /* -------------------------------------------- */ - static get defaultOptions() { - return mergeObject(super.defaultOptions, { - template: "systems/foundryvtt-reve-de-dragon/templates/calendar-template.html", - popOut: false, - resizable: false - }); - } - /* -------------------------------------------- */ getDateFromIndex(index) { const dateRdD = this.getCalendrier(index); @@ -555,97 +646,4 @@ export class RdDCalendrier extends Application { astrologieEditeur.updateData(calendrierData); astrologieEditeur.render(true); } - - /* -------------------------------------------- */ - /** @override */ - async activateListeners(html) { - super.activateListeners(html); - - this.updateDisplay(); - - html.find('.ajout-chronologie').click(ev => DialogChronologie.create()); - - html.find('.calendar-btn').click(ev => this.onCalendarButton(ev)); - - html.find('.calendar-btn-edit').click(ev => { - ev.preventDefault(); - this.showCalendarEditor(); - }); - - html.find('.astrologie-btn-edit').click(ev => { - ev.preventDefault(); - this.showAstrologieEditor(); - }); - - html.find('#calendar-move-handle').mousedown(ev => { - ev.preventDefault(); - ev = ev || window.event; - let isRightMB = false; - if ("which" in ev) { // Gecko (Firefox), WebKit (Safari/Chrome) & Opera - isRightMB = ev.which == 3; - } else if ("button" in ev) { // IE, Opera - isRightMB = ev.button == 2; - } - - if (!isRightMB) { - dragElement(document.getElementById("calendar-time-container")); - let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0; - - function dragElement(elmnt) { - elmnt.onmousedown = dragMouseDown; - function dragMouseDown(e) { - e = e || window.event; - e.preventDefault(); - pos3 = e.clientX; - pos4 = e.clientY; - - document.onmouseup = closeDragElement; - document.onmousemove = elementDrag; - } - - function elementDrag(e) { - e = e || window.event; - e.preventDefault(); - // calculate the new cursor position: - pos1 = pos3 - e.clientX; - pos2 = pos4 - e.clientY; - pos3 = e.clientX; - pos4 = e.clientY; - // set the element's new position: - elmnt.style.bottom = undefined - elmnt.style.top = (elmnt.offsetTop - pos2) + "px"; - elmnt.style.left = (elmnt.offsetLeft - pos1) + "px"; - } - - function closeDragElement() { - // stop moving when mouse button is released: - elmnt.onmousedown = undefined; - document.onmouseup = undefined; - document.onmousemove = undefined; - let xPos = (elmnt.offsetLeft - pos1) > window.innerWidth ? window.innerWidth - 200 : (elmnt.offsetLeft - pos1); - let yPos = (elmnt.offsetTop - pos2) > window.innerHeight - 20 ? window.innerHeight - 100 : (elmnt.offsetTop - pos2) - xPos = xPos < 0 ? 0 : xPos; - yPos = yPos < 0 ? 0 : yPos; - if (xPos != (elmnt.offsetLeft - pos1) || yPos != (elmnt.offsetTop - pos2)) { - elmnt.style.top = (yPos) + "px"; - elmnt.style.left = (xPos) + "px"; - } - game.system.rdd.calendrier.calendrierPos.top = yPos; - game.system.rdd.calendrier.calendrierPos.left = xPos; - if (game.user.isGM) { - game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos)); - } - } - } - } else if (isRightMB) { - game.system.rdd.calendrier.calendrierPos.top = 200; - game.system.rdd.calendrier.calendrierPos.left = 200; - if (game.user.isGM) { - game.settings.set(SYSTEM_RDD, "calendrier-pos", duplicate(game.system.rdd.calendrier.calendrierPos)); - } - this.setPos(game.system.rdd.calendrier.calendrierPos); - } - }); - } - } \ No newline at end of file diff --git a/module/rdd-combat.js b/module/rdd-combat.js index c5579338..9dd406f2 100644 --- a/module/rdd-combat.js +++ b/module/rdd-combat.js @@ -767,7 +767,7 @@ export class RdDCombat { // whisper: ChatMessage.getWhisperRecipients("GM")}) // } - if (!await this.accorderEntite('avant-attaque')) { + if (!await this.attacker.accorder(this.defender, 'avant-attaque')) { return; } if (arme.system.cac == 'empoignade' && this.attacker.isCombatTouche()) { @@ -886,7 +886,7 @@ export class RdDCombat { } await RdDResolutionTable.displayRollData(attackerRoll, this.attacker, 'chat-resultat-attaque.html'); - if (!await this.accorderEntite('avant-defense')) { + if (!await this.attacker.accorder(this.defender, 'avant-defense')) { return; } @@ -1319,35 +1319,6 @@ export class RdDCombat { this.removeChatMessageActionsPasseArme(attackerRoll.passeArme); } - /* -------------------------------------------- */ - /* retourne true si on peut continuer, false si on ne peut pas continuer */ - async accorderEntite(when = 'avant-encaissement') { - if (when != game.settings.get(SYSTEM_RDD, "accorder-entite-cauchemar") - || this.defender == undefined - || !this.defender.isEntite([ENTITE_INCARNE]) - || this.defender.isEntiteAccordee(this.attacker)) { - return true; - } - - let rolled = await RdDResolutionTable.roll(this.attacker.getReveActuel(), - Number(this.defender.system.carac.niveau.value)); - - let message = { - content: "Jet de points actuels de rêve à " + rolled.finalLevel + RdDResolutionTable.explain(rolled) + "
", - whisper: ChatMessage.getWhisperRecipients(this.attacker.name) - }; - - if (rolled.isSuccess) { - await this.defender.setEntiteReveAccordee(this.attacker); - message.content += this.attacker.name + " s'est accordé avec " + this.defender.name; - } - else { - message.content += this.attacker.name + " n'est pas accordé avec " + this.defender.name; - } - - ChatMessage.create(message); - return rolled.isSuccess; - } - /* -------------------------------------------- */ static async displayActorCombatStatus(combat, actor) { let formData = { diff --git a/module/rdd-resolution-table.js b/module/rdd-resolution-table.js index c6d67bf3..fd2e482a 100644 --- a/module/rdd-resolution-table.js +++ b/module/rdd-resolution-table.js @@ -14,7 +14,7 @@ const levelDown = [ { level: -15, score: 1, norm: 1, sign: 0, part: 0, epart: 2, etotal: 10 }, { level: -16, score: 1, norm: 1, sign: 0, part: 0, epart: 0, etotal: 2 } ]; -const levelImpossible = { score: 0, norm:0, sign: 0, part: 0, epart: 0, etotal: 1 }; +const levelImpossible = { score: 0, norm: 0, sign: 0, part: 0, epart: 0, etotal: 1 }; const reussites = [ { code: "etotal", isPart: false, isSign: false, isSuccess: false, isEchec: true, isEPart: true, isETotal: true, ptTache: -4, ptQualite: -6, quality: "Echec total", condition: (target, roll) => roll >= target.etotal && roll <= 100 }, @@ -42,6 +42,44 @@ export class RdDResolutionTable { return table; } + /* -------------------------------------------- */ + static computeChances(carac, level) { + if (level < -16) { + return levelImpossible; + } + if (level < -10) { + return levelDown.find(it => it.level == level); + } + const percentage = RdDResolutionTable.computePercentage(carac, level); + return this._computeCell(level, percentage); + } + + + /* -------------------------------------------- */ + static _computeRow(caracValue) { + let dataRow = [ + this._computeCell(-10, Math.max(Math.floor(caracValue / 4), 1)), + this._computeCell(-9, Math.max(Math.floor(caracValue / 2), 1)) + ] + for (var diff = -8; diff <= 22; diff++) { + dataRow[diff + 10] = this._computeCell(diff, RdDResolutionTable.computePercentage(caracValue, diff)); + } + return dataRow; + } + + /* -------------------------------------------- */ + static _computeCell(niveau, percentage) { + return { + niveau: niveau, + score: percentage, + norm: Math.min(99, percentage), + sign: this._reussiteSignificative(percentage), + part: this._reussitePart(percentage), + epart: this._echecParticulier(percentage), + etotal: this._echecTotal(percentage) + }; + } + /* -------------------------------------------- */ static getResultat(code) { let resultat = reussites.find(r => code == r.code); @@ -51,17 +89,6 @@ export class RdDResolutionTable { return resultat; } - /* -------------------------------------------- */ - static explain(rolled) { - let message = "
Jet : " + rolled.roll + " sur " + rolled.score + "% "; - if (rolled.caracValue != undefined && rolled.finalLevel != undefined) { - message += (rolled.diviseurSignificative > 1 ? `(1/${rolled.diviseurSignificative} de ` : "(") - + rolled.caracValue + " à " + Misc.toSignedString(rolled.finalLevel) + ") "; - } - message += '' + rolled.quality + '' - return message; - } - /* -------------------------------------------- */ static async displayRollData(rollData, actor = undefined, template = 'chat-resultat-general.html') { return await ChatUtility.createChatWithRollMode(actor?.userName ?? game.user.name, { @@ -82,8 +109,8 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static async roll(caracValue, finalLevel, rollData = {}){ - let chances = this.computeChances(caracValue, finalLevel); + static async roll(caracValue, finalLevel, rollData = {}) { + let chances = duplicate(this.computeChances(caracValue, finalLevel)); this._updateChancesWithBonus(chances, rollData.bonus, finalLevel); this._updateChancesFactor(chances, rollData.diviseurSignificative); chances.showDice = rollData.showDice; @@ -95,7 +122,7 @@ export class RdDResolutionTable { rolled.bonus = rollData.bonus; rolled.factorHtml = Misc.getFractionHtml(rollData.diviseurSignificative); - if (ReglesOptionelles.isUsing("afficher-colonnes-reussite")){ + if (ReglesOptionelles.isUsing("afficher-colonnes-reussite")) { rolled.niveauNecessaire = this.findNiveauNecessaire(caracValue, rolled.roll); rolled.ajustementNecessaire = rolled.niveauNecessaire - finalLevel; } @@ -103,13 +130,24 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static findNiveauNecessaire(caracValue, rollValue) { - for (let cell of this.resolutionTable[caracValue]) { - if ( rollValue <= cell.norm) { - return cell.niveau; - } + static findNiveauNecessaire(carac, rolled) { + if (carac == 0) { + return NaN; } - return 16; // Dummy default + if (rolled >= carac){ + const upper = Math.ceil(rolled/carac); + return 2*upper -10 + } + if (rolled > Math.floor(carac/2)) { + return -8 + } + if (rolled > Math.floor(carac/4)) { + return -9 + } + if (rolled > 1) { + return -10 + } + return -11; } /* -------------------------------------------- */ @@ -122,7 +160,7 @@ export class RdDResolutionTable { /* -------------------------------------------- */ static _updateChancesWithBonus(chances, bonus, finalLevel) { - if (bonus && finalLevel>-11) { + if (bonus && finalLevel > -11) { let newScore = Number(chances.score) + bonus; mergeObject(chances, this._computeCell(undefined, newScore), { overwrite: true }); } @@ -142,21 +180,19 @@ export class RdDResolutionTable { /* -------------------------------------------- */ static async rollChances(chances, diviseur, forceDiceResult = -1) { - chances.forceDiceResult = forceDiceResult <= 0 || forceDiceResult > 100 ? undefined : {total: forceDiceResult}; - chances.roll = await RdDDice.rollTotal( "1d100", chances); + chances.forceDiceResult = forceDiceResult <= 0 || forceDiceResult > 100 ? undefined : { total: forceDiceResult }; + chances.roll = await RdDDice.rollTotal("1d100", chances); mergeObject(chances, this.computeReussite(chances, chances.roll, diviseur), { overwrite: true }); return chances; } /* -------------------------------------------- */ - static computeChances(caracValue, difficulte) { - if (difficulte < -16) { - return duplicate(levelImpossible); - } - if (difficulte < -10) { - return duplicate(levelDown.find(levelData => levelData.level == difficulte)); - } - return duplicate(RdDResolutionTable.resolutionTable[caracValue][difficulte + 10]); + static computePercentage(carac, diff) { + if (diff < -16) return 0 + if (diff < -10) return 1 + if (diff == -10) return Math.max(Math.floor(carac / 4), 1) + if (diff == -9) return Math.max(Math.floor(carac / 2), 1) + return Math.max(Math.floor(carac * (diff + 10) / 2), 1); } /* -------------------------------------------- */ @@ -213,31 +249,6 @@ export class RdDResolutionTable { return reussite; } - /* -------------------------------------------- */ - static _computeRow(caracValue) { - let dataRow = [ - this._computeCell(-10, Math.max(Math.floor(caracValue / 4), 1)), - this._computeCell(-9, Math.max(Math.floor(caracValue / 2), 1)) - ] - for (var diff = -8; diff <= 22; diff++) { - dataRow[diff + 10] = this._computeCell(diff, Math.max(Math.floor(caracValue * (diff + 10) / 2), 1)); - } - return dataRow; - } - - /* -------------------------------------------- */ - static _computeCell(niveau, percentage) { - return { - niveau: niveau, - score: percentage, - norm: Math.min(99, percentage), - sign: this._reussiteSignificative(percentage), - part: this._reussitePart(percentage), - epart: this._echecParticulier(percentage), - etotal: this._echecTotal(percentage) - }; - } - /* -------------------------------------------- */ static _reussiteSignificative(percentage) { return Math.floor(percentage / 2); @@ -261,92 +272,34 @@ export class RdDResolutionTable { } /* -------------------------------------------- */ - static buildHTMLResults(caracValue, levelValue) { - if (caracValue == undefined || isNaN(caracValue)) caracValue = 10; - if (levelValue == undefined || isNaN(levelValue)) levelValue = 0; - - let cell = this.computeChances(caracValue, levelValue); - cell.epart = cell.epart > 99 ? 'N/A' : cell.epart; - cell.etotal = cell.etotal > 100 ? 'N/A' : cell.etotal; - cell.score = Math.min(cell.score, 99); - - return ` - - Particulière: ${cell.part} - - Significative: ${cell.sign} - - Réussite: ${cell.score} - - Echec Particulier: ${cell.epart} - - Echec Total: ${cell.etotal} - - ` + static subTable(carac, level, delta = { carac: 2, level: 5}) { + return { + carac, + level, + minCarac: carac - (delta?.carac ?? 2), + maxCarac: carac + (delta?.carac ?? 2), + minLevel: level - (delta?.level ?? 5), + maxLevel: level + (delta?.level ?? 5) + }; } /* -------------------------------------------- */ - static buildHTMLTableExtract(caracValue, levelValue) { - return this.buildHTMLTable(caracValue, levelValue, caracValue - 2, caracValue + 2, levelValue - 5, levelValue + 5) - } - - static buildHTMLTable(caracValue, levelValue, minCarac = 1, maxCarac = 21, minLevel = -10, maxLevel = 11) { - return this._buildHTMLTable(caracValue, levelValue, minCarac, maxCarac, minLevel, maxLevel) - } - - /* -------------------------------------------- */ - static _buildHTMLTable(caracValue, levelValue, minCarac, maxCarac, minLevel, maxLevel) { - let countColonnes = maxLevel - minLevel; + static async buildHTMLTable({ carac: carac, level: level, minCarac = 1, maxCarac = 21, minLevel = -10, maxLevel = 11 }) { + let colonnes = maxLevel - minLevel; minCarac = Math.max(minCarac, 1); - maxCarac = Math.min(maxCarac, caracMaximumResolution); + maxCarac = Math.min(maxCarac, minCarac + 20); minLevel = Math.max(minLevel, -10); - maxLevel = Math.max(Math.min(maxLevel, 22), minLevel + countColonnes); - - let table = $("") - .append(this._buildHTMLHeader(RdDResolutionTable.resolutionTable[0], minLevel, maxLevel)); - - for (var rowIndex = minCarac; rowIndex <= maxCarac; rowIndex++) { - table.append(this._buildHTMLRow(RdDResolutionTable.resolutionTable[rowIndex], rowIndex, caracValue, levelValue, minLevel, maxLevel)); - } - table.append("
"); - return table; + maxLevel = Math.max(Math.min(maxLevel, 30), minLevel + colonnes); + return await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/resolution-table.html', { + carac: carac, + difficulte: level, + min: minLevel, + rows: RdDResolutionTable.incrementalArray(minCarac, maxCarac), + cols: RdDResolutionTable.incrementalArray(minLevel, maxLevel) + }); } - - /* -------------------------------------------- */ - static _buildHTMLHeader(dataRow, minLevel, maxLevel) { - let tr = $(""); - - if (minLevel > -8) { - tr.append($("").text("-8")) - } - if (minLevel > -7) { - tr.append($("").text("...")); - } - for (let difficulte = minLevel; difficulte <= maxLevel; difficulte++) { - tr.append($("").text(Misc.toSignedString(difficulte))); - } - return tr; - } - - /* -------------------------------------------- */ - static _buildHTMLRow(dataRow, rowIndex, caracValue, levelValue, minLevel, maxLevel) { - let tr = $(""); - let max = maxLevel; - - if (minLevel > -8) { - let score = dataRow[-8 + 10].score; - tr.append($("").text(score)) - } - if (minLevel > -7) { - tr.append($("")) - } - for (let difficulte = minLevel; difficulte <= max; difficulte++) { - let td = $(""); - let score = dataRow[difficulte + 10].score; - if (rowIndex == caracValue && levelValue == difficulte) { - td.addClass('table-resolution-target'); - } else if (difficulte == -8) { - td.addClass('table-resolution-carac'); - } - tr.append(td.text(score)); - } - return tr; + static incrementalArray(min, max) { + return Array.from(Array(max-min+1).keys()).map(i=>i+min) } } \ No newline at end of file diff --git a/module/rdd-roll-encaisser.js b/module/rdd-roll-encaisser.js index a109b35d..4d98e413 100644 --- a/module/rdd-roll-encaisser.js +++ b/module/rdd-roll-encaisser.js @@ -1,4 +1,5 @@ -import { ENTITE_BLURETTE, ENTITE_INCARNE} from "./constants.js"; +import { ENTITE_BLURETTE, ENTITE_INCARNE } from "./constants.js"; +import { RdDUtility } from "./rdd-utility.js"; /** * Extend the base Dialog entity by defining a custom window to perform roll. @@ -6,32 +7,37 @@ import { ENTITE_BLURETTE, ENTITE_INCARNE} from "./constants.js"; */ export class RdDEncaisser extends Dialog { + static async encaisser(actor) { + let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-encaisser.html', + { ajustementsEncaissement: RdDUtility.getAjustementsEncaissement() } + ); + new RdDEncaisser(html, actor).render(true); + } + /* -------------------------------------------- */ constructor(html, actor) { - // Common conf - let buttons = {}; - if (!actor.isEntite()){ - buttons = { + let dialogConf = { + title: "Jet d'Encaissement", + content: html, + } + + if (!actor.isEntite()) { + dialogConf.default = "mortel"; + dialogConf.buttons = { "mortel": { label: "Mortel", callback: html => this.performEncaisser("mortel") }, "non-mortel": { label: "Non-mortel", callback: html => this.performEncaisser("non-mortel") }, "sonne": { label: "Sonné", callback: html => this.actor.setSonne() }, }; } - else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])){ - buttons = { - "cauchemar": { label: "cauchemar", callback: html => this.performEncaisser("cauchemar") } + else if (actor.isEntite([ENTITE_BLURETTE, ENTITE_INCARNE])) { + dialogConf.default = "cauchemar" + dialogConf.buttons = { + "cauchemar": { label: "Cauchemar", callback: html => this.performEncaisser("cauchemar") } } } - let dialogConf = { - title: "Jet d'Encaissement", - content: html, - buttons: buttons, - default: "mortel" - } - let dialogOptions = { - classes: ["rdddialog"], + classes: ["rdd-roll-dialog"], width: 320, height: 'fit-content' } @@ -44,7 +50,18 @@ export class RdDEncaisser extends Dialog { this.encaisserSpecial = "aucun"; } + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.html.find('[name="modificateurDegats"]').val("0"); + this.html.find('[name="modificateurDegats"]').change((event) => { + this.modifier = event.currentTarget.value; // Update the selected bonus/malus + }); + this.html.find('[name="encaisserSpecial"]').change((event) => { + this.encaisserSpecial = event.currentTarget.value; // Update the selected bonus/malus + }); + } /* -------------------------------------------- */ performEncaisser(mortalite) { @@ -58,22 +75,4 @@ export class RdDEncaisser extends Dialog { } }); } - - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - // Setup everything onload - $(function () { - $("#modificateurDegats").val("0"); - }); - - html.find('#modificateurDegats').change((event) => { - this.modifier = event.currentTarget.value; // Update the selected bonus/malus - }); - html.find('#encaisserSpecial').change((event) => { - this.encaisserSpecial = event.currentTarget.value; // Update the selected bonus/malus - }); - } - } diff --git a/module/rdd-roll-ethylisme.js b/module/rdd-roll-ethylisme.js index ce7580d4..440d7a08 100644 --- a/module/rdd-roll-ethylisme.js +++ b/module/rdd-roll-ethylisme.js @@ -13,47 +13,33 @@ export class RdDRollDialogEthylisme extends Dialog { title: "Test d'éthylisme", content: html, default: "rollButton", - buttons: { "rollButton": { label: "Test d'éthylisme", callback: html => this.onButton(html) } } + buttons: { "rollButton": { label: "Test d'éthylisme", callback: html => onRoll(this.rollData) } } }; - let dialogOptions = { classes: ["rdddialog"], width: 400, height: 'fit-content', 'z-index': 99999 } + let dialogOptions = { classes: ["rdd-roll-dialog"], width: 400, height: 'fit-content', 'z-index': 99999 } super(dialogConf, dialogOptions) - //console.log("ETH", rollData); - this.onRoll = onRoll; this.rollData = rollData; this.actor = actor; } - async onButton(html) { - this.onRoll(this.rollData); + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.bringToTop(); + + this.html.find(".force-alcool").change((event) => { + this.rollData.forceAlcool = Misc.toInt(event.currentTarget.value); + this.updateRollResult(); + }); + + this.html.find(".force-alcool").val(Misc.toInt(this.rollData.forceAlcool)); + this.updateRollResult(); } /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - this.bringToTop(); // Ensure top level - // Get the rollData stuff - var rollData = this.rollData; - var dialog = this; - - // Setup everything onload - $(function () { - $("#forceAlcool").val(Misc.toInt(rollData.forceAlcool)); - dialog.updateRollResult(); - }); - - // Update ! - html.find('#forceAlcool').change((event) => { - rollData.forceAlcool = Misc.toInt(event.currentTarget.value); // Update the selected bonus/malus - dialog.updateRollResult(); - }); - } async updateRollResult() { - - // Mise à jour valeurs - $("#roll-param").text(this.rollData.vie + " / " + Misc.toSignedString(Number(this.rollData.etat) + Number(this.rollData.forceAlcool) + this.rollData.diffNbDoses)); - $(".table-resolution").remove(); + this.html.find(".roll-ethylisme").text(this.rollData.vie + " / " + Misc.toSignedString(Number(this.rollData.etat) + Number(this.rollData.forceAlcool) + this.rollData.diffNbDoses)); + this.html.find(".table-resolution").remove(); } } diff --git a/module/rdd-roll-resolution-table.js b/module/rdd-roll-resolution-table.js index f276ede4..ed73babf 100644 --- a/module/rdd-roll-resolution-table.js +++ b/module/rdd-roll-resolution-table.js @@ -9,12 +9,19 @@ const titleTableDeResolution = 'Table de résolution'; /* -------------------------------------------- */ export class RdDRollResolutionTable extends Dialog { + static resolutionTable = undefined; /* -------------------------------------------- */ - static async open(rollData = {}) { - RdDRollResolutionTable._setDefaultOptions(rollData); - let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-resolution.html', rollData); - const dialog = new RdDRollResolutionTable(rollData, html); - dialog.render(true); + static async open() { + if (RdDRollResolutionTable.resolutionTable == undefined) { + const rollData = {} + RdDRollResolutionTable._setDefaultOptions(rollData); + let html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-roll-resolution.html', rollData); + RdDRollResolutionTable.resolutionTable = new RdDRollResolutionTable(rollData, html); + RdDRollResolutionTable.resolutionTable.render(true); + } + else{ + RdDRollResolutionTable.resolutionTable.bringToTop(); + } } /* -------------------------------------------- */ @@ -53,11 +60,40 @@ export class RdDRollResolutionTable extends Dialog { 'lancer-fermer': { label: 'Lancer les dés et fermer', callback: html => this.onLancerFermer() } } }; - super(conf, { classes: ["rdddialog"], width: 800, height: 'fit-content', 'z-index': 99999 }); + super(conf, { classes: ["rdd-roll-dialog"], top: 50, width: 'fit-content', height: 'fit-content', 'z-index': 99999 }); this.rollData = rollData; } + activateListeners(html) { + super.activateListeners(html); + this.html = html; + this.bringToTop(); + + + this.html.find("[name='diffLibre']").val(Misc.toInt(this.rollData.diffLibre)); + this.html.find("[name='diffConditions']").val(Misc.toInt(this.rollData.diffConditions)); + this.updateRollResult(); + + this.html.find('.lancer-table-resolution').click((event) => { + this.onLancer(); + }); + // Update ! + this.html.find("[name='diffLibre']").change((event) => { + this.rollData.diffLibre = Misc.toInt(event.currentTarget.value); + this.updateRollResult(); + }); + this.html.find("[name='diffConditions']").change((event) => { + this.rollData.diffConditions = Misc.toInt(event.currentTarget.value); + this.updateRollResult(); + }); + this.html.find("[name='carac']").change((event) => { + let caracKey = event.currentTarget.value; + this.rollData.selectedCarac = this.rollData.carac[caracKey]; + this.updateRollResult(); + }); + } + /* -------------------------------------------- */ async onLancer() { await RdDResolutionTable.rollData(this.rollData); @@ -72,65 +108,37 @@ export class RdDRollResolutionTable extends Dialog { await RdDResolutionTable.displayRollData(this.rollData); } - /* -------------------------------------------- */ - activateListeners(html) { - super.activateListeners(html); - - this.bringToTop(); - - var dialog = this; - - // Setup everything onload - function onLoad(){ - $("#diffLibre").val(Misc.toInt(dialog.rollData.diffLibre)); - $("#diffConditions").val(Misc.toInt(dialog.rollData.diffConditions)); - dialog.updateRollResult(); - } - $(function () { onLoad();}); - html.find('#lancer').click((event) => { - this.onLancer(); - }); - // Update ! - html.find('#diffLibre').change((event) => { - this.rollData.diffLibre = Misc.toInt(event.currentTarget.value); - this.updateRollResult(); - }); - html.find('#diffConditions').change((event) => { - this.rollData.diffConditions = Misc.toInt(event.currentTarget.value); - this.updateRollResult(); - }); - html.find('#carac').change((event) => { - let caracKey = event.currentTarget.value; - this.rollData.selectedCarac = this.rollData.carac[caracKey]; - this.updateRollResult(); - }); - } - /* -------------------------------------------- */ async updateRollResult() { let rollData = this.rollData; rollData.caracValue = parseInt(rollData.selectedCarac.value) rollData.finalLevel = this._computeFinalLevel(rollData); + const htmlTable = await RdDResolutionTable.buildHTMLTable({ + carac:rollData.caracValue, + level: rollData.finalLevel + }); + // Mise à jour valeurs - $("#carac").val(rollData.caracValue); - $("#roll-param").text(rollData.selectedCarac.value + " / " + Misc.toSignedString(rollData.finalLevel)); - $(".table-resolution").remove(); - $(".table-proba-reussite").remove(); - $("#tableResolution").append(RdDResolutionTable.buildHTMLTable(rollData.caracValue, rollData.finalLevel)); - $("#tableProbaReussite").append(RdDResolutionTable.buildHTMLResults(rollData.caracValue, rollData.finalLevel)); + this.html.find("[name='carac']").val(rollData.caracValue); + this.html.find(".roll-param-resolution").text(rollData.selectedCarac.value + " / " + Misc.toSignedString(rollData.finalLevel)); + this.html.find(".table-resolution").remove(); + this.html.find(".table-proba-reussite").remove(); + + this.html.find("div.placeholder-resolution").append(htmlTable) + } /* -------------------------------------------- */ _computeFinalLevel(rollData) { const diffConditions = Misc.toInt(rollData.diffConditions); - const diffLibre = this._computeDiffLibre(rollData); + const diffLibre = Misc.toInt(rollData.diffLibre); return diffLibre + diffConditions; } - /* -------------------------------------------- */ - _computeDiffLibre(rollData) { - return Misc.toInt(rollData.diffLibre); + async close() { + await super.close(); + RdDRollResolutionTable.resolutionTable = undefined; } } diff --git a/module/rdd-roll.js b/module/rdd-roll.js index a8253ad6..57c5ff70 100644 --- a/module/rdd-roll.js +++ b/module/rdd-roll.js @@ -16,24 +16,17 @@ import { ReglesOptionelles } from "./settings/regles-optionelles.js"; export class RdDRoll extends Dialog { /* -------------------------------------------- */ - static async create(actor, rollData, dialogConfig, ...actions) { - - if (actor.isRollWindowsOpened()) { - ui.notifications.warn("Vous avez déja une fenêtre de Test ouverte, il faut la fermer avant d'en ouvrir une autre.") - return; - } - actor.setRollWindowsOpened(true); - - RdDRoll._ensureCorrectActions(actions); + static async create(actor, rollData, dialogConfig, action) { + RdDRoll._ensureCorrectAction(action); RdDRoll._setDefaultOptions(actor, rollData); const html = await renderTemplate(dialogConfig.html, rollData); - let options = { classes: ["rdddialog"], width: 600, height: 'fit-content', 'z-index': 99999 }; - if (dialogConfig.options) { - mergeObject(options, dialogConfig.options, { overwrite: true }) + let options = { classes: ["rdd-roll-dialog"], width: 600, height: 'fit-content', 'z-index': 99999, close: html => {} }; + if (dialogConfig.close) { + options.close = dialogConfig.close; } - return new RdDRoll(actor, rollData, html, options, actions, dialogConfig.close); + return new RdDRoll(actor, rollData, html, options, action); } /* -------------------------------------------- */ @@ -67,7 +60,7 @@ export class RdDRoll extends Dialog { forceDiceResult: -1 } // Mini patch :Ajout du rêve actuel - if ( actor.system.type == "personnage") { + if (actor.system.type == "personnage") { defaultRollData.carac["reve-actuel"] = actor.system.reve.reve } @@ -79,6 +72,7 @@ export class RdDRoll extends Dialog { RollDataAjustements.calcul(rollData, actor); } + /* -------------------------------------------- */ static getDiviseurSignificative(rollData) { let facteurSign = 1; @@ -97,171 +91,132 @@ export class RdDRoll extends Dialog { return facteurSign; } - /* -------------------------------------------- */ - static _ensureCorrectActions(actions) { - if (actions.length == 0) { - throw 'No action defined'; + static _ensureCorrectAction(action) { + if (action.callbacks == undefined) { + console.warn('No callback defined for ', action.name); + action.callbacks = [{ action: r => console.warn(action.name, r) }]; } - actions.forEach(action => { - if (action.callbacks == undefined) { - action.callbacks = [{ action: r => console.log(action.name, r) }]; - } - }); } /* -------------------------------------------- */ - constructor(actor, rollData, html, options, actions, close = undefined) { + constructor(actor, rollData, html, options, action) { let conf = { - title: actions[0].label, + title: action.label, content: html, - buttons: {}, - default: actions[0].name, - close: close - }; - for (let action of actions) { - conf.buttons[action.name] = { - label: action.label, callback: html => { - this.rollData.canClose = true; - this.onAction(action, html) + buttons: { + "onAction": { + label: action.label, callback: html => { + this.rollData.canClose = true; + this.onAction(action) + } } - }; - } - + }, + default: "onAction", + close: options.close + }; super(conf, options); this.actor = actor; this.rollData = rollData; } - close() { - if (this.rollData.canClose) { - this.actor.setRollWindowsOpened(false); - return super.close(); - } - ui.notifications.info("Vous devez faire ce jet de dés!"); - } - - - /* -------------------------------------------- */ - async onAction(action, html) { - this.rollData.forceDiceResult = Number.parseInt($('#force-dice-result').val()) ?? -1; - await RdDResolutionTable.rollData(this.rollData); - console.log("RdDRoll -=>", this.rollData, this.rollData.rolled); - this.actor.setRollWindowsOpened(false); - if (action.callbacks) - for (let callback of action.callbacks) { - if (callback.condition == undefined || callback.condition(this.rollData)) { - await callback.action(this.rollData); - } - } - } - - /* -------------------------------------------- */ activateListeners(html) { super.activateListeners(html); - + this.html = html; this.bringToTop(); - var dialog = this; + console.log('RdDRoll.activateListeners', this.rollData); - function onLoad() { - let rollData = dialog.rollData; - console.log('Ouverture RdDRoll', rollData); - // Update html, according to rollData - if (rollData.competence) { - const defaut_carac = rollData.competence.system.defaut_carac - // Set the default carac from the competence item - rollData.selectedCarac = rollData.carac[defaut_carac]; - $("#carac").val(defaut_carac); - } - if (rollData.selectedSort) { - dialog.setSelectedSort(rollData.selectedSort); - $(".draconic").val(rollData.selectedSort.system.listIndex); // Uniquement a la selection du sort, pour permettre de changer - } - RdDItemSort.setCoutReveReel(rollData.selectedSort); - $("#diffLibre").val(Misc.toInt(rollData.diffLibre)); - $("#diffConditions").val(Misc.toInt(rollData.diffConditions)); - dialog.updateRollResult(); + // Update html, according to rollData + if (this.rollData.competence) { + const defaut_carac = this.rollData.competence.system.defaut_carac + // Set the default carac from the competence item + this.rollData.selectedCarac = this.rollData.carac[defaut_carac]; + this.html.find("[name='carac']").val(defaut_carac); } + if (this.rollData.selectedSort) { + this.setSelectedSort(this.rollData.selectedSort); + this.html.find(".draconic").val(this.rollData.selectedSort.system.listIndex); // Uniquement a la selection du sort, pour permettre de changer + } + RdDItemSort.setCoutReveReel(this.rollData.selectedSort); + this.html.find("[name='diffLibre']").val(Misc.toInt(this.rollData.diffLibre)); + this.html.find("[name='diffConditions']").val(Misc.toInt(this.rollData.diffConditions)); + this.updateRollResult(html); - // Setup everything onload - $(function () { onLoad(); }); - - // Update ! - html.find('#diffLibre').change((event) => { + this.html.find("[name='diffLibre']").change((event) => { this.rollData.diffLibre = Misc.toInt(event.currentTarget.value); // Update the selected bonus/malus - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('#diffConditions').change((event) => { + this.html.find("[name='diffConditions']").change((event) => { this.rollData.diffConditions = Misc.toInt(event.currentTarget.value); // Update the selected bonus/malus - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('#force-dice-result').change((event) => { + this.html.find("[name='force-dice-result']").change((event) => { this.rollData.forceDiceResult = Misc.toInt(event.currentTarget.value); }); - html.find('#carac').change((event) => { + this.html.find("[name='carac']").change((event) => { let caracKey = event.currentTarget.value; this.rollData.selectedCarac = this.rollData.carac[caracKey]; // Update the selectedCarac - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.roll-draconic').change((event) => { + this.html.find('.roll-draconic').change((event) => { let draconicKey = Misc.toInt(event.currentTarget.value); this.rollData.competence = this.rollData.draconicList[draconicKey]; // Update the selectedCarac - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.roll-sort').change((event) => { + this.html.find('.roll-sort').change((event) => { let sortKey = Misc.toInt(event.currentTarget.value); this.setSelectedSort(this.rollData.sortList[sortKey]); - this.updateRollResult(); - $("#diffLibre").val(this.rollData.diffLibre); + this.updateRollResult(html); + this.html.find("[name='diffLibre']").val(this.rollData.diffLibre); }); - html.find('.roll-carac-competence').change((event) => { + this.html.find('.roll-carac-competence').change((event) => { const competence = event.currentTarget.value; this.rollData.competence = this.rollData.competences.find(it => it.name == competence); - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.roll-signedraconique').change((event) => { + this.html.find('.roll-signedraconique').change((event) => { let sortKey = Misc.toInt(event.currentTarget.value); this.setSelectedSigneDraconique(this.rollData.signes[sortKey]); - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('#ptreve-variable').change((event) => { + this.html.find("[name='ptreve-variable']").change((event) => { let ptreve = Misc.toInt(event.currentTarget.value); this.rollData.selectedSort.system.ptreve_reel = ptreve; console.log("RdDRollSelectDialog - Cout reve", ptreve); - this.updateRollResult(); + this.updateRollResult(html); }); - html.find("[name='coupsNonMortels']").change((event) => { + this.html.find("[name='coupsNonMortels']").change((event) => { this.rollData.dmg.mortalite = event.currentTarget.checked ? "non-mortel" : "mortel"; - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.cuisine-proportions').change((event) => { + this.html.find('.cuisine-proportions').change((event) => { this.rollData.proportions = Number(event.currentTarget.value); - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.select-by-name').change((event) => { + this.html.find('.select-by-name').change((event) => { const attribute = event.currentTarget.attributes['name'].value; this.rollData[attribute] = event.currentTarget.value; - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.checkbox-by-name').change((event) => { + this.html.find('.checkbox-by-name').change((event) => { const attribute = event.currentTarget.attributes['name'].value; this.rollData[attribute] = event.currentTarget.checked; - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('input.use-encTotal').change((event) => { + this.html.find('input.use-encTotal').change((event) => { this.rollData.use.encTotal = event.currentTarget.checked; - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('input.use-surenc').change((event) => { + this.html.find('input.use-surenc').change((event) => { this.rollData.use.surenc = event.currentTarget.checked; - this.updateRollResult(); + this.updateRollResult(html); }); - html.find('.appel-moral').click((event) => { /* l'appel au moral, qui donne un bonus de +1 */ + this.html.find('.appel-moral').click((event) => { /* l'appel au moral, qui donne un bonus de +1 */ this.rollData.use.moral = !this.rollData.use.moral; - const appelMoral = html.find('.icon-appel-moral')[0]; - const tooltip = html.find('.tooltipAppelAuMoralText')[0]; + const appelMoral = this.html.find('.icon-appel-moral')[0]; + const tooltip = this.html.find('.tooltipAppelAuMoralText')[0]; if (this.rollData.use.moral) { if (this.rollData.moral > 0) { tooltip.innerHTML = "Appel au moral"; @@ -274,16 +229,36 @@ export class RdDRoll extends Dialog { tooltip.innerHTML = "Sans appel au moral"; appelMoral.src = "/systems/foundryvtt-reve-de-dragon/icons/moral-neutre.svg"; } - this.updateRollResult(); + this.updateRollResult(html); }); // Section Méditation - html.find('.conditionMeditation').change((event) => { - let condition = event.currentTarget.attributes['id'].value; + this.html.find('.conditionMeditation').change((event) => { + let condition = event.currentTarget.attributes['name'].value; this.rollData.conditionMeditation[condition] = event.currentTarget.checked; - this.updateRollResult(); + this.updateRollResult(html); }); } + /* -------------------------------------------- */ + close() { + if (this.rollData.canClose) { + return super.close(); + } + ui.notifications.info("Vous devez faire ce jet de dés!"); + } + + async onAction(action) { + this.rollData.forceDiceResult = Number.parseInt(this.html.find("[name='force-dice-result']").val()) ?? -1; + await RdDResolutionTable.rollData(this.rollData); + console.log("RdDRoll -=>", this.rollData, this.rollData.rolled); + if (action.callbacks) + for (let callback of action.callbacks) { + if (callback.condition == undefined || callback.condition(this.rollData)) { + await callback.action(this.rollData); + } + } + } + async setSelectedSort(sort) { this.rollData.selectedSort = sort; // Update the selectedCarac this.rollData.competence = RdDItemCompetence.getVoieDraconic(this.rollData.draconicList, sort.system.draconic); @@ -291,31 +266,31 @@ export class RdDRoll extends Dialog { this.rollData.diffLibre = RdDItemSort.getDifficulte(sort, -7); RdDItemSort.setCoutReveReel(sort); const htmlSortDescription = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/partial-description-sort.html", { sort: sort }); - $(".sort-ou-rituel").text(sort.system.isrituel ? "rituel" : "sort"); - $(".bonus-case").text(`${this.rollData.bonus}%`); - $(".details-sort").remove(); - $(".description-sort").append(htmlSortDescription); - $(".roll-draconic").val(sort.system.listIndex); - $(".div-sort-difficulte-fixe").text(Misc.toSignedString(sort.system.difficulte)); - $(".div-sort-ptreve-fixe").text(sort.system.ptreve); + this.html.find(".sort-ou-rituel").text(sort.system.isrituel ? "rituel" : "sort"); + this.html.find(".bonus-case").text(`${this.rollData.bonus}%`); + this.html.find(".placeholder-description-sort").children().remove(); + this.html.find(".placeholder-description-sort").append(htmlSortDescription); + this.html.find(".roll-draconic").val(sort.system.listIndex); + this.html.find(".div-sort-difficulte-fixe").text(Misc.toSignedString(sort.system.difficulte)); + this.html.find(".div-sort-ptreve-fixe").text(sort.system.ptreve); const diffVariable = RdDItemSort.isDifficulteVariable(sort); const coutVariable = RdDItemSort.isCoutVariable(sort); - HtmlUtility._showControlWhen($(".div-sort-non-rituel"), !sort.system.isrituel); - HtmlUtility._showControlWhen($(".div-sort-difficulte-var"), diffVariable); - HtmlUtility._showControlWhen($(".div-sort-difficulte-fixe"), !diffVariable); - HtmlUtility._showControlWhen($(".div-sort-ptreve-var"), coutVariable); - HtmlUtility._showControlWhen($(".div-sort-ptreve-fixe"), !coutVariable); + HtmlUtility._showControlWhen(this.html.find(".div-sort-non-rituel"), !sort.system.isrituel); + HtmlUtility._showControlWhen(this.html.find(".div-sort-difficulte-var"), diffVariable); + HtmlUtility._showControlWhen(this.html.find(".div-sort-difficulte-fixe"), !diffVariable); + HtmlUtility._showControlWhen(this.html.find(".div-sort-ptreve-var"), coutVariable); + HtmlUtility._showControlWhen(this.html.find(".div-sort-ptreve-fixe"), !coutVariable); } - async setSelectedSigneDraconique(signe){ + async setSelectedSigneDraconique(signe) { this.rollData.signe = signe; this.rollData.diffLibre = signe.system.difficulte, - $(".signe-difficulte").text(Misc.toSignedString(this.rollData.diffLibre)); + $(".signe-difficulte").text(Misc.toSignedString(this.rollData.diffLibre)); } /* -------------------------------------------- */ - async updateRollResult() { + async updateRollResult(html) { let rollData = this.rollData; rollData.dmg = rollData.attackerRoll?.dmg ?? RdDBonus.dmg(rollData, this.actor.getBonusDegat()) @@ -325,39 +300,35 @@ export class RdDRoll extends Dialog { rollData.use.appelAuMoral = this.actor.isPersonnage() && RdDCarac.isActionPhysique(rollData.selectedCarac); let dmgText = Misc.toSignedString(rollData.dmg.total); - switch (rollData.mortalite){ - case 'non-mortel': dmgText = `(${dmgText}) non-mortel`; break; - case 'empoignade': dmgText = `empoignade`; break; + switch (rollData.mortalite) { + case 'non-mortel': dmgText = `(${dmgText}) non-mortel`; break; + case 'empoignade': dmgText = `empoignade`; break; } RollDataAjustements.calcul(rollData, this.actor); rollData.finalLevel = this._computeFinalLevel(rollData); - HtmlUtility._showControlWhen($(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerivee(rollData.selectedCarac)); - HtmlUtility._showControlWhen($(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac)); - HtmlUtility._showControlWhen($(".utilisation-moral"), rollData.use.appelAuMoral); - HtmlUtility._showControlWhen($(".diffMoral"), rollData.ajustements.moralTotal.used); - HtmlUtility._showControlWhen($(".divAppelAuMoral"), rollData.use.appelAuMoral); - HtmlUtility._showControlWhen($("#etat-general"), !RdDCarac.isIgnoreEtatGeneral(rollData)); - HtmlUtility._showControlWhen($("#ajust-astrologique"), RdDResolutionTable.isAjustementAstrologique(rollData)); + const resolutionTable = await RdDResolutionTable.buildHTMLTable(RdDResolutionTable.subTable(rollData.caracValue, rollData.finalLevel)) + const adjustements = await this.buildAjustements(rollData); + + HtmlUtility._showControlWhen(this.html.find(".use-encTotal"), rollData.ajustements.encTotal.visible && RdDCarac.isAgiliteOuDerivee(rollData.selectedCarac)); + HtmlUtility._showControlWhen(this.html.find(".use-surenc"), rollData.ajustements.surenc.visible && RdDCarac.isActionPhysique(rollData.selectedCarac)); + HtmlUtility._showControlWhen(this.html.find(".utilisation-moral"), rollData.use.appelAuMoral); + HtmlUtility._showControlWhen(this.html.find(".diffMoral"), rollData.ajustements.moralTotal.used); + HtmlUtility._showControlWhen(this.html.find(".divAppelAuMoral"), rollData.use.appelAuMoral); // Mise à jour valeurs - $(".dialog-roll-title").text(this._getTitle(rollData)); - $("[name='coupsNonMortels']").prop('checked', rollData.mortalite == 'non-mortel'); - $(".dmg-arme-actor").text(dmgText); - $('.table-ajustement').remove(); - $(".table-resolution").remove(); - $(".table-proba-reussite").remove(); - $("#tableAjustements").append(await this.buildAjustements(rollData)); - $("#tableResolution").append(RdDResolutionTable.buildHTMLTableExtract(rollData.caracValue, rollData.finalLevel)); - $("#tableProbaReussite").append(RdDResolutionTable.buildHTMLResults(rollData.caracValue, rollData.finalLevel)); + this.html.find(".dialog-roll-title").text(this._getTitle(rollData)); + this.html.find("[name='coupsNonMortels']").prop('checked', rollData.mortalite == 'non-mortel'); + this.html.find(".dmg-arme-actor").text(dmgText); + this.html.find("div.placeholder-ajustements").empty().append(adjustements); + this.html.find("div.placeholder-resolution").empty().append(resolutionTable) } /* -------------------------------------------- */ async buildAjustements(rollData) { - const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html`, rollData); - return html; + return await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/partial-roll-ajustements.html`, rollData); } /* -------------------------------------------- */ @@ -375,23 +346,11 @@ export class RdDRoll extends Dialog { return 0; } - /* -------------------------------------------- */ - _computeDiffLibre(rollData) { - let diffLibre = Misc.toInt(rollData.diffLibre); - if (rollData.draconicList && rollData.selectedSort) { - return RdDItemSort.getDifficulte(rollData.selectedSort, diffLibre); - } - return diffLibre; - } - /* -------------------------------------------- */ _computeMalusArmure(rollData) { let malusArmureValue = 0; if (rollData.malusArmureValue && (rollData.selectedCarac.label == "Agilité" || rollData.selectedCarac.label == "Dérobée")) { - $("#addon-message").text("Malus armure appliqué : " + rollData.malusArmureValue); malusArmureValue = rollData.malusArmureValue; - } else { - $("#addon-message").text(""); } return malusArmureValue; } diff --git a/module/rdd-tmr-dialog.js b/module/rdd-tmr-dialog.js index 341191ca..f818bed2 100644 --- a/module/rdd-tmr-dialog.js +++ b/module/rdd-tmr-dialog.js @@ -5,7 +5,6 @@ import { TMRUtility } from "./tmr-utility.js"; import { tmrConstants } from "./tmr-constants.js"; import { RdDResolutionTable } from "./rdd-resolution-table.js"; import { RdDTMRRencontreDialog } from "./rdd-tmr-rencontre-dialog.js"; -import { TMRRencontres } from "./tmr-rencontres.js"; import { ChatUtility } from "./chat-utility.js"; import { RdDRoll } from "./rdd-roll.js"; import { Poetique } from "./poetique.js"; @@ -198,32 +197,33 @@ export class RdDTMRDialog extends Dialog { /* -------------------------------------------- */ async activateListeners(html) { super.activateListeners(html); + this.html = html; document.getElementById("tmrrow1").insertCell(0).append(this.pixiApp.view); if (this.viewOnly) { - html.find('.lancer-sort').remove(); - html.find('.lire-signe-draconique').remove(); + this.html.find('.lancer-sort').remove(); + this.html.find('.lire-signe-draconique').remove(); return; } - HtmlUtility._showControlWhen($(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue")); - HtmlUtility._showControlWhen($(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getActorCoord())); + HtmlUtility._showControlWhen(this.html.find(".appliquerFatigue"), ReglesOptionelles.isUsing("appliquer-fatigue")); + HtmlUtility._showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(this._getActorCoord())); // Roll Sort - html.find('.lancer-sort').click((event) => { + this.html.find('.lancer-sort').click((event) => { this.actor.rollUnSort(this._getActorCoord()); }); - html.find('.lire-signe-draconique').click((event) => { + this.html.find('.lire-signe-draconique').click((event) => { this.actor.rollLireSigneDraconique(this._getActorCoord()); }); - html.find('#dir-top').click((event) => this.moveFromKey("top")); - html.find('#dir-top-left').click((event) => this.moveFromKey("top-left")); - html.find('#dir-top-right').click((event) => this.moveFromKey("top-right")); - html.find('#dir-bottom-left').click((event) => this.moveFromKey("bottom-left")); - html.find('#dir-bottom-right').click((event) => this.moveFromKey("bottom-right")); - html.find('#dir-bottom').click((event) => this.moveFromKey("bottom")); + this.html.find('#dir-top').click((event) => this.moveFromKey("top")); + this.html.find('#dir-top-left').click((event) => this.moveFromKey("top-left")); + this.html.find('#dir-top-right').click((event) => this.moveFromKey("top-right")); + this.html.find('#dir-bottom-left').click((event) => this.moveFromKey("bottom-left")); + this.html.find('#dir-bottom-right').click((event) => this.moveFromKey("bottom-right")); + this.html.find('#dir-bottom').click((event) => this.moveFromKey("bottom")); // Gestion du cout de montée en points de rêve let reveCout = ((this.tmrdata.isRapide && !EffetsDraconiques.isDeplacementAccelere(this.actor)) ? -2 : -1) - this.actor.countMonteeLaborieuse(); @@ -245,7 +245,7 @@ export class RdDTMRDialog extends Dialog { } const coord = this._getActorCoord(); - HtmlUtility._showControlWhen($(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord)); + HtmlUtility._showControlWhen(this.html.find(".lire-signe-draconique"), this.actor.isResonanceSigneDraconique(coord)); let ptsreve = document.getElementById("tmr-pointsreve-value"); ptsreve.innerHTML = this.actor.system.reve.reve.value; @@ -280,7 +280,7 @@ export class RdDTMRDialog extends Dialog { } await this.actor.santeIncDec("fatigue", this.cumulFatigue) } - await super.close(); // moving 1 cell costs 1 fatigue + await super.close(); } /* -------------------------------------------- */ diff --git a/module/rdd-utility.js b/module/rdd-utility.js index c86000df..ecd8a843 100644 --- a/module/rdd-utility.js +++ b/module/rdd-utility.js @@ -15,6 +15,7 @@ import { RdDConfirm } from "./rdd-confirm.js"; import { RdDCalendrier } from "./rdd-calendrier.js"; import { Environnement } from "./environnement.js"; import { RdDItemCompetence } from "./item-competence.js"; +import { RdDResolutionTable } from "./rdd-resolution-table.js"; /* -------------------------------------------- */ // This table starts at 0 -> niveau -10 @@ -237,6 +238,8 @@ export class RdDUtility { 'systems/foundryvtt-reve-de-dragon/templates/partial-item-hautrevant.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-item-frequence.html', 'systems/foundryvtt-reve-de-dragon/templates/partial-item-description.html', + 'systems/foundryvtt-reve-de-dragon/templates/roll/explain.hbs', + 'systems/foundryvtt-reve-de-dragon/templates/resolution-table.html', // Dialogs 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-resolution.html', 'systems/foundryvtt-reve-de-dragon/templates/dialog-roll-competence.html', @@ -282,6 +285,8 @@ export class RdDUtility { ]; Handlebars.registerHelper('either', (a, b) => a ?? b); + Handlebars.registerHelper('computeResolutionScore', (row, col) => RdDResolutionTable.computePercentage(row, col)); + Handlebars.registerHelper('computeResolutionChances', (row, col) => RdDResolutionTable.computeChances(row, col)); Handlebars.registerHelper('upperFirst', str => Misc.upperFirst(str ?? 'Null')); Handlebars.registerHelper('lowerFirst', str => Misc.lowerFirst(str ?? 'Null')); Handlebars.registerHelper('upper', str => str?.toUpperCase() ?? 'NULL'); diff --git a/module/tmr-rencontres.js b/module/tmr-rencontres.js index 0bbe46b3..0d7bfcd1 100644 --- a/module/tmr-rencontres.js +++ b/module/tmr-rencontres.js @@ -1,6 +1,7 @@ import { Grammar } from "./grammar.js"; import { Misc } from "./misc.js"; import { RdDDice } from "./rdd-dice.js"; +import { RdDUtility } from "./rdd-utility.js"; import { SystemCompendiums, CompendiumTable, CompendiumTableHelpers } from "./settings/system-compendiums.js"; import { TMRUtility } from "./tmr-utility.js"; @@ -100,19 +101,21 @@ export class TMRRencontres { const row = await this.table.getRandom(frequence, filtreMauvaise); if (row) { - row.document = this.createRencontre(row.document, tmr); - await this.$chatRolledRencontre(row, tmr); + const rencontre = await this.createRencontre(row.document, tmr); + await this.$chatRolledRencontre(row, rencontre, tmr); + return rencontre; } - return row?.document; + return undefined; } /* -------------------------------------------- */ - async $chatRolledRencontre(row, tmr) { + async $chatRolledRencontre(row, rencontre,tmr) { const flavorContent = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/chat-compendium-table-roll-rencontre.html', { roll: row.roll, - rencontre: row?.document, + rencontre, + row, percentages: (row.total == 100) ? '%' : '', tmr, isGM: game.user.isGM, diff --git a/styles/simple.css b/styles/simple.css index 052a4257..724bb2eb 100644 --- a/styles/simple.css +++ b/styles/simple.css @@ -618,13 +618,10 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) { opacity: 0.7 ; } -.rdddialog .dialog-roll-sort { - width: 600px; - height: 430px; - z-index: 9999; - display: block; +.rdd-roll-dialog .description-sort { + max-width: 550px; } -.rdd-roll-part{ +.rdd-roll-part { align-items: center; border-radius: 6px; padding: 3px; background: var(--gradient-gold); @@ -659,6 +656,10 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) { text-align: right; } +.placeholder-ajustements { + flex-direction: column; +} + .table-resolution-carac { background-color: yellow; } @@ -668,7 +669,7 @@ input:is(.blessure-premiers_soins, .blessure-soins_complets) { background-color: lightblue; } -#tableProbaReussite{ +div.placeholder-resolution span.table-proba-reussite{ font-size: 0.8rem; padding: 5px; } diff --git a/templates/actor/astrologie.html b/templates/actor/astrologie.html index d5094e1e..90e15b53 100644 --- a/templates/actor/astrologie.html +++ b/templates/actor/astrologie.html @@ -1,2 +1,2 @@

Astrologie

-Astrologie : Nombres Astraux +Astrologie : Nombres Astraux diff --git a/templates/actor/header-compteurs.html b/templates/actor/header-compteurs.html index 9ff90fee..901dca9b 100644 --- a/templates/actor/header-compteurs.html +++ b/templates/actor/header-compteurs.html @@ -23,7 +23,7 @@ {{{calc.fatigue.html}}} Fatigue - + / {{system.sante.fatigue.max}} @@ -32,7 +32,7 @@ diff --git a/templates/chat-compendium-table-roll-rencontre.html b/templates/chat-compendium-table-roll-rencontre.html index 2b724e95..3e9991e9 100644 --- a/templates/chat-compendium-table-roll-rencontre.html +++ b/templates/chat-compendium-table-roll-rencontre.html @@ -1,11 +1,11 @@ {{rencontre.name}}

{{#if mauvaise}}Mauvaise rencontre{{else}}Rencontre{{/if}} en {{typeTmr-name tmr.type}}

-
{{rencontre.pack}}
-
Jet: {{roll.formula}} : {{roll.total}}{{percentages}}
+
{{row.document.pack}}
+
Jet: {{row.roll.formula}} : {{row.roll.total}}{{percentages}}

-

{{rencontre.name}} {{rencontre.system.force}} ({{rencontre.system.formule}})

-

{{linkCompendium rencontre.pack rencontre.id rencontre.name}}

+

{{rencontre.name}} de force {{rencontre.system.force}} ({{rencontre.system.formule}})

+

{{linkCompendium row.document.pack row.document.id row.document.name}}

{{#if rencontre.system.description}}
{{{rencontre.system.description}}} diff --git a/templates/dialog-astrologie-joueur.html b/templates/dialog-astrologie-joueur.html index 3b7d2fad..24096304 100644 --- a/templates/dialog-astrologie-joueur.html +++ b/templates/dialog-astrologie-joueur.html @@ -6,7 +6,7 @@ - {{#select diffConditions}} {{#each ajustementsConditions as |key|}} @@ -14,7 +14,7 @@ {{/select}} - {{#select joursSuivants}} {{#each dates as |date key|}} @@ -22,7 +22,7 @@ {{/select}} - + {{!-- Sheet Body --}}
diff --git a/templates/dialog-fabriquer-potion-base.html b/templates/dialog-fabriquer-potion-base.html index 6ad04035..16af1a07 100644 --- a/templates/dialog-fabriquer-potion-base.html +++ b/templates/dialog-fabriquer-potion-base.html @@ -5,7 +5,7 @@
- {{#select nbBrins}} {{{nbBrinsSelect}}} {{/select}} diff --git a/templates/dialog-item-achat.html b/templates/dialog-item-achat.html index c54eaf55..ade170ef 100644 --- a/templates/dialog-item-achat.html +++ b/templates/dialog-item-achat.html @@ -1,4 +1,4 @@ -
+
diff --git a/templates/dialog-item-consommer.html b/templates/dialog-item-consommer.html index 93744bac..0bbd47fc 100644 --- a/templates/dialog-item-consommer.html +++ b/templates/dialog-item-consommer.html @@ -1,4 +1,4 @@ - + {{item.name}}

{{item.name}}

diff --git a/templates/dialog-item-split.html b/templates/dialog-item-split.html index f09da7e8..0f61fc55 100644 --- a/templates/dialog-item-split.html +++ b/templates/dialog-item-split.html @@ -1,4 +1,4 @@ - + {{item.name}}

{{item.name}}

diff --git a/templates/dialog-item-vente.html b/templates/dialog-item-vente.html index c85235f8..2ba62e3b 100644 --- a/templates/dialog-item-vente.html +++ b/templates/dialog-item-vente.html @@ -1,4 +1,4 @@ - + {{item.name}}

{{item.name}}

diff --git a/templates/dialog-roll-alchimie.html b/templates/dialog-roll-alchimie.html index 7393afd4..2aa5612b 100644 --- a/templates/dialog-roll-alchimie.html +++ b/templates/dialog-roll-alchimie.html @@ -1,4 +1,4 @@ - +

Fabrication: {{recette.name}}

@@ -20,12 +20,12 @@ {{/if}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-forcer.html"}} {{>"systems/foundryvtt-reve-de-dragon/templates/partial-roll-moral.html"}} -
+
-
-
+
+
\ No newline at end of file diff --git a/templates/item-competence-sheet.html b/templates/item-competence-sheet.html index c53a9274..77b2115b 100644 --- a/templates/item-competence-sheet.html +++ b/templates/item-competence-sheet.html @@ -33,13 +33,13 @@
{{#if isGM}} - {{#select system.base}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-base-competence.html"}} {{/select}} {{else}} - + {{/if}}
diff --git a/templates/item-potion-sheet.html b/templates/item-potion-sheet.html index f696d0e5..b7ecd665 100644 --- a/templates/item-potion-sheet.html +++ b/templates/item-potion-sheet.html @@ -85,14 +85,14 @@
- {{#select splitDate.day}} {{#each jourMoisOptions as |key|}} {{/each}} {{/select}} - {{#select splitDate.month}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-heures.html"}} {{/select}} diff --git a/templates/item-tache-sheet.html b/templates/item-tache-sheet.html index eda91e85..4c451928 100644 --- a/templates/item-tache-sheet.html +++ b/templates/item-tache-sheet.html @@ -4,7 +4,7 @@
- {{#select system.carac}} {{#each caracList as |carac key|}} @@ -14,7 +14,7 @@
- {{#select system.competence}} {{>"systems/foundryvtt-reve-de-dragon/templates/enum-competence.html"}} diff --git a/templates/partial-description-sort.html b/templates/partial-description-sort.html index efb6d1ef..ff63cbee 100644 --- a/templates/partial-description-sort.html +++ b/templates/partial-description-sort.html @@ -5,6 +5,6 @@ {{#if sort.system.duree}}{{/if}} {{#if sort.system.coutseuil}}{{/if}}
-
+
{{> "systems/foundryvtt-reve-de-dragon/templates/partial-description-overflow.html" sort.system}}
\ No newline at end of file diff --git a/templates/partial-roll-ajustements.html b/templates/partial-roll-ajustements.html index 87f4b5e9..241761e6 100644 --- a/templates/partial-roll-ajustements.html +++ b/templates/partial-roll-ajustements.html @@ -1,7 +1,7 @@
Ajustement Final: - {{selectedCarac.value}} / {{numberFormat finalLevel decimals=0 sign=true}} + {{selectedCarac.value}} / {{numberFormat finalLevel decimals=0 sign=true}}
{{#each ajustements as |item key|}} {{#if item.used}} diff --git a/templates/partial-roll-diffCondition.html b/templates/partial-roll-diffCondition.html index 45a68528..4b578a51 100644 --- a/templates/partial-roll-diffCondition.html +++ b/templates/partial-roll-diffCondition.html @@ -1,6 +1,6 @@
- {{#select diffConditions}} {{#each ajustementsConditions as |key|}} diff --git a/templates/partial-roll-diffLibre.html b/templates/partial-roll-diffLibre.html index a20fb4b3..899d7cbd 100644 --- a/templates/partial-roll-diffLibre.html +++ b/templates/partial-roll-diffLibre.html @@ -1,6 +1,6 @@
- {{#select diffLibre}} {{#each difficultesLibres as |key|}} diff --git a/templates/partial-roll-forcer.html b/templates/partial-roll-forcer.html index db50a91d..c92bc6ca 100644 --- a/templates/partial-roll-forcer.html +++ b/templates/partial-roll-forcer.html @@ -1,6 +1,6 @@ {{#if isGM}}
- +
{{/if}} diff --git a/templates/partial-select-carac.html b/templates/partial-select-carac.html index 672a717d..fb1eb4ea 100644 --- a/templates/partial-select-carac.html +++ b/templates/partial-select-carac.html @@ -1,4 +1,4 @@ - {{#select carac}} {{#each carac as |caracitem key|}} diff --git a/templates/resolution-table.html b/templates/resolution-table.html new file mode 100644 index 00000000..1e319056 --- /dev/null +++ b/templates/resolution-table.html @@ -0,0 +1,44 @@ + + + {{#if (gt min -8)}} + + {{/if}} + {{#if (gt min -7)}} + + {{/if}} + {{#each cols as |col|}} + + {{/each}} + + {{#each rows as |row|}} + + {{#if (gt @root.min -8)}} + + {{/if}} + {{#if (gt @root.min -7)}} + + {{/if}} + {{#each @root.cols as |col|}} + {{#if (and (eq row @root.carac) (eq col @root.difficulte))}} + + {{else if (eq col -8)}} + + {{else}} + + {{/if}} + + {{/each}} + + {{/each}} +
-8...{{numberFormat col decimals=0 sign=true}}
{{computeResolutionScore row -8}}{{computeResolutionScore row col}}{{computeResolutionScore row col}}{{computeResolutionScore row col}}
+{{#with (computeResolutionChances carac difficulte) as |cell|}} +
+ + Particulière: {{cell.part}} + - Significative: {{cell.sign}} + - Réussite: {{cell.score}} + - Echec Particulier: {{cell.epart}} + - Echec Total: {{cell.etotal}} + +
+{{/with}} \ No newline at end of file diff --git a/templates/roll/explain.hbs b/templates/roll/explain.hbs new file mode 100644 index 00000000..c7ee3fee --- /dev/null +++ b/templates/roll/explain.hbs @@ -0,0 +1,11 @@ +{{actor.name}} +

Jet de {{carac.label}} à {{rolled.finalLevel}}: + + {{rolled.roll}} + sur {{rolled.score}}% +{{#if (and rolled.caracValue rolled.finalLevel)}} +({{#if (gt rolled.diviseurSignificative 1)}}1/{{rolled.diviseurSignificative}}{{/if}} + de {{rolled.caracValue}} à {{numberFormat rolled.finalLevel decimals=0 sign=true}}) +{{/if}} +{{rolled.quality}} +