From 9cee87b81e8d725d5719c6b58255d890da2d3f2f Mon Sep 17 00:00:00 2001 From: Oliver-Akins Date: Fri, 16 May 2025 18:53:59 -0600 Subject: [PATCH] Update the gun macros --- Axolotl-with-a-Gun/guns/glock/2-not-1.mjs | 106 +++++++++++ .../guns/{glock.mjs => glock/base.mjs} | 0 Axolotl-with-a-Gun/guns/gunsword/base.mjs | 2 +- .../guns/gunsword/only-empty-half.mjs | 112 ++++++++++++ Axolotl-with-a-Gun/guns/mini-gun/base.mjs | 23 ++- Axolotl-with-a-Gun/guns/mini-gun/ventable.mjs | 166 ++++++++++++++++++ 6 files changed, 403 insertions(+), 6 deletions(-) create mode 100644 Axolotl-with-a-Gun/guns/glock/2-not-1.mjs rename Axolotl-with-a-Gun/guns/{glock.mjs => glock/base.mjs} (100%) create mode 100644 Axolotl-with-a-Gun/guns/gunsword/only-empty-half.mjs create mode 100644 Axolotl-with-a-Gun/guns/mini-gun/ventable.mjs diff --git a/Axolotl-with-a-Gun/guns/glock/2-not-1.mjs b/Axolotl-with-a-Gun/guns/glock/2-not-1.mjs new file mode 100644 index 0000000..b43bbf0 --- /dev/null +++ b/Axolotl-with-a-Gun/guns/glock/2-not-1.mjs @@ -0,0 +1,106 @@ +const notifStyle = ` + font-size: 1.5rem; + margin: 0.5rem 0; + 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: `glock-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, + }, + ], + }); + const { statBase, extraDice } = answers; + let rollMode = game.settings.get(`core`, `rollMode`); + + let diceCount = statBase; + 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(`
  • ${total}
  • `); + }; + + if (successes === 0) { + successes = 2; + }; + + WorldAPI?.saveRollValue?.(20, Math.min(diceCount, 20)); + WorldAPI?.saveRollValue?.(100, successes === 0 ? 100 : successes); + + let content = `Rolls:
      ${results.join(`\n`)}

    Gain 1 Momentum
    Successes: ${successes}
    Crits: ${critsOnly}`; + + if (successes >= 8) { + content += `
    POP OFF
    Add one to your hobby stat and gain 1 additional Momentum!`; + } + else if (successes === 0) { + content += `
    Pinned Down
    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: Glock)`, + content, + }, + rollMode, + ); + + await ChatMessage.implementation.create(chatData); +} + +rollDice(); \ No newline at end of file diff --git a/Axolotl-with-a-Gun/guns/glock.mjs b/Axolotl-with-a-Gun/guns/glock/base.mjs similarity index 100% rename from Axolotl-with-a-Gun/guns/glock.mjs rename to Axolotl-with-a-Gun/guns/glock/base.mjs diff --git a/Axolotl-with-a-Gun/guns/gunsword/base.mjs b/Axolotl-with-a-Gun/guns/gunsword/base.mjs index 9282040..7fb6e63 100644 --- a/Axolotl-with-a-Gun/guns/gunsword/base.mjs +++ b/Axolotl-with-a-Gun/guns/gunsword/base.mjs @@ -109,4 +109,4 @@ async function rollDice() { await ChatMessage.implementation.create(chatData); } -rollDice(); \ No newline at end of file +rollDice(); diff --git a/Axolotl-with-a-Gun/guns/gunsword/only-empty-half.mjs b/Axolotl-with-a-Gun/guns/gunsword/only-empty-half.mjs new file mode 100644 index 0000000..3da0111 --- /dev/null +++ b/Axolotl-with-a-Gun/guns/gunsword/only-empty-half.mjs @@ -0,0 +1,112 @@ +const notifStyle = ` + font-size: 1.5rem; + margin: 0.5rem 0; + 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; + + let comboCount = game.user.getFlag(`world`, `comboCount`) ?? 0; + + const answers = await DialogManager.ask({ + id: `gunsword-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: `comboCount`, + inputType: `hidden`, + label: `Combo`, + details: `Your current C-C-C-Combo Meter is at: ${comboCount}`, + }, + ], + }); + const { statBase, extraDice } = answers; + let rollMode = game.settings.get(`core`, `rollMode`); + + let diceCount = statBase; + 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 && critsOnly === 0) { + successes += comboCount; + critsOnly += 1; + classes += ` success`; + comboCount = Math.ceil(comboCount / 2); + } + else if (total <= statBase) { + successes += 1; + comboCount += 1; + } + else { + classes += ` discarded` + } + + // Save dice stats if present + WorldAPI?.saveRollValue?.(sidesOnDice, total); + + results.push(`
  • ${total}
  • `); + } + + game.user.setFlag(`world`, `comboCount`, comboCount); + WorldAPI?.saveRollValue?.(20, Math.min(diceCount, 20)); + WorldAPI?.saveRollValue?.(100, successes === 0 ? 100 : successes); + + let content = `Rolls:
      ${results.join(`\n`)}

    Gain 1 Momentum
    Successes: ${successes}
    Crits: ${critsOnly}
    Combo Count After Roll: ${comboCount}`; + + if (successes >= 8) { + content += `
    POP OFF
    Add one to your hobby stat and gain 1 additional Momentum!`; + } + else if (successes === 0) { + content += `
    Pinned Down
    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: Gunsword)`, + content, + }, + rollMode, + ); + + await ChatMessage.implementation.create(chatData); +} + +rollDice(); diff --git a/Axolotl-with-a-Gun/guns/mini-gun/base.mjs b/Axolotl-with-a-Gun/guns/mini-gun/base.mjs index d0e2962..1c1d645 100644 --- a/Axolotl-with-a-Gun/guns/mini-gun/base.mjs +++ b/Axolotl-with-a-Gun/guns/mini-gun/base.mjs @@ -36,12 +36,17 @@ async function main() { }, ], }); - const { statBase, extraDice } = answers; + const { extraDice } = answers; + let { statBase } = answers; let rollMode = game.settings.get(`core`, `rollMode`); let diceCount = statBase; diceCount += extraDice; + if (statBase === 6) { + diceCount += 6; + }; + let statGain = 0; let gunLoss = 0; let successes = 0; let critsOnly = 0; @@ -68,9 +73,16 @@ async function main() { classes += ` success`; } + if (statBase === 6 && i <= 6) { + if (i === 6) { + statBase -= 1; + }; + continue + } + if (succeeded) { try { - const { holdTheTrigger } = await DialogManager.ask({ + const { holdTheTrigger, ventHeat } = await DialogManager.ask({ id: `mini-gun-hold-the-trigger`, question: `Hold The Trigger?`, inputs: [ @@ -102,16 +114,17 @@ async function main() { heatMeter += (holdTheTrigger ? 1 : -1); if (holdTheTrigger) { diceCount += 1; - } + }; if (heatMeter >= 6) { heatMeter = 0; gunLoss += 2; - } + statBase -= 2; + }; } catch {}; } // Save dice stats if present - WorldAPI?.saveRollValue?.(sidesOnDice, total); + WorldAPI?.saveRollValue?.(6, total); results.push(`
  • ${total}
  • `); }; diff --git a/Axolotl-with-a-Gun/guns/mini-gun/ventable.mjs b/Axolotl-with-a-Gun/guns/mini-gun/ventable.mjs new file mode 100644 index 0000000..c6130a3 --- /dev/null +++ b/Axolotl-with-a-Gun/guns/mini-gun/ventable.mjs @@ -0,0 +1,166 @@ +const notifStyle = ` + font-size: 1.5rem; + margin: 0.5rem 0; + 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 main() { + let heatMeter = game.user.getFlag(`world`, `heatMeter`) ?? 0; + + const answers = await DialogManager.ask({ + id: `mini-gun-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, + }, + ], + }); + const { extraDice } = answers; + let { statBase } = answers; + let rollMode = game.settings.get(`core`, `rollMode`); + + let diceCount = statBase; + diceCount += extraDice; + if (statBase === 6) { + diceCount += 6; + }; + + let statGain = 0; + let gunLoss = 0; + let successes = 0; + let critsOnly = 0; + let results = []; + for (let i = 0; i < diceCount; i++) { + let succeeded = false; + + let r = new Roll(`1d6`); + await r.evaluate(); + let classes = `roll die d6`; + + const total = r.total; + + if (total <= statBase) { + successes += 1; + succeeded = true; + } + else { + classes += ` discarded` + } + if (total === statBase) { + successes += 1; + critsOnly += 1; + classes += ` success`; + } + + if (statBase === 6 && i <= 6) { + if (i === 6) { + statBase -= 1; + }; + continue + } + + if (succeeded) { + try { + const { holdTheTrigger, ventHeat } = await DialogManager.ask({ + id: `mini-gun-hold-the-trigger`, + question: `Hold The Trigger?`, + inputs: [ + { + key: `_1`, + inputType: `hidden`, + label: `Success Count: ${successes}`, + }, + { + key: `_2`, + inputType: `hidden`, + label: `Total Dice Rolled: ${i + 1}/${diceCount}`, + }, + { + key: `_3`, + inputType: `hidden`, + label: `Current Heat: ${heatMeter}/6`, + }, + { + key: `holdTheTrigger`, + inputType: `checkbox`, + label: `Hold The Trigger?`, + details: `If you hold the trigger, you roll an additional dice, and gain 1 heat. If you don't hold the trigger, you lose one heat. When you reach 6 heat, you lost all heat and lose 2 GUN.`, + defaultValue: false, + autofocus: true, + } + ], + }); + heatMeter += (holdTheTrigger ? 1 : -1); + if (holdTheTrigger) { + diceCount += 1; + }; + if (heatMeter >= 6) { + heatMeter = 0; + gunLoss += 2; + statBase -= 2; + } + } catch {}; + } + + // Save dice stats if present + WorldAPI?.saveRollValue?.(6, total); + + results.push(`
  • ${total}
  • `); + }; + + game.user.setFlag(`world`, `heatMeter`, heatMeter); + WorldAPI?.saveRollValue?.(20, Math.min(diceCount, 20)); + WorldAPI?.saveRollValue?.(100, successes === 0 ? 100 : successes); + + let content = `Rolls:
      ${results.join(`\n`)}

    Gain 1 Momentum
    Successes: ${successes}
    Crits: ${critsOnly}
    Final Heat: ${heatMeter}`; + + if (gunLoss > 0) { + content += `
    Lose ${gunLoss} GUN
    `; + } + + if (successes >= 8) { + content += `
    POP OFF
    Add one to your hobby stat and gain 1 additional Momentum!`; + } + else if (successes === 0) { + content += `
    Pinned Down
    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: Mini-Gun)`, + content, + }, + rollMode, + ); + + await ChatMessage.implementation.create(chatData); +} + +main(); \ No newline at end of file