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:
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:
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:
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