Skip to content

Commit 3322c40

Browse files
authored
Merge branch 'Roll20:master' into master
2 parents 27d5705 + f1aa159 commit 3322c40

File tree

17 files changed

+33433
-61
lines changed

17 files changed

+33433
-61
lines changed

AttackMaster/5.0.5/attackMaster.js

Lines changed: 8874 additions & 0 deletions
Large diffs are not rendered by default.

AttackMaster/attackMaster.js

Lines changed: 36 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -114,14 +114,17 @@ API_Meta.AttackMaster={offset:Number.MAX_SAFE_INTEGER,lineCount:-1};
114114
* v5.0.4 26/09/2025 Fixed ranged two weapon penalty to be a penalty rather than a benefit!
115115
* Fixed scanForModifiers() priority selection and added saves as a new possible
116116
* priority.
117+
* v5.0.5 14/10/2025 Fixed the error introduced to scanForModifiers() by 5.0.4! Fixed AC calc on
118+
* changing player page and/or dropping token on map. Fixed crash if !attk called
119+
* without a command or parameters.
117120
*/
118121

119122
var attackMaster = (function() { // eslint-disable-line no-unused-vars
120123
'use strict';
121-
var version = '5.0.4',
124+
var version = '5.0.5',
122125
author = 'Richard @ Damery',
123126
pending = null;
124-
const lastUpdate = 1758783460;
127+
const lastUpdate = 1760686967;
125128

126129
/*
127130
* Define redirections for functions moved to the RPGMaster library
@@ -262,7 +265,7 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
262265
version:4.04,
263266
avatar:'https://s3.amazonaws.com/files.d20.io/images/257656656/ckSHhNht7v3u60CRKonRTg/thumb.png?1638050703',
264267
bio:'<div style="font-weight: bold; text-align: center; border-bottom: 2px solid black;">'
265-
+'<span style="font-weight: bold; font-size: 125%">AttackMaster Help v4.03</span>'
268+
+'<span style="font-weight: bold; font-size: 125%">AttackMaster Help v4.04</span>'
266269
+'</div>'
267270
+'<div style="padding-left: 5px; padding-right: 5px; overflow: hidden;">'
268271
+'<h1>Attack Master API v'+version+'</h1>'
@@ -2224,8 +2227,6 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
22242227
isInnate = wt.includes('innate'),
22252228
isType = isInnate, isSuperType=false, isSameName=false, isSpecialist=false, isMastery=false;
22262229

2227-
// isType = isSuperType = isSameName = isSpecialist = isMastery = false;
2228-
22292230
if (classObjs[0].base === 'creature') return 0;
22302231

22312232
if (allowedWeap) {
@@ -2912,7 +2913,7 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
29122913
adj = (parseInt(thisData.adj || 0) + (dmgType !== 'nadj' ? parseInt(thisData[dmgType] || 0) : 0)),
29132914
dexAdj = Math.floor(dexBonus * parseFloat(Math.max(thisData.dexBonus,0))),
29142915
curDexAdj = Math.floor(dexBonus * parseFloat(Math.max(curBest.data.dexBonus,0))),
2915-
acDiff = ((curBest.data.ac || 0) - (curBest.data.adj || 0) - (curDexAdj*dexBonus)) - (ac - adj - dexAdj);
2916+
acDiff = ((curBest.data.ac || 0) - (curBest.data.adj || 0) - curDexAdj) - (ac - adj - dexAdj);
29162917
let diff;
29172918

29182919
switch (priority) {
@@ -3530,8 +3531,6 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
35303531
attkMacro = '',
35313532
attkMacroDef, dmgMacroDef, qualifier, arTable;
35323533

3533-
// log('buildMWattkMacros: weapon '+weaponName+' dancing = '+dancing+', proficiency = '+proficiency);
3534-
35353534
var parseMWattkMacro = function( args, charCS, attkType, macro ) {
35363535

35373536
var attkAdvantage = (attrLookup(charCS,[fields.Magical_advantages[0]+tokenID,fields.Magical_advantages[1]])+'/////').split('/')[0],
@@ -7177,7 +7176,7 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
71777176
* of rounds or HP damage taken).
71787177
*/
71797178

7180-
async function doCheckMods( args, senderId, selected, silent=false ) {
7179+
async function doCheckMods( args, senderId, selected, silent=false, forceMod=false ) {
71817180

71827181
try {
71837182
if (!args) args=[];
@@ -7231,7 +7230,7 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
72317230
let newThac0 = (baseThac0 - thac0Mod);
72327231
// log('doCheckMods: baseThac0 = '+handleGetBaseThac0(charCS)+', thac0Mod = '+thac0Mod+', newThac0 = '+newThac0+', currentThac0 = '+currentThac0+', currentMod = '+currentThac0Mod+', attrName = '+currentThac0Field.name+', barName = '+currentThac0Field.barName);
72337232
if (currentThac0Field.name && currentThac0Field.barName.startsWith('bar')) {
7234-
if ((baseThac0 - currentThac0Mod) === currentThac0) {
7233+
if ((baseThac0 - currentThac0Mod) === currentThac0 || forceMod) {
72357234
curToken.set((currentThac0Field.barName+'_value'),newThac0);
72367235
curToken.set((currentThac0Field.barName+'_max'),'');
72377236
} else if (newThac0 !== currentThac0) {
@@ -7267,7 +7266,7 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
72677266
* if the two are different turn on the AC bar to indicate difference
72687267
*/
72697268

7270-
async function doCheckAC( args, senderId, selected, silent = false ) {
7269+
async function doCheckAC( args, senderId, selected, silent = false, forceAC = false ) {
72717270

72727271
try {
72737272
if (!args) args=[];
@@ -7408,15 +7407,31 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
74087407
currentAC = getTokenValue(curToken,fields.Token_AC,fields.AC,fields.MonsterAC,fields.Thac0_base);
74097408
// log('doCheckAC: baseAC('+baseAC+')-dmgAdj.armoured.adj('+dmgAdj.armoured.adj+')-dexBonus('+dexBonus+')-styleBonus('+styleBonus+') = '+ac);
74107409
// log('doCheckAC: currentAC.val = '+currentAC.val+', newAC = '+newAC+', prevAC = '+prevAC+', so val changed to '+((isNaN(currentAC.val) || newAC) ? ac : (currentAC.val + ac - prevAC)));
7411-
currentAC.val = ((isNaN(currentAC.val) || newAC) ? ac : (currentAC.val + ac - prevAC));
7410+
// currentAC.val = ((isNaN(currentAC.val) || newAC) ? ac : (currentAC.val + ac - prevAC));
7411+
// if (currentAC.barName.startsWith('bar')) {
7412+
// if (currentAC.val != ac ) {
7413+
// curToken.set(currentAC.barName+'_max',ac);
7414+
// } else {
7415+
// curToken.set(currentAC.barName+'_max','');
7416+
// }
7417+
// curToken.set(currentAC.barName+'_value',currentAC.val);
7418+
// }
7419+
74127420
if (currentAC.barName.startsWith('bar')) {
7413-
if (currentAC.val != ac) {
7414-
curToken.set(currentAC.barName+'_max',ac);
7415-
} else {
7421+
prevAC = isNaN(prevAC) ? 10 : prevAC;
7422+
if (prevAC == currentAC.val || forceAC) {
7423+
curToken.set(currentAC.barName+'_value',ac);
74167424
curToken.set(currentAC.barName+'_max','');
7417-
}
7418-
curToken.set(currentAC.barName+'_value',currentAC.val);
7419-
}
7425+
} else {
7426+
currentAC.val = ((isNaN(currentAC.val)) ? ac : (currentAC.val + ac - prevAC));
7427+
if (currentAC.val != ac) {
7428+
curToken.set(currentAC.barName+'_max',ac);
7429+
} else {
7430+
curToken.set(currentAC.barName+'_max','');
7431+
}
7432+
curToken.set(currentAC.barName+'_value',currentAC.val);
7433+
};
7434+
};
74207435

74217436
setAttr( charCS, fields.StdAC, (ac+dmgAdj.armoured[dmgType]-dmgAdj.armoured.nadj) );
74227437
setAttr( charCS, fields.SlashAC, (ac+dmgAdj.armoured[dmgType]-dmgAdj.armoured.sadj) );
@@ -8663,7 +8678,7 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
86638678
} else {
86648679
sendDebug('senderId is defined as ' + getObj('player',senderId).get('_displayname'));
86658680
};
8666-
if (!flags.noWaitMsg && !args[0].toLowerCase().startsWith('nowaitmsg')) sendWait(senderId,1,'attkMaster');
8681+
if (!flags.noWaitMsg && args[0] && !args[0].toLowerCase().startsWith('nowaitmsg')) sendWait(senderId,1,'attkMaster');
86678682

86688683
_.each(args, function(e) {
86698684
setTimeout( doAttkCmd, (1*t++), e, selected, senderId, isGM );
@@ -8818,8 +8833,8 @@ var attackMaster = (function() { // eslint-disable-line no-unused-vars
88188833
const defClass = (classObjs.length == 1 && classObjs[0].name == 'creature' && classObjs[0].level == 0);
88198834
if ((race && race.length) || !defClass) {
88208835
ModTable = moveMods( obj, charCS, ModTable );
8821-
doCheckAC( [obj.id], findTheGM(), [], true );
8822-
doCheckMods( [obj.id,'quiet'], findTheGM(), [], true );
8836+
doCheckAC( [obj.id], findTheGM(), [], true, true );
8837+
doCheckMods( [obj.id,'quiet'], findTheGM(), [], true, true );
88238838
}
88248839
}
88258840
}

AttackMaster/script.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
"$schema": "https://github.com/DameryDad/roll20-api-scripts/blob/AttackMaster/AttackMaster/Script.json",
33
"name": "AttackMaster",
44
"script": "attackMaster.js",
5-
"version": "5.0.4",
6-
"previousversions": ["1.036","1.038","1.039","1.041","1.042","2.046","1.3.00","1.3.01","1.3.02","1.3.03","1.4.01","1.4.02","1.4.03","1.4.04","1.4.05","1.4.06","1.4.07","1.5.01","1.5.02","1.5.03","2.1.0","2.2.0","2.3.0","2.3.1","2.3.2","2.3.3","3.0.0","3.1.2","3.2.0","3.2.1","3.3.0","3.4.0","3.5.0","4.0.1","4.0.2","4.0.3","4.0.4","5.0.0","5.0.1","5.0.2","5.0.3"],
5+
"version": "5.0.5",
6+
"previousversions": ["1.036","1.038","1.039","1.041","1.042","2.046","1.3.00","1.3.01","1.3.02","1.3.03","1.4.01","1.4.02","1.4.03","1.4.04","1.4.05","1.4.06","1.4.07","1.5.01","1.5.02","1.5.03","2.1.0","2.2.0","2.3.0","2.3.1","2.3.2","2.3.3","3.0.0","3.1.2","3.2.0","3.2.1","3.3.0","3.4.0","3.5.0","4.0.1","4.0.2","4.0.3","4.0.4","5.0.0","5.0.1","5.0.2","5.0.3","5.0.4"],
77
"description": "AttackMaster API for AD&D 2E provides functions to manage weapons, armour & shields, including taking weapons in hand and using them to attack, ranged weapon range and ammo management; penalties & bonuses for non-proficiency, proficiency, specialisation & mastery; 1-handed, 2-handed or many-handed weapons, and multi-weapon attacks.\n[AttackMaster Documentation](https://wiki.roll20.net/Script:AttackMaster) \n\n### Related APIs\nThis API works best with the RPGMaster series of APIs\n[RPGMaster Documentation](https://wiki.roll20.net/RPGMaster) \n\n### Getting Started\n* After installation, add the commands `!attk --menu` and `!attk --other-menu` as Ability Macros on Character Sheets of Characters, NPCs & Monsters that will use the API, and tick 'Show as Token Action'. These menus will then be available to Players controlling those sheets and give access to all common commands used in game-play.",
88
"authors": "Richard E.",
99
"roll20userid": "6497708",

0 commit comments

Comments
 (0)