Skip to content

Commit

Permalink
v0.3.7
Browse files Browse the repository at this point in the history
- Added setting for choosing disadvantage key binding used both for exported macros and when clicking the Mob Attack button in the dialog. This was requested in issue #35. The options are either Command (MacOS) or ctrl (Windows).
- Fixed a bug that had stopped the AC modifier from being added to target AC, as requested in issue #36.
  • Loading branch information
Stendarpaval committed Sep 5, 2021
1 parent ab2abea commit fbbdd1c
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 12 deletions.
7 changes: 6 additions & 1 deletion lang/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -160,5 +160,10 @@
"SETTINGS.MAT.defaultMobPrefix": "Default mob name prefix",
"SETTINGS.MAT.defaultMobPrefixHint": "Choose what default text will appear before the name of the first creature of a mob.",
"SETTINGS.MAT.defaultMobSuffix": "Default mob name suffix",
"SETTINGS.MAT.defaultMobSuffixHint": "Choose what default text will appear after the namme of the first creature of a mob."
"SETTINGS.MAT.defaultMobSuffixHint": "Choose what default text will appear after the namme of the first creature of a mob.",

"SETTINGS.MAT.disadvantageKeyBinding": "Disadvantage keybinding",
"SETTINGS.MAT.disadvantageKeyBindingHint": "Choose which key you want to be able to hold down to roll mob attacks with disadvantage. For MacOS users, the Command key is recommended. For Windows users, the ctrl key is recommended. Note: to roll with advantage, hold down the Option key (MacOS) or Alt key (Windows).",
"SETTINGS.MAT.metaKey": "Command",
"SETTINGS.MAT.ctrlKey": "Ctrl"
}
4 changes: 2 additions & 2 deletions module.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
}
],
"url": "https://github.com/Stendarpaval/mob-attack-tool",
"version": "0.3.6",
"version": "0.3.7",
"minimumCoreVersion": "0.8.8",
"compatibleCoreVersion": "0.8.8",
"system": ["dnd5e"],
Expand All @@ -27,5 +27,5 @@
"styles/mob-attack-tool.css"
],
"manifest": "https://raw.githubusercontent.com/Stendarpaval/mob-attack-tool/main/module.json",
"download": "https://github.com/Stendarpaval/mob-attack-tool/releases/download/0.3.6/module.zip"
"download": "https://github.com/Stendarpaval/mob-attack-tool/releases/download/0.3.7/module.zip"
}
6 changes: 4 additions & 2 deletions scripts/individualRolls.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,11 @@ export async function rollMobAttackIndividually(data) {

let attackFormula = '';

if (data.withAdvantage === true) {
if (data.withAdvantage || (!data.withDisadvantage && data.event.altKey)) {
data.withAdvantage = true;
attackFormula = `2d20kh + ${finalAttackBonus}`;
} else if (data.withDisadvantage === true) {
} else if (data.withDisadvantage || (!data.withAdvantage && (game.settings.get(moduleName, "disadvantageKeyBinding") === 0 ? data.event.metaKey : data.event.ctrlKey))) {
data.withDisadvantage = true;
attackFormula = `2d20kl + ${finalAttackBonus}`;
} else {
attackFormula = `1d20 + ${finalAttackBonus}`
Expand Down
9 changes: 5 additions & 4 deletions scripts/mobAttackTool.js
Original file line number Diff line number Diff line change
Expand Up @@ -667,7 +667,7 @@ export class MobAttackDialog extends FormApplication {
// increase AC modifier
html.on("click", ".increaseACmod", async () => {
let acMod = parseInt(html.find(`input[name="armorClassMod"]`)[0].value) ?? 0;
if (acMod.isNaN() || acMod == null || acMod == undefined) {
if (Number.isNaN(acMod) || acMod == null || acMod == undefined) {
acMod = 0;
html.find(`input[name="armorClassMod"]`)[0].value = "0";
}
Expand All @@ -681,7 +681,7 @@ export class MobAttackDialog extends FormApplication {
// decrease AC modifier
html.on("click", ".decreaseACmod", async () => {
let acMod = parseInt(html.find(`input[name="armorClassMod"]`)[0].value) ?? 0;
if (acMod.isNaN() || acMod == null || acMod == undefined) {
if (Number.isNaN(acMod) || acMod == null || acMod == undefined) {
acMod = 0;
html.find(`input[name="armorClassMod"]`)[0].value = "0";
}
Expand All @@ -693,13 +693,14 @@ export class MobAttackDialog extends FormApplication {
})

// execute mob attack
html.on("click", ".executeMobAttack", async () => {
html.on("click", ".executeMobAttack", async (event) => {
if (checkTarget()) {
let selectedTokenIds = [];
for (let token of canvas.tokens.controlled) {
selectedTokenIds.push({tokenId: token.id, tokenUuid: token.document.uuid, actorId: token.actor.id});
}
let mobAttackData = await prepareMobAttack(html, selectedTokenIds, this.weapons, this.availableAttacks, this.targets, this.targetAC + game.settings.get(moduleName,"savedArmorClassMod"), this.numSelected, this.monsters);
mobAttackData.event = event;
if (game.settings.get(moduleName,"mobRules") === 0) {
rollMobAttack(mobAttackData);
} else {
Expand Down Expand Up @@ -768,7 +769,7 @@ export class MobAttackDialog extends FormApplication {
let disadvKeyEvent = mobAttackData.withDisadvantage;
if (!mobAttackData.withAdvantage && !mobAttackData.withDisadvantage) {
advKeyEvent = `event.altKey`;
disadvKeyEvent = `event.metaKey`;
disadvKeyEvent = (game.settings.get(moduleName, "disadvantageKeyBinding") === 0 ? `event.metaKey` : `event.ctrlKey`);
}

let macroData = {
Expand Down
9 changes: 9 additions & 0 deletions scripts/mobRules.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,15 @@ export async function rollMobAttack(data) {
const weaponData = data.weapons[key];
const actorName = weaponData.actor.name;
const finalAttackBonus = getAttackBonus(weaponData);
if (!data.withDisadvantage && data.event.altKey) {
data.withAdvantage = true;
data.rollTypeValue = Math.floor(game.settings.get(moduleName,"rollTypeValue"));
data.rollTypeMessage = ` + ${data.rollTypeValue} [adv]`;
} else if (!data.withAdvantage && (game.settings.get(moduleName, "disadvantageKeyBinding") === 0 ? data.event.metaKey : data.event.ctrlKey)) {
data.withDisadvantage = true;
data.rollTypeValue = -1 * Math.floor(game.settings.get(moduleName,"rollTypeValue"));
data.rollTypeMessage = ` - ${data.rollTypeValue} [adv]`;
}
const d20Needed = calcD20Needed(finalAttackBonus, targetAC, data.rollTypeValue);
const attackersNeeded = calcAttackersNeeded(d20Needed);

Expand Down
12 changes: 12 additions & 0 deletions scripts/settings.js
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,18 @@ const matSettings = {
config: false,
default: true,
type: Boolean
},
"disadvantageKeyBinding": {
name: "SETTINGS.MAT.disadvantageKeyBinding",
hint: "SETTINGS.MAT.disadvantageKeyBindingHint",
scope: "client",
config: true,
type: Number,
default: 0,
choices: {
0: "SETTINGS.MAT.metaKey",
1: "SETTINGS.MAT.ctrlKey"
}
}
};

Expand Down
7 changes: 4 additions & 3 deletions scripts/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,7 @@ export function getTargetData(monsters) {
let arrayStart = 0;
let targetAC = 10;
let arrayLength = Math.floor(weaponsOnTargetArray.length / targetTokens.length);
let armorClassMod = game.settings.get(moduleName,"savedArmorClassMod");
if (arrayLength === 0) arrayLength = 1;
for (let targetToken of targetTokens) {
if (targetToken.actor === null && game.modules.get("multilevel-tokens").active) {
Expand All @@ -137,7 +138,7 @@ export function getTargetData(monsters) {
weapons: weaponsOnTargetArray.slice(arrayStart, arrayLength * (1 + targetCount)),
noWeaponMsg: '',
targetIndex: targetCount,
targetAC: targetAC,
targetAC: targetAC + armorClassMod,
targetACtext: ((game.user.isGM) ? ` ${game.i18n.localize("MAT.dialogTargetArmorClassMessage")}` : ``)
})

Expand Down Expand Up @@ -344,7 +345,7 @@ export async function prepareMobAttack(html, selectedTokenIds, weapons, availabl
}
if (targets.length === 0) {
numAttacksMultiplier = parseInt(html.find(`input[name="numAttacks${weaponData.id.replace(" ","-")}"]`)[0].value);
if (numAttacksMultiplier === NaN) {
if (Number.isNaN(numAttacksMultiplier)) {
numAttacksMultiplier = 0;
}
attacks[weaponData.id].push({targetId: null, targetNumAttacks: availableAttacks[weaponData.id] * numAttacksMultiplier});
Expand All @@ -360,7 +361,7 @@ export async function prepareMobAttack(html, selectedTokenIds, weapons, availabl
}
if (targets.length === 0) {
numAttacksMultiplier = parseInt(html.find(`input[name="numAttacks${weaponID.replace(" ","-")}"]`)[0].value);
if (numAttacksMultiplier === NaN) {
if (Number.isNaN(numAttacksMultiplier)) {
numAttacksMultiplier = 0;
}
attacks[weaponID].push({targetId: null, targetNumAttacks: availableAttacks[weaponData.id] * numAttacksMultiplier});
Expand Down

0 comments on commit fbbdd1c

Please sign in to comment.