101 lines
2.9 KiB
JavaScript
101 lines
2.9 KiB
JavaScript
export const augmentTable = (table, html, data) => {
|
|
// Treasure Toggle
|
|
let head = html.find(".sheet-header");
|
|
const flag = table.object.getFlag("acks", "treasure");
|
|
const treasure = flag
|
|
? "<div class='toggle-treasure active'></div>"
|
|
: "<div class='toggle-treasure'></div>";
|
|
head.append(treasure);
|
|
|
|
html.find(".toggle-treasure").click((ev) => {
|
|
let isTreasure = table.object.getFlag("acks", "treasure");
|
|
table.object.setFlag("acks", "treasure", !isTreasure);
|
|
});
|
|
|
|
// Treasure table formatting
|
|
if (flag) {
|
|
// Remove Interval
|
|
html.find(".result-range").remove();
|
|
html.find(".normalize-results").remove();
|
|
|
|
html.find(".result-weight").first().text("Chance");
|
|
|
|
// Replace Roll button
|
|
const roll = `<button class="roll-treasure" type="button"><i class="fas fa-gem"></i> ${game.i18n.localize('ACKS.table.treasure.roll')}</button>`;
|
|
html.find(".sheet-footer .roll").replaceWith(roll);
|
|
}
|
|
|
|
html.find(".roll-treasure").click((ev) => {
|
|
rollTreasure(table.object, { event: ev });
|
|
});
|
|
};
|
|
|
|
function drawTreasure(table, data) {
|
|
const percent = (chance) => {
|
|
const roll = new Roll("1d100").roll();
|
|
return roll.total <= chance;
|
|
};
|
|
data.treasure = {};
|
|
if (table.getFlag('acks', 'treasure')) {
|
|
table.results.forEach((r) => {
|
|
if (percent(r.weight)) {
|
|
const text = table._getResultChatText(r);
|
|
data.treasure[r._id] = ({
|
|
img: r.img,
|
|
text: TextEditor.enrichHTML(text),
|
|
});
|
|
if ((r.type === CONST.TABLE_RESULT_TYPES.ENTITY) && (r.collection === "RollTable")) {
|
|
const embeddedTable = game.tables.get(r.resultId);
|
|
drawTreasure(embeddedTable, data.treasure[r._id]);
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
const results = table.roll().results;
|
|
results.forEach((s) => {
|
|
const text = TextEditor.enrichHTML(table._getResultChatText(s));
|
|
data.treasure[s._id] = {img: s.img, text: text};
|
|
});
|
|
}
|
|
return data;
|
|
}
|
|
|
|
async function rollTreasure(table, options = {}) {
|
|
// Draw treasure
|
|
const data = drawTreasure(table, {});
|
|
let templateData = {
|
|
treasure: data.treasure,
|
|
table: table,
|
|
};
|
|
|
|
// Animation
|
|
if (options.event) {
|
|
let results = $(event.currentTarget.parentElement)
|
|
.prev()
|
|
.find(".table-result");
|
|
results.each((_, item) => {
|
|
item.classList.remove("active");
|
|
if (data.treasure[item.dataset.resultId]) {
|
|
item.classList.add("active");
|
|
}
|
|
});
|
|
}
|
|
|
|
let html = await renderTemplate(
|
|
"systems/acks/templates/chat/roll-treasure.html",
|
|
templateData
|
|
);
|
|
|
|
let chatData = {
|
|
content: html,
|
|
// sound: "/systems/acks/assets/coins.mp3"
|
|
}
|
|
|
|
let rollMode = game.settings.get("core", "rollMode");
|
|
if (["gmroll", "blindroll"].includes(rollMode)) chatData["whisper"] = ChatMessage.getWhisperRecipients("GM");
|
|
if (rollMode === "selfroll") chatData["whisper"] = [game.user._id];
|
|
if (rollMode === "blindroll") chatData["blind"] = true;
|
|
|
|
ChatMessage.create(chatData);
|
|
}
|