From 910cb8c4cafdc34da0f909559b1f3ad54bfaf320 Mon Sep 17 00:00:00 2001 From: nesuprachy <64099419+nesuprachy@users.noreply.github.com> Date: Thu, 13 Feb 2025 09:50:19 +0100 Subject: [PATCH] DrD2StatusMarkers patch 0.1.4 Performance optimization attempt --- DrD2StatusMarkers/0.1.4/DrD2StatusMarkers.js | 86 +++++++++++++++ DrD2StatusMarkers/DrD2StatusMarkers.js | 108 +++++++++---------- DrD2StatusMarkers/script.json | 4 +- 3 files changed, 138 insertions(+), 60 deletions(-) create mode 100644 DrD2StatusMarkers/0.1.4/DrD2StatusMarkers.js diff --git a/DrD2StatusMarkers/0.1.4/DrD2StatusMarkers.js b/DrD2StatusMarkers/0.1.4/DrD2StatusMarkers.js new file mode 100644 index 0000000000..b48f497239 --- /dev/null +++ b/DrD2StatusMarkers/0.1.4/DrD2StatusMarkers.js @@ -0,0 +1,86 @@ +// Github: TBD +// By: nesuprachy +// Contact: https://app.roll20.net/users/11071738/nesuprachy +// +// This script sets token markers based on relevant sheet attributes. +// Works with the DrD2 token marker set, icons must be named `RED`, `BLU`, `GRN`, `VIO`, `BLK`, `GRY`, `load` followed by corresponding values +// Uses TokenMod to set token markers from chat https://wiki.roll20.net/Script:Token_Mod + +var DrD2StatusMarkers = DrD2StatusMarkers || (function() { + 'use strict'; + + const version = '0.1.4'; + const lastUpdate = 1739435813976; + const markerAttributes = ['body_scarred', 'spirit_scarred', 'influence_scarred', 'danger', 'advantages', 'companion_bond_scarred', 'load']; + const markerMap = { + body_scarred: 'RED', + spirit_scarred: 'BLU', + influence_scarred: 'GRN', + danger: 'VIO', + advantages: 'BLK', + companion_bond_scarred: 'GRY', + load: 'load' + }; + + checkInstall = function () { + log(`-=> DrD2StatusMarkers v${version} <=- [${new Date(lastUpdate)}]`); + }, + + handleMarkerAttributes = function (obj, prev) { + //const startTime = Date.now(); + + const attr = obj.get('name'); + let marker = markerMap[attr]; + const charId = obj.get('_characterid'); + + // Parse old and new values + const prevVal = (attr === 'load') ? prev.current : parseInt(prev.current) || 0; + const newVal = (attr === 'load') ? obj.get('current') : parseInt(obj.get('current')) || 0; + if(newVal === prevVal) return; + + //log(`\'${obj.get('name')}\' of character \'${(getObj('character', charId)).get('name')}\' changed from ${prevVal} -> ${newVal}`); + + // If attribute is 'load' set marker to 'S', 'L' or 'T' + // If newVal is between 0 and 10 set marker to new value + // If newVal is >= 10 set marker to 9+ + // if newVal is <= 0 remove all markers except 'load' + if(marker){ + const clearAllMarkers = `|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|-${marker}9plus`; + if(attr === 'load'){ + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-loadL|-loadS|-loadT|load${newVal}`, null, {noarchive:true}); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-loadL|-loadS|-loadT|load${newVal}`); + } else if(newVal > 0 && newVal < 10) { + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}${newVal}`, null, {noarchive:true} ); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}${newVal}`); + } else if(newVal >= 10) { + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}9plus`, null, {noarchive:true} ); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}9plus`); + } else { + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}`, null, {noarchive:true} ); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}`); + } + } + + //const endTime = Date.now(); + //log(`handleMarkerAttributes() took ${endTime - startTime} ms to execute`); + }, + + registerEventHandlers = function () { + on('change:attribute:current', function(obj, prev){ + if(markerAttributes.includes(obj.get('name'))) handleMarkerAttributes(obj, prev); + }); + }; + + return { + CheckInstall: checkInstall, + RegisterEventHandlers: registerEventHandlers + }; + +}()); + +on('ready', () => { + 'use strict'; + + DrD2StatusMarkers.CheckInstall(); + DrD2StatusMarkers.RegisterEventHandlers(); +}); \ No newline at end of file diff --git a/DrD2StatusMarkers/DrD2StatusMarkers.js b/DrD2StatusMarkers/DrD2StatusMarkers.js index 3cc07d2599..b48f497239 100644 --- a/DrD2StatusMarkers/DrD2StatusMarkers.js +++ b/DrD2StatusMarkers/DrD2StatusMarkers.js @@ -9,74 +9,66 @@ var DrD2StatusMarkers = DrD2StatusMarkers || (function() { 'use strict'; - const version = '0.1.3'; - const lastUpdate = 1731662174989; + const version = '0.1.4'; + const lastUpdate = 1739435813976; const markerAttributes = ['body_scarred', 'spirit_scarred', 'influence_scarred', 'danger', 'advantages', 'companion_bond_scarred', 'load']; - + const markerMap = { + body_scarred: 'RED', + spirit_scarred: 'BLU', + influence_scarred: 'GRN', + danger: 'VIO', + advantages: 'BLK', + companion_bond_scarred: 'GRY', + load: 'load' + }; + checkInstall = function () { log(`-=> DrD2StatusMarkers v${version} <=- [${new Date(lastUpdate)}]`); }, handleMarkerAttributes = function (obj, prev) { - var attr = obj.get('name'); - if(markerAttributes.includes(attr)) { - var prevVal, newVal; - if(attr === 'load') { - prevVal = prev.current; - newVal = obj.get('current'); - }else { - prevVal = parseInt(prev.current)||0; - newVal = parseInt(obj.get('current'))||0; - } - var charId = obj.get('_characterid'); - var marker = ''; - //log(`${obj.get('name')} changed`); - //log(`prevVal ${prevVal} -> newVal ${newVal}`); - switch (attr) { - case markerAttributes[0]: - marker = 'RED'; - break; - case markerAttributes[1]: - marker = 'BLU'; - break; - case markerAttributes[2]: - marker = 'GRN'; - break; - case markerAttributes[3]: - marker = 'VIO'; - break; - case markerAttributes[4]: - marker = 'BLK'; - break; - case markerAttributes[5]: - marker = 'GRY'; - break; - case markerAttributes[6]: - marker= 'load'; - break; - default: - break; - } - if(marker){ - if(attr === 'load'){ - sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-loadL|-loadS|-loadT|load${newVal}`, null, {noarchive:true}); - //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-loadL|-loadS|-loadT|load${newVal}`); - } else if(newVal > 0 && newVal < 10) { - sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|-${marker}9plus|${marker}${newVal}`, null, {noarchive:true} ); - //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|-${marker}9plus|${marker}${newVal}`); - } else if(newVal >= 10) { - sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|${marker}9plus`, null, {noarchive:true} ); - //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|${marker}9plus`); - } else { - sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|-${marker}9plus`, null, {noarchive:true} ); - //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|-${marker}9plus`); - } + //const startTime = Date.now(); + + const attr = obj.get('name'); + let marker = markerMap[attr]; + const charId = obj.get('_characterid'); + + // Parse old and new values + const prevVal = (attr === 'load') ? prev.current : parseInt(prev.current) || 0; + const newVal = (attr === 'load') ? obj.get('current') : parseInt(obj.get('current')) || 0; + if(newVal === prevVal) return; + + //log(`\'${obj.get('name')}\' of character \'${(getObj('character', charId)).get('name')}\' changed from ${prevVal} -> ${newVal}`); + + // If attribute is 'load' set marker to 'S', 'L' or 'T' + // If newVal is between 0 and 10 set marker to new value + // If newVal is >= 10 set marker to 9+ + // if newVal is <= 0 remove all markers except 'load' + if(marker){ + const clearAllMarkers = `|-${marker}1|-${marker}2|-${marker}3|-${marker}4|-${marker}5|-${marker}6|-${marker}7|-${marker}8|-${marker}9|-${marker}9plus`; + if(attr === 'load'){ + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-loadL|-loadS|-loadT|load${newVal}`, null, {noarchive:true}); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers|-loadL|-loadS|-loadT|load${newVal}`); + } else if(newVal > 0 && newVal < 10) { + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}${newVal}`, null, {noarchive:true} ); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}${newVal}`); + } else if(newVal >= 10) { + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}9plus`, null, {noarchive:true} ); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}|${marker}9plus`); + } else { + sendChat('API', `!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}`, null, {noarchive:true} ); + //log(`!token-mod --ignore-selected --ids ${charId} --set statusmarkers${clearAllMarkers}`); } } + + //const endTime = Date.now(); + //log(`handleMarkerAttributes() took ${endTime - startTime} ms to execute`); }, - + registerEventHandlers = function () { - on('change:attribute:current', function(obj, prev){handleMarkerAttributes(obj, prev)}); + on('change:attribute:current', function(obj, prev){ + if(markerAttributes.includes(obj.get('name'))) handleMarkerAttributes(obj, prev); + }); }; return { diff --git a/DrD2StatusMarkers/script.json b/DrD2StatusMarkers/script.json index 6506756b51..f0372806ae 100644 --- a/DrD2StatusMarkers/script.json +++ b/DrD2StatusMarkers/script.json @@ -1,8 +1,8 @@ { "name": "DrD2StatusMarkers", "script": "DrD2StatusMarkers.js", - "version": "0.1.3", - "previousversions": ["0.1.0", "0.1.1", "0.1.2"], + "version": "0.1.4", + "previousversions": ["0.1.0", "0.1.1", "0.1.2", "0.1.3"], "description": "Designed for use only with the Draci Doupe II sheet.\n\nThis script sets token markers based on relevant sheet attributes.\nWorks with the DrD2 token marker set, icons must be named `RED`, `BLU`, `GRN`, `VIO`, `BLK`, `GRY`, `load` followed by corresponding values.\nYou can download the token marker set [here](https://download-directory.github.io/?url=https%3A%2F%2Fgithub.com%2Fnesuprachy%2Froll20-character-sheets%2Ftree%2FDraci-doupe-II%2FDraci%2520doupe%2520II%2Fassets%2FDrD2-token_markers).", "authors": "nesuprachy", "roll20userid": "11071738",