From af2c5f6e5d3e645a5166e54d7f2b244ee6876a91 Mon Sep 17 00:00:00 2001 From: johndav2 <44272061+johndav2@users.noreply.github.com> Date: Sat, 4 Jun 2022 22:10:28 -0700 Subject: [PATCH] Commit Code Reduced cache file by 35%-40% by removing all falsey variables and hardcoding default falsey values. Such as when an attribute (Roll20) returns undefined then a default value of 0 will be assigned. --- BESM4eExtras/BESM4eExtras.html | 248 ++++++++++++++++----------------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/BESM4eExtras/BESM4eExtras.html b/BESM4eExtras/BESM4eExtras.html index 09781b0906..ff43d28a51 100644 --- a/BESM4eExtras/BESM4eExtras.html +++ b/BESM4eExtras/BESM4eExtras.html @@ -30,7 +30,7 @@

Sheet Options

Sheet Version - +

Sheet Type @@ -2993,7 +2993,7 @@ - +
@@ -7844,6 +7844,16 @@ return (!str || str.length === 0); } + function isFalsey(v) { + const testFalsey = + parseInt(v) === 0 ? true : + v === '' ? true : + v === null ? true : + v === undefined ? true : + false; + return testFalsey; + } + function clog(debug, timer, text, data = '', title = '', type = 'event') { //types = 'info', 'event' //debug = 0:off, 1:info, 2:event, 3:performance @@ -7986,15 +7996,10 @@ } function upgradeTo_1_8_3(value, setObj) { - /* - const body = parseInt(value.static_stat_base_body); - const mind = parseInt(value.static_stat_base_mind); - const soul = parseInt(value.static_stat_base_soul); - */ const statValues = [ - parseInt(value.static_stat_base_body), - parseInt(value.static_stat_base_mind), - parseInt(value.static_stat_base_soul) + parseInt(value.static_stat_base_body) || 0, + parseInt(value.static_stat_base_mind) || 0, + parseInt(value.static_stat_base_soul) || 0 ]; clog(2, {}, 'statValues:', statValues, 'upgradeTo_1_8_3()'); _.each(statValues, (s, i) => { @@ -8017,18 +8022,18 @@ function setTotalLift(debug, timer, attrdb, value, setObj) { const size = value.static_template_size_name; - const rank = parseInt(value.static_template_size_rank); + const rank = parseInt(value.static_template_size_rank) || 0; clog(debug, timer, 'size =', size, 'setTotalLift()'); const liftMultiplier = size === 'Medium' ? 1 : rank < 0 ? parseFloat(value.static_template_size_lift) : - parseInt(value.static_template_size_lift); + parseInt(value.static_template_size_lift) || 0; clog(debug, timer, 'liftMultiplier =', liftMultiplier); const ssdb = attrdb.superstrength; const hasSuperStrength = ssdb === undefined ? false : _.chain(ssdb).pluck('level').reduce((p,c) => { return p + c; }, 0).value(); clog(debug, timer, 'hasSuperStrength =', hasSuperStrength); const strValue = isNaN(parseInt(setObj.stat_total_str)) ? - parseInt(value.stat_total_str) : parseInt(setObj.stat_total_str); + parseInt(value.stat_total_str) || 0 : parseInt(setObj.stat_total_str); const lift = hasSuperStrength ? parseInt(getSuperStrengthLift(debug, timer, hasSuperStrength)) : strValue * 25; clog(debug, timer, 'lift =', lift); @@ -8223,7 +8228,7 @@ 'limiterassignments', 'lock', 'name', - 'new', + //'new', 'object', 'objects', 'options', @@ -8363,10 +8368,10 @@ const groupType = value[`static_attrgroup_${groupid}_type`] || 'Standard'; const groupSourceID = value[`static_attrgroup_${groupid}_source`]; const isPowerFlux = groupType.toLowerCase().indexOf('flux') !== -1 ? true : false; - const fluxcost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]); + const fluxcost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]) || 0; const standardgroupcost = getStandardGroupCost(debug, timer, attrIDs, value, rowID, false, groupid, setObj); const groupIsActive = groupSourceID !== false ? - parseInt(value[`repeating_attr_${groupSourceID}_activate`]) : + parseInt(value[`repeating_attr_${groupSourceID}_activate`]) || 0 : false; const aggregateAttrGroupCost = isPowerFlux && groupIsActive ? @@ -8412,7 +8417,7 @@ const result = !isFlux ? false : //not flux group, keep running - groupSourceID == rowID ? + groupSourceID === rowID ? false : //flux group source, keep running isGroupActive ? false : //flux group is active, keep running @@ -8427,18 +8432,18 @@ //const isPowerVariation = /variation/i.test(groupType); const isPowerVariation = groupType.toLowerCase().indexOf('variation') !== -1 ? true : false; const groupSourceID = value[`static_attrgroup_${groupid}_source`]; - const groupIsActive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]); + const groupIsActive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]) || 0; clog(debug, timer, 'isPowerVariation =', isPowerVariation, 'setPoolCostIfGroupIsVariation()'); if(!isPowerVariation || !groupIsActive){ clog(debug, timer, 'groupIsActive =', groupIsActive); return; } - const groupCost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]); + const groupCost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]) || 0; const defect = value[`repeating_attr_${rowID}_attribute`]; const isDefect = defect.indexOf(defect) !== -1 ? true : false; const attrcost = groupSourceID == rowID ? 0 : isDefect ? 0 : - parseInt(value[`repeating_attr_${rowID}_totalcost`]); + parseInt(value[`repeating_attr_${rowID}_totalcost`]) || 0; const aggregateAttrCost = getAggregateAttrGroupCost(debug, timer, attrIDs, value, 'attr', rowID, setObj); const poolcost = aggregateAttrCost - groupCost; @@ -8455,7 +8460,7 @@ if(!isPowerFlux) return; const groupSourceID = value[`static_attrgroup_${groupid}_source`]; clog(debug, timer, 'groupSourceID =', groupSourceID); - const groupCost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]); + const groupCost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]) || 0; clog(debug, timer, 'groupCost =', groupCost); const fluxactive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]) || 0; clog(debug, timer, 'fluxactive =', fluxactive); @@ -8464,7 +8469,7 @@ clog(debug, timer, 'isDefect =', isDefect); const attrcost = groupSourceID == rowID ? 0 : isDefect ? 0 : - parseInt(value[`repeating_attr_${rowID}_totalcost`]); + parseInt(value[`repeating_attr_${rowID}_totalcost`]) || 0; clog(debug, timer, 'attrcost =', attrcost); const isFluxActive = isPowerFlux && fluxactive ? true : false; clog(debug, timer, 'isFluxActive =', isFluxActive); @@ -8485,7 +8490,7 @@ 2 : 1; const result = Math.round((getAttrCostPerLevel(debug, timer, value, rowID) * - parseInt(value[`repeating_attr_${rowID}_level`])) / isAltmunition); + (parseInt(value[`repeating_attr_${rowID}_level`])) || 0) / isAltmunition); clog(debug, timer, `repeating_attr_${rowID}_totalcost =`, result, 'setAttrCost()'); clog(debug, timer, `isWeapon =`, isWeapon); clog(debug, timer, `isAltmunition =`, isAltmunition); @@ -8506,7 +8511,7 @@ const groupSourceID = isPowerFlux || isPowerVariation ? value[`static_attrgroup_${groupid}_source`] : false; const groupIsActive = groupSourceID !== false ? - parseInt(value[`repeating_attr_${groupSourceID}_activate`]) : + parseInt(value[`repeating_attr_${groupSourceID}_activate`]) || 0 : false; const isVariationPool = isPowerVariation && groupIsActive ? true : false; const standardgroupcost = getStandardGroupCost(debug, timer, attrIDs, value, rowID, isLevelChange, groupid, setObj, isVariationPool); @@ -8518,7 +8523,7 @@ standardgroupcost; const poolspent = isPowerFlux && groupIsActive ? - parseInt(value[`static_attrgroup_${groupid}_spent`]) : + parseInt(value[`static_attrgroup_${groupid}_spent`]) || 0 : isPowerVariation && groupIsActive ? getPowerVariationPoolCost(debug, timer, value, standardgroupcost, groupSourceID, groupid, setObj) : 0; @@ -8537,7 +8542,7 @@ } function setAttrGroupPoolSpentByActivation(debug, timer, isActive, attrIDs, value, rowID, setObj) { - const groupid = parseInt(value[`repeating_attr_${rowID}_group`]); //getGroupID(value, 'attr'); + const groupid = parseInt(value[`repeating_attr_${rowID}_group`]) || 0; //getGroupID(value, 'attr'); clog(debug, timer, 'groupid =', groupid, 'setAttrGroupPoolSpentByActivation()'); const groupType = value[`static_attrgroup_${groupid}_type`] || 'Standard'; @@ -8551,7 +8556,7 @@ true : false; clog(debug, timer, 'isPowerVariation =', isPowerVariation); if (isPowerFlux || isPowerVariation) { - const poolmax = parseInt(value[`static_attrgroup_${groupid}_groupmax`]); + const poolmax = parseInt(value[`static_attrgroup_${groupid}_groupmax`]) || 0; clog(debug, timer, 'poolmax =', poolmax); const poolspent = isPowerFlux ? @@ -8569,7 +8574,7 @@ _.chain(attrIDs) .map(id=>{ const attribute = value[`repeating_attr_${id}_attribute`]; - const group = parseInt(value[`repeating_attr_${id}_group`]); + const group = parseInt(value[`repeating_attr_${id}_group`]) || 0; const isGroupMember = group === groupid; if (!isGroupMember) return 0; const isDefect = attribute === 'defect' ? true : false; @@ -8580,8 +8585,8 @@ 2 : 1; const isCurrAttr = id === rowID ? true : false; const attrcost = isCurrAttr && isLevelChange ? - parseInt(setObj[`repeating_attr_${id}_totalcost`]) * isAltmunition : - parseInt(value[`repeating_attr_${id}_totalcost`]) * isAltmunition; + (parseInt(setObj[`repeating_attr_${id}_totalcost`]) || 0) * isAltmunition : + (parseInt(value[`repeating_attr_${id}_totalcost`]) || 0) * isAltmunition; return attrcost; }) .reduce((memo, num)=>{ return memo + num; }, 0) @@ -8606,11 +8611,11 @@ function getPowerFluxPoolSpent(debug, timer, isActive, attrIDs, value, rowID, groupid, setObj) { clog(debug, timer, 'groupid =', groupid, 'getPowerFluxPoolSpent()'); const groupSourceID = value[`static_attrgroup_${groupid}_source`]; - const groupIsActive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]); + const groupIsActive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]) || 0; const result = !groupIsActive ? 0 : _.chain(attrIDs) .map(id=>{ - const group = parseInt(value[`repeating_attr_${id}_group`]); + const group = parseInt(value[`repeating_attr_${id}_group`]) || 0; const isGroupMember = group === groupid; if (!isGroupMember) return 0; @@ -8635,12 +8640,12 @@ isCurrAttr ? isActive : isNaN(parseInt(setObj[`repeating_attr_${id}_activate`])) ? - parseInt(value[`repeating_attr_${id}_activate`]) > 0 ? true : false : + (parseInt(value[`repeating_attr_${id}_activate`]) || 0) > 0 ? true : false : parseInt(setObj[`repeating_attr_${id}_activate`]) > 0 ? true : false; clog(debug, timer, 'isActivated =', isActivated); if (!isActivated) return 0; - const attrcost = parseInt(value[`repeating_attr_${id}_totalcost`]) * isAltmunition; + const attrcost = (parseInt(value[`repeating_attr_${id}_totalcost`]) || 0) * isAltmunition; clog(debug, timer, 'attrcost =', attrcost); return attrcost; }) @@ -8653,12 +8658,12 @@ function getPowerVariationPoolCost(debug, timer, isActive, attrIDs, value, rowID, groupid, setObj) { const groupSourceID = value[`static_attrgroup_${groupid}_source`]; - const groupIsActive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]); + const groupIsActive = parseInt(value[`repeating_attr_${groupSourceID}_activate`]) || 0; clog(debug, timer, 'groupid =', groupid, 'getPowerVariationPoolCost()'); const result = !groupIsActive ? 0 : _.chain(attrIDs) .map(id=>{ - const group = parseInt(value[`repeating_attr_${id}_group`]); + const group = parseInt(value[`repeating_attr_${id}_group`]) || 0; const isGroupMember = group === groupid; if (!isGroupMember) return 0; @@ -8683,12 +8688,12 @@ isCurrAttr ? isActive : isNaN(parseInt(setObj[`repeating_attr_${id}_activate`])) ? - parseInt(value[`repeating_attr_${id}_activate`]) > 0 ? true : false : + (parseInt(value[`repeating_attr_${id}_activate`]) || 0) > 0 ? true : false : parseInt(setObj[`repeating_attr_${id}_activate`]) > 0 ? true : false; clog(debug, timer, 'isActive =', isActive); if (!isActivated) return 0; - const attrcost = parseInt(value[`repeating_attr_${id}_totalcost`]) * isAltmunition; + const attrcost = (parseInt(value[`repeating_attr_${id}_totalcost`]) || 0) * isAltmunition; clog(debug, timer, 'attrcost =', attrcost); return attrcost; }) @@ -8783,8 +8788,8 @@ const id = o.source; const defect = o.name; const defectcategory = getDefectPointsByCategory(value, id, defect); - const group = parseInt(value[`repeating_attr_${id}_group`]); - const defectpoints = parseInt(value[`repeating_attr_${id}_rank`]) * defectcategory; + const group = parseInt(value[`repeating_attr_${id}_group`]) || 0; + const defectpoints = (parseInt(value[`repeating_attr_${id}_rank`]) || 0) * defectcategory; const appliedPoints = group == groupid ? defectpoints : 0; return appliedPoints; @@ -8803,7 +8808,7 @@ const aggregatePoolCost = _.chain(ids) .map(id=>{ const isGroupMember = - parseInt(value[`repeating_${sectionName}_${id}_group`]) == groupid ? + (parseInt(value[`repeating_${sectionName}_${id}_group`]) || 0) == groupid ? true : false; const isDefect = value[`repeating_attr_${id}_attribute`] === 'defect' ? @@ -8816,11 +8821,11 @@ true : false; const isActivated = sectionName == 'skill' ? 1 : isNaN(parseInt(setObj[`repeating_attr_${id}_activate`])) ? - parseInt(value[`repeating_attr_${id}_activate`]) : + parseInt(value[`repeating_attr_${id}_activate`]) || 0 : parseInt(setObj[`repeating_attr_${id}_activate`]); const attrcost = id == rowID ? parseInt(eventInfo.newValue) * getAttrCostPerLevel(debug, timer, value, rowID) : - parseInt(value[`repeating_${sectionName}_${id}_totalcost`]); + parseInt(value[`repeating_${sectionName}_${id}_totalcost`]) || 0; const appliedCost = isGroupMember ? isDefect ? 0 : isStandardGroup ? 0 : @@ -8846,13 +8851,13 @@ const attribute = value[`repeating_attr_${id}_attribute`]; clog(debug, timer, 'attribute =', attribute); clog(debug, timer, 'isCurrAttr =', isCurrAttr); - const group = parseInt(value[`repeating_attr_${id}_group`]); + const group = parseInt(value[`repeating_attr_${id}_group`]) || 0; clog(debug, timer, 'group =', group); const activated = - parseInt(setObj[`repeating_attr_${id}_activate`]) || - parseInt(value[`repeating_attr_${id}_activate`]); + parseInt(setObj[`repeating_attr_${id}_activate`]) || + parseInt(value[`repeating_attr_${id}_activate`]) || 0; clog(debug, timer, 'activated =', activated); - const attrcost = parseInt(value[`repeating_attr_${id}_totalcost`]); + const attrcost = parseInt(value[`repeating_attr_${id}_totalcost`]) || 0; clog(debug, timer, 'attrcost =', attrcost); const isGroupMember = group == groupid ? true : false; clog(debug, timer, 'isGroupMember =', isGroupMember); @@ -8887,9 +8892,9 @@ function getAggregateSkillGroupCost(debug, timer, skillIDs, value, rowID, groupID, setObj){ const result = _.chain(skillIDs) .map(id => { - const group = parseInt(value[`repeating_skill_${id}_group`]); + const group = parseInt(value[`repeating_skill_${id}_group`]) || 0; const totalcost = isNaN(parseInt(setObj[`repeating_skill_${id}_totalcost`])) ? - parseInt(value[`repeating_skill_${id}_totalcost`]) : + parseInt(value[`repeating_skill_${id}_totalcost`]) || 0 : parseInt(setObj[`repeating_skill_${id}_totalcost`]); const appliedCost = group == groupID ? id == rowID ? 0 : @@ -8915,7 +8920,7 @@ const skillcost = getSkillCost(debug, timer, value, skillname); clog(debug, timer, 'skillcost =', skillcost); const skillrank = isNaN(parseInt(setObj[`repeating_skill_${rowID}_level`])) ? - parseInt(value[`repeating_skill_${rowID}_level`]) : + parseInt(value[`repeating_skill_${rowID}_level`]) || 0 : parseInt(setObj[`repeating_skill_${rowID}_level`]); clog(debug, timer, 'skillrank =', skillrank); const totalcost = (skillcost * skillrank) + specilizationscost; @@ -8944,7 +8949,7 @@ const poolSpent = aggregatePoolCost; const standardcost = aggregateAttrCost + aggregateDefectPoints + attrcost; - const variationcost = parseInt(value[`static_attrgroup_${groupid}_groupcost`]); + const variationcost = parseInt(value[`static_attrgroup_${groupid}_groupcost`]) || 0; const fluxcost = parseInt(value[`repeating_attr_${groupSourceID}_totalcost`]) || 0; const groupCost = isPowerFlux && isGroupActive ? fluxcost : @@ -8981,7 +8986,7 @@ const aggregateRank = _.chain(defectdb) .map(defect => { const result = defect.name == 'shortcoming' ? defect.aspect == stat ? - parseInt(value[`repeating_attr_${defect.source}_activate`]) > 0 ? + (parseInt(value[`repeating_attr_${defect.source}_activate`]) || 0) > 0 ? defect.rank : 0 : 0 : 0; return result; }) @@ -9108,7 +9113,7 @@ const result = _.chain(defectdb) .map(defect => { const isActive = isNaN(parseInt(setObj[`repeating_attr_${defect.source}_activate`])) ? - parseInt(value[`repeating_attr_${defect.source}_activate`]) : + parseInt(value[`repeating_attr_${defect.source}_activate`]) || 0 : parseInt(setObj[`repeating_attr_${defect.source}_activate`]); const rank = defect.name == 'shortcoming' ? major_stats_regex.test(defect.aspect) ? @@ -9245,7 +9250,7 @@ function setAttrVisibilityByGroup(value, eventInfo, attrIDs, setObj, sectionName) { const section = sectionName.substring(0, sectionName.length - 5); _.each(attrIDs, (id) => { - const group = parseInt(value[`repeating_${section}_${id}_group`]); + const group = parseInt(value[`repeating_${section}_${id}_group`]) || 0; const currGroup = eventInfo.newValue.substring(sectionName.length); const visible = group == currGroup ? 0 : 1; setObj[`repeating_${section}_${id}_visible`] = visible; @@ -9361,7 +9366,7 @@ } function removePoolCpFromGroupCost(value, source, setObj) { - let type = parseInt(value[`${source}_type`]); + let type = parseInt(value[`${source}_type`]) || 0; if (type < 3) { let groupcost = setObj[`${source}_groupcost`] - setObj[`${source}_poolcp`]; setObj[`${source}_groupcost`] = groupcost; @@ -9397,7 +9402,7 @@ type == 2 ? (newlevel - poolenhancement) * 5 : type == 3 ? - parseInt(value[`${source}_groupmax`]) : + parseInt(value[`${source}_groupmax`]) || 0 : isSkill ? newlevel * 10 : 0; setLevelElevation(eventInfo, `${source}`, `poollevelelevation`, setObj); const newgroupcost = @@ -9448,13 +9453,13 @@ clog(debug, timer, 'currGroup =', currGroup); //setObj[`${source}_new`] = 0; //setObj[`${source}_group`] = currGroup; - writeValues(debug, timer, value, `${source}_new`, 0, setObj); + //writeValues(debug, timer, value, `${source}_new`, 0, setObj); writeValues(debug, timer, value, `${source}_group`, currGroup, setObj); } function resetOnActive(debug, timer, eventInfo, value, match, rowID, setObj) { - let activate = parseInt(value[`repeating_attr_${rowID}_activate`]), - reset = (eventInfo.previousValue == eventInfo.newValue) ? 0 : eventInfo.previousValue; + const activate = parseInt(value[`repeating_attr_${rowID}_activate`]) || 0; + const reset = (eventInfo.previousValue == eventInfo.newValue) ? 0 : eventInfo.previousValue; if (activate) { clog(debug, timer, 'attribute is active, exiting', '', 'resetOnActive()'); setObj[`${match}`] = reset; @@ -9466,8 +9471,8 @@ } function resetOnLocked(debug, timer, eventInfo, value, match, rowID, setObj) { - const locked = parseInt(value[`repeating_attr_${rowID}_lock`]), - reset = (eventInfo.previousValue == eventInfo.newValue) ? 0 : eventInfo.previousValue; + const locked = parseInt(value[`repeating_attr_${rowID}_lock`]) || 0; + const reset = (eventInfo.previousValue == eventInfo.newValue) ? 0 : eventInfo.previousValue; if (locked) { clog(debug, timer, 'attribute is locked, exiting', '', 'resetOnLocked()'); setObj[`${match}`] = reset; @@ -9479,15 +9484,15 @@ } function getIsLocked(debug, timer, value, rowID, sourceAttr) { - const result = parseInt(value[`repeating_attr_${rowID}_lock`]) ? true : false; + const result = (parseInt(value[`repeating_attr_${rowID}_lock`]) || 0) ? true : false; clog(debug, timer, 'result =', result, 'getIsLocked()'); return result; } function resetOnLevelNotZero(debug, timer, eventInfo, value, match, rowID, setObj) { - let level = parseInt(value[`repeating_attr_${rowID}_level`]), - elevel = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]), - reset = (eventInfo.previousValue == eventInfo.newValue) ? 0 : eventInfo.previousValue; + const level = parseInt(value[`repeating_attr_${rowID}_level`]) || 0; + const elevel = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; + const reset = (eventInfo.previousValue == eventInfo.newValue) ? 0 : eventInfo.previousValue; if (level || elevel) { clog(debug, timer, 'can‘t change Attribute when Level or Effective Level is greater than 0, exiting', '', 'resetOnLevelNotZero()'); setObj[`${match}`] = reset; @@ -10135,8 +10140,10 @@ } function getCharacteristicByAttr(debug, timer, value, rowID, attribute, setObj) { - const level = parseInt(setObj[`repeating_attr_${rowID}_effectivelevel`]) || parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0, - chardb = { + const level = + parseInt(setObj[`repeating_attr_${rowID}_effectivelevel`]) || + parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; + const chardb = { "capacity": { 0: { 1: "200 kg", @@ -10955,7 +10962,7 @@ const layer = attr == `armor` ? parseInt(value[`repeating_attr_${rowID}_armorlayer`]) || 1 : ''; const type = (attr == `absorption` || attr == `conversion`) ? - parseInt(value[`repeating_attr_${rowID}_collectiontype`]) : ''; + parseInt(value[`repeating_attr_${rowID}_collectiontype`]) || 0 : ''; const attrstate = parseInt(value[`protection_${attr}${layer}${type}_state`]) || 0; const source = @@ -11156,7 +11163,7 @@ clog(debug, timer, 'rowID =', rowID, 'getIsTargetedActive()'); const isTargeted = getIsTargeted(debug, timer, value, rowID, setObj); if (!isTargeted) return ''; - const activeID = parseInt(value[`repeating_attr_${rowID}_activate`]) === 1 ? + const activeID = (parseInt(value[`repeating_attr_${rowID}_activate`]) || 0) === 1 ? rowID : ''; clog(debug, timer, 'activeID =', activeID); clog(debug, timer, 'activate =', value[`repeating_attr_${rowID}_activate`]); @@ -11470,7 +11477,7 @@ clog(debug, timer, 'result =', result, 'getIsMelee()'); return result; } - + /* function getAttackMod(debug, timer, value, attrIDs, wpnclass, sourceAttr) { var result = 0, ismelee = getIsMelee(debug, timer, wpnclass); @@ -11485,7 +11492,7 @@ clog(debug, timer, 'result =', result, 'getAttackMod()'); return result; } - + */ function getSumOfActiveAttrLevels(attrdb, attribute, focus = '') { var result = 0; _.each(attrdb[`${attribute}`], (o) => { @@ -11526,7 +11533,7 @@ function updateWeaponStates(debug, timer, attrdb, extraarmIDs, value, source, sourceAttr, setObj){ const handsource = getHandSource(debug, timer, extraarmIDs, source); - const state = parseInt(value[`${handsource}_state`]); + const state = parseInt(value[`${handsource}_state`]) || 0; clog(debug, timer, 'state =', state, 'updateWeaponStates()'); if(state > 0) { setWeaponStates(debug, timer, extraarmIDs, value, handsource, setObj); @@ -11779,7 +11786,7 @@ function setAttrEffects(debug, timer, isActive, value, attrdb, extraarmIDs, attrIDs, skillIDs, sectionName, rowID, sourceAttr, setObj) { const attribute = removeWhiteSpace(value[`repeating_attr_${rowID}_attribute`]); - const level = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]); + const level = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; switch (attribute) { case "absorption": case "armor": @@ -11928,11 +11935,11 @@ function setSwarmCritters(isActive, debug, timer, value, attrdb, rowID, setObj){ const debugtext = '[setSwarmCritters()]'; - const body = parseInt(value.stat_total_body); - const soul = parseInt(value.stat_total_soul); + const body = parseInt(value.stat_total_body) || 0; + const soul = parseInt(value.stat_total_soul) || 0; const health = (body+soul)*5; const wounds = parseInt(value.static_stat_total_wounds) || 0; - const level = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]); + const level = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0; const critters = isActive ? health * level : 0; let swarmobj = _.find(attrdb.swarm, o => { if(o.source == rowID) return true; @@ -12001,15 +12008,15 @@ const groupCost = _.chain(attrIDs) .map(id=>{ id = id.toLowerCase(); - const group = parseInt(value[`repeating_attr_${id}_group`]); + const group = parseInt(value[`repeating_attr_${id}_group`]) || 0; const activated = parseInt(setObj[`repeating_attr_${id}_activate`]) || - parseInt(value[`repeating_attr_${id}_activate`]); + parseInt(value[`repeating_attr_${id}_activate`]) || 0; const attribute = value[`repeating_attr_${id}_attribute`]; const isWeapon = attribute === 'weapon' ? true : false; const isAltmunition = isWeapon && getCustomizationExists('altmunition', value[`repeating_attr_${id}_customizations`]) ? 2 : 1; - const totalcost = parseInt(value[`repeating_attr_${id}_totalcost`]) * isAltmunition; + const totalcost = (parseInt(value[`repeating_attr_${id}_totalcost`]) || 0) * isAltmunition; const appliedCost = group == groupid ? id == rowID ? 0 : ///flux/i.test(groupType) ? activated ? totalcost : 0 : @@ -12021,7 +12028,7 @@ .value(); const max = //isActive ? /flux/i.test(groupType) ? isActive && groupType.toLowerCase().indexOf('flux') !== -1 ? - parseInt(value[`repeating_${sectionName}_${rowID}_effectivelevel`]) * 5 : + (parseInt(value[`repeating_${sectionName}_${rowID}_effectivelevel`]) || 0) * 5 : ///variation/i.test(groupType) ? groupCost : 0 : 0; isActive && groupType.toLowerCase().indexOf('variation') !== -1 ? groupCost : 0; @@ -12032,13 +12039,13 @@ function convertAttrGroupCost(isActive, debug, timer, value, sectionName, attrIDs, rowID, setObj){ const groupid = getGroupID(value, sectionName); const groupType = value[`static_${sectionName}group_${groupid}_type`]; - const dynamicGroupCost = parseInt(value[`repeating_${sectionName}_${rowID}_totalcost`]); + const dynamicGroupCost = parseInt(value[`repeating_${sectionName}_${rowID}_totalcost`]) || 0; const aggregateAttrCost = _.chain(attrIDs) .map(id=>{ - const group = parseInt(value[`repeating_${sectionName}_${id}_group`]); + const group = parseInt(value[`repeating_${sectionName}_${id}_group`]) || 0; const activated = parseInt(setObj[`repeating_${sectionName}_${id}_activate`]) || - parseInt(value[`repeating_${sectionName}_${id}_activate`]); - const totalcost = parseInt(value[`repeating_${sectionName}_${id}_totalcost`]); + parseInt(value[`repeating_${sectionName}_${id}_activate`]) || 0; + const totalcost = parseInt(value[`repeating_${sectionName}_${id}_totalcost`]) || 0; const appliedCost = //group == groupid ? ///flux/i.test(groupType) ? group == groupid && groupType.toLowerCase().indexOf('flux') !== -1 ? @@ -12092,9 +12099,9 @@ function setSkillGroupMaxByLevelChange(isActive, timer, debug, value, rowID, setObj){ const isSkillAttr = attribute => attribute=='skill' ? true: false; if(isSkillAttr(value[`repeating_attr_${rowID}_attribute`])==false) return; - const groupid = parseInt(value[`repeating_attr_${rowID}_skillgroup`]); + const groupid = parseInt(value[`repeating_attr_${rowID}_skillgroup`]) || 0; const skillpointmax = isActive ? - parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) * 10 : 0; + (parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0) * 10 : 0; setObj[`static_skillgroup_${groupid}_groupmax`] = skillpointmax; clog(debug, timer, 'groupid =', groupid, 'setSkillGroupMaxByLevelChange()'); clog(debug, timer, 'skillpointmax =', skillpointmax); @@ -12300,11 +12307,11 @@ const state = (type == 'acv') ? isNaN(parseInt(setObj.static_button_targeted_attack)) ? - parseInt(value.static_button_targeted_attack) : + parseInt(value.static_button_targeted_attack) || 0 : parseInt(setObj.static_button_targeted_attack) : (type == 'dcv') ? isNaN(parseInt(setObj.static_button_targeted_defense)) ? - parseInt(value.static_button_targeted_defense) : + parseInt(value.static_button_targeted_defense) || 0 : parseInt(setObj.static_button_targeted_defense) : 0; clog(debug, timer, 'state =', state); @@ -12330,8 +12337,8 @@ const cv = Math.round((parseInt(setObj.stat_total_body) + parseInt(setObj.stat_total_mind) + parseInt(setObj.stat_total_soul)) / 3) || - Math.round((parseInt(value.stat_total_body) + parseInt(value.stat_total_mind) + - parseInt(value.stat_total_soul)) / 3) || + Math.round(((parseInt(value.stat_total_body) || 0) + (parseInt(value.stat_total_mind) || 0) + + (parseInt(value.stat_total_soul) || 0)) / 3) || 0; clog(debug, timer, 'cv =', cv); const result = @@ -12463,8 +12470,8 @@ function setWeaponReload(debug, timer, attrdb, value, setObj) { const rowID = value.active_weapon; - const capacity = parseInt(value[`repeating_attr_${rowID}_capacity`]); - let ammostate = parseInt(value.weapon_ammo_reloads); + const capacity = parseInt(value[`repeating_attr_${rowID}_capacity`]) || 0; + let ammostate = parseInt(value.weapon_ammo_reloads) || 0; const reloadcapacity = ammostate > 0 ? capacity : 0; const reloadammo = ammostate > 0 ? ammostate -= 1 : 0; writeValues(debug, timer, value, 'weapon_ammo_reloads', reloadammo, setObj); @@ -12477,8 +12484,8 @@ const state = setObj[`${handsource}_state`]; const rowID = value[`${handsource}_source`]; const type = value[`repeating_attr_${rowID}_attribute`]; - const ammostate = parseInt(value.weapon_ammo_reloads); - const capacitystate = parseInt(value.weapon_ammo_capacity); + const ammostate = parseInt(value.weapon_ammo_reloads) || 0; + const capacitystate = parseInt(value.weapon_ammo_capacity) || 0; clog(debug, timer, 'ammostate =', ammostate, 'setWeaponAmmo()'); clog(debug, timer, 'capacitystate =', capacitystate); if (rowID !== setObj.previous_weapon && _.isString(setObj.previous_weapon)) { @@ -12499,17 +12506,15 @@ if (!getIsObject(customization)) return; const ammo = isNaN(parseInt(value[`repeating_attr_${rowID}_ammostate`])) ? getAmmoMax(debug, timer, customization.rank) : - parseInt(value[`repeating_attr_${rowID}_ammostate`]); + parseInt(value[`repeating_attr_${rowID}_ammostate`]) || 0; const capacity = isNaN(parseInt(value[`repeating_attr_${rowID}_capacitystate`])) ? 0 : - parseInt(value[`repeating_attr_${rowID}_capacitystate`]); + parseInt(value[`repeating_attr_${rowID}_capacitystate`]) || 0; writeValues(debug, timer, value, 'weapon_ammo_reloads', ammo, setObj); writeValues(debug, timer, value, 'weapon_ammo_capacity', capacity, setObj); clog(debug, timer, 'ammo =', ammo, 'setWeaponAmmo()'); clog(debug, timer, 'capacity =', capacity); } else if (rowID.length === 20) {//weapon unarmed, save ammo state - //const ammostate = parseInt(value.weapon_ammo_reloads); - //const capacitystate = parseInt(value.weapon_ammo_capacity); clog(debug, timer, 'weapon unarmed, save ammo state', ''); writeValues(debug, timer, value, `repeating_attr_${rowID}_ammostate`, ammostate, setObj); writeValues(debug, timer, value, `repeating_attr_${rowID}_capacitystate`, capacitystate, setObj); @@ -13075,7 +13080,7 @@ targetedmdState ? targetedmdLevel : 0; const rushattackState = isNaN(parseInt(setObj.static_button_targeted_rushdamage)) ? - parseInt(value.static_button_targeted_rushdamage) : + parseInt(value.static_button_targeted_rushdamage) || 0 : parseInt(setObj.static_button_targeted_rushdamage); const rushattackLevel = //getRushAttack(debug, attrdb); @@ -13161,7 +13166,7 @@ break; case 'autofire': const firemode = parseInt(setObj[`static_weapon_autofire_selection`]) || - parseInt(value[`static_weapon_autofire_selection`]); + parseInt(value[`static_weapon_autofire_selection`]) || 1; const numhits = firemode == 1 ? `{{hits2=1}} {{hits3=1}} {{hits4=1}} {{hits5=1}} {{hits6=1}} {{hits7=1}} {{hits8=1}} {{hits9=1}} {{hits10=1}} {{hits11=1}} {{hits12=1}}` : firemode == 3 ? @@ -13278,7 +13283,7 @@ result = `${result} {{${customization.name}=${customization.rank}}} {{range=${range}}}`; break; case 'stoppable': - const stopdamage = parseInt(value[`repeating_attr_${rowID}_level`]) * 10; + const stopdamage = (parseInt(value[`repeating_attr_${rowID}_level`]) || 0) * 10; const timetostop = customization.rank > 3 ? '1 hour' : customization.rank > 2 ? '1 minute' : customization.rank > 1 ? '5 rounds' : @@ -13385,7 +13390,7 @@ setObj.weapon_ammo = 0; setObj.weapon_autofire = 0; const state = parseInt(setObj[`repeating_attr_${rowID}_activate`]) || - parseInt(value[`repeating_attr_${rowID}_activate`]); + parseInt(value[`repeating_attr_${rowID}_activate`]) || 0; clog(debug, timer, 'state =', state, 'disableActiveWeapon()'); clog(debug, timer, 'activeweapon =', activeweapon); if (!state) return; @@ -13395,7 +13400,7 @@ } function setButtonState(debug, timer, value, source, rowID, sourceAttr, setObj) { - const theme = parseInt(value.theme); + const theme = parseInt(value.theme) || 1; const attribute = sourceAttr; const setstate = value[`${source}_${attribute}`] || 0; const state = setstate == 0 ? 1 : 0; @@ -13446,7 +13451,7 @@ const handsStateArray = _.map(handsArray, hand => { const source = setObj[`${hand}_source`] || value[`${hand}_source`]; - const state = parseInt(setObj[`${hand}_state`]) || parseInt(value[`${hand}_state`]); + const state = parseInt(setObj[`${hand}_state`]) || parseInt(value[`${hand}_state`]) || 0; const isExtraArm = extraarmIDs.indexOf(hand) !== -1 ? true : false; const extraArmType = parseInt(value[`${hand}_type`]) || false; const isWeaponMount = isExtraArm && extraArmType === 0 ? true : false; @@ -13485,7 +13490,7 @@ } function setDepleteRules(debug, timer, value, attrIDs, setObj) { - const state = parseInt(value.static_rules_deplete_alt) == 1 ? + const state = (parseInt(value.static_rules_deplete_alt) || 0) == 1 ? 1 : 0; if (_.isArray(attrIDs)) { _.each(attrIDs, id => { @@ -13499,7 +13504,7 @@ function setDepleteResurvation(debug, timer, attrdb, value, rowID, setObj) { const depleteRank = getCustomizationValue(debug, timer, value, rowID, 'rank', 'deplete'); - const useDepleteAltRules = parseInt(value.static_rules_deplete_alt); + const useDepleteAltRules = (parseInt(value.static_rules_deplete_alt) || 0); if (!depleteRank && !useDepleteAltRules) return; const totalDepete = _.chain(all_attributes_array) .map( a => { @@ -13667,7 +13672,7 @@ const skillStatButtonState = button => allaspects_stats_array.indexOf(button) !== -1 || major_stats_array.indexOf(button) !== -1 ? - parseInt(value[`${match}state`]) > 0 ? + (parseInt(value[`${match}state`]) || 0) > 0 ? setObj[`${match}state`] = 0 : setObj[`${match}state`] = 1 : false; @@ -13681,7 +13686,7 @@ sourceAttr; const setButtonState = button => button == 'stat' || button == 'type' || button.length == 20 ? - parseInt(value[`${source}state`]) > 0 ? + (parseInt(value[`${source}state`]) || 0) > 0 ? setObj[`${source}state`] = 0 : setObj[`${source}state`] = 1 : false; @@ -13702,7 +13707,7 @@ (specilizations.match(/,/g) || []).length; const skillname = value[`repeating_skill_${rowID}_name`]; const skillcost = getSkillCost(debug, timer, value, skillname); - const skillrank = parseInt(value[`repeating_skill_${rowID}_level`]); + const skillrank = parseInt(value[`repeating_skill_${rowID}_level`]) || 0; const totalcost = (skillcost * skillrank) + specilizationscost; const groupid = getGroupID(value, 'skill'); const spent = getAggregateSkillGroupCost(debug, timer, skillIDs, value, rowID, groupid, setObj); @@ -13712,7 +13717,7 @@ function setSkillGroupCost(value, sectionName, cost, setObj){ const groupID = getGroupID(value, sectionName); - const groupcost = parseInt(value[`static_skillgroup_${groupID}_groupcost`]); + const groupcost = parseInt(value[`static_skillgroup_${groupID}_groupcost`]) || 0; setObj[`static_skillgroup_${groupID}_groupcost`] = groupcost + cost; } @@ -13743,7 +13748,7 @@ const stats = type.major==1 ? statmajor: statallaspect; const sum = _.chain(stats) .map(stat=>{ - return parseInt(value[`stat_total_${stat}`]); + return parseInt(value[`stat_total_${stat}`]) || 0; }) .reduce((memo,stat)=>{ return memo + stat; @@ -13981,7 +13986,8 @@ sheetdb.extraarmIDs = extraarmIDs; _.each(getAttrsString, o => { - if(value[o] !== undefined) sheetdb[o] = value[o]; + //if(value[o] !== undefined) sheetdb[o] = value[o]; + if(!isFalsey(value[o])) sheetdb[o] = value[o]; }); clog(3, timer, 'value:', value); @@ -14128,8 +14134,10 @@ switch (sectionName) { case `attr`: - const isNew = parseInt(value[`${source}_new`]) === 0 ? false : true; - clog(debug, timer, `${source}_new =`, value[`${source}_new`], 'Attribute is new?'); + //const isNew = parseInt(value[`${source}_new`]) === 0 ? false : true; + const group = parseInt(value[`${source}_group`]) || 0; + const isNew = group !== 0 ? false : true; + clog(debug, timer, `isNew =`, isNew, 'Attribute is new?'); if(isNew) { setGroupMembership(debug, timer, value, setObj, source, sectionName); attrIDs.indexOf(rowID) === -1 ? attrIDs.push(rowID) : false; @@ -14137,13 +14145,6 @@ } if(getIsSheetworker(eventInfo.sourceType)) return; switch (sourceAttr) { - /* - case `options`: - if (resetOnLocked(debug, timer, eventInfo, value, match, rowID, setObj)) return; - const state = parseInt(value[`${source}_${sourceAttr}`]) > 0 ? 0: 1; - setObj[`${source}_${sourceAttr}`] = state; - break; - */ case `attribute`: if (resetOnLocked(debug, timer, eventInfo, value, match, rowID, setObj)) return; if (resetOnLevelNotZero(debug, timer, eventInfo, value, match, rowID, setObj)) return; @@ -14172,7 +14173,7 @@ if (getFluxGroupIsNotActive(debug, timer, value, rowID)) return; const isActive = setButtonState(debug, timer, value, source, rowID, sourceAttr, setObj); const handsource = getHandSource(debug, timer, extraarmIDs, value[`repeating_attr_${rowID}_source`]); - const handstate = handsource !== false ? parseInt(value[`${handsource}_state`]) : false; + const handstate = handsource !== false ? parseInt(value[`${handsource}_state`]) || 0 : false; setAttrEffects(debug, timer, isActive, value, attrdb, extraarmIDs, attrIDs, skillIDs, sectionName, rowID, sourceAttr, setObj); //setPoolCostIfGroupIsFlux(debug, timer, attrIDs, value, rowID, setObj); setAttrGroupPoolSpentByActivation(debug, timer, isActive, attrIDs, value, rowID, setObj); @@ -14240,8 +14241,7 @@ break; case 'statselection': case 'option': - const state = parseInt(value[`${source}_${sourceAttr}`]) > 0 ? 0: 1; - //setObj[`${source}_${sourceAttr}`] = state; + const state = (parseInt(value[`${source}_${sourceAttr}`]) || 0) > 0 ? 0 : 1; writeValues(debug, timer, value, `${source}_${sourceAttr}`, state, setObj); break; default: