diff --git a/MaterialDeck.js b/MaterialDeck.js
index ab34934..5a4c6b6 100644
--- a/MaterialDeck.js
+++ b/MaterialDeck.js
@@ -11,10 +11,10 @@ export var streamDeck;
export var tokenControl;
var move;
export var macroControl;
-var combatTracker;
-var playlistControl;
-var soundboard;
-var otherControls;
+export var combatTracker;
+export var playlistControl;
+export var soundboard;
+export var otherControls;
export const moduleName = "MaterialDeck";
export var selectedTokenId;
@@ -45,7 +45,7 @@ async function analyzeWSmessage(msg,passthrough = false){
if (enableModule == false) return;
const data = JSON.parse(msg);
if (data == undefined || data.payload == undefined) return;
- //console.log(data);
+ //console.log("Received",data);
const action = data.action;
const event = data.event;
const context = data.context;
@@ -62,9 +62,9 @@ async function analyzeWSmessage(msg,passthrough = false){
streamDeck.setContext(action,context,coordinates,settings);
if (action == 'token'){
- if (selectedTokenId != undefined)
- tokenControl.update(selectedTokenId);
- }
+ tokenControl.active = true;
+ tokenControl.update(selectedTokenId);
+ }
else if (action == 'macro')
macroControl.update(settings,context);
else if (action == 'combattracker')
@@ -126,7 +126,7 @@ function startWebsocket() {
ws.onopen = function() {
WSconnected = true;
- ui.notifications.info("Material Deck Connected: "+ip+':'+port);
+ ui.notifications.info("Material Deck "+game.i18n.localize("MaterialDeck.Notifications.Connected") +": "+ip+':'+port);
wsOpen = true;
let msg = {
type: "Foundry"
@@ -276,6 +276,7 @@ Hooks.on('renderHotbar', (hotbar)=>{
Hooks.on('renderCombatTracker',()=>{
if (enableModule == false || ready == false) return;
combatTracker.updateAll();
+ tokenControl.update(selectedTokenId);
});
Hooks.on('renderPlaylistDirectory', (playlistDirectory)=>{
@@ -309,6 +310,11 @@ Hooks.on('renderSceneControls',()=>{
otherControls.updateAll();
});
+Hooks.on('targetToken',(user,token,targeted)=>{
+ if (enableModule == false || ready == false) return;
+ if (token.id == selectedTokenId) tokenControl.update(selectedTokenId);
+});
+
Hooks.once('init', ()=>{
//CONFIG.debug.hooks = true;
registerSettings(); //in ./src/settings.js
diff --git a/changelog.md b/changelog.md
index f37a53f..0b79a5e 100644
--- a/changelog.md
+++ b/changelog.md
@@ -1,4 +1,22 @@
# Changelog Material Deck Module
+### v0.8.5 - 17-11-2020
+
+- Added 'Display Icon' to Macro action
+- Removed background option from 'Macro' => 'Macro Board' => 'Trigger Macro', this is handled in the macro configuration screen
+- Added 'Background' option in 'Macro' => 'Macro Board' => 'Offset'
+- Fixed control buttons from not performing action when clicked
+- Added check for each function to prevent unnecessary searching through the button buffer
+- Added 'Target', 'Visibility', 'Toggle Combat State' and 'Set Condition' options to the 'Token' action (under 'on click')
+- Added 'Zoom In' and 'Zoom Out' functions to 'Move' action
+- Added ability to load icons from web sources
+- Added support for localization (module only)
+- Fixed issue where SD buttons would not load properly if Foundry was initialized before the SD, or if Foundry was refreshed
+- Long words now split up onto multiple lines
+
+Compatible server app and SD plugin:
+Server v0.2.4 (no change)
+SD plugin v0.7.2
+
### v0.8.4 - 11-11-2020
- In 'Other' action, 'Control Button' mode, add 'Displayed Controls' option
@@ -9,7 +27,7 @@
- Newly created actions now show the correct options at the start
Compatible server app and SD plugin:
-Server v0.2.4
+Server v0.2.4 (no change)
SD plugin v0.7.1
### v0.8.3 - 10-11-2020
diff --git a/lang/en.json b/lang/en.json
index 2d545a4..113bb18 100644
--- a/lang/en.json
+++ b/lang/en.json
@@ -1,39 +1,40 @@
{
"MaterialDeck.Notifications.Disconnected": "Disconnected from mdServer, attempting to reconnect",
"MaterialDeck.Notifications.ConnectFail": "Can't connect to mdServer, retrying",
-
- "MaterialDeck.Sett.PlaylistConfig": "Playlist Configuration",
- "MaterialDeck.Sett.SoundboardConfig": "Soundboard Configuration",
- "MaterialDeck.Sett.MacroConfig": "Macro Configuration",
- "MaterialDeck.Sett.Brightness": "Brightness",
- "MaterialDeck.Sett.Brightness_Hint": "LED brightness level",
- "MaterialDeck.Sett.Enable": "Enable module",
+ "MaterialDeck.Notifications.Connected": "Connected",
- "MaterialDeck.Playlist.Clear": "Clear data",
- "MaterialDeck.Playlist.Playmethod.Header": "Play Method",
- "MaterialDeck.Playlist.Playmethod.Label": "Method",
- "MaterialDeck.Playlist.Playmethod.Unrestricted": "Unrestricted",
- "MaterialDeck.Playlist.Playmethod.OneTrackPlaylist": "One track per playlist",
- "MaterialDeck.Playlist.Playmethod.OneTrackTotal": "One track in total",
- "MaterialDeck.Playlist.Playlists": "Playlists",
- "MaterialDeck.Playlist.Playlist": "Playlist",
- "MaterialDeck.Playlist.None": "None",
- "MaterialDeck.Playlist.Save": "Save",
- "MaterialDeck.Soundboard.Volume": "Volume",
+ "MaterialDeck.Sett.Enable": "Enable module",
+ "MaterialDeck.Sett.Model": "Stream Deck Model",
+ "MaterialDeck.Sett.Model_Hint": "Reduces the amount of macros and sounds in the macro and soundboard configuration screens. Gives a better overview, but if desired it can be set to XL to get the maximum number. This doesn't influence the operation of the module.",
+ "MaterialDeck.Sett.Model_Mini": "Mini",
+ "MaterialDeck.Sett.Model_Normal": "Normal or Mobile",
+ "MaterialDeck.Sett.Model_XL": "XL",
+ "MaterialDeck.Sett.PlaylistConfig": "Playlist Configuration",
+ "MaterialDeck.Sett.MacroConfig": "Macro Configuration",
+ "MaterialDeck.Sett.SoundboardConfig": "Soundboard Configuration",
- "MaterialDeck.Soundboard.Sound": "Sound",
- "MaterialDeck.Soundboard.Icon": "Icon",
- "MaterialDeck.Soundboard.Playback": "Playback",
- "MaterialDeck.Soundboard.Once": "Once",
- "MaterialDeck.Soundboard.Repeat": "Repeat",
- "MaterialDeck.Soundboard.Hold": "Hold",
- "MaterialDeck.Soundboard.On": "On",
- "MaterialDeck.Soundboard.Off": "Off",
-
- "MaterialDeck.Macro.Macro": "Macro",
- "MaterialDeck.Macro.Background": "Background",
- "MaterialDeck.Macro.FurnaceArgs": "Furnace arguments",
-
- "MaterialDeck.Name": "Name"
+ "MaterialDeck.PL.Unrestricted": "Unrestricted",
+ "MaterialDeck.PL.OneTrackPlaylist": "One track per playlist",
+ "MaterialDeck.PL.OneTrackTotal": "One track in total",
+ "MaterialDeck.PL.Header": "Play Method",
+ "MaterialDeck.PL.Label": "Method",
+
+ "MaterialDeck.Playlists": "Playlists",
+ "MaterialDeck.Playlist": "Playlist",
+ "MaterialDeck.FurnaceArgs": "Furnace arguments",
+ "MaterialDeck.Background": "Background",
+ "MaterialDeck.Macro": "Macro",
+ "MaterialDeck.Sound": "Sound",
+ "MaterialDeck.Icon": "Icon",
+ "MaterialDeck.Once": "Once",
+ "MaterialDeck.Repeat": "Repeat",
+ "MaterialDeck.Hold": "Hold",
+ "MaterialDeck.Playback": "Playback",
+ "MaterialDeck.Volume": "Volume",
+ "MaterialDeck.On": "On",
+ "MaterialDeck.Off": "Off",
+ "MaterialDeck.Name": "Name",
+ "MaterialDeck.None": "None",
+ "MaterialDeck.Save": "Save"
}
diff --git a/module.json b/module.json
index 11d52f1..4a09a94 100644
--- a/module.json
+++ b/module.json
@@ -2,7 +2,7 @@
"name": "MaterialDeck",
"title": "Material Deck",
"description": "",
- "version": "0.8.4",
+ "version": "0.8.5",
"author": "CDeenen",
"esmodules": [
"./MaterialDeck.js"
diff --git a/src/combattracker.js b/src/combattracker.js
index 2667a0b..3fea2b0 100644
--- a/src/combattracker.js
+++ b/src/combattracker.js
@@ -3,11 +3,12 @@ import {streamDeck, tokenControl} from "../MaterialDeck.js";
export class CombatTracker{
constructor(){
+ this.active = false;
this.combatantLength = 0;
}
async updateAll(){
-
+ if (this.active == false) return;
for (let i=0; i<32; i++){
let data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'combattracker') continue;
@@ -16,6 +17,7 @@ export class CombatTracker{
}
update(settings,context){
+ this.active = true;
let ctFunction = settings.combatTrackerFunction;
if (ctFunction == undefined) ctFunction == 0;
diff --git a/src/macro.js b/src/macro.js
index 8411551..3dda53d 100644
--- a/src/macro.js
+++ b/src/macro.js
@@ -3,10 +3,12 @@ import {streamDeck} from "../MaterialDeck.js";
export class MacroControl{
constructor(){
+ this.active = false;
this.offset = 0;
}
async updateAll(){
+ if (this.active == false) return;
for (let i=0; i<32; i++){
let data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'macro') continue;
@@ -15,10 +17,13 @@ export class MacroControl{
}
update(settings,context){
+ this.active = true;
let mode = settings.macroMode;
let displayName = settings.displayName;
let macroNumber = settings.macroNumber;
let background = settings.background;
+ let icon = false;
+ if (settings.displayIcon) icon = true;
let ringColor = "#000000";
let ring = 0;
if(macroNumber == undefined || isNaN(parseInt(macroNumber))){
@@ -53,15 +58,15 @@ export class MacroControl{
src += macro.img;
}
}
-
- streamDeck.setIcon(1,context,src,background);
+ if (icon) streamDeck.setIcon(1,context,src,background);
+ else streamDeck.setIcon(0, context, "", background);
if (displayName == 0) name = "";
streamDeck.setTitle(name,context);
}
- else {
+ else { //Macro board
let name = "";
let src = '';
- if (settings.macroBoardMode == 0) {
+ if (settings.macroBoardMode == 0) { //Execute macro
macroNumber += this.offset - 1;
if (macroNumber < 0) macroNumber = 0;
var macroId = game.settings.get(MODULE.moduleName,'macroSettings').macros[macroNumber];
@@ -76,8 +81,8 @@ export class MacroControl{
src += macro.img;
}
}
- }
- else {
+ }
+ else { //Offset
let ringOffColor = settings.offRing;
if (ringOffColor == undefined) ringOffColor = '#000000';
@@ -92,7 +97,8 @@ export class MacroControl{
ring = 2;
}
- streamDeck.setIcon(1, context,src,background,ring,ringColor);
+ if (icon) streamDeck.setIcon(1, context,src,background,ring,ringColor);
+ else streamDeck.setIcon(0, context, "", background,ring,ringColor);
if (displayName == 0) name = "";
streamDeck.setTitle(name,context);
}
diff --git a/src/move.js b/src/move.js
index 516837b..9bc6fb2 100644
--- a/src/move.js
+++ b/src/move.js
@@ -2,22 +2,37 @@ import * as MODULE from "../MaterialDeck.js";
export class Move{
constructor(){
+ this.active = false;
}
keyPress(settings){
+ console.log('move',settings)
let dir = settings.dir;
let mode = settings.mode;
if (mode == undefined) mode = 0;
if (dir == undefined) dir = 0;
- if (settings.mode == '1')
- this.moveToken(MODULE.selectedTokenId,dir);
- else
- this.moveCanvas(dir);
+ if (dir < 9){
+ if (settings.mode == '1')
+ this.moveToken(MODULE.selectedTokenId,dir);
+ else
+ this.moveCanvas(dir);
+ }
+ else if (dir == 9) {//zoom in
+ let viewPosition = canvas.scene._viewPosition;
+ viewPosition.scale = viewPosition.scale*1.05;
+ viewPosition.duration = 100;
+ canvas.animatePan(viewPosition);
+ }
+ else if (dir == 10) {//zoom out
+ let viewPosition = canvas.scene._viewPosition;
+ viewPosition.scale = viewPosition.scale*0.95;
+ viewPosition.duration = 100;
+ canvas.animatePan(viewPosition);
+ }
}
async moveToken(tokenId,dir){
if (tokenId == undefined) return;
-
const token = canvas.tokens.children[0].children.find(p => p.id == tokenId);
const gridSize = canvas.scene.data.grid;
let x = token.x;
diff --git a/src/othercontrols.js b/src/othercontrols.js
index c11eb6b..e1b6777 100644
--- a/src/othercontrols.js
+++ b/src/othercontrols.js
@@ -3,10 +3,12 @@ import {streamDeck} from "../MaterialDeck.js";
export class OtherControls{
constructor(){
+ this.active = false;
this.offset = 0;
}
async updateAll(){
+ if (this.active == false) return;
for (let i=0; i<32; i++){
let data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'other') continue;
@@ -15,6 +17,7 @@ export class OtherControls{
}
update(settings,context){
+ this.active = true;
let mode = settings.otherMode;
if (mode == undefined) mode = 0;
@@ -312,8 +315,10 @@ export class OtherControls{
if (selectedControl != undefined){
const selectedTool = selectedControl.tools[controlNr];
if (selectedTool != undefined){
- if (selectedTool.toggle)
+ if (selectedTool.toggle) {
selectedTool.active = !selectedTool.active;
+ selectedTool.onClick(selectedTool.active);
+ }
else if (selectedTool.button){
selectedTool.onClick();
}
@@ -335,8 +340,10 @@ export class OtherControls{
if (selectedTool != undefined){
ui.controls.activeControl = controlName;
canvas.getLayer(selectedControl.layer).activate();
- if (selectedTool.toggle)
+ if (selectedTool.toggle) {
selectedTool.active = !selectedTool.active;
+ selectedTool.onClick(selectedTool.active);
+ }
else if (selectedTool.button){
selectedTool.onClick();
}
diff --git a/src/playlist.js b/src/playlist.js
index fb18ab1..97f4b00 100644
--- a/src/playlist.js
+++ b/src/playlist.js
@@ -3,11 +3,13 @@ import {streamDeck} from "../MaterialDeck.js";
export class PlaylistControl{
constructor(){
+ this.active = false;
this.playlistOffset = 0;
this.trackOffset = 0;
}
async updateAll(){
+ if (this.active == false) return;
for (let i=0; i<32; i++){
let data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'playlist') continue;
@@ -16,6 +18,7 @@ export class PlaylistControl{
}
update(settings,context){
+ this.active = true;
if (settings.playlistMode == undefined) settings.playlistMode = 0;
if (settings.playlistMode == 0){
this.updatePlaylist(settings,context);
diff --git a/src/settings.js b/src/settings.js
index d64bba2..011ed91 100644
--- a/src/settings.js
+++ b/src/settings.js
@@ -17,13 +17,13 @@ export const registerSettings = function() {
});
game.settings.register(MODULE.moduleName,'streamDeckModel', {
- name: "Stream Deck Model",
- hint: "Reduces the amount of macros and sounds in the macro and soundboard configuration screens. Gives a better overview, but if desired it can be set to XL to get the maximum number. This doesn't influence the operation of the module.",
+ name: "MaterialDeck.Sett.Model",
+ hint: "MaterialDeck.Sett.Model_Hint",
scope: "world",
config: true,
type:Number,
default:1,
- choices:["Mini","Normal or Mobile","XL"],
+ choices:["MaterialDeck.Sett.Model_Mini","MaterialDeck.Sett.Model_Normal","MaterialDeck.Sett.Model_XL"],
});
/**
@@ -35,12 +35,12 @@ export const registerSettings = function() {
config: false,
type:Number,
default:0,
- choices:["Default","One track per playlist","One track in total"],
+ choices:["MaterialDeck.Playlist.Playmethod.Unrestricted","MaterialDeck.Playlist.Playmethod.OneTrackPlaylist","MaterialDeck.Playlist.Playmethod.OneTrackTotal"],
});
game.settings.registerMenu(MODULE.moduleName, 'playlistConfigMenu',{
- name: "Playlist Configuration",
- label: "Playlist Configuration",
+ name: "MaterialDeck.Sett.PlaylistConfig",
+ label: "MaterialDeck.Sett.PlaylistConfig",
type: playlistConfigForm,
restricted: true
});
diff --git a/src/soundboard.js b/src/soundboard.js
index bb31e78..d907f2c 100644
--- a/src/soundboard.js
+++ b/src/soundboard.js
@@ -3,6 +3,7 @@ import {streamDeck} from "../MaterialDeck.js";
export class SoundboardControl{
constructor(){
+ this.active = false;
this.offset = 0;
this.activeSounds = [];
for (let i=0; i<64; i++)
@@ -10,6 +11,7 @@ export class SoundboardControl{
}
async updateAll(){
+ if (this.active == false) return;
for (let i=0; i<32; i++){
let data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'soundboard') continue;
@@ -18,6 +20,7 @@ export class SoundboardControl{
}
update(settings,context){
+ this.active = true;
let mode = settings.soundboardMode;
if (mode == undefined) mode = 0;
diff --git a/src/streamDeck.js b/src/streamDeck.js
index ee4ee04..8941441 100644
--- a/src/streamDeck.js
+++ b/src/streamDeck.js
@@ -23,6 +23,8 @@ export class StreamDeck{
let canvasBox = document.createElement('div');
canvasBox.id = 'sdCanvasBox';
document.body.appendChild(canvasBox); // adds the canvas to the body element
+
+ this.syllableRegex = /[^aeiouy]*[aeiouy]+(?:[^aeiouy]*$|[^aeiouy](?=[^aeiouy]))?/gi;
}
setScreen(action){
@@ -42,20 +44,90 @@ export class StreamDeck{
clearContext(action,coordinates = {column:0,row:0}){
let num = coordinates.column + coordinates.row*8;
this.buttonContext[num] = undefined;
+ if (this.getActive(action) == false){
+ if (action == 'token') MODULE.tokenControl.active = false;
+ else if (action == 'macro') MODULE.macroControl.active = false;
+ else if (action == 'combattracker') MODULE.combatTracker.active = false;
+ else if (action == 'playlist') MODULE.playlistControl.active = false;
+ else if (action == 'soundboard') MODULE.soundboard.active = false;
+ else if (action == 'other') MODULE.otherControls.active = false;
+ }
+ }
+
+ getActive(action){
+ for (let i=0; i 10){
+ let syllables = this.syllabify(txtNewPart);
+
+ for (let j=0; j j) newTxtArray[counter] += '-';
+ counter++;
+ j++;
+ }
+ else {
+ newTxtArray[counter] = syllables[j];
+ if (syllables.length > j) newTxtArray[counter] += '-';
+ counter++;
+ }
+ }
+ }
+ else{
+ newTxtArray[counter] = txtNewPart;
+ counter++;
+ }
+ }
+ for (let i=0; i 0)
txtNew += "\n";
- txtNew += txtNewPart;
+ if (i {
if (format == 'color') ctx.filter = "opacity(0)";
+ if (data.overlay) ctx.filter = "brightness(60%)";
//ctx.filter = "brightness(0) saturate(100%) invert(38%) sepia(62%) saturate(2063%) hue-rotate(209deg) brightness(90%) contrast(95%)";
var imageAspectRatio = img.width / img.height;
var canvasAspectRatio = canvas.width / canvas.height;
diff --git a/src/token.js b/src/token.js
index 11f8cb8..cfd3996 100644
--- a/src/token.js
+++ b/src/token.js
@@ -3,9 +3,11 @@ import {streamDeck} from "../MaterialDeck.js";
export class TokenControl{
constructor(){
+ this.active = false;
}
async update(tokenId){
+ if (this.active == false) return;
for (let i=0; i<32; i++){
let data = streamDeck.buttonContext[i];
if (data == undefined || data.action != 'token') continue;
@@ -73,10 +75,99 @@ export class TokenControl{
}
initiative = attributes.init.total;
}
- else return;
+ else {
+ //Other systems
+
+
+
+
+ }
+ if (settings.onClick == 4) { //toggle visibility
+ ring = 1;
+ if (token.data.hidden){
+ ring = 2;
+ ringColor = "#FF7B00";
+ }
+ if (icon == false) {
+ iconSrc = window.CONFIG.controlIcons.visibility;
+ streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor,true);
+ }
+ }
+ else if (settings.onClick == 5) { //toggle combat state
+ ring = 1;
+ if (token.inCombat){
+ ring = 2;
+ ringColor = "#FF7B00";
+ }
+ if (icon == false) {
+ iconSrc = window.CONFIG.controlIcons.combat;
+ streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor,true);
+ }
+ }
+ else if (settings.onClick == 6) { //target token
+ ring = 1;
+ if (token.isTargeted){
+ ring = 2;
+ ringColor = "#FF7B00";
+ }
+ if (icon == false) {
+ iconSrc = "fas fa-bullseye";
+ streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor);
+ }
+ }
+ else if (settings.onClick == 7) { //toggle condition
+ ring = 1;
+ let condition = settings.condition;
+ if (condition == undefined) condition = 0;
+
+ if (condition == 0 && icon == false){
+ iconSrc = window.CONFIG.controlIcons.effects;
+ }
+ else if (icon == false) {
+ let effect = CONFIG.statusEffects.find(e => e.id === this.getStatusId(condition));
+ iconSrc = effect.icon;
+ let effects = token.actor.effects.entries;
+ let active = effects.find(e => e.isTemporary === this.getStatusId(condition));
+ if (active != undefined){
+ ring = 2;
+ ringColor = "#FF7B00";
+ }
+ }
+ streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor,true);
+ }
}
else {
iconSrc += "";
+ if (settings.onClick == 4) { //toggle visibility
+ if (icon == false) {
+ iconSrc = window.CONFIG.controlIcons.visibility;
+ streamDeck.setIcon(1,context,iconSrc,background,1,'#000000',true);
+ }
+ }
+ else if (settings.onClick == 5) { //toggle combat state
+ if (icon == false) {
+ iconSrc = window.CONFIG.controlIcons.combat;
+ streamDeck.setIcon(1,context,iconSrc,background,1,'#000000',true);
+ }
+ }
+ else if (settings.onClick == 6) { //target token
+ if (icon == false) {
+ iconSrc = "fas fa-bullseye";
+ streamDeck.setIcon(1,context,iconSrc,background,1,'#000000');
+ }
+ }
+ else if (settings.onClick == 7) { //toggle condition
+ let condition = settings.condition;
+ if (condition == undefined) condition = 0;
+
+ if (condition == 0 && icon == false){
+ iconSrc = window.CONFIG.controlIcons.effects;
+ }
+ else if (icon == false) {
+ iconSrc = CONFIG.statusEffects.find(e => e.id === this.getStatusId(condition)).icon;
+ }
+ streamDeck.setIcon(1,context,iconSrc,background,1,'#000000',true);
+ }
}
if (icon) streamDeck.setIcon(1,context,iconSrc,background,ring,ringColor);
@@ -89,7 +180,7 @@ export class TokenControl{
streamDeck.setTitle(txt,context);
}
- keyPress(settings){
+ async keyPress(settings){
if (MODULE.selectedTokenId == undefined) return;
const tokenId = MODULE.selectedTokenId;
@@ -108,8 +199,72 @@ export class TokenControl{
else if (onClick == 2){ //Open character sheet
token.actor.sheet.render(true);
}
- else { //Open token config
+ else if (onClick == 3) { //Open token config
token.sheet._render(true);
}
+ else if (onClick == 4) { //Toggle visibility
+ token.toggleVisibility();
+ }
+ else if (onClick == 5) { //Toggle combat state
+ token.toggleCombat();
+ }
+ else if (onClick == 6) { //Target token
+ token.setTarget(!token.isTargeted,{releaseOthers:false});
+ }
+ else if (onClick == 7) { //Toggle condition
+ let condition = settings.condition;
+ if (condition == undefined) condition = 0;
+
+ if (condition == 0){
+ const effects = token.actor.effects.entries;
+ for (let i=0; i e.icon === effects[i].data.icon);
+ await token.toggleEffect(effect)
+ }
+ }
+ else {
+ const effect = CONFIG.statusEffects.find(e => e.id === this.getStatusId(condition));
+ token.toggleEffect(effect);
+ }
+
+ }
+ }
+
+ getStatusId(nr){
+ let id;
+ if (nr == 1) id = 'dead';
+ else if (nr == 2) id = 'unconscious';
+ else if (nr == 3) id = 'sleep';
+ else if (nr == 4) id = 'stun';
+ else if (nr == 5) id = 'prone';
+ else if (nr == 6) id = 'restrain';
+ else if (nr == 7) id = 'paralysis';
+ else if (nr == 8) id = 'fly';
+ else if (nr == 9) id = 'bind';
+ else if (nr == 10) id = 'deaf';
+ else if (nr == 11) id = 'silence';
+ else if (nr == 12) id = 'fear';
+ else if (nr == 13) id = 'burning';
+ else if (nr == 14) id = 'frozen';
+ else if (nr == 15) id = 'shock';
+ else if (nr == 16) id = 'corrode';
+ else if (nr == 17) id = 'bleeding';
+ else if (nr == 18) id = 'disease';
+ else if (nr == 19) id = 'poison';
+ else if (nr == 20) id = 'radiation';
+ else if (nr == 21) id = 'regen';
+ else if (nr == 22) id = 'degen';
+ else if (nr == 23) id = 'upgrade';
+ else if (nr == 24) id = 'downgrade';
+ else if (nr == 25) id = 'target';
+ else if (nr == 26) id = 'eye';
+ else if (nr == 27) id = 'curse';
+ else if (nr == 28) id = 'bless';
+ else if (nr == 29) id = 'fireShield';
+ else if (nr == 30) id = 'coldShield';
+ else if (nr == 31) id = 'magicShield';
+ else if (nr == 32) id = 'holyShield';
+
+ return id;
}
}
\ No newline at end of file
diff --git a/templates/macroConfig.html b/templates/macroConfig.html
index f5d15ff..f951a79 100644
--- a/templates/macroConfig.html
+++ b/templates/macroConfig.html
@@ -13,12 +13,12 @@
{{#each this.dataThis}}
- {{localize "MaterialDeck.Macro.Macro"}} {{this.iteration}}
+ {{localize "MaterialDeck.Macro"}} {{this.iteration}}
{{#if this.furnace}}
-
+
{{/if}}
-
+
@@ -39,7 +39,7 @@
{{/each}}
\ No newline at end of file
diff --git a/templates/playlistConfig.html b/templates/playlistConfig.html
index 106258f..b606cb5 100644
--- a/templates/playlistConfig.html
+++ b/templates/playlistConfig.html
@@ -1,26 +1,26 @@