diff --git a/BESM4eExtras/BESM4eExtras.css b/BESM4eExtras/BESM4eExtras.css
index 03e84087c6..db17d51dcd 100644
--- a/BESM4eExtras/BESM4eExtras.css
+++ b/BESM4eExtras/BESM4eExtras.css
@@ -1,5 +1,5 @@
/* === VERSION === */
-/* 1.7.6 */
+/* 1.8.0 */
/* === GENERAL === */
.charsheet {
@@ -2326,7 +2326,9 @@ button.sheet-major-stat[type="action"] {
}
button.sheet-activated,
+input.sheet-targeted[value="1"] ~ button.sheet-targeted,
input.sheet-push-button:checked + button.sheet-condition,
+input.sheet-push-button:checked + button.sheet-multi-select,
input.sheet-protectionstate:checked + h4.sheet-protection,
input.sheet-targeted:checked + button.sheet-targeted,
input.sheet-weapon:checked + button.sheet-weapon,
@@ -2678,6 +2680,21 @@ div.sheet-flex-skillcontainer {
align-self: center;
}
+.sheet-flex-11-12 {
+ flex: 0 1 91.66667%;
+ align-self: center;
+}
+
+.sheet-flex-12-13 {
+ flex: 0 1 92.30769%;
+ align-self: center;
+}
+
+.sheet-flex-14-15 {
+ flex: 0 1 93.33333%;
+ align-self: center;
+}
+
.sheet-flex-19-20 {
flex: 0 1 95%;
align-self: center;
diff --git a/BESM4eExtras/BESM4eExtras.html b/BESM4eExtras/BESM4eExtras.html
index 3acbea5349..811993d9a9 100644
--- a/BESM4eExtras/BESM4eExtras.html
+++ b/BESM4eExtras/BESM4eExtras.html
@@ -30,7 +30,7 @@
Sheet Options
Spent
-
+
Remaining
@@ -189,13 +241,13 @@
Size
-
+
Height
-
+
Mass
-
+
@@ -1904,7 +1956,9 @@
-
+ Lift
+
+
@@ -7687,6 +7741,7 @@
const rolls_array = ['static_roll_type_selection','static_button_personal_defense','static_button_movement_defense'];
const combat_stats_array = ['static_weapon_autofire_selection','weapon_ammo_capacity','weapon_ammo_reloads','static_weapon_range_selection','mainhand_state', 'offhand_state', 'mainhand_source', 'offhand_source', 'extraarms', 'extraarms_inuse', 'static_button_targeted_rushdamage', 'static_button_targeted_damage', 'static_button_targeted_attack', 'static_button_targeted_defense', 'massivedamage_targeted', 'massivedamage', 'enemyattack', 'enemydefense'];
const size_template_values_array = ['size', 'height', 'mass', 'size_lift', 'size_strdmg', 'size_ar', 'size_extradmg', 'size_rnghitdef', 'size_rngspd'];
+ const size_template_keys_array = ['name','rank','cost','height','mass','lift','strdmg','ar','extradmg','rnghitdef','rngspd'];
const all_attributes_array = ['absorption','alternate form','alternate identity','armor','attack mastery','augmented','capacity','change state','cognition','combat technique','companion','connected','control environment','conversion','data access','defect','defense mastery','dimension walk','dynamic powers','elasticity','enemy attack','enemy defense','energized','exorcism','extra actions','extra arms','extra defenses','features','flight','forcefield','gear','ground speed','healing','heightened awareness','heightened senses','illusion','immovable','immunity','immutable','inspire','jumping','massive damage','melee attack','melee defense','merge','metamorphosis','mimic','mind control','mind shield','minions','mulligan','nullify','plant control','pocket dimension','portal','power flux','power variation','projection','ranged attack','ranged defense','regeneration','reincarnation','resilient','sensory block','shield','sixth sense','size change','skill','social mastery','spaceflight','special movement','summon creatures','supersense','superspeed','superstrength','swarm','telekinesis','telepathy','teleport','tough','transfer','transmute','tunneling','unaffected','unassailable','undetectable','unique attribute','unknown power','water speed','wealth','weapon'];
const all_attributes_regex = /(absorption|alternate form|alternate identity|armor|attack mastery|augmented|capacity|change state|cognition|combat technique|companion|connected|control environment|conversion|data access|defect|defense mastery|dimension walk|dynamic powers|elasticity|enemy attack|enemy defense|energized|exorcism|extra actions|extra arms|extra defenses|features|flight|forcefield|gear|ground speed|healing|heightened awareness|heightened senses|illusion|immovable|immunity|immutable|inspire|jumping|massive damage|melee attack|melee defense|merge|metamorphosis|mimic|mind control|mind shield|minions|mulligan|nullify|plant control|pocket dimension|portal|power flux|power variation|projection|ranged attack|ranged defense|regeneration|reincarnation|resilient|sensory block|shield|sixth sense|size change|skill|social mastery|spaceflight|special movement|summon creatures|supersense|superspeed|superstrength|swarm|telekinesis|telepathy|teleport|tough|transfer|transmute|tunneling|unaffected|unassailable|undetectable|unique attribute|unknown power|water speed|wealth|weapon)/i;
const all_defects_array = ["achilles heel","awkward size","bane","blind fury","conditional ownership","confined","cursed","demure","easily distracted","fragile","hounded","impaired manipulation","impaired speech","inept attack","inept defense","involuntary change","ism","magnet","marked","nemesis","nightmares","no healing","obligated","phobia","physical impairment","red tape","reduced damage","sensory impairment","shortcoming","significant other","skeleton in the closet","social fault","special requirement","unappealing","unique defect","unsettled","vulnerability","wanted","weak point"];
@@ -7806,44 +7861,38 @@
}
}
- function doUpgrade(value, attrIDs, setObj){
+ function doUpgrade(value, sheetdb, attrIDs,sizetemplateIDs, setObj){
clog(2, {}, `global_version =`, value.global_version, 'doUpgrade()');
clog(2, {}, 'sheet_version =', value.version);
const sheet_version = value.version;
let global_version = value.global_version.split('.').map(Number);
const major_global_version = parseInt(global_version.shift());
const minor_global_version = parseFloat(global_version.join('.'));
- //clog(2, {}, 'global_version =', global_version);
- //clog(2, {}, 'major_global_version =', major_global_version);
- //clog(2, {}, 'minor_global_version =', minor_global_version);
- //const isLesserThan122 = global_version[0] <= 1 && global_version[1] <= 2 && global_version[2] < 2 ?
const isLesserThan122 = major_global_version <= 1 && minor_global_version < 2.2 ?
true : false;
- //clog(2, {}, 'isLesserThan122 =', isLesserThan122);
if (isLesserThan122) {
upgradeTo_1_2_2(value, setObj);
}
- //const isLesserThan131 = global_version[0] <= 1 && global_version[1] <= 3 && global_version[2] < 1 ?
const isLesserThan131 = major_global_version <= 1 && minor_global_version < 3.1 ?
true : false;
- //clog(2, {}, 'isLesserThan131 =', isLesserThan131);
if (isLesserThan131) {
upgradeTo_1_3_1(value, setObj);
}
- //const isLesserThan150 = global_version[0] <= 1 && global_version[1] < 5 ?
const isLesserThan150 = major_global_version <= 1 && minor_global_version < 5.0 ?
true : false;
- //clog(2, {}, 'isLesserThan150 =', isLesserThan150);
if (isLesserThan150) {
upgradeTo_1_5_0(setObj);
}
- //const isLesserThan172 = global_version[0] <= 1 && global_version[1] <= 7 && global_version[2] < 2 ?
const isLesserThan172 = major_global_version <= 1 && minor_global_version < 7.2 ?
true : false;
- //clog(2, {}, 'isLesserThan172 =', isLesserThan172);
if (isLesserThan172) {
upgradeTo_1_7_2(attrIDs, setObj);
}
+ const isLesserThan180 = major_global_version <= 1 && minor_global_version < 8.0 ?
+ true : false;
+ if (isLesserThan180) {
+ upgradeTo_1_8_0(sizetemplateIDs, value, sheetdb, setObj);
+ }
setObj.global_version = sheet_version;
}
@@ -7919,8 +7968,92 @@
clog(2, {}, 'upgraded to 1.7.2');
}
+ function upgradeTo_1_8_0(sizetemplateIDs, value, sheetdb, setObj) {
+ const currSize = value.static_template_size_name || 'medium';
+ setDefaultSize(sheetdb, setObj, currSize);
+ setTotalLift(0, {}, {}, value, setObj);
+ if (sizetemplateIDs.length !== undefined) {
+ _.each(sizetemplateIDs, id => {
+ removeRepeatingRow(`repeating_sizetemplate_${id}`);
+ });
+ }
+ clog(2, {}, 'upgraded to 1.8.0');
+ }
+
/** Build UI Functions **/
+ function getSuperStrengthLift(debug, timer, level) {
+ const lift = level !== 0 ?
+ get1or2andHalfor5(level) * (10 ** (Math.floor(level/3) + 2)) :
+ level;
+ clog(debug, timer, 'lift =', lift, 'getSuperStrengthLift()');
+ return lift;
+ };
+
+ function setTotalLift(debug, timer, attrdb, value, setObj) {
+ const size = value.static_template_size_name;
+ const rank = parseInt(value.static_template_size_rank);
+ 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);
+ 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);
+ const lift = hasSuperStrength ? parseInt(getSuperStrengthLift(debug, timer, hasSuperStrength)) :
+ strValue * 25;
+ clog(debug, timer, 'lift =', lift);
+ const totalLift = lift * liftMultiplier;
+ clog(debug, timer, 'totalLift =', totalLift);
+ setObj.stat_total_lift = totalLift;
+ }
+
+ function setDefaultSize(sheetdb, setObj, size = 'Medium') {
+ //clog(2, {}, 'size =', size, 'setDefaultSize()');
+ const json = JSON.parse(global_templates_size_json);
+ //clog(2, {}, 'json:', json);
+ const template = _.find(json.template, t => {
+ //clog(2, {}, 't:', t);
+ if (t.name === size) return true;
+ });
+ //clog(2, {}, 'template:', template);
+ const description = "Height/Length: " + template.height + "\r\nMass: " + template.mass + "\r\nLift: " + template.lift + "\r\nStrength Damage: " + template.strdmg + "\r\nArmor Rating: " + template.ar + "\r\nExtra Damage Taken: " + template.extradmg + "\r\nRanged Hit/Defend: " + template.rnghitdef + "\r\nRange Speed: " + template.rngspd;
+ const cost = parseInt(template.rank) * 10;
+ _.each(size_template_keys_array, key => {
+ const val = isNaN(template[key]) ? template[key] : parseInt(template[key]);
+ setObj[`static_template_size_${key}`] = val;
+ sheetdb[`static_template_size_${key}`] = val;
+ });
+ setObj.static_template_size_selection = template.name.toLowerCase();
+ sheetdb.static_template_size_selection = template.name.toLowerCase();
+ setObj.static_template_size_description = description;
+ setObj.static_template_size_cost = cost;
+ }
+
+ function setSizeTemplate(debug, timer, eventInfo, value, setObj) {
+ const size = capital(eventInfo.newValue);
+ clog(debug, timer, 'size =', size, 'setSizeTemplate()');
+ const json = JSON.parse(global_templates_size_json);
+ clog(debug, timer, 'json:', json);
+ const template = _.find(json.template, t => {
+ if (t.name === size) return true;
+ });
+ clog(debug, timer, 'template:', template);
+ const description = "Height/Length: " + template.height + "\r\nMass: " + template.mass + "\r\nLift: " + template.lift + "\r\nStrength Damage: " + template.strdmg + "\r\nArmor Rating: " + template.ar + "\r\nExtra Damage Taken: " + template.extradmg + "\r\nRanged Hit/Defend: " + template.rnghitdef + "\r\nRange Speed: " + template.rngspd;
+ clog(debug, timer, 'description =', description);
+ const cost = parseInt(template.rank) * 10;
+ _.each(size_template_keys_array, key => {
+ writeValues(debug, timer, value, `static_template_size_${key}`, template[key], setObj);
+ });
+ writeValues(debug, timer, value, 'static_template_size_selection', template.name.toLowerCase(), setObj);
+ setObj.static_template_size_description = description;
+ setObj.static_template_size_cost = cost;
+ }
+ /*
function buildSizeUI(sizes, setObj) {
var json = JSON.parse(global_templates_size_json);
_.each(sizes, (size, i) => {
@@ -7945,7 +8078,7 @@
setObj[`repeating_sizetemplate_${rowID}_rngspd`] = json.template[`${i}`].rngspd;
});
}
-
+ */
function getSkillStatsDisplay(stats) {
var result = "";
_.each(stats, (stat, i) => {
@@ -8109,12 +8242,12 @@
});
return result;
}
-
+ /*
function buildSizeTemplateValuesArray(rowID) {
const result = [`repeating_sizetemplate_${rowID}_height`, `repeating_sizetemplate_${rowID}_mass`, `repeating_sizetemplate_${rowID}_lift`, `repeating_sizetemplate_${rowID}_strdmg`, `repeating_sizetemplate_${rowID}_ar`, `repeating_sizetemplate_${rowID}_extradmg`, `repeating_sizetemplate_${rowID}_rnghitdef`, `repeating_sizetemplate_${rowID}_rngspd`, `repeating_sizetemplate_${rowID}_selection`, `repeating_sizetemplate_${rowID}_description`, `repeating_sizetemplate_${rowID}_label`];
return result;
}
-
+ */
function buildRepeatingExtraArmValuesArray(extraarms) {
var result = [];
if (extraarms != undefined) {
@@ -8193,7 +8326,7 @@
}
function getDefectPointsByCategory(value, rowID, defect){
- const aspect = value[`repeating_attr_${rowID}_defectaspect`];
+ const aspect = value[`repeating_attr_${rowID}_defectaspect`] || [];
const result = defect == 'shortcoming' ? aspect.length > 3 ? -4 : -1 :
lesser_defects_regex.test(defect) ? -1 :
serious_defects_regex.test(defect) ? -2 :
@@ -8844,6 +8977,7 @@
key === undefined ? true :
key === "" ? true :
key.indexOf('undefined') !== -1 ? true :
+ key.indexOf('__') !== -1 ? true :
false;
const isResultUndefined =
result === undefined ? true :
@@ -8978,8 +9112,8 @@
const showMajorAspectStats = majorAspectInUse ? 1 : 0;
setObj.showallaspectsstats = showAllAspectsStats;
setObj.showmajoraspectstats = showMajorAspectStats;
- clog(debug, timer, 'showallaspectsstats =', showallaspectsstats, 'setStatAspectView()');
- clog(debug, timer, 'showmajoraspectstats =', showmajoraspectstats);
+ clog(debug, timer, 'showallaspectsstats =', showAllAspectsStats, 'setStatAspectView()');
+ clog(debug, timer, 'showmajoraspectstats =', showMajorAspectStats);
}
function setDamageLevelByDamageTaken(debug, timer, value, setObj, sourceAttr) {
@@ -9031,10 +9165,11 @@
(derivedvalue == 'sanity') ? 'unassailable' :
(derivedvalue == 'social') ? 'socialmastery' :
'';
+ const multiplier = attribute === 'tough' || attribute === 'energized' ? 10 : 2;
const bonusattribute = attrdb[`${attribute}`];
const bonus = _.chain(bonusattribute)
.map(o => {
- const result = parseInt(o.level) || 0;
+ const result = parseInt(o.level) * multiplier || 0;
return result;
})
.reduce((memo, num)=>{ return memo + num; }, 0)
@@ -10502,6 +10637,7 @@
function setDynamicRollValue(debug, timer, eventInfo, value, attrdb, rowID, sourceAttr, setObj) {
const rolltype = value.static_roll_type_selection;
+ clog(debug, timer, 'rolltype =', rolltype, 'setDynamicRollValue()');
let cv = 0;
let rollmod = 0;
let type = '';
@@ -10516,7 +10652,7 @@
title = '{{title=Roll 2d6}}';
break;
case 'acv':
- cv = getCV(debug, timer, value, attrdb, setObj, sourceAttr, 'acv', '', true);
+ cv = getCV(debug, timer, value, attrdb, setObj, 'acv', '');
type = '{{acvroll=1}}';
title = '{{title=Roll ACV}}';
stat = `{{acv=${cv}}}`;
@@ -10533,10 +10669,8 @@
parseInt(value.static_button_personal_defense) ?
'personal' :
'';
- const bonus = defensetype != '' ?
- getSumOfActiveAttrLevels(attrdb, 'rangeddefense', defensetype) * 2 :
- 0;
- cv = getCV(debug, timer, value, attrdb, setObj, sourceAttr, 'dcv', '', true) + bonus;
+ clog(debug, timer, 'defensetype =', defensetype);
+ cv = getCV(debug, timer, value, attrdb, setObj, 'dcv', defensetype);
type = '{{dcvroll=1}}';
title = '{{title=Roll DCV}}';
stat = `{{dcv=${cv}}}`;
@@ -10544,7 +10678,7 @@
result = `${result} ${buildProtectionsString(debug, timer, value)}`;
break;
case 'initiative':
- cv = getCV(debug, timer, value, attrdb, setObj, sourceAttr, 'acv', '');
+ cv = getCV(debug, timer, value, attrdb, setObj, 'acv', '');
rollmod = getSumOfActiveSubAttrRanks(attrdb, 'combattechnique', 'lightningreflexes') || 0;
type = '{{initiative=1}}';
title = '{{title=Roll Initiative}}';
@@ -10575,6 +10709,7 @@
`|Minor Edge, ${setDice(rollmod, 1)}|Minor Obstacle, ${setDice(rollmod, -1)}` +
`|Major Edge, ${setDice(rollmod, 2)}|Major Obstacle, ${setDice(rollmod, -2)}}]]` +
`+[[${base}]] ${turntracker}]]}} {{roll=$[[0]]}}`;
+ clog(debug, timer, 'result =', result);
setObj.dynamic_roll_value = result;
setObj.dynamic_roll_base = base;
}
@@ -10656,7 +10791,8 @@
_.each(all_defects_array, defectmatch => {
defectmatch = removeWhiteSpace(defectmatch);
const exposesetting = defectmatch == defect ? 1 : 0;
- setObj[`repeating_attr_${rowID}_show${defectmatch}`] = exposesetting;
+ //setObj[`repeating_attr_${rowID}_show${defectmatch}`] = exposesetting;
+ writeValues(debug, timer, value, `repeating_attr_${rowID}_show${defectmatch}`, exposesetting, setObj);
exposesetting ? exposed_settings.push(`show${defectmatch}`) : false;
});
clog(debug, timer, 'exposed_settings:', exposed_settings, 'exposeDefectSettingsOnDefectChange()');
@@ -10826,7 +10962,7 @@
damagetype = (isActive) ? value[`repeating_attr_${rowID}_damagetype`] : "";
setObj[`protection_${attr}${layer}_specialized`] = specialized;
setObj[`protection_${attr}${layer}_gap`] = gap;
- setObj[`protection_${attr}${layer}_damagetype`] = damagetype;
+ if (damagetype !== undefined) setObj[`protection_${attr}${layer}_damagetype`] = damagetype;
clog(debug, timer, 'specialized =', specialized);
clog(debug, timer, 'damagetype =', damagetype);
clog(debug, timer, 'gap =', gap);
@@ -10998,8 +11134,25 @@
clog(debug, timer, 'senseRanks:', senseRanks, 'setHeightenedSenses()');
}
- function getIsTargetedActive(debug, timer, value, attrIDs, rowID, setObj) {
+ function getIsTargetedActive(debug, timer, value, attrdb, rowID, setObj) {
+ 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 ?
+ rowID : '';
+ clog(debug, timer, 'activeID =', activeID);
+ clog(debug, timer, 'activate =', value[`repeating_attr_${rowID}_activate`]);
+ /*
const attribute = removeWhiteSpace(value[`repeating_attr_${rowID}_attribute`]);
+ clog(debug, timer, 'attribute =', attribute, 'getIsTargetedActive()');
+ const activedb = attrdb[`${attribute}`];
+ const isActive = activedb !== undefined ?
+ _.chain(activedb).pluck('source').find(s => {
+ if (s === rowID) return true;
+ }).value() : undefined;
+ const activeID = isActive !== undefined ? rowID : '';
+ clog(debug, timer, 'activeID =', activeID);
+ /*
let activeID = "";
_.each(attrIDs, (attrID) => {
const attrname = removeWhiteSpace(value[`repeating_attr_${attrID}_attribute`]);
@@ -11008,6 +11161,7 @@
activeID = attrID;
}
});
+ */
return activeID;
}
@@ -11055,12 +11209,14 @@
getTargetedLevel(attrdb, attribute);
const result = (isActive) ? targeted : 0;
const enable = (result > 0) ? 1 : 0;
- const activeID = getIsTargetedActive(debug, timer, value, attrIDs, rowID, setObj);
+ const activeID = getIsTargetedActive(debug, timer, value, attrdb, rowID, setObj);
attribute = isRushAttack ? 'rushattack' : attribute;
+ /*
if (activeID != "") {
setActiveAttribute(0, debug, timer, value, activeID, sourceAttr, setObj, attribute);
setObj[`repeating_attr_${activeID}_activate`] = 0;
}
+ */
clog(debug, timer, 'attribute =', attribute, 'setTargeted()');
clog(debug, timer, 'targeted =', targeted);
clog(debug, timer, 'result =', result);
@@ -11135,7 +11291,7 @@
}
clog(debug, timer, 'defectdb:', defectdb, 'setDefectdb()');
}
-
+ /*
function getAttributeSettingByCustomization(debug, timer, value, rowID, customizations) {
const attribute_settings_by_customization_obj = {
'ammo':'ammo',
@@ -11164,12 +11320,14 @@
});
clog(debug, timer, 'customizations:', customizations, 'getAttributeSettingByCustomization()');
}
-
+ */
function setAttrdb(isActive, debug, timer, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj) {
+ clog(debug, timer, 'isActive =', isActive, 'setAttrdb(TEST)');
+ clog(debug, timer, 'attribute =', attribute);
const name = value[`repeating_attr_${rowID}_name`] || "";
const level = parseInt(value[`repeating_attr_${rowID}_effectivelevel`]) || 0;
const customizations = value[`repeating_attr_${rowID}_customizations`] || [];
- getAttributeSettingByCustomization(debug, timer, value, rowID, customizations);
+ //getAttributeSettingByCustomization(debug, timer, value, rowID, customizations);
let result = {};
let stat = 0;
let focused = 0;
@@ -11267,12 +11425,14 @@
}
if (isActive) {
attrdb[`${attribute}`].push(result);
+ /*
if (getIsTargeted(debug, timer, value, rowID, setObj)) {
- const activeID = getIsTargetedActive(debug, timer, value, attrIDs, rowID, setObj);
+ const activeID = getIsTargetedActive(debug, timer, value, attrdb, rowID, setObj);
if (activeID != "") {
attrdb[`${attribute}`].splice(getActiveIdPosition(attrdb, attribute, activeID), 1);
}
}
+ */
} else {
attrdb[`${attribute}`].find((attr, i) => {
//console.log(`attr.source = ${attr.source}`); console.log(`rowID = ${rowID}`);
@@ -11706,8 +11866,12 @@
setActiveAttribute(isActive, debug, timer, value, rowID, attrdb, setObj, attribute, level);
break;
case "socialmastery":
+ setAttrdb(isActive, debug, timer, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj);
+ setActiveAttribute(isActive, debug, timer, value, rowID, attrdb, setObj, attribute, level);
+ break;
case "superstrength":
setAttrdb(isActive, debug, timer, value, attrdb, attrIDs, rowID, sourceAttr, attribute, setObj);
+ setTotalLift(debug, timer, attrdb, value, setObj);
setActiveAttribute(isActive, debug, timer, value, rowID, attrdb, setObj, attribute, level);
break;
case "swarm":
@@ -12098,19 +12262,23 @@
clog(debug, timer, 'setDamageType', setDamageType,'setDamageType()');
}
- function getCV(debug, timer, value, attrdb, setObj, sourceAttr, type, focus = 'unarmed', invertState = false) {
+ function getCV(debug, timer, value, attrdb, setObj, type, focus = 'unarmed') {
+ clog(debug, timer, 'focus =', focus, 'getCV()');
const mastery =
(type == 'acv') ? getSumOfActiveAttrLevels(attrdb, 'attackmastery') :
(type == 'dcv') ? getSumOfActiveAttrLevels(attrdb, 'defensemastery') :
0;
+ clog(debug, timer, 'mastery =', mastery);
const isMelee =
getIsMelee(debug, timer, focus);
+ clog(debug, timer, 'isMelee =', isMelee);
const specialty =
(isMelee && type == 'acv') ? getSumOfActiveAttrLevels(attrdb, 'meleeattack', focus) * 2 :
(isMelee && type == 'dcv') ? getSumOfActiveAttrLevels(attrdb, 'meleedefense', focus) * 2 :
(!isMelee && type == 'acv') ? getSumOfActiveAttrLevels(attrdb, 'rangedattack', focus) * 2 :
(!isMelee && type == 'dcv') ? getSumOfActiveAttrLevels(attrdb, 'rangeddefense', focus) * 2 :
0;
+ clog(debug, timer, 'specialty =', specialty);
const state =
(type == 'acv') ?
isNaN(parseInt(setObj.static_button_targeted_attack)) ?
@@ -12121,25 +12289,36 @@
parseInt(value.static_button_targeted_defense) :
parseInt(setObj.static_button_targeted_defense) :
0;
+ clog(debug, timer, 'state =', state);
const enemy =
- (type == 'acv') ? getTargetedLevel(attrdb, 'enemyattack') * 2 :
- (type == 'dcv') ? getTargetedLevel(attrdb, 'enemydefense') * 2 :
+ (type == 'acv' && state) ?
+ getTargetedLevel(attrdb, 'enemyattack') * 2 :
+ (type == 'dcv' && state) ?
+ getTargetedLevel(attrdb, 'enemydefense') * 2 :
0;
+ clog(debug, timer, 'enemy =', enemy);
+ /*
const targeted =
- (type == 'acv') ? (invertState && sourceAttr == 'attack') ? (state > 0) ?
- 0 : enemy : (state > 0) ? enemy : 0 :
+ (type == 'acv') ?
+ (invertState && sourceAttr == 'attack') ?
+ (state > 0) ?
+ 0 : enemy :
+ (state > 0) ?
+ enemy : 0 :
(type == 'dcv') ? (invertState && sourceAttr == 'defense') ? (state > 0) ?
0 : enemy : (state > 0) ? enemy : 0 :
0;
+ */
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) ||
0;
+ clog(debug, timer, 'cv =', cv);
const result =
- cv + targeted + specialty + mastery;
- clog(debug, timer, 'result =', result, 'getCV()');
+ cv + enemy + specialty + mastery;
+ clog(debug, timer, 'result =', result);
return result;
}
@@ -12313,7 +12492,7 @@
} 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', handsource);
+ 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);
}
@@ -12873,9 +13052,9 @@
const targetedmdLevel =
getTargetedLevel(attrdb, 'massivedamage') || 0;
const targetedmd =
- invertState && sourceAttr == 'damage' ?
- targetedmdState > 0 ? 0 : targetedmdLevel :
- targetedmdState > 0 ? targetedmdLevel : 0;
+ //invertState && sourceAttr == 'damage' ?
+ //targetedmdState > 0 ? 0 : targetedmdLevel :
+ targetedmdState ? targetedmdLevel : 0;
const rushattackState =
isNaN(parseInt(setObj.static_button_targeted_rushdamage)) ?
parseInt(value.static_button_targeted_rushdamage) :
@@ -12911,11 +13090,11 @@
const acv =
attack_maneuvers_regex.test(maneuver) ?
isSwarm ? parseInt(weapon.level) + 4 :
- getCV(debug, timer, value, attrdb, setObj, sourceAttr, 'acv', weaponclass) : 0;
+ getCV(debug, timer, value, attrdb, setObj, 'acv', weaponclass) : 0;
const dcv =
defense_maneuvers_regex.test(maneuver) ?
isSwarm ? 0 :
- getCV(debug, timer, value, attrdb, setObj, sourceAttr, 'dcv', weaponclass) : 0;
+ getCV(debug, timer, value, attrdb, setObj, 'dcv', weaponclass) : 0;
let damage = isSwarm ?
Math.round(weapon.critters/10) :
isTelekinesis ?
@@ -13147,7 +13326,7 @@
clog(debug, timer, 'result =', result, 'setCombatRoll()');
setObj.maneuverroll = result;
}
-
+ /*
function setSizeTemplate(value, sizetempateIDs, rowID, setObj) {
_.each(sizetempateIDs, templateID => {
if (templateID!=rowID) setObj[`repeating_sizetemplate_${templateID}_selection`] = 0;
@@ -13162,7 +13341,7 @@
setObj.size_rnghitdef = value[`repeating_sizetemplate_${rowID}_rnghitdef`];
setObj.size_rngspd = value[`repeating_sizetemplate_${rowID}_rngspd`];
}
-
+ */
function writeHiddenDamageAttributes(sheetdb) {
var damage = [];
for (let i = 2; i == 12; i++) {
@@ -13208,11 +13387,13 @@
rowID=='movement' ? 'personal':
'';
//setObj[`${source}_${attribute}`] = state;
+ clog(debug, timer, 'attribute =', attribute, 'setButtonState()');
writeValues(debug, timer, value, `${source}_${attribute}`, state, setObj)
setObj[`${source}_activatetheme`] = theme;
- clog(debug, timer, 'state =', state, 'setButtonState()');
+ //writeValues(debug, timer, value, `${source}_activatetheme`, theme, setObj)
if(counterdefense.length>0) {
setObj[`static_button_${counterdefense}_defense`] = counterstate;
+ //writeValues(debug, timer, value, `static_button_${counterdefense}_defense`, counterstate, setObj)
clog(debug, timer, `${counterdefense} =`, counterstate);
}
return state;
@@ -13228,8 +13409,9 @@
}
function getHandSource(debug, timer, extraarmIDs, rowID){
- const handsource = /(mainhand|offhand)/i.test(rowID) ?
- rowID : `repeating_extraarm_${rowID}`;
+ const handsource = /(mainhand|offhand)/i.test(rowID) ? rowID :
+ extraarmIDs !== undefined ? extraarmIDs.indexOf(rowID) !== -1 ?
+ `repeating_extraarm_${rowID}` : '' : '';
const handscheck = handsource !== '' ? handsource.indexOf(',') > 0 ?
handsource.split(',') : handsource : false;
const result = handscheck !== false ? _.isArray(handscheck) ?
@@ -13429,7 +13611,7 @@
}
function recordSheetChanges(timer, eventInfo, value, setObj) {
- const sheet_change_array = ['show_debug_messages','weapon_ammo_reloads','weapon_ammo_capacity'];
+ const sheet_change_array = ['show_debug_messages','weapon_ammo_reloads','weapon_ammo_capacity','theme'];
const recordChange = sheet_change_array.indexOf(eventInfo.sourceAttribute) !== -1 ?
true : false;
if (recordChange) {
@@ -13612,6 +13794,8 @@
function registerEvents() {
const eventsToRegister = [
+ "theme",
+ "static_template_size_selection",
"static_rules_deplete_alt",
"weapon_ammo_reloads",
"weapon_ammo_capacity",
@@ -13630,7 +13814,7 @@
"static_stat_total_shame",
"repeating_attr",
"repeating_skill",
- "repeating_sizetemplate",
+ //"repeating_sizetemplate",
"static_stat_base_body",
"static_stat_base_mind",
"static_stat_base_soul",
@@ -13695,22 +13879,26 @@
const events = `change:${registerEvents()} clicked:${registerActions()} remove:${registerRemoved()}`;
const buttons = [
- "attrgroup1",
- "attrgroup2",
- "attrgroup3",
- "attrgroup4",
- "attrgroup5",
- "attrgroup6",
- "attrgroup7",
- "attrgroup8",
- "attrgroup9",
- "attrgroup10",
- "skillgroup1",
- "skillgroup2",
- "skillgroup3",
- "skillgroup4",
- "skillgroup5",
- ];
+ "attrgroup1",
+ "attrgroup2",
+ "attrgroup3",
+ "attrgroup4",
+ "attrgroup5",
+ "attrgroup6",
+ "attrgroup7",
+ "attrgroup8",
+ "attrgroup9",
+ "attrgroup10",
+ "skillgroup1",
+ "skillgroup2",
+ "skillgroup3",
+ "skillgroup4",
+ "skillgroup5",
+ ];
+
+ const sizeTemplateVariables = _.map(size_template_keys_array, key => {
+ return `static_template_size_${key}`;
+ });
on("sheet:opened", () => {
@@ -13729,6 +13917,8 @@
clog(3, timer, `Fetched extra arm IDs (${extraarmIDs.length} total)`, '');
getSectionIDs('skilltemplate', skilltempIDs => {
clog(3, timer, `Fetched skill template IDs (${skilltempIDs.length} total)`, '');
+ getSectionIDs('sizetemplate', sizetemplateIDs => {
+ clog(3, timer, `Fetched size template IDs (${sizetemplateIDs.length} total)`, '');
const skilltemp_names_array = _.map(skilltempIDs, id => {
return `repeating_skilltemplate_${id}_label`;
});
@@ -13746,6 +13936,7 @@
getAttrsString = getAttrsString.concat(buildRepeatingExtraArmValuesArray(extraarmIDs));
getAttrsString = getAttrsString.concat(stats_array);
getAttrsString = getAttrsString.concat(rolls_array);
+ getAttrsString = getAttrsString.concat(sizeTemplateVariables);
getAttrsString = getAttrsString.concat([
'show_debug_messages',
'theme',
@@ -13777,7 +13968,8 @@
clog(3, timer, 'value:', value);
if (value.global_initialized != 1) {
- buildSizeUI(global_templates_size_names, setObj);
+ //buildSizeUI(global_templates_size_names, setObj);
+ //setDefaultSize(sheetdb, setObj);
buildSkillsUI(value, setObj, sheetdb);
writeHiddenDamageAttributes(sheetdb);
createAttrdbJSON(setObj);
@@ -13785,7 +13977,7 @@
setObj.stat_total_body = '0';
setObj.stat_total_mind = '0';
setObj.stat_total_soul = '0';
- doUpgrade(value, attrIDs, setObj);
+ doUpgrade(value, sheetdb, attrIDs, sizetemplateIDs, setObj);
}else{
const skillmap = _.chain(skilltempIDs)
.map( id => {
@@ -13794,7 +13986,7 @@
.compact()
.value();
sheetdb.skillmap = skillmap;
- doUpgrade(value, attrIDs, setObj);
+ doUpgrade(value, sheetdb, attrIDs, sizetemplateIDs, setObj);
}
setObj.sheetdb = JSON.stringify(sheetdb);
clog(3, timer, 'Ready to write setObj to cache:', setObj, 'setAttrs()');
@@ -13805,6 +13997,7 @@
});
});
});
+ });
});
on("clicked:attrgroup1 clicked:attrgroup2 clicked:attrgroup3 clicked:attrgroup4 clicked:attrgroup5 clicked:attrgroup6 clicked:attrgroup7 clicked:attrgroup8 clicked:attrgroup9 clicked:attrgroup10 clicked:skillgroup1 clicked:skillgroup2 clicked:skillgroup3 clicked:skillgroup4 clicked:skillgroup5", (eventInfo) => {
@@ -13972,6 +14165,7 @@
}
setGroupDefectPointsOnActivation(debug, timer, attrIDs, attrdb, value, sectionName, rowID, setObj);
setDepleteResurvation(debug, timer, attrdb, value, rowID, setObj);
+ setTotalLift(debug, timer, attrdb, value, setObj);
break;
case `lock`:
if (resetOnActive(debug, timer, eventInfo, value, match, rowID, setObj)) return;
@@ -14057,6 +14251,7 @@
break;
}
break;
+ /*
case `sizetemplate`:
if (eventInfo.newValue == "0" ||
getIsSheetworker(eventInfo.sourceType)) {
@@ -14064,6 +14259,7 @@
}
setSizeTemplate(value, sizetempateIDs, rowID, setObj);
break;
+ */
}
persistCache(value, attrdb, attrIDs, skillIDs, extraarmIDs, skillmap);
clog(debug, timer, 'setObj:', setObj, 'Changes To Sheet Values', 'info');
@@ -14114,6 +14310,7 @@
setTotalShock(debug, timer, value, attrdb, setObj);
setTotalMovement(debug, timer, value, attrdb, setObj);
updateSkillRolls(debug, timer, value, skillIDs, sourceAttr, setObj);
+ setTotalLift(debug, timer, attrdb, value, setObj);
break;
}
break;
@@ -14134,12 +14331,14 @@
break;
case `button`:
if (rowID == 'targeted') {
- const rolltype = selection =>
- selection == 'acv' || selection == 'dcv' ?
- setDynamicRollValue(debug, timer, eventInfo, value, attrdb, rowID, sourceAttr, setObj) :
- false;
- rolltype(value.static_roll_type_selection);
setButtonState(debug, timer, value, source, rowID, sourceAttr, setObj);
+ if (sourceAttr === "attack" || sourceAttr === 'defense') {
+ const rolltype = selection =>
+ selection == 'acv' || selection == 'dcv' ?
+ setDynamicRollValue(debug, timer, eventInfo, value, attrdb, rowID, sourceAttr, setObj) :
+ false;
+ rolltype(value.static_roll_type_selection);
+ }
setCombatRoll(debug, timer, value, attrdb, undefined, sourceAttr, setObj, true);
}
if (rowID == 'personal' || rowID == 'movement') {
@@ -14170,6 +14369,10 @@
case 'rules':
setDepleteRules(debug, timer, value, attrIDs, setObj);
break;
+ case 'template':
+ setSizeTemplate(debug, timer, eventInfo, value, setObj);
+ setTotalLift(debug, timer, attrdb, value, setObj);
+ break;
}
persistCache(value, attrdb, attrIDs, skillIDs, extraarmIDs, skillmap);
clog(debug, timer, 'setObj:', setObj, 'Changes To Sheet Values', 'info');