109 lines
No EOL
2.6 KiB
JavaScript
109 lines
No EOL
2.6 KiB
JavaScript
const notifStyle = `
|
|
font-size: 1.5rem;
|
|
margin-bottom: 0.5rem;
|
|
padding: 6px 8px;
|
|
box-shadow: 0 0 10px var(--color-shadow-dark);
|
|
color: var(--color-text-light-1);
|
|
border-radius: 5px;
|
|
text-align: center;`;
|
|
|
|
const greenNotif = `
|
|
background: var(--color-level-success-bg);
|
|
border: 1px solid var(--color-level-success-border);`;
|
|
|
|
const redNotif = `
|
|
background: var(--color-level-error-bg);
|
|
border: 1px solid var(--color-level-error);`;
|
|
|
|
async function rollDice() {
|
|
const sidesOnDice = 6;
|
|
|
|
const answers = await DialogManager.ask({
|
|
id: `ak47-dice-pool`,
|
|
question: `Set up your dice pool:`,
|
|
inputs: [
|
|
{
|
|
key: `statBase`,
|
|
inputType: `number`,
|
|
label: `Stat Base`,
|
|
autofocus: true,
|
|
},
|
|
{
|
|
key: `extraDice`,
|
|
inputType: `number`,
|
|
label: `Extra Dice`,
|
|
defaultValue: 0,
|
|
},
|
|
{
|
|
key: `bonusThreshold`,
|
|
defaultValue: 2,
|
|
label: `Bonus Threshold (when stat base <= bonus threshold, gain 3 dice)`,
|
|
}
|
|
],
|
|
});
|
|
const { statBase, bonusThreshold, extraDice, } = answers;
|
|
let rollMode = game.settings.get(`core`, `rollMode`);
|
|
|
|
let diceCount = statBase;
|
|
if (statBase <= bonusThreshold) {
|
|
diceCount += 3;
|
|
};
|
|
diceCount += extraDice;
|
|
|
|
let successes = 0;
|
|
let critsOnly = 0;
|
|
const results = [];
|
|
for (let i = diceCount; i > 0; i--) {
|
|
let r = new Roll(`1d${sidesOnDice}`);
|
|
await r.evaluate();
|
|
let classes = `roll die d${sidesOnDice}`;
|
|
|
|
const total = r.total;
|
|
|
|
if (total <= statBase) {
|
|
successes += 1;
|
|
}
|
|
else {
|
|
classes += ` discarded`
|
|
}
|
|
if (total === statBase) {
|
|
successes += 1;
|
|
critsOnly += 1;
|
|
classes += ` success`;
|
|
}
|
|
|
|
// Save dice stats if present
|
|
WorldAPI?.saveRollValue?.(sidesOnDice, total);
|
|
|
|
results.push(`<li class="${classes}">${total}</li>`);
|
|
}
|
|
|
|
WorldAPI?.saveRollValue?.(100, successes === 0 ? 100 : successes);
|
|
|
|
let content = `Rolls:<div class="dice-tooltip"><ol class="dice-rolls">${results.join(`\n`)}</ol></div><hr>Successes: ${successes}<br>Crits: ${critsOnly}`;
|
|
|
|
if (successes >= 8) {
|
|
content += `<br><br><div style="${notifStyle} ${greenNotif}">POP OFF</div> Add one to the stat you didn't use and gain 1 Momentum!`;
|
|
}
|
|
else if (successes === 0) {
|
|
content += `<br><br><div style="${notifStyle} ${redNotif}">Pinned Down</div> Roll a d6, rescuing you becomes a new objective`;
|
|
}
|
|
|
|
|
|
if (rollMode === CONST.DICE_ROLL_MODES.BLIND) {
|
|
ui.notifications.info(`Cannot make a blind roll from the macro, rolling with mode "Private GM Roll" instead`);
|
|
rollMode = CONST.DICE_ROLL_MODES.PRIVATE;
|
|
};
|
|
|
|
const chatData = ChatMessage.applyRollMode(
|
|
{
|
|
flavor: `(Gun: AK-47)`,
|
|
content,
|
|
},
|
|
rollMode,
|
|
);
|
|
|
|
await ChatMessage.implementation.create(chatData);
|
|
}
|
|
|
|
rollDice(); |