Files
roll20-character-sheets/Pathfinder Community/dev/src/PFBuffs.js
T

2283 lines
88 KiB
JavaScript

'use strict';
import _ from 'underscore';
import {PFLog, PFConsole} from './PFLog';
import TAS from './TheAaronSheet.js';
import * as SWUtils from './SWUtils';
import PFConst from './PFConst';
import * as PFUtils from './PFUtils';
import * as PFAbilityScores from './PFAbilityScores';
import * as PFSaves from './PFSaves';
import * as PFAttackGrid from './PFAttackGrid';
import * as PFAttacks from './PFAttacks';
import * as PFDefense from './PFDefense';
import * as PFHealth from './PFHealth';
import * as PFChecks from './PFChecks';
import * as PFInitiative from './PFInitiative';
import * as PFEncumbrance from './PFEncumbrance';
import * as PFSize from './PFSize';
import * as PFSkills from './PFSkills';
import * as PFBuffsOld from './PFBuffsOld';
export var
//values in the bonus dropdown
buffColumns = [
'ac', 'armor', 'attack', 'casterlevel', 'cha', 'cha_skills', 'check', 'check_ability', 'check_skills', 'cmb', 'cmb2', 'cmd', 'con', 'con_skills', 'crit_conf', 'customa1', 'customa10', 'customa11', 'customa12', 'customa2', 'customa3', 'customa4', 'customa5', 'customa6', 'customa7', 'customa8', 'customa9', 'dex', 'dex_skills', 'dmg', 'dmg_kineticblast', 'dmg_melee', 'dmg_melee2', 'dmg_power_attack', 'dmg_ranged', 'dmg_ranged2', 'flatfooted', 'fort', 'hptemp', 'initiative', 'int', 'int_skills', 'kineticblast', 'melee', 'melee2', 'natural', 'ranged', 'ranged2', 'ref', 'saves', 'shield', 'size', 'speed', 'spelldc_0', 'spelldc_1', 'spelldc_2', 'str', 'str_skills', 'touch', 'will', 'wis', 'wis_skills'],
//map of buffColumns to corresponding total field (buff_XYZ-total only XYZ portion)
buffToTot = {
'ac': 'AC', 'armor': 'armor', 'attack': 'attack', 'casterlevel': 'CasterLevel', 'cha': 'CHA', 'cha_skills': 'CHA_skills', 'check': 'Check', 'check_ability': 'check_ability', 'check_skills': 'check_skills', 'cmb': 'CMB', 'cmd': 'CMD', 'con': 'CON', 'con_skills': 'CON_skills', 'dex': 'DEX', 'dex_skills': 'DEX_skills', 'dmg': 'DMG', 'dmg_melee': 'dmg_melee', 'dmg_ranged': 'dmg_ranged', 'flatfooted': 'flat-footed', 'fort': 'Fort', 'hptemp': 'HP-temp', 'initiative': 'Initiative', 'int': 'INT', 'int_skills': 'INT_skills', 'melee': 'Melee', 'natural': 'natural', 'ranged': 'Ranged', 'ref': 'Ref', 'saves': 'saves', 'shield': 'shield', 'size': 'size', 'speed': 'speed', 'spelldc_0': 'SpellDC_0', 'spelldc_1': 'SpellDC_1', 'spelldc_2': 'SpellDC_2', 'str': 'STR', 'str_skills': 'STR_skills', 'touch': 'Touch', 'will': 'Will', 'wis': 'WIS', 'wis_skills': 'WIS_skills', 'melee2': 'melee2', 'ranged2': 'ranged2', 'cmb2': 'cmb2', 'dmg_melee2': 'dmg_melee2', 'dmg_ranged2': 'dmg_ranged2', 'kineticblast': 'kineticblast', 'dmg_kineticblast': 'dmg_kineticblast', 'dmg_power_attack': 'dmg_power_attack', 'customa1': 'customa1', 'customa2': 'customa2', 'customa3': 'customa3', 'customa4': 'customa4', 'customa5': 'customa5', 'customa6': 'customa6', 'customa7': 'customa7', 'customa8': 'customa8', 'customa9': 'customa9', 'customa10': 'customa10', 'customa11': 'customa11', 'customa12': 'customa12', 'crit_conf': 'crit_conf'
},
//only the total fields (buff_XYZ-total only XYZ portion) (no penalty fields)
totColumns = _.values(buffToTot).concat(['dodge']).sort(),
bonusTypes = ['alchemical', 'circumstance', 'competence', 'deflection', 'dodge', 'enhancement', 'inherent', 'insight', 'luck', 'morale', 'profane', 'racial', 'resistance', 'sacred', 'size', 'trait', 'untyped'];
//these have only their own type, enhancement, or untyped
var armorcols = ['armor', 'shield', 'natural'],
//buffsFFcmdOnlyTemp = '',
//map of buffs to other buffs that affect it. left is "parent" buff that is substracted from right
buffsAffectingOthers = {
'ac': ['cmd', 'touch', 'flatfooted'],
'attack': ['melee', 'ranged', 'cmb', 'melee2', 'ranged2', 'cmb2'],
'check': ['initiative', 'check_skills', 'check_ability', 'str_skills', 'dex_skills', 'con_skills', 'int_skills', 'wis_skills', 'cha_skills'],
'dmg': ['dmg_melee', 'dmg_ranged', 'dmg_melee2', 'dmg_ranged2'],
'dmg_melee': ['dmg_melee2'],
'dmg_ranged': ['dmg_ranged2'],
'saves': ['fort', 'ref', 'will'],
'check_skills': ['str_skills', 'dex_skills', 'con_skills', 'int_skills', 'wis_skills', 'cha_skills']
},
//reverse map of buffsAffectingOthers, left is "child" buff, buff on right added to (and checked for stacking)
affectedBuffs = {
'melee': ['attack'],
'melee2': ['melee', 'attack'],
'ranged': ['attack'],
'ranged2': ['ranged', 'attack'],
'cmb': ['attack'],
'cmb2': ['cmb', 'attack'],
'dmg_melee': ['dmg'],
'dmg_melee2': ['dmg_melee', 'dmg'],
'dmg_ranged': ['dmg'],
'dmg_ranged2': ['dmg_ranged', 'dmg'],
'cmd': ['ac'],
'flatfooted': ['ac'],
'touch': ['ac'],
'fort': ['saves'],
'ref': ['saves'],
'will': ['saves'],
'check_skills': ['check'],
'check_ability': ['check'],
'initiative': ['check_ability', 'check'],
'str_skills': ['check_skills', 'check'],
'dex_skills': ['check_skills', 'check'],
'con_skills': ['check_skills', 'check'],
'int_skills': ['check_skills', 'check'],
'wis_skills': ['check_skills', 'check'],
'cha_skills': ['check_skills', 'check']
},
//all total fields plus "_exists", INCLUDING penalty fields
buffTotFields = _.chain(totColumns).map(function (totstr) {
var isAbility = (PFAbilityScores.abilities.indexOf(totstr) >= 0) && totstr.indexOf('skill') < 1;
if (!isAbility) {
return ['buff_' + totstr + '-total', 'buff_' + totstr + '_exists'];
} else {
return ['buff_' + totstr + '-total', 'buff_' + totstr + '_exists', 'buff_' + totstr + '-total_penalty', 'buff_' + totstr + '_penalty_exists'];
}
}).flatten().value(),
//map of buffs to another map of bonus type to other fields on sheet of same bonus and type
otherCharBonuses = {
'str': {'inherent': 'STR-inherent', 'enhancement': 'STR-enhance'},
'dex': {'inherent': 'DEX-inherent', 'enhancement': 'DEX-enhance'},
'con': {'inherent': 'CON-inherent', 'enhancement': 'CON-enhance'},
'int': {'inherent': 'INT-inherent', 'enhancement': 'INT-enhance'},
'wis': {'inherent': 'WIS-inherent', 'enhancement': 'WIS-enhance'},
'cha': {'inherent': 'CHA-inherent', 'enhancement': 'CHA-enhance'},
'initiative': {'trait': 'init-trait'},
'fort': {'resistance': 'Fort-resist', 'trait': 'Fort-trait'},
'ref': {'resistance': 'Ref-resist', 'trait': 'Ref-trait'},
'will': {'resistance': 'Will-resist', 'trait': 'Will-trait'},
'ac': {'deflection': 'AC-deflect'},
'armor': {'armor': 'armor3-acbonus', 'enhancement': 'armor3-enhance'},
'shield': {'shield': 'shield3-acbonus', 'enhancement': 'shield3-enhance'},
'natural': {'natural': 'AC-natural'}
},
charHelperFields = {
'armor': ['armor3-equipped'],//,'use_piecemeal_armor'],
'shield': ['shield3-equipped']//,'use_piecemeal_armor']
},
//reverse otherCharBonuses: fields on sheet that affect buffs (all leaf nodes of otherCharBonuses)
charBonusFields = _.chain(otherCharBonuses).values().map(function (v) {return _.values(v);}).flatten().uniq().value().sort(),
//note fields
buffNoteFields = ['buff_attack_notes', 'buff_save_notes', 'buff_init_notes', 'buff_skill_notes', 'buff_defense_notes'],
//the buff field prefixes for each row
buffsPerRow = ['b1', 'b2', 'b3', 'b4', 'b5', 'b6'],
//bonus types that always stack don't need to use max (penalty is fake type used internally)
stackingTypes = ['untyped', 'circumstance', 'dodge', 'penalty'],
//these buff columns dont have bonus types use this to hide the type dropdown
bonusesWithNoTypes = ['size', 'hptemp'],
//all attributes on a buff row, to make getAttrs easier when totalling
buffRowAttrs = ['_b1-show', '_b1_val', '_b1_bonus', '_b1_bonustype',
'_b2-show', '_b2_val', '_b2_bonus', '_b2_bonustype',
'_b3-show', '_b3_val', '_b3_bonus', '_b3_bonustype',
'_b4-show', '_b4_val', '_b4_bonus', '_b4_bonustype',
'_b5-show', '_b5_val', '_b5_bonus', '_b5_bonustype',
'_b6-show', '_b6_val', '_b6_bonus', '_b6_bonustype',
'_enable_toggle', '_add_note_to_roll'],
events = {
// events pass in the column updated macro-text is "either", buffs are auto only
buffTotalNonAbilityEvents: {
"Fort": [PFSaves.updateSave],
"Will": [PFSaves.updateSave],
"Ref": [PFSaves.updateSave],
"STR_skills": [PFSkills.recalculateAbilityBasedSkills],
"DEX_skills": [PFSkills.recalculateAbilityBasedSkills],
"CON_skills": [PFSkills.recalculateAbilityBasedSkills],
"INT_skills": [PFSkills.recalculateAbilityBasedSkills],
"WIS_skills": [PFSkills.recalculateAbilityBasedSkills],
"CHA_skills": [PFSkills.recalculateAbilityBasedSkills],
"Melee": [PFAttackGrid.updateAttackGrid],
"Ranged": [PFAttackGrid.updateAttackGrid],
"CMB": [PFAttackGrid.updateAttackGrid],
"melee2": [PFAttackGrid.updateAttackGrid],
"ranged2": [PFAttackGrid.updateAttackGrid],
"cmb2": [PFAttackGrid.updateAttackGrid]
},
buffTotalAbilityEvents: {
"STR": [PFAbilityScores.updateAbilityScore],
"DEX": [PFAbilityScores.updateAbilityScore],
"CON": [PFAbilityScores.updateAbilityScore],
"INT": [PFAbilityScores.updateAbilityScore],
"WIS": [PFAbilityScores.updateAbilityScore],
"CHA": [PFAbilityScores.updateAbilityScore]
},
buffEventsTotalOnUpdate: {
"buff_Check-total": [PFSkills.updateAllSkillsDiff],
"buff_check_skills-total": [PFSkills.updateAllSkillsDiff]
},
// events do NOT pass in column updated
buffTotalEventsNoParam: {
"DMG": [PFAttacks.updateRepeatingWeaponDamages],
"dmg_ranged": [PFAttacks.updateRepeatingWeaponDamages],
"dmg_melee": [PFAttacks.updateRepeatingWeaponDamages],
"dmg_ranged2": [PFAttacks.updateRepeatingWeaponDamages],
"dmg_melee2": [PFAttacks.updateRepeatingWeaponDamages],
"dmg_power_attack": [PFAttacks.updateRepeatingWeaponDamages],
"saves": [PFSaves.updateSaves],
"attack": [PFAttackGrid.updateAttacks],
"AC": [PFDefense.updateDefenses],
"Touch": [PFDefense.updateDefenses],
"armor": [PFDefense.updateDefenses],
"shield": [PFDefense.updateDefenses],
"dodge": [PFDefense.updateDefenses],
"natural": [PFDefense.updateDefenses],
"flat-footed": [PFDefense.updateDefenses],
"CMD": [PFDefense.updateDefenses],
"HP-temp": [PFHealth.updateTempMaxHP],
"Check": [PFInitiative.updateInitiative],
"check_ability": [PFInitiative.updateInitiative],
"initiative": [PFInitiative.updateInitiative],
"speed": [PFEncumbrance.updateModifiedSpeed]
}
};
/** Copies buffs from repeating_buff to repeating_buff2
* Reverse engineers "to all attacks", "to all damage" etc
* @param {function} callback when done
*/
function mergeOldIntoNewBuffs (callback) {
var done = function (failed) {
//set checkbox
SWUtils.setWrapper({'merge_buffs_now': 0}, PFConst.silentParams, function () {
if (typeof callback === "function") {
callback();
}
});
};
PFBuffsOld.getAllRowAttrs(function (ids, v) {
var setter = {};
if (!ids || !v) {
done(1);
return;
}
//TAS.debug("OLD BUFFS ARE: ", ids, v);
ids.forEach(function (id) {
var prefix = 'repeating_buff_' + id + '_',
newId = '',
newprefix = '',
buffCounter = 0,
tempprefix = '',
buffprefix = '',
newBuffName = '',
buffs = [],
doneAttacks = 0,
doneAC = 0,
doneSaves = 0;
try {
//filter for attribute/ values from v for this id row:
//then filter for buffs w macro-text only (to get one val per row, and only where user entered text, cause others there too w/defaults
//then get the attr name from the macro text attribute (after id_, before _macro-text)
//then filter for buffs where -show is 1
buffs = Object.keys(v).filter(function (attr) {
return (attr.indexOf(prefix) === 0);
}).filter(function (attr) {
return (/size$|macro\-text$/i).test(attr);
}).filter(function (macroattr) {
if (v[macroattr]) {
return true;
}
return false;
}).map(function (attr) {
if (attr.indexOf('size') >= 0) {
return 'size';
}
return SWUtils.getAttributeName(attr).slice(5, -11); //get only the buff name
}).filter(function (attr) {
return (parseInt(v[prefix + 'buff-' + attr + '-show'], 10) === 1); //only where -show checked
});
//TAS.debug("BUFFS MERGE LEFT ON ROW "+id+" are ",buffs);
//if any left then create new buff2 row
if (_.size(buffs)) {
newId = generateRowID();
newprefix = 'repeating_buff2_' + newId + '_';
tempprefix = newprefix + 'b';
setter[newprefix + 'enable_toggle'] = v[prefix + 'buff-enable_toggle'] || '0';
setter[newprefix + 'name'] = v[prefix + 'buff-name'] || '';
if (v[prefix + 'buff-notes']) {
setter[newprefix + 'notes'] = v[prefix + 'buff-notes'];
}
//size has special handling
if (buffs.indexOf('size') >= 0) {
//TAS.debug("adding buff for size");
buffCounter++;
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '-show'] = 1;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-size'];
setter[buffprefix + '_val'] = v[prefix + 'buff-size'];
setter[buffprefix + '_bonus'] = 'size';
buffs = _.without(buffs, 'size');
}
//check for buffs that should be combined into 1:
if (buffs.indexOf('CMD') >= 0 && buffs.indexOf('AC') >= 0) {
if (parseInt(v[prefix + 'buff-AC'], 10) === parseInt(v[prefix + 'buff-CMD'], 10)) {
//TAS.debug('both ac and cmd');
buffCounter++;
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '-show'] = 1;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-AC_macro-text'];
setter[buffprefix + '_val'] = v[prefix + 'buff-AC'];
setter[buffprefix + '_bonus'] = 'ac';
if (buffs.indexOf('Touch')) {
setter[buffprefix + '_bonustype'] = 'deflection';
} else {
setter[buffprefix + '_bonustype'] = 'untyped';
}
//if flat footed assume uncanny dodge already so will be built in
buffs = _.without(buffs, 'AC', 'CMD', 'flat-footed', 'Touch');
}
}
if (buffs.indexOf('Melee') >= 0 && buffs.indexOf('Ranged') >= 0) {
//assume they did not add CMB since it is brand new
if (parseInt(v[prefix + 'buff-Melee'], 10) === parseInt(v[prefix + 'buff-Ranged'], 10)) {
//TAS.debug('both melee and ranged');
buffCounter++;
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '-show'] = 1;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-Melee_macro-text'];
setter[buffprefix + '_val'] = v[prefix + 'buff-Melee'];
setter[buffprefix + '_bonus'] = 'attack';
setter[buffprefix + '_bonustype'] = 'untyped';
buffs = _.without(buffs, 'Melee', 'Ranged', 'CMB');
}
}
if (buffs.indexOf('Fort') >= 0 && buffs.indexOf('Will') >= 0 && buffs.indexOf('Ref') >= 0) {
if (parseInt(v[prefix + 'buff-Fort'], 10) === parseInt(v[prefix + 'buff-Will'], 10) === parseInt(v[prefix + 'buff-Ref'], 10)) {
//TAS.debug('all saves');
buffCounter++;
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '-show'] = 1;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-Fort_macro-text'];
setter[buffprefix + '_val'] = v[prefix + 'buff-Fort'];
setter[buffprefix + '_bonus'] = 'saves';
setter[buffprefix + '_bonustype'] = 'untyped';
buffs = _.without(buffs, 'Fort', 'Will', 'Ref');
}
}
if (buffs.indexOf('Check') >= 0 && buffs.indexOf('check_skills') >= 0) {
if (parseInt(v[prefix + 'buff-Check'], 10) === parseInt(v[prefix + 'buff-check_skills'], 10)) {
//TAS.debug('both Check and check_skills');
buffCounter++;
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '-show'] = 1;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-Check_macro-text'];
setter[buffprefix + '_val'] = v[prefix + 'buff-Check'];
setter[buffprefix + '_bonus'] = 'check';
setter[buffprefix + '_bonustype'] = 'untyped';
buffs = _.without(buffs, 'Check', 'check_skills');
}
}
if (buffs.indexOf('DMG') >= 0 && buffs.indexOf('DMG_ranged') >= 0) {
if (parseInt(v[prefix + 'buff-DMG'], 10) === parseInt(v[prefix + 'buff-DMG_ranged'], 10)) {
//TAS.debug("found all damage");
buffCounter++;
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-DMG_macro-text'];
setter[buffprefix + '_val'] = v[prefix + 'buff-DMG'];
setter[buffprefix + '_bonus'] = 'dmg';
setter[buffprefix + '_bonustype'] = 'untyped';
setter[buffprefix + '-show'] = 1;
buffs = _.without(buffs, 'DMG', 'DMG_ranged');
}
}
//loop through any buffs left
//TAS.debug("NON SPECIAL BUFFS LEFT: ",buffs);
buffs.forEach(function (buff) {
//TAS.debug("adding buff "+buff+" to setter, macro is "+v[prefix+'buff-'+buff+'_macro-text']);
buffCounter++;
if (buffCounter > 6) {
buffCounter = 1;
newId = generateRowID();
newprefix = 'repeating_buff2_' + newId + '_';
tempprefix = newprefix + 'b';
setter[newprefix + 'enable_toggle'] = v[prefix + 'buff-enable_toggle'];
setter[newprefix + 'name'] = v[prefix + 'buff-name'];
}
buffprefix = tempprefix + buffCounter;
setter[buffprefix + '-show'] = 1;
setter[buffprefix + '_macro-text'] = v[prefix + 'buff-' + buff + '_macro-text'];
setter[buffprefix + '_val'] = v[prefix + 'buff-' + buff] || 0;
newBuffName = buff.toLowerCase().replace('-', '');
if (newBuffName === 'check') {
newBuffName = 'check_ability';
} else if (newBuffName === 'dmg') {
newBuffName = 'dmg_melee';
}
setter[buffprefix + '_bonus'] = newBuffName;
setter[buffprefix + '_bonustype'] = 'untyped';
});
}
} catch (erri) {
TAS.error("Buff copy error for " + id + " " + (v['repeating_buff_' + id + '_buff-name'] || ''), erri);
}
});
if (_.size(setter)) {
TAS.debug("##############################", "MERGE BUFFS NEW BUFFS ARE: ", setter);
SWUtils.setWrapper(setter, PFConst.silentParams, done);
//done();
} else {
done();
}
});
}
/** Looks at add_note_to_roll attribute of row and sets notes appropriately.
* @param {string} id id of row to calculate on
* @param {Map<string,string>} v from getAttrs
* @param {Map<string,string>} setter map to write to for setAttrs, optional
* @returns {Map<string,string>} setter or new map for setAttrs
*/
function getBuffNotes (id, v, setter) {
var idStr = SWUtils.getRepeatingIDStr(id),
prefix = 'repeating_buff2_' + idStr,
notestr = '', buffstr = '', notefield = '', notereg, addNote = 0, tempstr = '';
try {
setter = setter || {};
if (v[prefix + 'add_note_to_roll']) {
notefield = 'buff_' + v[prefix + 'add_note_to_roll'] + '_notes';
}
if (parseInt(v[prefix + 'enable_toggle'], 10) === 1 && notefield) {
addNote = 1;
}
buffstr = SWUtils.getTranslated('buff');
notestr = '**' + buffstr + ": @{" + prefix + 'name}:** @{' + prefix + 'notes}';
notereg = new RegExp(SWUtils.escapeForRegExp(notestr), 'i');
if (notefield) {
tempstr = v[notefield] || '';
//TAS.debug("the note is "+tempstr);
if (!tempstr) {
if (addNote) {
setter[notefield] = notestr;
}
} else if (notereg.test(tempstr)) {
if (!addNote) {
setter[notefield] = tempstr.replace(notereg, '');
}
} else if (addNote) {
setter[notefield] = tempstr + notestr;
}
buffNoteFields.forEach(function (note) {
if (note !== notefield) {
tempstr = v[note];
if (tempstr) {
tempstr = tempstr.replace(notereg, '');
if (tempstr !== v[note]) {
setter[note] = tempstr;
}
}
}
});
} else {
//delete from all
buffNoteFields.forEach(function (note) {
tempstr = v[note];
if (tempstr) {
tempstr = tempstr.replace(notereg, '');
if (tempstr !== v[note]) {
setter[note] = tempstr;
}
}
});
}
} catch (er) {
} finally {
return setter;
}
}
/**Looks at add_note_to_roll attribute of row and sets notes appropriately.
* calls getBuffNotes
* @param {string} id id of row, optional
* @param {object} eventInfo from on function, either id or this must be populated.
*/
function addNoteAsync (id, eventInfo) {
var idStr, prefix, fields;
if (!id && !eventInfo) {
return;
}
id = id || SWUtils.getRowId(eventInfo.sourceAttribute);
idStr = SWUtils.getRepeatingIDStr(id);
prefix = 'repeating_buff2_' + idStr;
fields = buffNoteFields.concat([prefix + 'add_note_to_roll', prefix + 'enable_toggle']);
//TAS.debug("the fields are ",fields);
getAttrs(fields, function (v) {
var setter = getBuffNotes(id, v);
if (_.size(setter)) {
//TAS.debug('PFBuffs set notes',setter);
SWUtils.setWrapper(setter, PFConst.silentParams);
}
});
}
/** sets all buff totals to 0, and the buff notes fields to blank.
* @param {function} callback
* @param {boolean} silently
*/
export function clearBuffTotals (callback, silently) {
var done = function () {
if (typeof callback === "function") {
callback();
}
};
//TAS.notice("the total fields are ",buffTotFields2);
getAttrs(buffTotFields, function (v) {
var setter = {}, params = {};
//TAS.debug("PFBuffs.clearBuffTotals we got back the following: ",v);
//TAS.notice("now using ",totColumns);
setter = _.reduce(totColumns, function (memo, col) {
var val = parseInt(v['buff_' + col + '-total'], 10) || 0,
exists = parseInt(v['buff_' + col + '_exists'], 10) || 0;
if (val) {
memo['buff_' + col + '-total'] = 0;
}
if (exists) {
memo['buff_' + col + '_exists'] = 0;
}
return memo;
}, {});
//zero ability penalties
setter = _.reduce(PFAbilityScores.abilities, function (memo, col) {
var val = parseInt(v['buff_' + col + '-total_penalty'], 10) || 0,
exists = parseInt(v['buff_' + col + '_penalty_exists'], 10) || 0;
if (val) {
memo['buff_' + col + '-total_penalty'] = 0;
}
if (exists) {
memo['buff_' + col + '_penalty_exists'] = 0;
}
return memo;
}, setter);
//clear notes
buffNoteFields.forEach(function (attr) {
setter[attr] = '';
});
if (_.size(setter)) {
if (silently) {
params = PFConst.silentParams;
}
SWUtils.setWrapper(setter, params, done);
} else {
done();
}
});
}
/** Gets list of buffs from the buff rows for so we don't have to keep looping through the ids.
* Returns between 0 to 6 "rows" for each id, each corresponds to b1..b6 buffs.
* only returns buffs where -show is 1 and _val is != 0 (i.e. ones that exist for totalling)
* @param {[string]} ids ids for list
* @param {Map<string,string>} v from getAttrs
* @param {string} col optional, buff to limit on. If supplied, only returns buffs where bonus =col, plus any related buffs
* @returns {[{'bonus':string,'bonusType':string,'val':Number}]} array of entries from rows
*/
function assembleRows (ids, v, col) {
var relatedBuffsL = [];
if (col) {
relatedBuffsL = affectedBuffs[col] || [];
relatedBuffsL = relatedBuffsL.concat(buffsAffectingOthers[col] || []);
}
//TAS.debug("assembleRows for "+col + " includes fields "+ relatedBuffsL);
var rows = ids.reduce(function (m, id) {
var valArray, prefix = 'repeating_buff2_' + id + '_';
try {
valArray = buffsPerRow.reduce(function (im, n) {
var innerPrefix = prefix + n,
bonusField = innerPrefix + '_bonus', vals = {};
try {
//TAS.debug("assembleRows looking at "+ bonusField +" = " + v[bonusField] + " show is "+ v[innerPrefix+'-show']);
if (v[bonusField] && parseInt(v[innerPrefix + '-show'], 10) === 1) {
if (!col || v[bonusField] === col || relatedBuffsL.indexOf(v[bonusField]) >= 0) {
vals.bonus = v[bonusField];
vals.val = parseInt(v[innerPrefix + '_val'], 10) || 0;
if (vals.bonus === 'size') {
vals.bonusType = vals.bonus;
} else if (vals.bonus === 'hptemp') {
vals.bonusType = 'untyped';
} else if (armorcols.indexOf(vals.bonus) >= 0) {
//TAS.debug("PFBUFFS rows type: "+vals.bonus+" is "+ v[innerPrefix+'_bonustype']);
if (v[innerPrefix + '_bonustype'] === 'enhancement') {
vals.bonusType = 'enhancement';
} else {
vals.bonusType = vals.bonus;
}
} else {
vals.bonusType = v[innerPrefix + '_bonustype'] || 'untyped';
}
//TAS.debug("adding the set ",vals);
im.push(vals);
}
}
} catch (er2) {
TAS.error("PFBuffs.assembleRows col:" + col + ", row:" + id + ", buff:" + n, er2);
} finally {
return im;
}
}, []);
if (valArray && _.size(valArray)) {
//TAS.debug("assembleRows this row had these",valArray);
m = m.concat(valArray);
}
} catch (erri3) {
TAS.error("PFBuffs.assembleRows erri3:", erri3);
} finally {
return m;
}
}, []);
//TAS.debug("assembleRows returning with ",rows);
return rows;
}
/** Calculates total for given bonus and returns it in setter map. Synchronous.
* @param {string} col which bonus we are calculating (val from 'bonus' dropdown)
* @param {[{'bonus':string,'bonusType':string,'val':Number}]} rows output from assembleRows
* @param {Map<string,string>} v from getAttrs
* @param {Map<string,string>} setter map to write to for setAttrs, optional
* @returns {Map<string,string>} setter or new map for setAttrs
*/
function updateBuffTotal (col, rows, v, setter) {
var isAbility = 0,
bonuses = {},
sums = {'sum': 0, 'pen': 0},
tempInt = 0,
totaldodge = 0, tempdodge = 0,
totalcol = '',
isWorn = 1,
//stackArmor=0,
columns = [col];
try {
//TAS.debug("total sync for "+col,rows,v);
setter = setter || {};
isAbility = (PFAbilityScores.abilities.indexOf(col) >= 0) && col.indexOf('skill') < 9;
if (affectedBuffs[col]) {
columns = columns.concat(affectedBuffs[col]);
}
rows = rows.filter(function (row) {
if (columns.indexOf(row.bonus) >= 0) {
return 1;
}
return 0;
});
if (rows && _.size(rows)) {
TAS.debug("PFBUFFS ROWS NOW:", rows);
if (col === 'hptemp') {
//hptemp=alwaysstack
sums.sum = rows.filter(function (row) {
return row.val > 0;
}).reduce(function (m, row) {
m += (row.val || 0);
return m;
}, 0);
} else if (col === 'size') {
//size=neverstack , negative is not a penalty
sums = rows.reduce(function (m, row) {
if (row.val > 0) {
m.sum = Math.max(m.sum, row.val);
} else if (row.val < 0) {
m.pen = Math.min(m.pen, row.val);
}
return m;
}, sums);
sums.sum += sums.pen;
} else {
//if (col==='armor'||col==='shield'){
// stackArmor = 0;//parseInt(v.use_piecemeal_armor,10)||0;
//}
//stack all rows
bonuses = rows.reduce(function (m, row) {
if (row.bonus === col) {
if (row.val < 0) {
m.penalty = (m.penalty || 0) + row.val;
} else if (stackingTypes.includes(row.bonusType)) { // || stackArmor ) {
m[row.bonusType] = (m[row.bonusType] || 0) + row.val;
} else {
m[row.bonusType] = Math.max((m[row.bonusType] || 0), row.val);
}
}
return m;
}, {});
//subtract any nonstacking parent buffs affecting it:
if (_.size(columns) > 1) {
bonuses = rows.reduce(function (m, row) {
if (stackingTypes.indexOf(row.bonusType) < 0 &&
affectedBuffs[col].indexOf(row.bonus) >= 0 &&
row.val > 0 && m[row.bonusType] > 0) {
if (row.val < m[row.bonusType]) {
m[row.bonusType] -= row.val;
} else {
m[row.bonusType] = 0;
}
}
return m;
}, bonuses);
}
if (!((col === 'armor' && bonuses.armor > 0) || (col === 'shield' && bonuses.shield > 0))) {
//subtract charsheet fields (charField) that overlap:
_.each(otherCharBonuses[col], function (charField, bonusType) {
TAS.debug("PFBUFFS ################## type:" + bonusType + ", comparing to " + charField);
if (bonuses[bonusType]) {
tempInt = parseInt(v[charField], 10) || 0;
if (bonuses[bonusType] <= tempInt) {
bonuses[bonusType] = 0;
} else {
bonuses[bonusType] -= tempInt;
}
}
});
//NOW START SUMMING
//if ability, penalty is applied seperately
if (isAbility && _.contains(bonuses, 'penalty')) {
sums.pen = bonuses.penalty;
bonuses.penalty = 0;
}
//if ac,touch,cmd,flatfooted, copy dodge out
if (col === 'ac' && bonuses.dodge) {
if (col === 'ac') {
totaldodge += bonuses.dodge;
}
bonuses.dodge = 0;
}
sums.sum = _.reduce(bonuses, function (m, bonus, bonusType) {
m += bonus;
return m;
}, 0);
} else {
//if armor or shield then compare both
//if only enhance then is ok to use above
TAS.debug("PFBUFFS ac bonsuses ", bonuses, otherCharBonuses[col]);
sums.sum = _.reduce(bonuses, function (m, bonus, bonusType) {
if (bonus > 0) {
m += bonus;
}
return m;
}, 0);
sums.pen = _.reduce(bonuses, function (m, bonus, bonusType) {
if (bonus < 0) {
m += bonus;
}
return m;
}, 0);
//if (!stackArmor){ ]
isWorn = parseInt(v[col + '3-equipped'], 10) || 0;
tempInt = 0;
if (isWorn) {
tempInt = _.reduce(otherCharBonuses[col], function (tot, charField, bonusType) {
tot += parseInt(v[charField], 10) || 0;
return tot;
}, 0);
}
if (sums.sum > 0 && tempInt > 0) {
if (sums.sum <= tempInt) {
sums.sum = 0;
} else if (sums.sum > tempInt) {
sums.sum -= tempInt;
}
}
if (sums.pen !== 0) {
sums.sum += sums.pen;
}
}
}
}
if (col === 'ac') {
TAS.info("column is AC, setting dodge to " + totaldodge);
//this means we ignore dodge, deflection to touch, cmd, flatfooted
tempdodge = parseInt(v['buff_dodge-total'], 10) || 0;
//ignore dodge and deflect for any other than ac
if (totaldodge !== tempdodge) {
setter['buff_dodge-total'] = totaldodge;
}
tempInt = parseInt(v['buff_dodge_exists'], 10) || 0;
if (totaldodge && !tempInt) {
setter['buff_dodge_exists'] = 1;
} else if (tempInt && !totaldodge) {
setter['buff_dodge_exists'] = 0;
}
}
// section added below to prevent cmd(type:dodge) buff from being included with cmdff
if(col==='cmd' && bonuses.dodge!==0) {
TAS.info('column is CMD, setting buffsFFcmdOnlyTemp to dodge buff:'+bonuses.dodge);
let buffsFFcmdOnlyTemp = bonuses.dodge;
setter['buff_ffCMD-nododge'] = buffsFFcmdOnlyTemp || 0;
TAS.info('buff_ffCMD-nododge now set same as dodge buff:'+buffsFFcmdOnlyTemp);
}
totalcol = buffToTot[col];
if (totalcol) {
if (parseInt(v['buff_' + totalcol + '-total'], 10) !== sums.sum) {
setter['buff_' + totalcol + '-total'] = sums.sum;
}
tempInt = parseInt(v['buff_' + totalcol + '_exists'], 10) || 0;
if (sums.sum !== 0 && tempInt === 0) {
setter['buff_' + totalcol + '_exists'] = 1;
} else if (sums.sum === 0 && tempInt === 1) {
setter['buff_' + totalcol + '_exists'] = 0;
}
if (isAbility) {
if (parseInt(v['buff_' + totalcol + '-total_penalty'], 10) !== sums.pen) {
setter['buff_' + totalcol + '-total_penalty'] = sums.pen;
}
tempInt = parseInt(v['buff_' + totalcol + '_penalty_exists'], 10) || 0;
if (sums.pen !== 0 && tempInt === 0) {
setter['buff_' + totalcol + '_penalty_exists'] = 1;
} else if (sums.pen === 0 && tempInt === 1) {
setter['buff_' + totalcol + '_penalty_exists'] = 0;
}
}
} else {
TAS.error("PFBuffs.updateBuffTotal cannot find total column corresponding to " + col);
}
} catch (err) {
TAS.error("PFBuffs.updateBuffTotal", err);
} finally {
TAS.debug("######################", "PFBuffs setting ", setter);
return setter;
}
}
/** update total for given buff. calls assembleRows, updateBuffTotal for the column.
* @param {string} col the bonus/buff to calculate
* @param {function} callback when done
* @param {boolean} silently if set with silent true
*/
function updateBuffTotalAsync (col, callback, silently) {
var done = _.once(function () {
//TAS.debug("leaving PFBuffs.updateBuffTotalAsync for "+col);
if (typeof callback === "function") {
callback();
}
}),
isAbility = (PFAbilityScores.abilities.indexOf(col) >= 0) && col.indexOf('skill') < 0;
//TAS.debug("totalling async vfor "+ col);
getSectionIDs('repeating_buff2', function (ids) {
var fields, totfields, otherfields, totals = [], columnsToGet = [], columnsToUpdate = [];
if (ids && _.size(ids)) {
try {
fields = SWUtils.cartesianAppend(['repeating_buff2_'], ids, buffRowAttrs);
//columns = concat(buffsAffectingOthers[col]||[]).concat(affectedBuffs[col]||[]);
columnsToGet = [col];
columnsToUpdate = [col];
if (buffsAffectingOthers[col]) {
columnsToGet = columnsToGet.concat(buffsAffectingOthers[col]);
columnsToUpdate = columnsToUpdate.concat(buffsAffectingOthers[col]);
}
if (affectedBuffs[col]) {
columnsToGet = columnsToGet.concat(affectedBuffs[col]);
}
totals = columnsToUpdate.map(function (b) {return buffToTot[b];});
if (col === 'ac') {
totals.push('dodge')
}
totfields = totals.map(function (t) {return 'buff_' + t + '-total'}).concat(
totals.map(function (t) {return 'buff_' + t + '_exists'}));
if (isAbility) {
totfields = totfields.concat(['buff_' + buffToTot[col] + '-total_penalty', 'buff_' + buffToTot[col] + '_penalty_exists']);
}
fields = fields.concat(totfields);
fields = fields.concat(buffNoteFields);
otherfields = columnsToGet.reduce(function (m, c) {
if (otherCharBonuses[c]) {
_.each(otherCharBonuses[c], function (bonus, bonustype) {
m.push(bonus);
});
}
return m;
}, []);
if (_.size(otherfields)) {
fields = fields.concat(otherfields);
}
if (col === 'armor') {
fields.push('armor3-equipped');
//fields.push('use_piecemeal_armor');
} else if (col === 'shield') {
fields.push('shield3-equipped');
//fields.push('use_piecemeal_armor');
}
} catch (outerr) {
TAS.error("PFBUffs.updateBuffTotalAsync2 " + col + " error before getAttrs", outerr);
done();
return;
}
//TAS.debug("updateBuffTotalAsync fields ",fields,'#######################################');
getAttrs(fields, function (v) {
var rows, params = {}, setter = {}, diff = 0;
try {
//TAS.debug("PFBuffsasync got for "+ col+" v is",v);
//don't need to put this in different loop but do it for future since when we move to multi column at once will need.
ids = ids.filter(function (id) {
return (parseInt(v['repeating_buff2_' + id + '_enable_toggle'], 10) || 0);
});
//TAS.debug("PFBuffsasync there are " +_.size(ids)+" rows" );
if (_.size(ids)) {
rows = assembleRows(ids, v, col);
//TAS.debug("PFBUFFSASYNC rows ",rows);
setter = columnsToUpdate.reduce(function (m, c) {
return updateBuffTotal(c, rows, v, m);
}, setter);
} else {
clearBuffTotals();
}
} catch (errou) {
TAS.error("PFBuffs.updateBuffTotalAsync errou on col " + col, errou);
} finally {
if (_.size(setter)) {
if (silently) {
params = PFConst.silentParams;
}
_.each(setter, function (val, key) {
if (events.buffEventsTotalOnUpdate[key]) {
var tempint = parseInt(v[key], 10) || 0;
diff += (parseInt(val, 10) - tempint);
}
});
if (diff) {
PFSkills.updateAllSkillsDiff(diff, 0);
}
SWUtils.setWrapper(setter, params, done);
} else {
done();
}
}
});
} else {
clearBuffTotals(callback);
}
});
}
/** Updates all buff totals
* @param {function} callback
* @param {boolean} silently
* @param {Map} eventInfo
*/
function updateAllBuffTotalsAsync (callback, silently, eventInfo) {
var done = _.once(function () {
//TAS.debug("leaving PFBuffs.updateBuffTotalAsync for "+col);
if (typeof callback === "function") {
callback();
}
});
getSectionIDs('repeating_buff2', function (ids) {
var fields, buffRepFields;
if (!ids || _.size(ids) === 0) {
clearBuffTotals(done, silently);
return;
}
fields = SWUtils.cartesianAppend(['repeating_buff2_'], ids, buffRowAttrs);
fields = fields.concat(buffTotFields);
fields = fields.concat(charBonusFields);
fields = fields.concat(['armor3-equipped', 'shield3-equipped']);//,'use_piecemeal_armor']);
//TAS.debug("##########################","added in " , charBonusFields);
//don't need to get notes since we're forcing a reset
//fields = fields.concat(buffNoteFields);
getAttrs(fields, function (v) {
var rows = [], params = {}, setter = {};
try {
ids = ids.filter(function (id) {
return (parseInt(v['repeating_buff2_' + id + '_enable_toggle'], 10) || 0);
});
if (!ids || _.size(ids) === 0) {
clearBuffTotals(done, silently);
return;
}
//start with blank notes to force reset
buffNoteFields.forEach(function (attr) {
setter[attr] = '';
v[attr] = '';
});
//TAS.debug("PFBuffs.updateAllBuffTotalsAsync2 v is",v);
setter = ids.reduce(function (m, id) {
m = getBuffNotes(id, v, m);
v = _.extend(v, m); // copy any updates back for next pass
return m;
}, setter);
//now calculate totals.
rows = assembleRows(ids, v);
_.each(buffColumns, function (col) {
setter = updateBuffTotal(col, rows, v, setter);
});
} catch (errou) {
TAS.error("PFBuffs.updateAllBuffTotalsAsync2 errou on col ", errou);
} finally {
if (_.size(setter)) {
//TAS.debug("######################","PFBuffs.updateAllBuffTotalsAsync2 setting ",setter);
if (silently) {
params = PFConst.silentParams;
}
SWUtils.setWrapper(setter, params, done);
} else {
done();
}
}
});
});
}
/**Sets 1 or 0 for buffexists in status panel (only for recalculate)
* REFACTOR: i think this can be deleted
* @param {function} callback when done
*/
function resetStatuspanel (callback) {
var done = _.once(function () {if (typeof callback === "function") {callback();} });
getAttrs(buffTotFields, function (v) {
var setter = {},
getExists = function (pre, post) {
var val, exists;
post = post || '';
val = parseInt(v[pre + "-total" + post], 10) || 0;
exists = parseInt(v[pre + post + "_exists"], 10) || 0;
if (val !== 0 && !exists) {
return 1;
}
if (val === 0 && exists) {
return 0;
}
return -1;
};
try {
setter = _.reduce(totColumns, function (memo, col) {
var pre, v;
pre = "buff_" + col;
v = getExists(pre, '');
if (v === 1 || v === 0) {
memo[pre + '_exists'] = v;
}
return memo;
}, setter);
setter = _.reduce(PFAbilityScores.abilities, function (memo, col) {
var pre, v;
pre = "buff_" + col;
v = getExists(pre, '_penalty');
if (v === 1 || v === 0) {
memo[pre + '_penalty_exists'] = v;
}
return memo;
}, setter);
} catch (err) {
TAS.error("PFBuffs.resetStatuspanel2 error inside calculate exists", err);
} finally {
if (_.size(setter) > 0) {
SWUtils.setWrapper(setter, PFConst.silentParams, done);
} else {
done();
}
}
});
}
function reEvaluateCustomMacros (callback, silently) {
var done = _.once(function () {
if (typeof callback === "function") {
callback();
}
}),
buffRowMacros2 = ['_b1-show', '_b1_val', '_b1_macro-text',
'_b2-show', '_b2_val', '_b2_macro-text',
'_b3-show', '_b3_val', '_b3_macro-text',
'_b4-show', '_b4_val', '_b4_macro-text',
'_b5-show', '_b5_val', '_b5_macro-text',
'_b6-show', '_b6_val', '_b6_macro-text',
'_enable_toggle'],
recalculateBuffRow = function (callback, id, v) {
var buffDone = _.after(6, callback);
try {
buffsPerRow.forEach(function (b) {
if (parseInt(v['repeating_buff2_' + id + '_enable_toggle'], 10) &&
parseInt(v['repeating_buff2_' + id + '_' + b + '-show'], 10)) {
SWUtils.evaluateAndSetNumber('repeating_buff2_' + id + '_' + b + '_macro-text', 'repeating_buff2_' + id + '_' + b + '_val', 0, buffDone, true);
} else {
buffDone();
}
});
} catch (err) {
TAS.error("PFBuffs.reEvaluateCustomMacros2: rowid" + id, err);
buffDone();
}
};
getSectionIDs("repeating_buff", function (ids) {
//TAS.debug("PFBuffs.recalculate there are " + _.size(ids) + " rows and " + numColumns + " columns");
var fields;
try {
if (_.size(ids) > 0) {
fields = SWUtils.cartesianAppend(['repeating_buff2_'], ids, buffRowMacros2);
getAttrs(fields, function (v) {
var numRows = _.size(ids),
doneRow = _.after(numRows, done);
ids.forEach(function (id) {
recalculateBuffRow(doneRow, id, v);
});
});
} else {
clearBuffTotals(done);
}
} catch (err) {
TAS.error("PFBuffs.reEvaluateCustomMacros2", err);
//what to do? just quit
done();
}
});
}
/**
*
* @param {string} name name of buff from dropdown
* @param {Map<string,string>} v attributes for con, speed, level
* @param {boolean} onByDefault 1 or 0, 1 means enable buff on creation
* @returns {Map<string,string>} to pass to setAttrs
*/
function getCommonBuffEntries (name, v, onByDefault) {
var id, prefix = '', setter = {},
calc = 0, conmod = 0, speed = 0, level = 0, tempint = 0, bab = 0;
if (!name) {
return setter;
}
id = generateRowID();
prefix = 'repeating_buff2_' + id + '_';
setter[prefix + 'enable_toggle'] = onByDefault ? 1 : 0;
setter[prefix + 'tabcat2'] = '1';
if (v) {
conmod = parseInt(v['CON-mod'], 10);
speed = parseInt(v['speed-base'], 10);
level = parseInt(v['level'], 10);
bab = parseInt(v['bab'], 10);
if (!(isNaN(conmod) || isNaN(speed) || isNaN(level) || isNaN(bab))) {
calc = 1;
}
}
//TAS.debug("adding common buff for :"+name+" should calc is:"+calc,v);
switch (name) {
case 'rage':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-rage');
setter[prefix + 'bufftype'] = 'class';
setter[prefix + 'tabcat'] = 'class';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'str';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '4 + min(4,2*(floor(@{level}/11)+floor(@{level}/20)))';
if (calc === 1) {
if (level < 11) {
tempint = 4;
} else if (level === 20) {
tempint = 8;
} else {
tempint = 6;
}
} else {
tempint = 4;
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'con';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '4 + min(4,2*(floor(@{level}/11)+floor(@{level}/20)))';
setter[prefix + 'b2_val'] = tempint;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ac';
setter[prefix + 'b3_bonustype'] = 'untyped';
setter[prefix + 'b3_macro-text'] = '-2';
setter[prefix + 'b3_val'] = -2;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'will';
setter[prefix + 'b4_bonustype'] = 'morale';
setter[prefix + 'b4_macro-text'] = '2 + min(4,(floor(@{level}/11)+floor(@{level}/20)))';
tempint = tempint / 2;
setter[prefix + 'b4_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'skill';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-rage-note');
setter[prefix + 'description-show'] = 1;
break;
case 'unchainedrage':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-rage-unchained');
setter[prefix + 'bufftype'] = 'class';
setter[prefix + 'tabcat'] = 'class';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'melee';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = '2 + min(2,(floor(@{level}/11)+floor(@{level}/20)))';
if (calc === 1) {
if (level < 11) {
tempint = 2;
} else if (level === 20) {
tempint = 4;
} else {
tempint = 3;
}
} else {
tempint = 2;
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg_melee';
setter[prefix + 'b2_bonustype'] = 'untyped';
setter[prefix + 'b2_macro-text'] = '2 + min(2,(floor(@{level}/11)+floor(@{level}/20)))';
setter[prefix + 'b2_val'] = tempint;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ac';
setter[prefix + 'b3_bonustype'] = 'untyped';
setter[prefix + 'b3_macro-text'] = '-2';
setter[prefix + 'b3_val'] = -2;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'will';
setter[prefix + 'b4_bonustype'] = 'untyped';
setter[prefix + 'b4_macro-text'] = '2 + min(2,(floor(@{level}/11)+floor(@{level}/20)))';
tempint = tempint;
setter[prefix + 'b4_val'] = tempint;
setter[prefix + 'b5-show'] = 1;
setter[prefix + 'b5_bonus'] = 'hptemp';
setter[prefix + 'b5_hide'] = 1;
setter[prefix + 'b5_macro-text'] = '@{level}*(2+(floor(@{level}/11)+floor(@{level}/20)))';
tempint = tempint * level;
setter[prefix + 'b5_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'skill';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-rage-note');
setter[prefix + 'description-show'] = 1;
break;
case 'prayer':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-prayer');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'luck';
setter[prefix + 'b1_macro-text'] = '1';
setter[prefix + 'b1_val'] = 1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_bonustype'] = 'luck';
setter[prefix + 'b2_macro-text'] = '1';
setter[prefix + 'b2_val'] = 1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'saves';
setter[prefix + 'b3_bonustype'] = 'luck';
setter[prefix + 'b3_macro-text'] = '1';
setter[prefix + 'b3_val'] = 1;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'check_skills';
setter[prefix + 'b4_bonustype'] = 'luck';
setter[prefix + 'b4_macro-text'] = '1';
setter[prefix + 'b4_val'] = 1;
break;
case 'prayerdebuff':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-prayer-debuff');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'luck';
setter[prefix + 'b1_macro-text'] = '-1';
setter[prefix + 'b1_val'] = -1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_bonustype'] = 'luck';
setter[prefix + 'b2_macro-text'] = '-1';
setter[prefix + 'b2_val'] = -1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'saves';
setter[prefix + 'b3_bonustype'] = 'luck';
setter[prefix + 'b3_macro-text'] = '-1';
setter[prefix + 'b3_val'] = -1;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'check_skills';
setter[prefix + 'b4_bonustype'] = 'luck';
setter[prefix + 'b4_macro-text'] = '-1';
setter[prefix + 'b4_val'] = -1;
break;
case 'bless':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-bless');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '1';
setter[prefix + 'b1_val'] = 1;
setter[prefix + 'b2-show'] = 0;
setter[prefix + 'b2_bonus'] = 'will';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '1';
setter[prefix + 'b2_val'] = 1;
setter[prefix + 'add_note_to_roll'] = 'save';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-bless-note');
setter[prefix + 'description-show'] = 1;
break;
case 'aid':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-aid');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '1';
setter[prefix + 'b2-show'] = 0;
setter[prefix + 'b2_bonus'] = 'will';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '2';
setter[prefix + 'b2_val'] = 2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'hptemp';
setter[prefix + 'b3_hide'] = 1;
setter[prefix + 'b3_val_error'] = 1;
setter[prefix + 'b3_macro-text'] = '1d8 + @{level}';
if (calc) {
tempint = 4 + level;
} else {
tempint = 4;
}
setter[prefix + 'b3_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'save';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-aid-note');
setter[prefix + 'description-show'] = 1;
break;
case 'haste':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-haste');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = '1';
setter[prefix + 'b1_val'] = 1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'ac';
setter[prefix + 'b2_bonustype'] = 'dodge';
setter[prefix + 'b2_macro-text'] = '1';
setter[prefix + 'b2_val'] = 1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ref';
setter[prefix + 'b3_bonustype'] = 'dodge';
setter[prefix + 'b3_macro-text'] = '1';
setter[prefix + 'b3_val'] = 1;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'speed';
setter[prefix + 'b4_bonustype'] = 'enhancement';
setter[prefix + 'b4_macro-text'] = 'min(@{speed-base},30)';
tempint = 30;
if (calc) {
if (speed < 30) {
tempint = speed;
}
}
setter[prefix + 'b4_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'attack';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-haste-note');
setter[prefix + 'description-show'] = 1;
break;
case 'enlargeperson':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-enlarge-person');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'size';
setter[prefix + 'b1_hide'] = 1;
setter[prefix + 'b1_macro-text'] = '1';
setter[prefix + 'b1_val'] = 1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'str';
setter[prefix + 'b2_bonustype'] = 'size';
setter[prefix + 'b2_macro-text'] = '2';
setter[prefix + 'b2_val'] = 2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'dex';
setter[prefix + 'b3_bonustype'] = 'size';
setter[prefix + 'b3_macro-text'] = '-2';
setter[prefix + 'b3_val'] = -2;
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-enlarge-person-note');
break;
case 'divinefavor':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-divine-favor');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'luck';
setter[prefix + 'b1_macro-text'] = 'min(3, max(1, floor(@{level}/3)))';
tempint = 1;
if (calc) {
if (level <= 5) {
tempint = 1;
} else if (level <= 8) {
tempint = 2;
} else {
tempint = 3;
}
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_bonustype'] = 'luck';
setter[prefix + 'b2_macro-text'] = 'min(3, max(1, floor(@{level}/3)))';
setter[prefix + 'b2_val'] = tempint;
break;
case 'shieldoffaith':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-shield-of-faith');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'ac';
setter[prefix + 'b1_bonustype'] = 'deflection';
setter[prefix + 'b1_macro-text'] = '2+floor((@{level})/6)';
tempint = 2;
if (calc) {
if (level < 6) {
tempint = 2;
} else if (level < 12) {
tempint = 3;
} else if (level < 18) {
tempint = 4;
} else {
tempint = 5;
}
}
setter[prefix + 'b1_val'] = tempint;
break;
case 'shield':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-shield');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'shield';
setter[prefix + 'b1_bonustype'] = 'shield';
setter[prefix + 'b1_macro-text'] = '4';
setter[prefix + 'b1_val'] = 4;
setter[prefix + 'add_note_to_roll'] = 'defense';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-shield-note');
setter[prefix + 'description-show'] = 1;
break;
case 'magearmor':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-mage-armor');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'armor';
setter[prefix + 'b1_bonustype'] = 'armor';
setter[prefix + 'b1_macro-text'] = '4';
setter[prefix + 'b1_val'] = 4;
setter[prefix + 'add_note_to_roll'] = 'defense';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-magearmor-note');
setter[prefix + 'description-show'] = 1;
break;
case 'inspirecourage':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-inspire-courage');
setter[prefix + 'bufftype'] = 'song';
setter[prefix + 'tabcat'] = 'song';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'competence';
setter[prefix + 'b1_macro-text'] = '1+floor((@{level}+1)/6)';
tempint = 1;
if (calc) {
if (level < 5) {
tempint = 1;
} else if (level < 11) {
tempint = 2;
} else if (level < 16) {
tempint = 3;
} else {
tempint = 4;
}
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'dmg';
setter[prefix + 'b3_bonustype'] = 'competence';
setter[prefix + 'b3_macro-text'] = '1+floor((@{level}+1)/6)';
setter[prefix + 'b3_val'] = tempint;
setter[prefix + 'b2-show'] = 0;
setter[prefix + 'b2_bonus'] = 'will';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '1+floor((@{level}+1)/6)';
setter[prefix + 'b2_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'save';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-inspire-courage-note');
setter[prefix + 'description-show'] = 1;
break;
case 'inspiregreatness':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-inspire-greatness');
setter[prefix + 'bufftype'] = 'song';
setter[prefix + 'tabcat'] = 'song';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'competence';
setter[prefix + 'b1_macro-text'] = '2';
setter[prefix + 'b1_val'] = 2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'fort';
setter[prefix + 'b2_bonustype'] = 'competence';
setter[prefix + 'b2_macro-text'] = '2';
setter[prefix + 'b2_val'] = 2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'hptemp';
setter[prefix + 'b3_hide'] = 1;
setter[prefix + 'b3_macro-text'] = '2d10+(2*@{CON-mod})';
tempint = 10;
if (calc) {
tempint = 10 + (2 * conmod);
}
setter[prefix + 'b3_val'] = tempint;
setter[prefix + 'b3_val_error'] = 1;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'casterlevel';
setter[prefix + 'b4_bonustype'] = 'untyped';
setter[prefix + 'b4_macro-text'] = '2';
setter[prefix + 'b4_val'] = 2;
break;
case 'inspireheroics':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-inspire-heroics');
setter[prefix + 'bufftype'] = 'song';
setter[prefix + 'tabcat'] = 'song';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'saves';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '4';
setter[prefix + 'b1_val'] = 4;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'ac';
setter[prefix + 'b2_bonustype'] = 'dodge';
setter[prefix + 'b2_macro-text'] = '4';
setter[prefix + 'b2_val'] = 4;
break;
case 'inspiredrage':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-inspired-rage');
setter[prefix + 'bufftype'] = 'song';
setter[prefix + 'tabcat'] = 'song';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'str';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '2+(2*floor(@{level}/8))';
tempint = 2;
if (calc) {
if (level < 8) {
tempint = 2;
} else if (level < 16) {
tempint = 4;
} else {
tempint = 6;
}
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'con';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '2+(2*floor(@{level}/8))';
setter[prefix + 'b2_val'] = tempint;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ac';
setter[prefix + 'b3_bonustype'] = 'untyped';
setter[prefix + 'b3_macro-text'] = '-1';
setter[prefix + 'b3_val'] = -1;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'will';
setter[prefix + 'b4_bonustype'] = 'morale';
setter[prefix + 'b4_macro-text'] = '1+floor(@{level}/4)';
tempint = 1;
if (calc) {
tempint = 1 + Math.floor(level / 4);
}
setter[prefix + 'b4_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'skill';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-inspired-rage-note');
setter[prefix + 'description-show'] = 1;
break;
case 'heroism':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-heroism');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '2';
setter[prefix + 'b1_val'] = 2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'saves';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '2';
setter[prefix + 'b2_val'] = 2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'check_skills';
setter[prefix + 'b3_bonustype'] = 'morale';
setter[prefix + 'b3_macro-text'] = '2';
setter[prefix + 'b3_val'] = 2;
break;
case 'blessingoffervor':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-blessing-of-fervor');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = '2';
setter[prefix + 'b1_val'] = 2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'ac';
setter[prefix + 'b2_bonustype'] = 'dodge';
setter[prefix + 'b2_macro-text'] = '2';
setter[prefix + 'b2_val'] = 2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ref';
setter[prefix + 'b3_bonustype'] = 'dodge';
setter[prefix + 'b3_macro-text'] = '2';
setter[prefix + 'b3_val'] = 2;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'speed';
setter[prefix + 'b4_bonustype'] = 'enhancement';
setter[prefix + 'b4_macro-text'] = '30';
setter[prefix + 'b4_val'] = 30;
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-blessing-of-fervor-note');
setter[prefix + 'description-show'] = 1;
break;
case 'goodhope':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-good-hope');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '2';
setter[prefix + 'b1_val'] = 2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '2';
setter[prefix + 'b2_val'] = 2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'saves';
setter[prefix + 'b3_bonustype'] = 'morale';
setter[prefix + 'b3_macro-text'] = '2';
setter[prefix + 'b3_val'] = 2;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'check';
setter[prefix + 'b4_bonustype'] = 'morale';
setter[prefix + 'b4_macro-text'] = '2';
setter[prefix + 'b4_val'] = 2;
break;
case 'crushingdespair':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-crushing-despair');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_macro-text'] = '-2';
setter[prefix + 'b1_val'] = -2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_macro-text'] = '-2';
setter[prefix + 'b2_val'] = -2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'saves';
setter[prefix + 'b3_macro-text'] = '-2';
setter[prefix + 'b3_val'] = -2;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'check';
setter[prefix + 'b4_macro-text'] = '-2';
setter[prefix + 'b4_val'] = -2;
break;
case 'archonsaura':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-archons-aura');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_macro-text'] = '-2';
setter[prefix + 'b1_val'] = -2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'saves';
setter[prefix + 'b2_macro-text'] = '-2';
setter[prefix + 'b2_val'] = -2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ac';
setter[prefix + 'b3_macro-text'] = '-2';
setter[prefix + 'b3_val'] = -2;
setter[prefix + 'add_note_to_roll'] = 'defense';
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-archons-aura-note');
break;
case 'curse':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-curse');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'str';
setter[prefix + 'b1_macro-text'] = '-6';
setter[prefix + 'b1_val'] = -6;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'attack';
setter[prefix + 'b2_macro-text'] = '-4';
setter[prefix + 'b2_val'] = -4;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'saves';
setter[prefix + 'b2_macro-text'] = '-4';
setter[prefix + 'b2_val'] = -4;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'check';
setter[prefix + 'b2_macro-text'] = '-4';
setter[prefix + 'b2_val'] = -4;
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-curse-note');
break;
case 'desecrate':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-desecrate');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'profane';
setter[prefix + 'b1_macro-text'] = '1';
setter[prefix + 'b1_val'] = 1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_bonustype'] = 'profane';
setter[prefix + 'b2_macro-text'] = '1';
setter[prefix + 'b2_val'] = 1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'saves';
setter[prefix + 'b3_bonustype'] = 'profane';
setter[prefix + 'b3_macro-text'] = '1';
setter[prefix + 'b3_val'] = 1;
setter[prefix + 'add_note_to_roll'] = 'save'
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-desecrate-note');
break;
case 'consecrate':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-consecrate');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_macro-text'] = '-1';
setter[prefix + 'b1_val'] = -1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_macro-text'] = '-1';
setter[prefix + 'b2_val'] = -1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'saves';
setter[prefix + 'b3_macro-text'] = '-1';
setter[prefix + 'b3_val'] = -1;
setter[prefix + 'add_note_to_roll'] = 'save'
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-consecrate-note');
break;
case 'slow':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-slow');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_macro-text'] = '-1';
setter[prefix + 'b1_val'] = -1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'ac';
setter[prefix + 'b2_macro-text'] = '-1';
setter[prefix + 'b2_val'] = -1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'ref';
setter[prefix + 'b3_macro-text'] = '-1';
setter[prefix + 'b3_val'] = -1;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b3_bonus'] = 'speed';
setter[prefix + 'b3_macro-text'] = '-ceil(ceil(@{speed-base}/2)/5)*5';
setter[prefix + 'b3_val'] = -15;
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-slow-note');
break;
case 'reduceperson':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-reduce-person');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'size';
setter[prefix + 'b1_hide'] = 1;
setter[prefix + 'b1_macro-text'] = '-1';
setter[prefix + 'b1_val'] = -1;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'str';
setter[prefix + 'b2_bonustype'] = 'size';
setter[prefix + 'b2_macro-text'] = '-2';
setter[prefix + 'b2_val'] = -2;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'dex';
setter[prefix + 'b3_bonustype'] = 'size';
setter[prefix + 'b3_macro-text'] = '+2';
setter[prefix + 'b3_val'] = +2;
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-reduce-person-note');
break;
case 'bane':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-bane');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_macro-text'] = '-1';
setter[prefix + 'b1_val'] = -1;
setter[prefix + 'b2-show'] = 0;
setter[prefix + 'b2_bonus'] = 'will';
setter[prefix + 'b2_macro-text'] = '-1';
setter[prefix + 'b2_val'] = -1;
setter[prefix + 'add_note_to_roll'] = 'save';
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-bane-note');
break;
case 'deathknell':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-death-knell');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'str';
setter[prefix + 'b1_bonustype'] = 'enhancement';
setter[prefix + 'b1_macro-text'] = '2';
setter[prefix + 'b1_val'] = 2;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'casterlevel';
setter[prefix + 'b2_bonustype'] = 'untyped';
setter[prefix + 'b2_macro-text'] = '1';
setter[prefix + 'b2_val'] = 1;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'hptemp';
setter[prefix + 'b3_hide'] = 1;
setter[prefix + 'b3_macro-text'] = '1d8';
setter[prefix + 'b3_val'] = 4;
setter[prefix + 'b3_val_error'] = 1;
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = 'roll 1d8 and place in temp hp macro textbox';
break;
case 'magicvestment':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-magic-vestment');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'armor';
setter[prefix + 'b1_bonustype'] = 'enhancement';
setter[prefix + 'b1_macro-text'] = 'min(5,floor(@{level}/4))';
tempint = 1;
if (calc) {
tempint = 1 + Math.floor(level / 8);
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = 'Can change bonus to shield';
break;
case 'ward':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-ward');
setter[prefix + 'bufftype'] = 'hex';
setter[prefix + 'tabcat'] = 'hex';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'ac';
setter[prefix + 'b1_bonustype'] = 'deflection';
setter[prefix + 'b1_macro-text'] = '2 + (floor(@{level}/8))';
tempint = 2;
if (calc) {
tempint = 2 + Math.floor(level / 8);
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'saves';
setter[prefix + 'b2_bonustype'] = 'resistance';
setter[prefix + 'b2_macro-text'] = '2 + (floor(@{level}/8))';
setter[prefix + 'b2_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'save';
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-ward-note');
break;
case 'battlespirit':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-battle-spirit');
setter[prefix + 'bufftype'] = 'aura';
setter[prefix + 'tabcat'] = 'aura';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_bonustype'] = 'morale';
setter[prefix + 'b1_macro-text'] = '1 + (floor(@{level}/8))';
tempint = 1;
if (calc) {
tempint = 1 + Math.floor(level / 8);
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg';
setter[prefix + 'b2_bonustype'] = 'morale';
setter[prefix + 'b2_macro-text'] = '1 + (floor(@{level}/8))';
setter[prefix + 'b2_val'] = tempint;
break;
case 'battleward':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-battle-ward');
setter[prefix + 'bufftype'] = 'hex';
setter[prefix + 'tabcat'] = 'hex';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'ac';
setter[prefix + 'b1_bonustype'] = 'deflection';
setter[prefix + 'b1_macro-text'] = '3 + (floor(@{level}/8))';
tempint = 3;
if (calc) {
tempint = 3 + Math.floor(level / 8);
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'defense';
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-battle-ward-note');
break;
case 'hamperinghex':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-hampering-hex');
setter[prefix + 'bufftype'] = 'hex';
setter[prefix + 'tabcat'] = 'hex';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'ac';
setter[prefix + 'b1_macro-text'] = '-2';
setter[prefix + 'b1_val'] = -2;
setter[prefix + 'notes'] = 'At 8th level the penalty becomes -4';
break;
case 'boneward':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-bone-ward');
setter[prefix + 'bufftype'] = 'hex';
setter[prefix + 'tabcat'] = 'hex';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'ac';
setter[prefix + 'b1_bonustype'] = 'deflection';
setter[prefix + 'b1_macro-text'] = '2 + (floor(@{level}/8))';
tempint = 2;
if (calc) {
tempint = 2 + Math.floor(level / 8);
}
setter[prefix + 'b1_val'] = tempint;
break;
case 'stardust':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-stardust');
setter[prefix + 'bufftype'] = 'spell';
setter[prefix + 'tabcat'] = 'spell';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'attack';
setter[prefix + 'b1_macro-text'] = '-1 - (floor(@{level}/4))';
tempint = -1;
if (calc) {
tempint = -1 * (1 + Math.floor(level / 4));
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'add_note_to_roll'] = 'skill';
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-stardust-note');
break;
case 'airbarrier':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-air-barrier');
setter[prefix + 'bufftype'] = 'hex';
setter[prefix + 'tabcat'] = 'hex';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'armor';
setter[prefix + 'b1_bonustype'] = 'armor';
setter[prefix + 'b1_macro-text'] = '4 + (2*(floor (max((@{level}-3),0) /4)))';
tempint = 4;
if (calc) {
if (level < 7) {
tempint = 4;
} else if (tempint < 11) {
tempint = 6;
} else if (tempint < 15) {
tempint = 8;
} else if (tempint < 19) {
tempint = 10;
}
}
setter[prefix + 'b1_val'] = tempint;
setter[prefix + 'description-show'] = '1';
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-air-barrier-note');
break;
case 'elementaloverflow':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-elemental-overflow');
setter[prefix + 'bufftype'] = 'class';
setter[prefix + 'tabcat'] = 'class';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'kineticblast';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = 'min(@{kineticistburn},max(0,floor(@{kineticist_level-mod}/3)))';
setter[prefix + 'b1_val'] = 0;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg_kineticblast';
setter[prefix + 'b2_bonustype'] = 'untyped';
setter[prefix + 'b2_macro-text'] = '2*min(@{kineticistburn},max(0,floor(@{kineticist_level-mod}/3)))';
setter[prefix + 'b2_val'] = 0;
setter[prefix + 'b3-show'] = 1;
setter[prefix + 'b3_bonus'] = 'dex';
setter[prefix + 'b3_bonustype'] = 'size';
setter[prefix + 'b3_macro-text'] = 'min(3,max(0,floor((@{kineticistburn}-1)/2)),floor((@{kineticist_level-mod}-1)/5))*2';
setter[prefix + 'b3_val'] = 0;
setter[prefix + 'b4-show'] = 1;
setter[prefix + 'b4_bonus'] = 'con';
setter[prefix + 'b4_bonustype'] = 'size';
setter[prefix + 'b4_macro-text'] = 'min(2,max(0,floor((@{kineticistburn}+1)/4)),floor((@{kineticist_level-mod}+4)/10))*2';
setter[prefix + 'b4_val'] = 0;
setter[prefix + 'b5-show'] = 1;
setter[prefix + 'b5_bonus'] = 'str';
setter[prefix + 'b5_bonustype'] = 'size';
setter[prefix + 'b5_macro-text'] = 'min(1,max(0,floor(@{kineticistburn}/5)),floor(@{kineticist_level-mod}/11))*2';
setter[prefix + 'b5_val'] = 0;
setter[prefix + 'description-show'] = '1';
setter[prefix + 'add_note_to_roll'] = 'defense';
setter[prefix + 'notes'] = "**:" + SWUtils.getTranslated('buff-elemental-overflow') + "** [[({1d1,{1d0,(@{kineticist_level-mod}-2)d1}kh1}kl1)*5*@{kineticistburn}]]**%** " + SWUtils.getTranslated('buff-elemental-overflow-note');
break;
case 'powerattack':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-power-attack');
setter[prefix + 'bufftype'] = 'other';
setter[prefix + 'tabcat'] = 'other';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'melee';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = '-1-floor(@{bab}/4)';
tempint = 1;
if (calc) {
tempint = 1 + Math.floor(bab / 4);
}
setter[prefix + 'b1_val'] = -tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg_power_attack';
setter[prefix + 'b2_bonustype'] = 'untyped';
setter[prefix + 'b2_macro-text'] = '2+2*floor(@{bab}/4)';
setter[prefix + 'b2_val'] = 2 * tempint;
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-power-attack-note');
break;
case 'deadlyaim':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-deadly-aim');
setter[prefix + 'bufftype'] = 'other';
setter[prefix + 'tabcat'] = 'other';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'ranged';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = '-1-floor(@{bab}/4)';
tempint = 1;
if (calc) {
tempint = 1 + Math.floor(bab / 4);
}
setter[prefix + 'b1_val'] = -tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'dmg_ranged';
setter[prefix + 'b2_bonustype'] = 'untyped';
setter[prefix + 'b2_macro-text'] = '2+2*floor(@{bab}/4)';
setter[prefix + 'b2_val'] = 2 * tempint;
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-deadly-aim-note');
break;
case 'combatexpertise':
setter[prefix + 'name'] = SWUtils.getTranslated('buff-combat-expertise');
setter[prefix + 'bufftype'] = 'other';
setter[prefix + 'tabcat'] = 'other';
setter[prefix + 'b1-show'] = 1;
setter[prefix + 'b1_bonus'] = 'melee';
setter[prefix + 'b1_bonustype'] = 'untyped';
setter[prefix + 'b1_macro-text'] = '-1-floor(@{bab}/4)';
tempint = 1;
if (calc) {
tempint = 1 + Math.floor(bab / 4);
}
setter[prefix + 'b1_val'] = -tempint;
setter[prefix + 'b2-show'] = 1;
setter[prefix + 'b2_bonus'] = 'ac';
setter[prefix + 'b2_bonustype'] = 'dodge';
setter[prefix + 'b2_macro-text'] = '1+floor(@{bab}/4)';
setter[prefix + 'b2_val'] = 2 * tempint;
setter[prefix + 'notes'] = SWUtils.getTranslated('buff-combat-expertise-note');
break;
}
return setter;
}
/** Creates buff entries
*
* @param {function} callback
* @param {Map} eventInfo
*/
export function addCommonBuff (callback, eventInfo) {
var done = function () {
if (typeof callback === "function") {
callback();
}
}, setter = {}, fields;
fields = ['add_common_buff', 'common_buff_toadd', 'CON-mod', 'level', 'speed-base'];
getAttrs(fields, function (v) {
var onByDefault = 0;
TAS.debug("adding common buff:", v);
if (parseInt(v.add_common_buff, 10)) {
if (v['common_buff_toadd']) {
if (eventInfo && eventInfo.sourceType === 'player') {
onByDefault = 1;
}
setter = getCommonBuffEntries(v['common_buff_toadd'], v, onByDefault);
setter.common_buff_toadd = '';
if (v['common_buff_toadd'] === 'slow') {
setter['condition-Staggered'] = 1;
}
}
setter.add_common_buff = 0;
//TAS.debug("common buff setting: ",setter);
SWUtils.setWrapper(setter, PFConst.silentParams, updateAllBuffTotalsAsync);
}
});
}
export function migrate (callback) {
PFBuffsOld.migrate(callback);
}
export var recalculate = TAS.callback(function recalculateBuffs (callback, silently, oldversion) {
var done = _.once(function () {
if (typeof callback === "function") {
callback();
}
});
migrate(function () {
getAttrs(['is_newsheet', 'use_buff_bonuses'], function (v) {
//new sheets have nothing
if (parseInt(v.is_newsheet, 10)) {
done();
return;
}
if (parseInt(v.use_buff_bonuses, 10)) {
reEvaluateCustomMacros(function () {
updateAllBuffTotalsAsync(function () {
resetStatuspanel();//no need to wait
done();
}, silently);
}, silently);
} else {
PFBuffsOld.recalculate(done, silently);
}
});
});
});
function registerEventHandlers () {
var custombuffs = ['customa1', 'customa2', 'customa3', 'customa4', 'customa5', 'customa6', 'customa7', 'customa8', 'customa9',
'customa10', 'customa11', 'customa12'];
on("change:add_common_buff", TAS.callback(function eventAddCommonBuff (eventInfo) {
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
TAS.debug("caught " + eventInfo.sourceAttribute + ", event: " + eventInfo.sourceType);
addCommonBuff(null, eventInfo);
}
}));
_.each(otherCharBonuses, function (charFieldMap, buff) {
_.each(charFieldMap, function (field, bonustype) {
on("change:" + field, TAS.callback(function eventCharFieldUpdatesBuff (eventInfo) {
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
TAS.debug("caught " + eventInfo.sourceAttribute + ", event: " + eventInfo.sourceType);
updateBuffTotalAsync(buff);
}
}));
});
});
_.each(charHelperFields, function (charFieldArray, buff) {
_.each(charFieldArray, function (field) {
on("change:" + field, TAS.callback(function eventCharBuffHelperField (eventInfo) {
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
TAS.debug("caught " + eventInfo.sourceAttribute + ", event: " + eventInfo.sourceType);
updateBuffTotalAsync(buff);
}
}));
});
});
buffsPerRow.forEach(function (b) {
var prefix = "change:repeating_buff2:" + b;
on(prefix + "_macro-text", TAS.callback(function eventBuffMacroText (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " for column " + b + ", event: " + eventInfo.sourceType);
SWUtils.evaluateAndSetNumber('repeating_buff2_' + b + '_macro-text', 'repeating_buff2_' + b + '_val', 0, null, false);
}));
on(prefix + "_bonustype", TAS.callback(function PFBuffs_updateBuffbonustype (eventInfo) {
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
getAttrs(['repeating_buff2_' + b + '_val', 'repeating_buff2_' + b + '-show', 'repeating_buff2_' + b + '_bonus', 'repeating_buff2_enable_toggle'], function (v) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType, v);
if (parseInt(v['repeating_buff2_' + b + '-show'], 10) && parseInt(v['repeating_buff2_enable_toggle'], 10) &&
parseInt(v['repeating_buff2_' + b + '_val'], 10) && v['repeating_buff2_' + b + '_bonus']) {
updateBuffTotalAsync(v['repeating_buff2_' + b + '_bonus']);
}
});
}
}));
on(prefix + "-show ", TAS.callback(function PFBuffs_updateBuffRowShowBuff (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
getAttrs(['repeating_buff2_' + b + '_val', 'repeating_buff2_' + b + '_bonus', 'repeating_buff2_enable_toggle'], function (v) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType, v);
if (parseInt(v['repeating_buff2_enable_toggle'], 10) && parseInt(v['repeating_buff2_' + b + '_val'], 10) &&
v['repeating_buff2_' + b + '_bonus']) {
updateBuffTotalAsync(v['repeating_buff2_' + b + '_bonus']);
}
});
}
}));
on(prefix + "_val", TAS.callback(function updateBuffValue (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "sheetworker" || eventInfo.sourceType === "api") {
getAttrs(['repeating_buff2_' + b + '-show', 'repeating_buff2_' + b + '_bonus', 'repeating_buff2_enable_toggle'], function (v) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType, v);
if (parseInt(v['repeating_buff2_enable_toggle'], 10) && parseInt(v['repeating_buff2_' + b + '-show'], 10) &&
v['repeating_buff2_' + b + '_bonus']) {
updateBuffTotalAsync(v['repeating_buff2_' + b + '_bonus']);
}
});
}
}));
on(prefix + "_bonus", TAS.callback(function PFBuffs_updateBuffbonus (eventInfo) {
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
getAttrs(['repeating_buff2_' + b + '_val', 'repeating_buff2_' + b + '_bonus', 'repeating_buff2_' + b + '_hide', 'repeating_buff2_enable_toggle'], function (v) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType, v);
var setter = {};
if (bonusesWithNoTypes.indexOf(v['repeating_buff2_' + b + '_bonus']) >= 0) {
setter['repeating_buff2_' + b + '_hide'] = 1;
SWUtils.setWrapper(setter, PFConst.silentParams);
} else if (parseInt(v['repeating_buff2_' + b + '_hide'], 10) === 1) {
setter['repeating_buff2_' + b + '_hide'] = 0;
SWUtils.setWrapper(setter, PFConst.silentParams);
}
if (parseInt(v['repeating_buff2_enable_toggle'], 10) && parseInt(v['repeating_buff2_' + b + '_val'], 10)) {
updateAllBuffTotalsAsync(null, null, eventInfo);
}
});
}
}));
});
on('change:repeating_buff2:add_note_to_roll', TAS.callback(function PFBuffs_addnote (eventInfo) {
if (eventInfo.sourceType === "player") {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
addNoteAsync(null, eventInfo);
}
}));
on('change:repeating_buff2:enable_toggle', TAS.callback(function PFBuffs_enabletoggle (eventInfo) {
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
getAttrs(['repeating_buff2_b1_bonus', 'repeating_buff2_b2_bonus', 'repeating_buff2_b3_bonus',
'repeating_buff2_b4_bonus', 'repeating_buff2_b5_bonus', 'repeating_buff2_b6_bonus',
'repeating_buff2_b1-show', 'repeating_buff2_b2-show', 'repeating_buff2_b3-show',
'repeating_buff2_b4-show', 'repeating_buff2_b5-show', 'repeating_buff2_b6-show',
'repeating_buff2_enable_toggle', 'repeating_buff2_tabcat2'], function (v) {
var setter = {};
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType, v);
buffsPerRow.forEach(function (b) {
if (v['repeating_buff2_' + b + '_bonus'] && parseInt(v['repeating_buff2_' + b + '-show'], 10)) {
updateBuffTotalAsync(v['repeating_buff2_' + b + '_bonus']);
}
});
addNoteAsync(null, eventInfo);
setter['repeating_buff2_tabcat2'] = v.repeating_buff2_enable_toggle || '0';
SWUtils.setWrapper(setter, PFConst.silentParams);
});
}
}));
on("change:repeating_buff2:bufftype", TAS.callback(function eventBuff2Type (eventInfo) {
var setter = {};
if (eventInfo.sourceType === "player") {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
getAttrs(['buffs_tab', 'repeating_buff2_bufftype', 'repeating_buff2_tabcat'], function (v) {
setter['buffs_tab'] = v.repeating_buff2_bufftype || '99';
setter['repeating_buff2_tabcat'] = v.repeating_buff2_bufftype || '-1';
SWUtils.setWrapper(setter, PFConst.silentParams);
});
}
}));
on("remove:repeating_buff2", TAS.callback(function PFBuffs_removeBuffRow (eventInfo) {
TAS.debug("caught remove " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "player" || eventInfo.sourceType === "api") {
updateAllBuffTotalsAsync(null, null, eventInfo);
}
}));
//generic easy buff total updates
_.each(events.buffTotalNonAbilityEvents, function (functions, col) {
var eventToWatch = "change:buff_" + col + "-total";
_.each(functions, function (methodToCall) {
on(eventToWatch, TAS.callback(function event_updateBuffNonAbilityEvents (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "sheetworker" || eventInfo.sourceType === "api") {
methodToCall(col, eventInfo);
}
}));
});
});
_.each(events.buffTotalAbilityEvents, function (functions, col) {
var eventToWatch = "change:buff_" + col + "-total change:buff_" + col + "-total_penalty";
_.each(functions, function (methodToCall) {
on(eventToWatch, TAS.callback(function event_updateBuffAbilityEvents (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "sheetworker" || eventInfo.sourceType === "api") {
methodToCall(col, eventInfo);
}
}));
});
});
_.each(events.buffTotalEventsNoParam, function (functions, col) {
var eventToWatch = "change:buff_" + col + "-total";
_.each(functions, function (methodToCall) {
on(eventToWatch, TAS.callback(function eventBuffTotalNoParam (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "sheetworker" || eventInfo.sourceType === "api") {
methodToCall(null, false, null, eventInfo);
}
}));
});
});
on('change:merge_buffs_now', TAS.callback(function eventMergeBuffs (eventInfo) {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
if (eventInfo.sourceType === "player") {
getAttrs(['merge_buffs_now'], function (v) {
if (parseInt(v.merge_buffs_now), 10) {
mergeOldIntoNewBuffs(updateAllBuffTotalsAsync);
}
});
}
}));
custombuffs.forEach(function (buff) {
on('change:buff_' + buff + '-total', TAS.callback(function customBuffTotal (eventInfo) {
if (eventInfo.sourceType === "sheetworker" || eventInfo.sourceType === "api") {
TAS.debug("caught " + eventInfo.sourceAttribute + " event: " + eventInfo.sourceType);
SWUtils.evaluateAndAddAsync(null, null, buff, PFConst.customEquationMacros[buff], 'buff_' + buff + '-total');
}
}));
});
}
registerEventHandlers();
//PFConsole.log(' PFBuffs module loaded ');
//PFLog.modulecount++;