Rework fiches, jets de dés et CSS

This commit is contained in:
2026-04-03 16:22:51 +02:00
parent e001ec0dc9
commit 1fb80f6abe
21 changed files with 3091 additions and 1316 deletions

View File

@@ -46,6 +46,11 @@ export class MournbladeCYD2Utility {
Handlebars.registerHelper('mul', function (a, b) {
return parseInt(a) * parseInt(b);
})
Handlebars.registerHelper('select', function(value, options) {
const html = options.fn(this);
const escaped = String(value).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
return html.replace(new RegExp(`value="${escaped}"`, 'g'), `value="${value}" selected="selected"`);
})
game.settings.register("fvtt-mournblade-cyd-2-0", "mournblade-cyd2-pause-logo", {
name: "Logo de pause",
@@ -63,6 +68,7 @@ export class MournbladeCYD2Utility {
// Initialise les listes de sélection dès le hook init (avant le rendu des fiches)
game.system.mournbladecyd2.config.listeNiveauSkill = this.createDirectOptionList(0, 10)
game.system.mournbladecyd2.config.listeNiveauCreature = this.createDirectOptionList(0, 35)
game.system.mournbladecyd2.config.pointsAmeOptions = this.createDirectOptionList(1, 20)
}
@@ -151,7 +157,7 @@ export class MournbladeCYD2Utility {
static async chatListeners(html) {
$(html).on("click", '.predilection-reroll', async event => {
let predIdx = $(event.currentTarget).data("predilection-index")
let predIdx = event.currentTarget.dataset.predilectionIndex
let messageId = MournbladeCYD2Utility.findChatMessageId(event.currentTarget)
let message = game.messages.get(messageId)
let rollData = message.getFlag("world", "mournblade-cyd2-roll")
@@ -345,7 +351,7 @@ export class MournbladeCYD2Utility {
if (rollData.mainDice.includes("d20")) {
let diceValue = rollData.roll.terms[0].results[0].result
if (diceValue % 2 == 1) {
//console.log("PAIR/IMP2", diceValue)
rollData.isD20Impair = true
rollData.finalResult -= rollData.roll.terms[0].results[0].result // Substract value
if (diceValue == 1 || diceValue == 11) {
rollData.isDramatique = true
@@ -425,7 +431,8 @@ export class MournbladeCYD2Utility {
} else if (rollData.attr2) {
rollData.diceFormula += `+${rollData.attr.value}+${rollData.attr2.value}+${rollData.modificateur}+${rollData.bonusMalusContext}`
} else {
rollData.diceFormula += `+${rollData.attr.value}*${rollData.multiplier}+${rollData.modificateur}+${rollData.bonusMalusContext}`
const attrPart = rollData.multiplier > 1 ? `${rollData.attr.value}*${rollData.multiplier}` : `${rollData.attr.value}`
rollData.diceFormula += `+${attrPart}+${rollData.modificateur}+${rollData.bonusMalusContext}`
}
// Bonus arme naturelle en défense
@@ -491,6 +498,21 @@ export class MournbladeCYD2Utility {
rollData.finalResult = myRoll.total
this.computeResult(rollData)
// Rune post-roll: calculate duration and apply soul cost
if (rollData.rune) {
rollData.runeduree = Math.ceil(rollData.runeame / 3)
if (rollData.runemode == "inscrire") {
rollData.runeduree *= 2
}
let subAme = rollData.runeame
if (!rollData.isSuccess && !rollData.isDramatique) {
subAme = Math.ceil(rollData.runeame / 2)
}
rollData.runeAmeCout = subAme
actor.subPointsAme(rollData.runemode, subAme)
}
if (rollData.isInit) {
actor.setFlag("world", "last-initiative", rollData.finalResult)
}
@@ -779,7 +801,8 @@ export class MournbladeCYD2Utility {
/* -------------------------------------------- */
static applyBonneAventureRoll(li, changed, addedBonus) {
let msgId = $(li).data("message-id")
const el = li instanceof HTMLElement ? li : li[0];
let msgId = el.dataset.messageId ?? el.closest("[data-message-id]")?.dataset.messageId
let msg = game.messages.get(msgId)
if (msg) {
let rollData = msg.getFlag("world", "mournblade-cyd2-roll")
@@ -798,7 +821,8 @@ export class MournbladeCYD2Utility {
/* -------------------------------------------- */
static applyEclatRoll(li, changed, addedBonus) {
let msgId = $(li).data("message-id")
const el = li instanceof HTMLElement ? li : li[0];
let msgId = el.dataset.messageId ?? el.closest("[data-message-id]")?.dataset.messageId
let msg = game.messages.get(msgId)
if (msg) {
let rollData = msg.getFlag("world", "mournblade-cyd2-roll")
@@ -817,14 +841,19 @@ export class MournbladeCYD2Utility {
/* -------------------------------------------- */
static chatRollMenu(html, options) {
let canApply = li => canvas.tokens.controlled.length && li.find(".mournblade-cyd2-roll").length
let canApply = li => {
const el = li instanceof HTMLElement ? li : li[0];
return canvas.tokens.controlled.length && el.querySelector(".mournblade-cyd2-roll");
}
let getActor = function (li) {
let message = game.messages.get($(li).attr("data-message-id"))
const el = li instanceof HTMLElement ? li : li[0];
let message = game.messages.get(el.dataset.messageId)
let rollData = message.getFlag("world", "mournblade-cyd2-roll")
return MournbladeCYD2Utility.getActorFromRollData(rollData)
}
let getRollData = function (li) {
let message = game.messages.get($(li).attr("data-message-id"))
const el = li instanceof HTMLElement ? li : li[0];
let message = game.messages.get(el.dataset.messageId)
return message.getFlag("world", "mournblade-cyd2-roll")
}
let canApplyBA = function (li) {
@@ -884,7 +913,7 @@ export class MournbladeCYD2Utility {
/* -------------------------------------------- */
static async confirmDelete(actorSheet, li) {
let itemId = li.data("item-id");
let itemId = li.dataset?.itemId ?? li.dataset?.["item-id"];
let msgTxt = "<p>Etes vous certain de vouloir supprimer cet item ?";
let buttons = {
delete: {
@@ -892,7 +921,7 @@ export class MournbladeCYD2Utility {
label: "Oui !",
callback: () => {
actorSheet.actor.deleteEmbeddedDocuments("Item", [itemId]);
li.slideUp(200, () => actorSheet.render(false));
actorSheet.render(false);
}
},
cancel: {