diff --git a/TokenController/4.0.0/TokenController.js b/TokenController/4.0.0/TokenController.js
index 4c1f72218..d8c2130df 100644
--- a/TokenController/4.0.0/TokenController.js
+++ b/TokenController/4.0.0/TokenController.js
@@ -69,8 +69,8 @@ API_Meta.TokenController = { offset: Number.MAX_SAFE_INTEGER, lineCount: -1 };
const TokenController = (() => {
const NAME = 'TokenController';
- const VERSION = '4.2.0';
- const AUTHOR = 'Scott E. Schwarz';
+ const VERSION = '4.0.1';
+ const AUTHOR = 'Developesque';
let errorMessage = "";
let listingVars = false;
let combatStarted = false;
@@ -229,10 +229,14 @@ const TokenController = (() => {
log(`${NAME} ${VERSION} by ${AUTHOR} Ready Meta Offset : ${API_Meta.TokenController.offset}`);
createMenu();
+
+ on('chat:message', chatHandler);
+ on('change:graphic', graphicHandler);
+ on('change:campaign:turnorder', turnorderHandler);
});
// Token Destruction
- on("change:graphic", function (obj, prev) {
+ const graphicHandler = function (obj, prev) {
if (obj.get("_subtype") !== "token") {
return;
}
@@ -265,10 +269,47 @@ const TokenController = (() => {
rotation: obj.get('rotation')
});
});
- });
+ };
+ // When Roll20 combat starts
+ const turnorderHandler = function (campaign, prev) {
+ const rawCurrent = campaign.get('turnorder');
+ const rawPrev = (prev && typeof prev.get === 'function') ? prev.get('turnorder') : prev;
+ let current = [];
+ let prevOrder = [];
+ try {
+ current = typeof rawCurrent === 'string' ? (JSON.parse(rawCurrent || '[]') || []) : (Array.isArray(rawCurrent) ? rawCurrent : []);
+ } catch (e) { current = []; }
+ try {
+ prevOrder = typeof rawPrev === 'string' ? (JSON.parse(rawPrev || '[]') || []) : (Array.isArray(rawPrev) ? rawPrev : []);
+ } catch (e) { prevOrder = []; }
+ const wasEmpty = !prevOrder || prevOrder.length === 0;
+ const isNowActive = current && current.length > 0;
+
+ if (isNowActive && current[0] && typeof current[0] === 'object' && current[0].id) {
+ currentCombatant = current[0].id;
+ }
+
+ if (combatStarted && !isNowActive) {
+ combatStarted = false;
+ //sendChat('System', '🏆 Combat has ended!');
+ return;
+ }
+
+ if (combatStarted && state[NAME].storedVariables.combatPatrol) {
+ pathTokens(true);
+ }
+
+ // When Roll20 combat starts
+ if (!combatStarted && !wasEmpty && isNowActive) {
+ combatStarted = true;
+ //sendChat('System', '⚔️ Combat has started!');
+ sendChat(`${NAME}`, `/w GM ⚔️ Patrols have been stopped! Combat Patrolling is ${state[NAME].storedVariables.combatPatrol ? "enabled" : "disabled"}`);
+ }
+ };
+
// Commands
- on("chat:message", function (msg) {
+ const chatHandler = function (msg) {
try {
if (msg.type === "api" && (msg.content.toLowerCase().startsWith("!token-control") || msg.content.toLowerCase().startsWith("!tc"))) {
@@ -497,44 +538,7 @@ const TokenController = (() => {
log(` ${NAME} Error: ${err}
${errorMessage}`);
errorMessage = "";
}
- });
-
- // When Roll20 combat starts
- on('change:campaign:turnorder', function (campaign, prev) {
- const rawCurrent = campaign.get('turnorder');
- const rawPrev = (prev && typeof prev.get === 'function') ? prev.get('turnorder') : prev;
- let current = [];
- let prevOrder = [];
- try {
- current = typeof rawCurrent === 'string' ? (JSON.parse(rawCurrent || '[]') || []) : (Array.isArray(rawCurrent) ? rawCurrent : []);
- } catch (e) { current = []; }
- try {
- prevOrder = typeof rawPrev === 'string' ? (JSON.parse(rawPrev || '[]') || []) : (Array.isArray(rawPrev) ? rawPrev : []);
- } catch (e) { prevOrder = []; }
- const wasEmpty = !prevOrder || prevOrder.length === 0;
- const isNowActive = current && current.length > 0;
-
- if (isNowActive && current[0] && typeof current[0] === 'object' && current[0].id) {
- currentCombatant = current[0].id;
- }
-
- if (combatStarted && !isNowActive) {
- combatStarted = false;
- //sendChat('System', '🏆 Combat has ended!');
- return;
- }
-
- if (combatStarted && state[NAME].storedVariables.combatPatrol) {
- pathTokens(true);
- }
-
- // When Roll20 combat starts
- if (!combatStarted && !wasEmpty && isNowActive) {
- combatStarted = true;
- //sendChat('System', '⚔️ Combat has started!');
- sendChat(`${NAME}`, `/w GM ⚔️ Patrols have been stopped! Combat Patrolling is ${state[NAME].storedVariables.combatPatrol ? "enabled" : "disabled"}`);
- }
- });
+ };
function cleanupStaleTokens() {
const beforePaths = state[NAME].storedVariables.activeTokenPaths.length;
diff --git a/TokenController/TokenController.js b/TokenController/TokenController.js
index 4c1f72218..d8c2130df 100644
--- a/TokenController/TokenController.js
+++ b/TokenController/TokenController.js
@@ -69,8 +69,8 @@ API_Meta.TokenController = { offset: Number.MAX_SAFE_INTEGER, lineCount: -1 };
const TokenController = (() => {
const NAME = 'TokenController';
- const VERSION = '4.2.0';
- const AUTHOR = 'Scott E. Schwarz';
+ const VERSION = '4.0.1';
+ const AUTHOR = 'Developesque';
let errorMessage = "";
let listingVars = false;
let combatStarted = false;
@@ -229,10 +229,14 @@ const TokenController = (() => {
log(`${NAME} ${VERSION} by ${AUTHOR} Ready Meta Offset : ${API_Meta.TokenController.offset}`);
createMenu();
+
+ on('chat:message', chatHandler);
+ on('change:graphic', graphicHandler);
+ on('change:campaign:turnorder', turnorderHandler);
});
// Token Destruction
- on("change:graphic", function (obj, prev) {
+ const graphicHandler = function (obj, prev) {
if (obj.get("_subtype") !== "token") {
return;
}
@@ -265,10 +269,47 @@ const TokenController = (() => {
rotation: obj.get('rotation')
});
});
- });
+ };
+ // When Roll20 combat starts
+ const turnorderHandler = function (campaign, prev) {
+ const rawCurrent = campaign.get('turnorder');
+ const rawPrev = (prev && typeof prev.get === 'function') ? prev.get('turnorder') : prev;
+ let current = [];
+ let prevOrder = [];
+ try {
+ current = typeof rawCurrent === 'string' ? (JSON.parse(rawCurrent || '[]') || []) : (Array.isArray(rawCurrent) ? rawCurrent : []);
+ } catch (e) { current = []; }
+ try {
+ prevOrder = typeof rawPrev === 'string' ? (JSON.parse(rawPrev || '[]') || []) : (Array.isArray(rawPrev) ? rawPrev : []);
+ } catch (e) { prevOrder = []; }
+ const wasEmpty = !prevOrder || prevOrder.length === 0;
+ const isNowActive = current && current.length > 0;
+
+ if (isNowActive && current[0] && typeof current[0] === 'object' && current[0].id) {
+ currentCombatant = current[0].id;
+ }
+
+ if (combatStarted && !isNowActive) {
+ combatStarted = false;
+ //sendChat('System', '🏆 Combat has ended!');
+ return;
+ }
+
+ if (combatStarted && state[NAME].storedVariables.combatPatrol) {
+ pathTokens(true);
+ }
+
+ // When Roll20 combat starts
+ if (!combatStarted && !wasEmpty && isNowActive) {
+ combatStarted = true;
+ //sendChat('System', '⚔️ Combat has started!');
+ sendChat(`${NAME}`, `/w GM ⚔️ Patrols have been stopped! Combat Patrolling is ${state[NAME].storedVariables.combatPatrol ? "enabled" : "disabled"}`);
+ }
+ };
+
// Commands
- on("chat:message", function (msg) {
+ const chatHandler = function (msg) {
try {
if (msg.type === "api" && (msg.content.toLowerCase().startsWith("!token-control") || msg.content.toLowerCase().startsWith("!tc"))) {
@@ -497,44 +538,7 @@ const TokenController = (() => {
log(` ${NAME} Error: ${err}
${errorMessage}`);
errorMessage = "";
}
- });
-
- // When Roll20 combat starts
- on('change:campaign:turnorder', function (campaign, prev) {
- const rawCurrent = campaign.get('turnorder');
- const rawPrev = (prev && typeof prev.get === 'function') ? prev.get('turnorder') : prev;
- let current = [];
- let prevOrder = [];
- try {
- current = typeof rawCurrent === 'string' ? (JSON.parse(rawCurrent || '[]') || []) : (Array.isArray(rawCurrent) ? rawCurrent : []);
- } catch (e) { current = []; }
- try {
- prevOrder = typeof rawPrev === 'string' ? (JSON.parse(rawPrev || '[]') || []) : (Array.isArray(rawPrev) ? rawPrev : []);
- } catch (e) { prevOrder = []; }
- const wasEmpty = !prevOrder || prevOrder.length === 0;
- const isNowActive = current && current.length > 0;
-
- if (isNowActive && current[0] && typeof current[0] === 'object' && current[0].id) {
- currentCombatant = current[0].id;
- }
-
- if (combatStarted && !isNowActive) {
- combatStarted = false;
- //sendChat('System', '🏆 Combat has ended!');
- return;
- }
-
- if (combatStarted && state[NAME].storedVariables.combatPatrol) {
- pathTokens(true);
- }
-
- // When Roll20 combat starts
- if (!combatStarted && !wasEmpty && isNowActive) {
- combatStarted = true;
- //sendChat('System', '⚔️ Combat has started!');
- sendChat(`${NAME}`, `/w GM ⚔️ Patrols have been stopped! Combat Patrolling is ${state[NAME].storedVariables.combatPatrol ? "enabled" : "disabled"}`);
- }
- });
+ };
function cleanupStaleTokens() {
const beforePaths = state[NAME].storedVariables.activeTokenPaths.length;
diff --git a/TokenController/script.json b/TokenController/script.json
index 6e9e5eb3c..d921c8e92 100644
--- a/TokenController/script.json
+++ b/TokenController/script.json
@@ -1,10 +1,10 @@
{
"name": "TokenController",
"script": "TokenController.js",
- "version": "4.0.0",
- "previousversions": ["3.0.0"],
+ "version": "4.0.1",
+ "previousversions": ["4.0.0"],
"description": "# Token Controller\n\rBring your scene to life with simple but dynamic patrol pathing. Select a pre-defined path or quickly create your own (not map or position dependent, just works with grids), select a token, and click start. Tokens may have multiple paths assigned to them at a time, allowing for intricate path layering. Version 2 will have a Path Building tool!",
- "authors": "Scott E. Schwarz",
+ "authors": "Developesque",
"roll20userid": "6975764",
"useroptions": [],
"dependencies": [