diff --git a/BESM4eExtras/BESM4eExtras.html b/BESM4eExtras/BESM4eExtras.html index 79f1935e25..60f5eccef3 100644 --- a/BESM4eExtras/BESM4eExtras.html +++ b/BESM4eExtras/BESM4eExtras.html @@ -7576,7 +7576,7 @@ const combattechniques_array = ['blackout','blindfighting','blindshooting','brutal','concealment','criticalstrike','deadeye','defelction','enhancedknockback','extendedrange','farshot','hardboiled','judgeopponent','lethalblow','lightningreflexes','multipletargets','portablearmory','preciseaim','reflection','rushattack','steadyhand','tournamentencyclopedia','twoweapons','weaponsencyclopedia']; const stats_array = ['static_stat_type_set', 'static_stat_temp_energy', 'static_stat_temp_health', 'stat_total_social', 'static_stat_total_shame', 'stat_total_sanity', 'static_stat_total_maddness', 'stat_total_energy', 'static_stat_total_fatigue', 'stat_total_health', 'static_stat_total_wounds', 'stat_total_shock', 'static_character_points_spent', 'bodystate', 'mindstate', 'soulstate', 'static_stat_base_body', 'static_stat_base_mind', 'static_stat_base_soul', 'stat_total_body', 'stat_total_mind', 'stat_total_soul', 'stat_total_acv', 'stat_total_dcv', 'stat_total_str', 'stat_total_cre', 'stat_total_com', 'stat_total_awa', 'stat_total_dex', 'stat_total_agi', 'stat_total_con', 'stat_total_int', 'stat_total_per', 'stat_total_rea', 'stat_total_wil', 'stat_total_cha', 'strstate', 'agistate', 'dexstate', 'constate', 'intstate', 'reastate', 'perstate', 'crestate', 'wilstate', 'chastate', 'awastate', 'comstate']; 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', 'attrdb', 'static_button_targeted_rushdamage', 'static_button_targeted_damage', 'static_button_targeted_attack', 'static_button_targeted_defense', 'massivedamage_targeted', 'massivedamage', 'enemyattack', 'enemydefense']; + 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 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; @@ -7608,6 +7608,14 @@ .value(); /** Utility Functions **/ + function getTimestamp(event, timerStart, timecache) { + const timeNow = Date.now(); + const timeElapsed = timeNow - timerStart; + const timeTaken = timeElapsed - timecache; + console.log('\x1b[33m%s\x1b[0m',`[timestamp(${timeElapsed}[${timeTaken}])]: ${event}`); + return timeElapsed; + } + function capital(str) { if (str.length == 0) return; const whitespace = /\s/g.test(str); @@ -8169,6 +8177,18 @@ if(wasDynamicGroup(attribute)) convertToStandardGroup(debug, attrIDs, attrdb, value, rowID, setObj); } + function cleanupSheetdb(debug, removedInfo, value) { + _.chain(removedInfo) + .keys() + .each( o => { + delete value[o.toLowerCase()]; + }); + if(debug) { + console.log(`[cleanupSheetdb()] value:`); + console.log(value); + } + } + function restoreActiveAttribute(removedInfo){ setAttrs(removedInfo,{silent:true}); } @@ -13802,31 +13822,78 @@ ]; on("sheet:opened", () => { - getAttrs(on_sheet_open_array, (value) => { - var setObj = {}; - if (value.global_initialized != 1) { - buildSizeUI(global_templates_size_names, setObj); - buildSkillsUI(); - writeHiddenDamageAttributes(setObj); - createAttrdbJSON(setObj); - setObj.global_initialized = 1; - }else{ - doUpgrade(value, setObj); - } - setAttrs(setObj); + + getSectionIDs('attr', attrIDs => { + getSectionIDs('skill', skillIDs => { + getSectionIDs('extraarm', extraarmIDs => { + let getAttrsString = []; + + getAttrsString = getAttrsString.concat(buildReapeatingAttrValuesArray(attrIDs)); + getAttrsString = getAttrsString.concat(buildReapeatingSkillValuesArray(skillIDs)); + //getAttrsString = getAttrsString.concat(buildSkillTemplateValuesArray(rowID)); + //getAttrsString = getAttrsString.concat(buildSizeTemplateValuesArray(rowID)); + getAttrsString = getAttrsString.concat(combat_stats_array); + getAttrsString = getAttrsString.concat(buildConditionStateArray()); + getAttrsString = getAttrsString.concat(buildAttrGroupValuesArray()); + getAttrsString = getAttrsString.concat(buildSkillGroupValuesArray()); + getAttrsString = getAttrsString.concat(buildProtectionValuesArray()); + getAttrsString = getAttrsString.concat(buildRepeatingExtraArmValuesArray(extraarmIDs)); + getAttrsString = getAttrsString.concat(stats_array); + getAttrsString = getAttrsString.concat(rolls_array); + getAttrsString = getAttrsString.concat([ + 'show_debug_messages', + 'theme', + 'static_weapon_maneuver_name', + 'active_weapon', + 'static_attrgroup_selected_tab', + 'static_skillgroup_selected_tab' + ]); + getAttrsString = getAttrsString.concat(size_template_values_array); + getAttrsString = getAttrsString.concat(buildStatButtonStatesArray()); + const getValues = getAttrsString.concat(on_sheet_open_array); + + getAttrs(getValues, (value) => { + const setObj = {}; + const sheetdb = {}; + sheetdb.attrIDs = attrIDs; + sheetdb.skillIDs = skillIDs; + sheetdb.extraarmIDs = extraarmIDs; + + _.each(getAttrsString, o => { + if(value[o] !== undefined) sheetdb[o] = value[o]; + }); + console.log(`[TEST sheetdb]:`); console.log(sheetdb); + setObj.sheetdb = JSON.stringify(value); + + if (value.global_initialized != 1) { + buildSizeUI(global_templates_size_names, setObj); + buildSkillsUI(); + writeHiddenDamageAttributes(setObj); + createAttrdbJSON(setObj); + setObj.global_initialized = 1; + }else{ + doUpgrade(value, setObj); + } + setAttrs(setObj); + }); + }); + }); }); }); 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) => { const button = eventInfo.triggerName.substring(8, eventInfo.triggerName.length); const section = button.replace(/[0-9]/g, ""); - let setObj = []; + const setObj = {}; setObj[`static_${section}_selected_tab`] = button; setAttrs(setObj); return; }); on(events, (eventInfo) => { + const timerStart = Date.now(); //console.log(`[timestamp(TEST)] timerStart = ${timerStart}`); + var timecache = 0; + timecache = getTimestamp('Main script fired',timerStart,timecache); /** Script Main **/ const isRemoved = /remove/i.test(eventInfo.triggerName); @@ -13834,25 +13901,46 @@ eventInfo.sourceAttribute = isRemoved ? `${eventInfo.sourceAttribute}_removed` : eventInfo.sourceAttribute; + timecache = getTimestamp('Checked for removed event',timerStart,timecache); + if(eventInfo.sourceAttribute === undefined){ eventInfo.sourceAttribute = eventInfo.triggerName.substring(8, eventInfo.triggerName.length); } + + timecache = getTimestamp('Checked if event was a button push',timerStart,timecache); + if(/clicked/i.test(eventInfo.triggerName)){ if(/repeating_skill_/i.test(eventInfo.triggerName)){ const button = eventInfo.htmlAttributes.name.substring(3,eventInfo.htmlAttributes.name.length); eventInfo.sourceAttribute = `${eventInfo.sourceAttribute}${button}`; } } + + timecache = getTimestamp('Checked for skill button push',timerStart,timecache); + setPreviousValue(eventInfo); + timecache = getTimestamp('Fixed previousValue',timerStart,timecache); + console.log(`[Event Listener] eventInfo:`); console.log(eventInfo); + timecache = getTimestamp('Display event listener',timerStart,timecache); + eventInfo.sourceAttribute.replace(/^((.+?)_(.+?)_(.+?))_(.+)/, (match, source, sourceType, sectionName, rowID, sourceAttr) => { + timecache = getTimestamp('Breakdown event into steering variables',timerStart,timecache); + + //if (`${sourceType}` == `repeating` && /(costperlevel|visible|new|source|characteristic|rollable|attrdefecttoggle|damagetype)/i.test(`${sourceAttr}`)) return; + if (sourceType == `repeating` && non_actionable_events.indexOf(sourceAttr) >= 0) return; + + timecache = getTimestamp('Checked for non-actionable events',timerStart,timecache); + const originalCaseRowID = rowID; source = source.toLowerCase(); match = match.toLowerCase(); rowID = rowID.toLowerCase(); + timecache = getTimestamp('Normalize steering variables',timerStart,timecache); + console.log(`match = ${match}`); console.log(`source = ${source}`); console.log(`sourceType = ${sourceType}`); @@ -13860,17 +13948,27 @@ console.log(`rowID = ${rowID}`); console.log(`sourceAttr = ${sourceAttr}`); - //if (`${sourceType}` == `repeating` && /(costperlevel|visible|new|source|characteristic|rollable|attrdefecttoggle|damagetype)/i.test(`${sourceAttr}`)) return; - if (sourceType == `repeating` && non_actionable_events.indexOf(sourceAttr) >= 0) return; - - var getAttrsString = [`show_debug_messages`]; - var setObj = {}; + let getAttrsString = [`show_debug_messages`]; + const setObj = {}; + timecache = getTimestamp('Set global variables for attr reading/writing',timerStart,timecache); + /* getSectionIDs('attr', attrIDs => { + + timecache = getTimestamp('Got attrIDs',timerStart,timecache); + getSectionIDs('skill', skillIDs => { + + timecache = getTimestamp('Got skillIDs',timerStart,timecache); + getSectionIDs('extraarm', extraarmIDs => { + + timecache = getTimestamp('Got extraarmIDs',timerStart,timecache); + getSectionIDs('sizetemplate', sizetempateIDs => { + timecache = getTimestamp('Got sizetemplateIDs',timerStart,timecache); + /* getAttrsString = getAttrsString.concat(buildReapeatingAttrValuesArray(attrIDs)); getAttrsString = getAttrsString.concat(buildReapeatingSkillValuesArray(skillIDs)); getAttrsString = sectionName=='skilltemplate' ? getAttrsString.concat(buildSkillTemplateValuesArray(rowID)): getAttrsString; @@ -13892,13 +13990,37 @@ ]); getAttrsString = getAttrsString.concat(size_template_values_array); getAttrsString = getAttrsString.concat(buildStatButtonStatesArray()); + */ - getAttrs(getAttrsString, (value) => { + getAttrsString = getAttrsString.concat([ + 'attrdb', + 'sheetdb' + ]); + + timecache = getTimestamp('Built getAttrsString to fetch databases',timerStart,timecache); + + getAttrs(getAttrsString, (v) => { + + timecache = getTimestamp('Got all the data',timerStart,timecache); + + let value = JSON.parse(v.sheetdb); + const attrIDs = value.attrIDs; + const skillIDs = value.skillIDs; + const extraarmIDs = value.extraarmIDs; + !isRemoved ? value[match] = eventInfo.newValue !== undefined ? eventInfo.newValue : + value[match] : false; + + timecache = getTimestamp('Loaded sheetdb as value',timerStart,timecache); console.log(`[Captured Attributes] value:`); console.log(value); + + const attrdb = JSON.parse(v.attrdb); + + timecache = getTimestamp('Loaded attrdb',timerStart,timecache); const debug = parseInt(value[`show_debug_messages`]) || 0; - var attrdb = JSON.parse(value.attrdb); + + timecache = getTimestamp('Set debug variable',timerStart,timecache); if(isRemoved){ if(getWasActive(removedInfo, originalCaseRowID)){ @@ -13913,11 +14035,17 @@ cleanupSkillCosts(debug, skillIDs, value, rowID, setObj); break; } + cleanupSheetdb(debug, removedInfo, value); if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } + value = {...value, ...setObj}; + setObj.sheetdb = JSON.stringify(value); setAttrs(setObj,{silent:true}); } return; }else if (sourceType==`repeating`) { + + timecache = getTimestamp('Is repeating event',timerStart,timecache); + const isCustomization = getIsCustomization(debug, sourceAttr);//(enhancement|limiter)/i.test(`${sourceAttr}`); const customizationType = getCustomizationType(debug, sourceAttr); const customization = (isCustomization) ? @@ -13927,6 +14055,9 @@ } : undefined; sourceAttr = isCustomization ? 'customization' : sourceAttr; + + timecache = getTimestamp('Checked for customization',timerStart,timecache); + switch (sectionName) { case `attr`: const isNew = parseInt(value[`${source}_new`]) || 0; @@ -13960,17 +14091,42 @@ setAttrCharacteristic(debug, value, rowID, setObj); break; case `activate`: + + timecache = getTimestamp('sourceAttr == "activate"',timerStart,timecache); + if (!getIsLocked(debug, value, rowID, sourceAttr)) return; if (!getFluxGroupIsActive(debug, value, rowID)) return; const isActive = setButtonState(debug, value, source, rowID, sourceAttr, setObj); const handsource = getHandSource(debug, value[`repeating_attr_${rowID}_source`]); const handstate = parseInt(value[`${handsource}_state`]); + + timecache = getTimestamp('Passed checks and set variables',timerStart,timecache); + setAttrEffects(debug, isActive, value, attrdb, extraarmIDs, attrIDs, sectionName, rowID, sourceAttr, setObj); + + timecache = getTimestamp('Completed setAttrEffects',timerStart,timecache); + setPoolCostIfGroupIsFlux(debug, isActive, attrIDs, value, rowID, setObj); + + timecache = getTimestamp('Completed setPoolCostIfGroupIsFlux',timerStart,timecache); + setPoolCostIfGroupIsVariation(debug, isActive, attrIDs, value, rowID, setObj); - if (handstate) setWeaponAmmo(debug, attrdb, value, handsource, setObj); + + timecache = getTimestamp('Compelted setPoolCostIFGroupIsVariation',timerStart,timecache); + + if (handstate) { + setWeaponAmmo(debug, attrdb, value, handsource, setObj); + timecache = getTimestamp('Completed setWeaponAmmo',timerStart,timecache); + } + disableActiveWeapon(debug, value, rowID, setObj); + + timecache = getTimestamp('Completed disableActiveWeapon',timerStart,timecache); + setGroupDefectPointsOnActivation(debug, attrIDs, attrdb, value, sectionName, rowID, setObj); + + timecache = getTimestamp('Completed setGroupDefectPointsOnActivation',timerStart,timecache); + break; case `lock`: if (resetOnActive(debug, eventInfo, value, match, rowID, setObj)) return; @@ -14063,9 +14219,19 @@ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } + + timecache = getTimestamp('Ready to write',timerStart,timecache); + value = {...value, ...setObj}; + setObj.sheetdb = JSON.stringify(value); setAttrs(setObj,{silent:true}); + + timecache = getTimestamp('Writing complete',timerStart,timecache); + return; } else if (sourceType==`static`) { + + timecache = getTimestamp('Is static event',timerStart,timecache); + switch (sectionName) { case `weapon`: switch (rowID) { @@ -14159,17 +14325,24 @@ break; } if(debug){ console.log('[Changes To Sheet Values] setObj:'); console.log(setObj); } + value = {...value, ...setObj}; + setObj.sheetdb = JSON.stringify(value); + timecache = getTimestamp('Ready to write',timerStart,timecache); + setAttrs(setObj,{silent:true}); + + timecache = getTimestamp('Writing complete',timerStart,timecache); + return; } else { if(debug) console.log(`[sourceType = ${sourceType}] no matching sourceType, exiting.`); return; } }); - }); - }); - }); - }); + // }); + // }); + // }); + // }); }); });