164 lines
5.7 KiB
JavaScript
164 lines
5.7 KiB
JavaScript
|
|
export default class RMFRPToolsDiceRoller extends FormApplication {
|
|
constructor(item, actor) {
|
|
super();
|
|
this.item = foundry.utils.duplicate(item);
|
|
this.actor = actor;
|
|
this.itemName = item.name;
|
|
this.characterBonus = Number(item.system.total_bonus);
|
|
this.stunnedModifier = actor.getStunnedModifier()
|
|
this.rollType = [
|
|
{ value: "one_to_onehundred", text: "1-100", selected: false },
|
|
{ value: "open_ended", text: "Open-Ended", selected: true },
|
|
{ value: "high_open_ended", text: "High Open-Ended", selected: false },
|
|
{ value: "low_open_ended", text: "Low Open-Ended", selected: false }
|
|
];
|
|
}
|
|
|
|
static get defaultOptions() {
|
|
return foundry.utils.mergeObject(super.defaultOptions, {
|
|
classes: ["form"],
|
|
title: "Rolemaster Dice Roller",
|
|
popOut: true,
|
|
width: 480,
|
|
height: 440,
|
|
template: "systems/fvtt-rolemaster-frp/templates/sheets/apps/app_dice_roller.html"
|
|
});
|
|
}
|
|
|
|
getData() {
|
|
// Send data to the template
|
|
return {
|
|
itemName: this.itemName,
|
|
characterBonus: this.characterBonus,
|
|
selectOptions: this.rollType,
|
|
woundsModifier: this.actor.system.modifiers.woundsModifier,
|
|
config: CONFIG.rmfrp,
|
|
difficulty: 0,
|
|
combatSituation: 0,
|
|
lightningModifier: 0,
|
|
darknessModifier: 0,
|
|
hitsPerRound: 0,
|
|
isStunned: this.actor.system.state.stunned,
|
|
stunnedModifier: this.stunnedModifier
|
|
};
|
|
}
|
|
|
|
activateListeners(html) {
|
|
super.activateListeners(html);
|
|
}
|
|
|
|
async _updateObject(event, formData) {
|
|
console.log("Rolling Dice");
|
|
console.log(formData);
|
|
console.log(event);
|
|
this.roll(event.submitter?.dataset?.value, formData);
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
async showDiceSoNice(roll, rollMode) {
|
|
if (game.modules.get("dice-so-nice")?.active) {
|
|
if (game.dice3d) {
|
|
let whisper = null;
|
|
let blind = false;
|
|
rollMode = rollMode ?? game.settings.get("core", "rollMode");
|
|
switch (rollMode) {
|
|
case "blindroll": //GM only
|
|
blind = true;
|
|
case "gmroll": //GM + rolling player
|
|
whisper = this.getUsers(user => user.isGM);
|
|
break;
|
|
case "roll": //everybody
|
|
whisper = this.getUsers(user => user.active);
|
|
break;
|
|
case "selfroll":
|
|
whisper = [game.user.id];
|
|
break;
|
|
}
|
|
await game.dice3d.showForRoll(roll, game.user, true, whisper, blind);
|
|
}
|
|
}
|
|
}
|
|
|
|
/* -------------------------------------------- */
|
|
async roll(rollKey, formData) {
|
|
let baseRoll = await new Roll("1d100").roll();
|
|
await this.showDiceSoNice(baseRoll, game.settings.get("core", "rollMode"))
|
|
let rollType = this.rollType.find(r => r.value == rollKey)?.text;
|
|
let rollData = {
|
|
name: this.itemName,
|
|
rollKey: rollKey,
|
|
rollType: rollType,
|
|
difficulty: Number(formData.difficulty),
|
|
combatSituation: Number(formData?.combatSituation || 0),
|
|
lightningModifier: Number(formData?.lightningModifier || 0),
|
|
darknessModifier: Number(formData?.darknessModifier || 0),
|
|
characterBonus: Number(this.characterBonus),
|
|
woundsModifier: Number(this.actor.system.modifiers.woundsModifier),
|
|
hitsPerRound: Number(formData.hitsPerRound),
|
|
isStunned: this.actor.system.state.stunned,
|
|
stunnedModifier: this.stunnedModifier,
|
|
rolls: [baseRoll],
|
|
}
|
|
if (baseRoll.result == 66) {
|
|
rollData.content = "You rolled a 66!";
|
|
}
|
|
// Process the for low open ended rolls
|
|
if (rollKey === "open_ended" || rollKey === "low_open_ended") {
|
|
if (baseRoll.result < 6) {
|
|
rollData.lowopen = true
|
|
let newRoll = await new Roll("-1d100").roll();
|
|
await this.showDiceSoNice(newRoll, game.settings.get("core", "rollMode"))
|
|
rollData.rolls.push(newRoll);
|
|
while (newRoll.result > 95) {
|
|
newRoll = await new Roll("-1d100").roll();
|
|
await this.showDiceSoNice(newRoll, game.settings.get("core", "rollMode"))
|
|
rollData.rolls.push(newRoll);
|
|
}
|
|
}
|
|
}
|
|
// Process the for high open ended rolls
|
|
if (rollKey === "open_ended" || rollKey === "high_open_ended") {
|
|
if (baseRoll.result > 95) {
|
|
rollData.highopen = true
|
|
let newRoll = await new Roll("1d100").roll();
|
|
await this.showDiceSoNice(newRoll, game.settings.get("core", "rollMode"))
|
|
rollData.rolls.push(newRoll);
|
|
while (newRoll.result > 95) {
|
|
newRoll = await new Roll("1d100").roll();
|
|
await this.showDiceSoNice(newRoll, game.settings.get("core", "rollMode"))
|
|
rollData.rolls.push(newRoll);
|
|
}
|
|
}
|
|
}
|
|
// Compute total of rolls
|
|
rollData.totalRolls = rollData.rolls.reduce((acc, roll) => Number(acc) + Number(roll.result), 0);
|
|
rollData.totalFinal = rollData.totalRolls + Number(rollData.combatSituation) +
|
|
Number(rollData.lightningModifier) +
|
|
Number(rollData.darknessModifier) +
|
|
Number(this.actor.system.modifiers.woundsModifier) +
|
|
Number(formData.difficulty) +
|
|
Number(rollData.hitsPerRound) +
|
|
Number(rollData.stunnedModifier) +
|
|
Number(this.characterBonus);
|
|
console.log(">>> Roll Data: ", rollData);
|
|
|
|
// Define the Chat Message Template
|
|
let chatTemplate = "systems/fvtt-rolemaster-frp/templates/chat/chat_dice_roll.html";
|
|
|
|
// Pass the Data through to be used in the Chat Message
|
|
let chatData = rollData
|
|
// Render the Rolls to the Chat Window
|
|
renderTemplate(chatTemplate, chatData).then((html) => {
|
|
let chatOptions = {
|
|
style: CONST.CHAT_MESSAGE_STYLES.ROLL,
|
|
flavor: rollType,
|
|
rollMode: game.settings.get("core", "rollMode"),
|
|
content: html,
|
|
};
|
|
ChatMessage.create(chatOptions);
|
|
});
|
|
}
|
|
|
|
}
|