79 lines
2.9 KiB
JavaScript
79 lines
2.9 KiB
JavaScript
/**
|
|
* This function is used to hook into the Chat Log context menu to add additional options to each message
|
|
* These options make it easy to conveniently apply damage to controlled tokens based on the value of a Roll
|
|
*
|
|
* @param {HTMLElement} html The Chat Message being rendered
|
|
* @param {Array} options The Array of Context Menu options
|
|
*
|
|
* @return {Array} The extended options Array including new context choices
|
|
*/
|
|
export const addChatMessageContextOptions = function(html, options) {
|
|
let canApply = li => canvas.tokens.controlled.length && li.find(".dice-roll").length;
|
|
options.push(
|
|
{
|
|
name: game.i18n.localize("ACKS.messages.applyDamage"),
|
|
icon: '<i class="fas fa-user-minus"></i>',
|
|
condition: canApply,
|
|
callback: li => applyChatCardDamage(li, 1)
|
|
},
|
|
{
|
|
name: game.i18n.localize("ACKS.messages.applyHealing"),
|
|
icon: '<i class="fas fa-user-plus"></i>',
|
|
condition: canApply,
|
|
callback: li => applyChatCardDamage(li, -1)
|
|
},
|
|
{
|
|
name: game.i18n.localize("ACKS.messages.applyHalf"),
|
|
icon: '<i class="fas fa-user-times"></i>',
|
|
condition: canApply,
|
|
callback: li => applyChatCardDamage(li, 0.5)
|
|
},
|
|
{
|
|
name: game.i18n.localize("ACKS.messages.applyDouble"),
|
|
icon: '<i class="fas fa-bullseye"></i>',
|
|
condition: canApply,
|
|
callback: li => applyChatCardDamage(li, 2)
|
|
}
|
|
);
|
|
return options;
|
|
};
|
|
|
|
/* -------------------------------------------- */
|
|
|
|
export const addChatMessageButtons = function(msg, html, data) {
|
|
// Hide blind rolls
|
|
let blindable = html.find('.blindable');
|
|
if (msg.data.blind && !game.user.isGM && blindable && blindable.data('blind') === true) {
|
|
blindable.replaceWith("<div class='dice-roll'><div class='dice-result'><div class='dice-formula'>???</div></div></div>");
|
|
}
|
|
// Buttons
|
|
let roll = html.find('.damage-roll');
|
|
if (roll.length > 0) {
|
|
let total = roll.find('.dice-total');
|
|
let value = total.text();
|
|
roll.append($(`<div class="dice-damage"><button type="button" data-action="apply-damage"><i class="fas fa-tint"></i></button></div>`))
|
|
roll.find('button[data-action="apply-damage"]').click((ev) => {
|
|
ev.preventDefault();
|
|
applyChatCardDamage(roll, 1);
|
|
})
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Apply rolled dice damage to the token or tokens which are currently controlled.
|
|
* This allows for damage to be scaled by a multiplier to account for healing, critical hits, or resistance
|
|
*
|
|
* @param {HTMLElement} roll The chat entry which contains the roll data
|
|
* @param {Number} multiplier A damage multiplier to apply to the rolled damage.
|
|
* @return {Promise}
|
|
*/
|
|
function applyChatCardDamage(roll, multiplier) {
|
|
const amount = roll.find('.dice-total').last().text();
|
|
return Promise.all(canvas.tokens.controlled.map(t => {
|
|
const a = t.actor;
|
|
return a.applyDamage(amount, multiplier);
|
|
}));
|
|
}
|
|
|
|
/* -------------------------------------------- */
|