From 11a830d244e217301d1dfcf8fa841ea033590345 Mon Sep 17 00:00:00 2001 From: Ludovic D Date: Fri, 24 Jul 2020 03:54:55 +0200 Subject: [PATCH] Update v0.2.0-alpha --- .vs/Tokenmagic/v16/.suo | Bin 134144 -> 151040 bytes .vs/VSWorkspaceState.json | 3 +- .vs/slnx.sqlite | Bin 90112 -> 90112 bytes README.md | 97 +++++++ Tokenmagic.zip | Bin 22090487 -> 22099393 bytes tokenmagic/fx/Anime.js | 25 +- tokenmagic/fx/filters/FilterGleamingGlow.js | 125 ++++++++ tokenmagic/fx/filters/FilterLiquid.js | 95 +++++++ tokenmagic/fx/filters/FilterXRays.js | 125 ++++++++ tokenmagic/fx/filters/proto/FilterProto.js | 28 +- .../fx/glsl/fragmentshaders/forcefield.js | 6 +- tokenmagic/fx/glsl/fragmentshaders/liquid.js | 103 +++++++ .../fx/glsl/fragmentshaders/magicglow.js | 171 +++++++++++ .../fx/glsl/fragmentshaders/mirrorimages.js | 1 + tokenmagic/fx/glsl/fragmentshaders/waves.js | 6 +- tokenmagic/fx/glsl/fragmentshaders/xray.js | 66 +++++ tokenmagic/lang/en.json | 6 +- tokenmagic/lang/fr.json | 8 +- tokenmagic/module.json | 8 +- .../module/proto/PlaceableObjectProto.js | 24 ++ tokenmagic/module/tokenmagic.js | 267 +++++++++++++++--- tokenmagic/packs/token-magic-portfolio.db | 124 +++----- tokenmagic/updates/UPDATE-0.2.0.md | 96 +++++++ 23 files changed, 1215 insertions(+), 169 deletions(-) create mode 100644 tokenmagic/fx/filters/FilterGleamingGlow.js create mode 100644 tokenmagic/fx/filters/FilterLiquid.js create mode 100644 tokenmagic/fx/filters/FilterXRays.js create mode 100644 tokenmagic/fx/glsl/fragmentshaders/liquid.js create mode 100644 tokenmagic/fx/glsl/fragmentshaders/magicglow.js create mode 100644 tokenmagic/fx/glsl/fragmentshaders/xray.js create mode 100644 tokenmagic/module/proto/PlaceableObjectProto.js create mode 100644 tokenmagic/updates/UPDATE-0.2.0.md diff --git a/.vs/Tokenmagic/v16/.suo b/.vs/Tokenmagic/v16/.suo index 91edb995ecbea15c6951896dc76714783855ecc6..6836581e93d33d994b745118d24c2507b4d3660e 100644 GIT binary patch delta 12646 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 Yznoa*^;hK}*C^m`Dn4L}|F<^wKOFH28~^|S delta 8728 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,) + +// Example +... +if (TokenMagic.hasFilterType(myToken,"glow")) { + console.log("myToken has a glow filter."); +} +... +``` +To verify if a placeable has a filter with the specified `filterId` : +```javascript +TokenMagic.hasFilterId(,) + +// Example +... +if (TokenMagic.hasFilterId(myToken,"mySuperShadow_01")) { + console.log("myToken has my customized super shadow 1 filter."); +} +... +``` +Add or update filter(s) on a placeable. If a filter applied on an object has a filterType and a filterId identical to those found in the parameters, the values are updated with the new ones. Otherwise a new filter is created. +```javascript +(async) TokenMagic.addUpdateFilters(, ) +``` + +## PlaceableObject TMFX prototypes + +*Added new prototype functions in class PlaceableObject (Token, Tile, etc.), to facilitate coding :* + +```javascript +(async) .TMFXaddFilters() +(async) .TMFXupdateFilters() +(async) .TMFXaddUpdateFilters() +(async) .TMFXdeleteFilters(optional ) +.TMFXhasFilterType() +.TMFXhasFilterId() + +// Example 1 +let glowFunc = async function() { + + const tokens = canvas.tokens.placeables; + + for (const token of tokens){ + if (token.TMFXhasFilterId("funnyAlternateGlow")) { + await token.TMFXdeleteFilters("funnyAlternateGlow"); + } else { + let params = + [{ + filterType: "glow", + filterId: "funnyAlternateGlow", + color: Math.floor(Math.random() * 16777215), + animated: null + }]; + await token.TMFXaddUpdateFilters(params); + } + } +}; + +glowFunc(); +``` + # Token Magic FX - Update v0.1.3d-alpha ## FX diff --git a/Tokenmagic.zip b/Tokenmagic.zip index c98d3c9391aec5c57cb48fc0e96b54c9e029e6a5..9c38fbb539453c6892ea80c9f019d7012f1977b3 100644 GIT binary patch delta 32113 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 delta 23595 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 RAV~1r2TlX&H(e+M@_${tAvFL1 diff --git a/tokenmagic/fx/Anime.js b/tokenmagic/fx/Anime.js index 40de67e..3fb8c2d 100644 --- a/tokenmagic/fx/Anime.js +++ b/tokenmagic/fx/Anime.js @@ -17,13 +17,14 @@ export class Anime { if (!(this.puppet == null)) { if (this.puppet.hasOwnProperty("animated") + && !(this.puppet.animated == null) && typeof this.puppet.animated === 'object' && Object.keys(this.puppet.animated).length > 0) { this.initAnimatedInternals(this.puppet.animated); this.animated = this.puppet.animated; // easy access to the puppet's animodes - Anime.addAnimation(self); // ready to tick } + Anime.addAnimation(self); // ready to tick } } @@ -56,7 +57,6 @@ export class Anime { this.elapsedTime[effect] += frameTime; } }); - this.autoDisableCheck(); } @@ -89,18 +89,21 @@ export class Anime { if (!(this.puppet.filterOwner === game.data.userId && (this.puppet.autoDisable || this.puppet.autoDestroy))) { return; } - if (this.puppet.enabled === false) { return; } + if (this.puppet.enabled === false && !this.puppet.autoDestroy) { return; } if (Object.values(this.animated).every(animeEffect => animeEffect.active === false)) { - let params = {}; - params.filterId = this.puppet.filterId; - this.puppet.autoDestroy ? params.destroy = true : params.enabled = false; - var placeable = this.puppet.getPlaceable(); - // updating the filter trigger an update{placeable} for everyone - await window.TokenMagic.updateFilterByPlaceable(params, placeable); + if (this.puppet.autoDestroy) { + await window.TokenMagic.deleteFilters(placeable, this.puppet.filterId); + } else { + let params = {}; + params.filterId = this.puppet.filterId; + params.enabled = false; + + await window.TokenMagic.updateFilterByPlaceable(params, placeable); + } } } @@ -387,7 +390,9 @@ export class Anime { if (anime.puppet.hasOwnProperty("preComputation")) { anime.puppet.preComputation(); } - anime.animate(Anime._frameTime); + if (anime.puppet.hasOwnProperty("animated") && !(anime.puppet.animated == null)) { + anime.animate(Anime._frameTime); + } }); Anime._prevTime = Anime._lastTime; } diff --git a/tokenmagic/fx/filters/FilterGleamingGlow.js b/tokenmagic/fx/filters/FilterGleamingGlow.js new file mode 100644 index 0000000..b25395e --- /dev/null +++ b/tokenmagic/fx/filters/FilterGleamingGlow.js @@ -0,0 +1,125 @@ +import { magicGlow } from '../glsl/fragmentshaders/magicglow.js'; +import { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js'; +import { Anime } from "../Anime.js"; +import "./proto/FilterProto.js"; + +export class FilterGleamingGlow extends PIXI.Filter { + + constructor(params) { + + let { + time, + color, + thickness, + scale, + auraIntensity, + subAuraIntensity, + discard, + threshold, + auraType + } = Object.assign({}, FilterGleamingGlow.defaults, params); + + // using specific vertex shader and fragment shader + super(customVertex2D, magicGlow); + + this.uniforms.color = new Float32Array([1.0, 0.4, 0.1, 1.0]); + this.uniforms.thickness = new Float32Array([0.01, 0.01]); + + Object.assign(this, { + time, color, thickness, scale, auraIntensity, subAuraIntensity, discard, threshold, auraType + }); + + this.animated = {}; + this.setTMParams(params); + this.anime = new Anime(this); + this.normalizeTMParams(); + } + + get time() { + return this.uniforms.time; + } + + set time(value) { + this.uniforms.time = value; + } + + get scale() { + return this.uniforms.scale; + } + + set scale(value) { + this.uniforms.scale = value; + } + + get auraIntensity() { + return this.uniforms.auraIntensity; + } + + set auraIntensity(value) { + this.uniforms.auraIntensity = value; + } + + get subAuraIntensity() { + return this.uniforms.subAuraIntensity; + } + + set subAuraIntensity(value) { + this.uniforms.subAuraIntensity = value; + } + + get threshold() { + return this.uniforms.threshold; + } + + set threshold(value) { + this.uniforms.threshold = value; + } + + get color() { + return PIXI.utils.rgb2hex(this.uniforms.color); + } + + set color(value) { + PIXI.utils.hex2rgb(value, this.uniforms.color); + } + + get discard() { + return this.uniforms.holes; + } + + set discard(value) { + if (!(value == null) && typeof value === "boolean") { + this.uniforms.holes = value; + } + } + + get auraType() { + return this.uniforms.auraType; + } + + set auraType(value) { + this.uniforms.auraType = Math.floor(value); + } + + apply(filterManager, input, output, clear) { + this.uniforms.thickness[0] = (this.thickness * this.placeableImg.parent.worldTransform.a) / input._frame.width; + this.uniforms.thickness[1] = (this.thickness * this.placeableImg.parent.worldTransform.a) / input._frame.height; + filterManager.applyFilter(this, input, output, clear); + } +} + +FilterGleamingGlow.defaults = { + time: 0, + color: 0xFF8010, + thickness: 5, + scale: 1, + auraIntensity: 1, + subAuraIntensity: 1, + discard: false, + threshold: 0.5, + auraType: 1, +}; + + + + diff --git a/tokenmagic/fx/filters/FilterLiquid.js b/tokenmagic/fx/filters/FilterLiquid.js new file mode 100644 index 0000000..12b4684 --- /dev/null +++ b/tokenmagic/fx/filters/FilterLiquid.js @@ -0,0 +1,95 @@ +import { liquid } from '../glsl/fragmentshaders/liquid.js'; +import { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js'; +import { Anime } from "../Anime.js"; +import "./proto/FilterProto.js"; + +export class FilterLiquid extends PIXI.Filter { + + constructor(params) { + let { + time, + color, + scale, + intensity, + blend, + spectral + } = Object.assign({}, FilterLiquid.defaults, params); + + // using specific vertex shader and fragment shader + super(customVertex2D, liquid); + + this.uniforms.color = new Float32Array([0.1, 0.45, 1.0]); + + Object.assign(this, { + time, color, scale, intensity, blend, spectral + }); + + this.animated = {}; + this.setTMParams(params); + this.anime = new Anime(this); + this.normalizeTMParams(); + } + + get time() { + return this.uniforms.time; + } + + set time(value) { + this.uniforms.time = value; + } + + get scale() { + return this.uniforms.scale; + } + + set scale(value) { + this.uniforms.scale = value; + } + + get color() { + return PIXI.utils.rgb2hex(this.uniforms.color); + } + + set color(value) { + PIXI.utils.hex2rgb(value, this.uniforms.color); + } + + get intensity() { + return this.uniforms.intensity; + } + + set intensity(value) { + this.uniforms.intensity = value; + } + + get blend() { + return this.uniforms.blend; + } + + set blend(value) { + this.uniforms.blend = Math.floor(value); + } + + get spectral() { + return this.uniforms.spectral; + } + + set spectral(value) { + if (!(value == null) && typeof value === "boolean") { + this.uniforms.spectral = value; + } + } +} + +FilterLiquid.defaults = { + time: 0.0, + color: 0x0595FF, + scale: 1, + intensity: 5, + blend: 4, + spectral: false, +}; + + + + diff --git a/tokenmagic/fx/filters/FilterXRays.js b/tokenmagic/fx/filters/FilterXRays.js new file mode 100644 index 0000000..e8a5fa5 --- /dev/null +++ b/tokenmagic/fx/filters/FilterXRays.js @@ -0,0 +1,125 @@ +import { xRay } from '../glsl/fragmentshaders/xray.js'; +import { customVertex2D } from '../glsl/vertexshaders/customvertex2D.js'; +import { Anime } from "../Anime.js"; +import "./proto/FilterProto.js"; + +export class FilterXRays extends PIXI.Filter { + + constructor(params) { + let { + time, + color, + divisor, + intensity, + blend, + anchorX, + anchorY, + dimX, + dimY + } = Object.assign({}, FilterXRays.defaults, params); + + // using specific vertex shader and fragment shader + super(customVertex2D, xRay); + + this.uniforms.color = new Float32Array([1.0, 0.4, 0.1]); + this.uniforms.anchor = new Float32Array([0.5, -1.0]); + this.uniforms.dimensions = new Float32Array([1.0, 1.0]); + + Object.assign(this, { + time, color, divisor, intensity, blend, anchorX, anchorY, dimX, dimY + }); + + this.animated = {}; + this.setTMParams(params); + this.anime = new Anime(this); + this.normalizeTMParams(); + } + + get time() { + return this.uniforms.time; + } + + set time(value) { + this.uniforms.time = value; + } + + get color() { + return PIXI.utils.rgb2hex(this.uniforms.color); + } + + set color(value) { + PIXI.utils.hex2rgb(value, this.uniforms.color); + } + + get divisor() { + return this.uniforms.divisor; + } + + set divisor(value) { + this.uniforms.divisor = value; + } + + get intensity() { + return this.uniforms.intensity; + } + + set intensity(value) { + this.uniforms.intensity = value; + } + + get blend() { + return this.uniforms.blend; + } + + set blend(value) { + this.uniforms.blend = Math.floor(value); + } + + get anchorX() { + return this.uniforms.anchor[0]; + } + + set anchorX(value) { + this.uniforms.anchor[0] = value; + } + + get anchorY() { + return this.uniforms.anchor[1]; + } + + set anchorY(value) { + this.uniforms.anchor[1] = value; + } + + get dimX() { + return this.uniforms.dimensions[0]; + } + + set dimX(value) { + this.uniforms.dimensions[0] = value; + } + + get dimY() { + return this.uniforms.dimensions[1]; + } + + set dimY(value) { + this.uniforms.dimensions[1] = value; + } +} + +FilterXRays.defaults = { + time: 0.0, + color: 0xFF8010, + divisor: 40, + intensity: 0.1, + blend: 8, + anchorX: 0.5, + anchorY: -1.0, + dimX: 1, + dimY: 1, +}; + + + + diff --git a/tokenmagic/fx/filters/proto/FilterProto.js b/tokenmagic/fx/filters/proto/FilterProto.js index a7143c1..42d5f87 100644 --- a/tokenmagic/fx/filters/proto/FilterProto.js +++ b/tokenmagic/fx/filters/proto/FilterProto.js @@ -1,4 +1,4 @@ -import { objectAssign, getPlaceableById } from "../../../module/tokenmagic.js"; +import { objectAssign, getPlaceableById, getMinPadding } from "../../../module/tokenmagic.js"; PIXI.Filter.prototype.setTMParams = function (params) { this.autoDisable = false; @@ -9,7 +9,7 @@ PIXI.Filter.prototype.setTMParams = function (params) { this.dummy = false; objectAssign(this, params); if (!this.dummy) { - this.originalPadding = this.padding; + this.originalPadding = Math.max(this.padding, getMinPadding()); this.assignPlaceable(); this.activateTransform(); } @@ -24,7 +24,6 @@ PIXI.Filter.prototype.getPlaceableType = function () { } PIXI.Filter.prototype.calculatePadding = function () { - if (this.gridPadding > 0) { var imgSize = Math.max(this.placeableImg.width, this.placeableImg.height); var toSize = (canvas.dimensions.size >= imgSize @@ -44,20 +43,6 @@ PIXI.Filter.prototype.calculatePadding = function () { } } -PIXI.Filter.prototype.verifyPadding = function () { - // TODO - //var paddings = PIXI.Filter._paddingObject; - //if (paddings.hasOwnProperty(this.placeableId)) { - // if (!(paddings[this.placeableId] == null) && this.currentPadding < paddings[this.placeableId]) { - // this.currentPadding = 0; - // } else { - // paddings[this.placeableId] = this.currentPadding; - // } - //} else { - // paddings[this.placeableId] = this.currentPadding; - //} -} - PIXI.Filter.prototype.assignPlaceable = function () { if (this.placeableType === "Token") { let parent = canvas.tokens.placeables.find(n => n.id === this.placeableId); @@ -84,7 +69,6 @@ PIXI.Filter.prototype.filterTransform = function () { this.placeableImg.parent.zIndex = this.zIndex; } - //this.verifyPadding(); this.padding = this.currentPadding; if ("handleTransform" in this) { @@ -94,7 +78,7 @@ PIXI.Filter.prototype.filterTransform = function () { PIXI.Filter.prototype.normalizeTMParams = function () { - if (this.hasOwnProperty("animated")) { + if (this.hasOwnProperty("animated") && !(this.animated == null) ) { // Normalize animations properties Object.keys(this.animated).forEach((effect) => { @@ -160,8 +144,8 @@ PIXI.Filter.prototype.normalizeTMParams = function () { if (!this.anime.hasInternals(effect)) { this.anime.initInternals(effect); } + + this.anime.animated = this.animated; }); } -} - -//PIXI.Filter._paddingObject = {}; \ No newline at end of file +} \ No newline at end of file diff --git a/tokenmagic/fx/glsl/fragmentshaders/forcefield.js b/tokenmagic/fx/glsl/fragmentshaders/forcefield.js index b339373..0b34634 100644 --- a/tokenmagic/fx/glsl/fragmentshaders/forcefield.js +++ b/tokenmagic/fx/glsl/fragmentshaders/forcefield.js @@ -601,7 +601,7 @@ void main() } else if (shieldType == 11) { result = grid(uv*5.*scale); } else if (shieldType == 12) { - result = galaxy(uv*5.*scale)*2.; + result = galaxy(uv*5.*scale); } else if (shieldType != 1) { result = vec4(color,1.); } @@ -629,10 +629,6 @@ void main() vec4 final = clamp(ambientLight(clamp(colorized, 0., 1.)*intensity, uv, posLight-vec2(0.5,0.5)),0.,1.); - //if ( r <= 1. && pixel.a < 1. ) { - // pixel.rgb = vec3(1.); - //} - gl_FragColor = r > 1.0 ? pixel*(1.-a) diff --git a/tokenmagic/fx/glsl/fragmentshaders/liquid.js b/tokenmagic/fx/glsl/fragmentshaders/liquid.js new file mode 100644 index 0000000..2dc016c --- /dev/null +++ b/tokenmagic/fx/glsl/fragmentshaders/liquid.js @@ -0,0 +1,103 @@ +export const liquid = ` +precision mediump float; +precision mediump int; + +uniform sampler2D uSampler; +uniform float time; +uniform float intensity; +uniform float scale; +uniform int blend; +uniform bool spectral; +uniform vec3 color; + +varying vec2 vFilterCoord; +varying vec2 vTextureCoord; +varying vec4 vInputSize; +varying vec4 vOutputFrame; + +#define PI 3.14159265359 + +#define NUM_OCTAVES 3 + +float rand(vec2 n) { + return fract(sin(dot(n, vec2(12.9898, 4.1414))) * 43758.5453); +} + +float noise(vec2 p){ + vec2 ip = floor(p); + vec2 u = fract(p); + u = u*u*(3.0-2.0*u); + + float res = mix( + mix(rand(ip),rand(ip+vec2(1.0,0.0)),u.x), + mix(rand(ip+vec2(0.0,1.0)),rand(ip+vec2(1.0,1.0)),u.x),u.y); + return res*res; +} + +float fbm(vec2 x) { + float v = 0.0; + float a = 0.5; + vec2 shift = vec2(100); + mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.50)); + for (int i = 0; i < NUM_OCTAVES; ++i) { + v += a * noise(x); + x = rot * x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +vec4 blenderVec3(int blend, vec4 fColv4, vec3 sCol) +{ + vec3 fCol = vec3(fColv4); + if ( blend == 1) { fCol = fCol * sCol; } + else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); } + else if (blend == 3) { fCol = min(fCol, sCol); } + else if (blend == 4) { fCol = max(fCol, sCol); } + else if (blend == 5) { fCol = abs(fCol - sCol); } + else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); } + else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); } + else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); } + else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); } + else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); } + else if (blend == 11) { fCol = fCol / (1.0 - sCol + 0.00001); } + else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol + 0.00001; } + else if (blend == 13) { fCol = max(fCol,sCol)-(min(fCol,sCol)*0.5)+abs(fCol-sCol);} + else if (blend >= 14) { fCol = fCol + sCol; } + + return vec4(fCol,fColv4.a); +} + +void main() { + + float distortion1 = fbm( + vec2( fbm( vFilterCoord * 2.5 * scale + time/2.), + fbm( (-vFilterCoord - vec2(0.01)) * 5. * scale + time/3.) ) + ); + + float distortion2 = fbm( + vec2( fbm( -vFilterCoord * 5. * scale + time/2.), + fbm( (vFilterCoord + vec2(0.01)) * 2.5 * scale + time/3.) ) + ); + + vec2 uv = vFilterCoord; + + uv.x += 0.8*sin(min(distortion1/4.,distortion2/4.)); + uv.y += 0.8*cos(min(distortion1/4.,distortion2/4.)); + uv *= 1. + 0.11*(cos(sqrt(max(distortion1, distortion2))+1.)/2.); + uv -= vec2(0.036,0.81); + + vec2 mappedCoord = (uv*vOutputFrame.zw) / vInputSize.xy; + + vec4 pixel = texture2D(uSampler, mappedCoord); + vec3 aColor = color; + aColor.rgb *= min(distortion1,distortion2); + pixel.rgb += aColor*intensity; + + float a = pixel.a; + + if (spectral) pixel.a = max(distortion1,distortion2)*3.75; + + gl_FragColor = blenderVec3(blend,pixel,color/3.) * min(pixel.a,a); +} +`; \ No newline at end of file diff --git a/tokenmagic/fx/glsl/fragmentshaders/magicglow.js b/tokenmagic/fx/glsl/fragmentshaders/magicglow.js new file mode 100644 index 0000000..90aac4e --- /dev/null +++ b/tokenmagic/fx/glsl/fragmentshaders/magicglow.js @@ -0,0 +1,171 @@ +export const magicGlow = ` +precision mediump float; + +uniform sampler2D uSampler; +uniform float time; +uniform float scale; +uniform float auraIntensity; +uniform float subAuraIntensity; +uniform float threshold; +uniform int auraType; +uniform bool holes; +uniform vec2 thickness; +uniform vec4 color; +uniform vec4 filterArea; +uniform vec4 filterClamp; + +varying vec2 vTextureCoord; +varying vec2 vFilterCoord; + +const int NUM_OCTAVES = 4; +const float PI = 3.14159265358; +const float TWOPI = 6.28318530717; +const float MAX_TOTAL_ALPHA = 17.2787595915; + +float rand(vec2 uv) +{ + return fract(sin(dot(uv.xy ,vec2(12.9898,78.233))) * 43758.5453); +} + +float noise(vec2 p) +{ + vec2 ip = floor(p); + vec2 u = fract(p); + u = u*u*(3.0-2.0*u); + + float res = mix( + mix(rand(ip),rand(ip+vec2(1.0,0.0)),u.x), + mix(rand(ip+vec2(0.0,1.0)),rand(ip+vec2(1.0,1.0)),u.x),u.y); + return res*res; +} + +float fbm(vec2 x) +{ + float v = 0.0; + float a = 0.5; + vec2 shift = vec2(100); + mat2 rot = mat2(cos(0.5), sin(0.5), -sin(0.5), cos(0.50)); + for (int i = 0; i < NUM_OCTAVES; ++i) { + v += a * noise(x); + x = rot * x * 2.0 + shift; + a *= 0.5; + } + return v; +} + +vec4 outlining() +{ + vec4 ownColor = texture2D(uSampler, vTextureCoord); + vec4 curColor; + float maxAlpha = 0.; + vec2 displaced; + for (float angle = 0.; angle <= TWOPI; angle += 0.3141592653) { + displaced.x = vTextureCoord.x + thickness.x * cos(angle); + displaced.y = vTextureCoord.y + thickness.y * sin(angle); + curColor = texture2D(uSampler, clamp(displaced, filterClamp.xy, filterClamp.zw)); + maxAlpha = max(maxAlpha, curColor.a); + } + float resultAlpha = max(maxAlpha, ownColor.a); + return vec4((ownColor.rgb + color.rgb * (1. - ownColor.a)) * resultAlpha, resultAlpha); + +} + +vec4 glowing() +{ + vec2 px = vec2(1.0 / filterArea.x, 1.0 / filterArea.y); + + float totalAlpha = 0.0; + float outerStrength = 6.; + + vec2 direction; + vec2 displaced; + vec4 curColor; + + for (float angle = 0.0; angle < TWOPI; angle += 0.3141592653) { + direction = vec2(cos(angle), sin(angle)) * px; + + for (float curDistance = 0.0; curDistance < 10.; curDistance++) { + displaced = clamp(vTextureCoord + direction * + (curDistance + 1.0), filterClamp.xy, filterClamp.zw); + + curColor = texture2D(uSampler, displaced); + totalAlpha += (10. - curDistance) * curColor.a; + } + } + + curColor = texture2D(uSampler, vTextureCoord); + + float alphaRatio = (totalAlpha / MAX_TOTAL_ALPHA); + float outerGlowAlpha = alphaRatio * outerStrength * (1. - curColor.a); + float outerGlowStrength = min(1.0 - curColor.a, outerGlowAlpha); + + vec4 outerGlowColor = (outerGlowStrength * (color.rgba/10.) ); + + float resultAlpha = outerGlowAlpha; + return vec4(color.rgb * resultAlpha, resultAlpha); +} + +vec4 ripples(vec2 suv) +{ + suv.x += time/2.; + vec3 c1 = ( 0.0 ) * (color.rgb / 0.1); + vec3 c2 = vec3(c1); + vec3 c3 = vec3(c1); + vec3 c4 = vec3( color.r/0.2, color.g/0.3, color.b/0.5 ); + vec3 c5 = vec3(c3); + vec3 c6 = vec3(c1); + vec2 p = suv; + float q = 2.*fbm(p + time/5.); + vec2 r = vec2(fbm(p + q + ( time/10. ) - p.x - p.y), fbm(p + p + ( time/10. ))); + //r.x += bornedCos(-0.3,-0.2); + //r.y += 200.*bornedSin(-1.9,1.9); + + vec3 c = color.rgb * ( + mix( c1, c2, fbm( p + r ) ) + mix( c3, c4, r.x ) - mix( c5, c6, r.y ) + ); + return vec4(c,1.); +} + +vec4 noisy(vec2 suv) +{ + vec4 noiseColor; + noiseColor.r = (color.r * noise(suv + fbm(suv) + time)); + noiseColor.g = (color.g * noise(suv + fbm(suv) + time)); + noiseColor.b = (color.b * noise(suv + fbm(suv) + time)); + noiseColor.a = 1.; + return clamp(noiseColor,0.,1.); +} + +void main(void) +{ + + vec4 pixel = texture2D(uSampler,vTextureCoord); + + if (pixel.a == 1.) { + gl_FragColor = pixel; + } else { + vec4 glowlevel = glowing(); + vec4 outlinelevel = outlining(); + vec4 aura; + + if (auraType <= 1) { + aura = ripples(vFilterCoord*20.*scale); + } else { + aura = noisy(vFilterCoord*20.*scale); + } + + vec4 effect; + effect = ((glowlevel*subAuraIntensity)/10.) + ((outlinelevel*auraIntensity)/1.25); + + if (effect.a >= 0.) {effect.rgb = aura.rgb*(max(effect.a,0.));} + + float intensity = effect.r + effect.g + effect.b; + if(intensity < threshold && effect.a != 0.) { + if (holes) {discard;} + effect.rgb = (color.rgb)*(effect.a/2.); + } + + gl_FragColor = pixel + effect * (1.-pixel.a); + } +} +`; \ No newline at end of file diff --git a/tokenmagic/fx/glsl/fragmentshaders/mirrorimages.js b/tokenmagic/fx/glsl/fragmentshaders/mirrorimages.js index 4c8d128..b8ba271 100644 --- a/tokenmagic/fx/glsl/fragmentshaders/mirrorimages.js +++ b/tokenmagic/fx/glsl/fragmentshaders/mirrorimages.js @@ -29,6 +29,7 @@ vec4 blenderVec3(int blend, vec4 fColv4, vec4 sColv4) else if (blend == 11) { fCol = fCol / (1.0 - sCol); } else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; } else if (blend == 13) { fCol = fCol + sCol; } + else if (blend == 14) { fCol = max(fCol,sCol)-(min(fCol,sCol)*0.5)+abs(fCol-sCol);} else { fCol = fCol + sCol; } return vec4(fCol,max(fColv4.a,sColv4.a)); diff --git a/tokenmagic/fx/glsl/fragmentshaders/waves.js b/tokenmagic/fx/glsl/fragmentshaders/waves.js index e05f1ba..babb666 100644 --- a/tokenmagic/fx/glsl/fragmentshaders/waves.js +++ b/tokenmagic/fx/glsl/fragmentshaders/waves.js @@ -50,8 +50,4 @@ void main() { gl_FragColor = col * pixel.a; } -`; - - - - +`; \ No newline at end of file diff --git a/tokenmagic/fx/glsl/fragmentshaders/xray.js b/tokenmagic/fx/glsl/fragmentshaders/xray.js new file mode 100644 index 0000000..ab2fd02 --- /dev/null +++ b/tokenmagic/fx/glsl/fragmentshaders/xray.js @@ -0,0 +1,66 @@ +export const xRay = ` +precision mediump float; +precision mediump int; + +uniform sampler2D uSampler; +uniform float time; +uniform float intensity; +uniform float divisor; +uniform int blend; +uniform vec2 dimensions; +uniform vec2 anchor; +uniform vec3 color; + +varying vec2 vFilterCoord; +varying vec2 vTextureCoord; + +#define PI 3.14159265359 + +vec4 blender(int blend, vec4 fColv4, vec4 sColv4) +{ + vec3 fCol = vec3(fColv4); + vec3 sCol = vec3(sColv4); + + if ( blend <= 1) { fCol = fCol * sCol; } + else if (blend == 2) { fCol = (1. - (1. - fCol) * (1. - sCol)); } + else if (blend == 3) { fCol = min(fCol, sCol); } + else if (blend == 4) { fCol = max(fCol, sCol); } + else if (blend == 5) { fCol = abs(fCol - sCol); } + else if (blend == 6) { fCol = 1. - abs(1. - fCol - sCol); } + else if (blend == 7) { fCol = fCol + sCol - (2. * fCol * sCol); } + else if (blend == 8) { fCol = all(lessThanEqual(fCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); } + else if (blend == 9) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol) : (1. - 2. * (1. - fCol) * (1. - sCol)); } + else if (blend == 10) { fCol = all(lessThanEqual(sCol, vec3(0.5, 0.5, 0.5))) ? (2. * fCol * sCol + fCol * fCol * (1. - 2. * sCol)) : sqrt(fCol) * (2. * sCol - 1.) + (2. * fCol) * (1. - sCol); } + else if (blend == 11) { fCol = fCol / (1.0 - sCol); } + else if (blend == 12) { fCol = 1.0 - (1.0 - fCol) / sCol; } + else if (blend == 13) { fCol = max(fCol,sCol)-(min(fCol,sCol)*0.5)+abs(fCol-sCol);} + else if (blend >= 14) { fCol = fCol + sCol; } + + return vec4(fCol,fColv4.a); +} + +void main() { + + vec4 pixel = texture2D(uSampler, vTextureCoord); + if (pixel.a==0.) { + gl_FragColor = pixel; + return; + } + + vec2 uv = (vFilterCoord - anchor) / dimensions; + + float len = length(uv *0.5); + float angle = atan(uv.x, uv.y) / (2. * PI); + float beam = fract((angle) * divisor + sin((sqrt(len) * 0.2) - (time/2.))); + + beam = 2.* cos(beam / (PI / 5.)); + beam *= floor(fract(angle * divisor + sin(time - (len * 1.2) * 0.2)) *256.) / 256.; + + float fractburn = fract(beam); + + vec4 color1 = smoothstep(0.0, 1., (beam*(intensity/10.) + pixel * vec4(color,1.)) / (fractburn == 0. ? fractburn+0.1 : fractburn) * 0.3 ); + vec4 result = blender(blend, pixel, color1); + + gl_FragColor = result*pixel.a; +} +`; \ No newline at end of file diff --git a/tokenmagic/lang/en.json b/tokenmagic/lang/en.json index edbd622..6c4989a 100644 --- a/tokenmagic/lang/en.json +++ b/tokenmagic/lang/en.json @@ -1,3 +1,7 @@ { - "TOKENMAGIC.TokenMagic": "TokenMagic" + "TMFX.TokenMagic": "TokenMagic", + "TMFX.useMaxPadding.name": "FX in additive padding mode", + "TMFX.useMaxPadding.hint": "By default, FX paddings are additives when applied on a given placeable. If the checkbox is unchecked, the maximum padding is used.", + "TMFX.minPadding.name": "Minimum padding", + "TMFX.minPadding.hint": "The minimum padding applied to a FX." } diff --git a/tokenmagic/lang/fr.json b/tokenmagic/lang/fr.json index edbd622..3fd3878 100644 --- a/tokenmagic/lang/fr.json +++ b/tokenmagic/lang/fr.json @@ -1,3 +1,7 @@ -{ - "TOKENMAGIC.TokenMagic": "TokenMagic" +{ + "TMFX.TokenMagic": "TokenMagic", + "TMFX.useMaxPadding.name": "Effets en mode padding additif", + "TMFX.useMaxPadding.hint": "Par défaut, les effets additionnent leur padding en s'appliquant sur un objet donné. Si la case est décochée, c'est le padding maximum qui est utilisé.", + "TMFX.minPadding.name": "Padding minimum", + "TMFX.minPadding.hint": "Padding minimum appliqué aux effets." } diff --git a/tokenmagic/module.json b/tokenmagic/module.json index 50e4e45..385f516 100644 --- a/tokenmagic/module.json +++ b/tokenmagic/module.json @@ -2,7 +2,7 @@ "name": "tokenmagic", "title": "Tokenmagic", "description": "

Add graphic filters and animations on your tokens and tiles.

", - "version": "0.1.3d", + "version": "0.2.0", "compatibleCoreVersion": "0.6.5", "minimumCoreVersion": "0.6.0", "author": "SecretFire", @@ -11,6 +11,7 @@ ], "esmodules": [ "module/tokenmagic.js", + "module/proto/PlaceableObjectProto.js", "fx/Anime.js", "fx/glsl/vertexshaders/customvertex2D.js", "fx/glsl/fragmentshaders/removeshadow.js", @@ -24,6 +25,8 @@ "fx/glsl/fragmentshaders/smoke.js", "fx/glsl/fragmentshaders/forcefield.js", "fx/glsl/fragmentshaders/mirrorimages.js", + "fx/glsl/fragmentshaders/xray.js", + "fx/glsl/fragmentshaders/magicglow.js", "fx/filters/FilterBevel.js", "fx/filters/FilterAdjustment.js", "fx/filters/FilterAdvancedBloom.js", @@ -48,6 +51,9 @@ "fx/filters/FilterSmoke.js", "fx/filters/FilterForceField.js", "fx/filters/FilterMirrorImages.js", + "fx/filters/FilterXRays.js", + "fx/filters/FilterLiquid.js", + "fx/filters/FilterGleamingGlow.js", "fx/filters/proto/FilterProto.js" ], diff --git a/tokenmagic/module/proto/PlaceableObjectProto.js b/tokenmagic/module/proto/PlaceableObjectProto.js new file mode 100644 index 0000000..012c5fb --- /dev/null +++ b/tokenmagic/module/proto/PlaceableObjectProto.js @@ -0,0 +1,24 @@ + +PlaceableObject.prototype.TMFXaddFilters = async function (paramsArray) { + await window.TokenMagic.addFilters(this, paramsArray); +} + +PlaceableObject.prototype.TMFXupdateFilters = async function (paramsArray) { + await window.TokenMagic.updateFiltersByPlaceable(this, paramsArray); +} + +PlaceableObject.prototype.TMFXaddUpdateFilters = async function (paramsArray) { + await window.TokenMagic.addUpdateFilters(this, paramsArray); +} + +PlaceableObject.prototype.TMFXdeleteFilters = async function (filterId = null) { + await window.TokenMagic.deleteFilters(this, filterId); +} + +PlaceableObject.prototype.TMFXhasFilterType = function (filterType) { + return window.TokenMagic.hasFilterType(this, filterType); +} + +PlaceableObject.prototype.TMFXhasFilterId = function (filterId) { + return window.TokenMagic.hasFilterId(this, filterId); +} \ No newline at end of file diff --git a/tokenmagic/module/tokenmagic.js b/tokenmagic/module/tokenmagic.js index 9add523..51dd12d 100644 --- a/tokenmagic/module/tokenmagic.js +++ b/tokenmagic/module/tokenmagic.js @@ -22,7 +22,11 @@ import { FilterFlood } from "../fx/filters/FilterFlood.js"; import { FilterSmoke } from "../fx/filters/FilterSmoke.js"; import { FilterForceField } from "../fx/filters/FilterForceField.js"; import { FilterMirrorImages } from "../fx/filters/FilterMirrorImages.js"; +import { FilterXRays } from "../fx/filters/FilterXRays.js"; +import { FilterLiquid } from "../fx/filters/FilterLiquid.js"; +import { FilterGleamingGlow } from "../fx/filters/FilterGleamingGlow.js"; import { Anime } from "../fx/Anime.js"; +import "./proto/PlaceableObjectProto.js"; const moduleTM = "module.tokenmagic"; @@ -51,23 +55,53 @@ export const FilterType = { smoke: FilterSmoke, flood: FilterFlood, images: FilterMirrorImages, - field: FilterForceField + field: FilterForceField, + xray: FilterXRays, + liquid: FilterLiquid, + xglow: FilterGleamingGlow }; -const graphics = new PIXI.Graphics(); - -// The FilterForceField is a huge shader : when loaded for the first time, you can take a coffee break. -// This piece of code solve the problem, while waiting for a cleaner solution. -// There is a better solution, no doubt. -export async function loadHeavyFilters() { - let params = - { - filterType: "field", - enabled: true, - dummy: true - }; - var filter = new FilterForceField(params); - graphics.filters = [filter]; +function i18n(key) { + return game.i18n.localize(key); +} + +export function registerSettings() { + game.settings.register("tokenmagic", "useAdditivePadding", { + name: i18n("TMFX.useMaxPadding.name"), + hint: i18n("TMFX.useMaxPadding.hint"), + scope: "world", + config: true, + default: true, + type: Boolean + }); + + game.settings.register("tokenmagic", "minPadding", { + name: i18n("TMFX.minPadding.name"), + hint: i18n("TMFX.minPadding.hint"), + scope: "world", + config: true, + default: 0, + type: Number + }); +} + +const sleep = m => new Promise(r => setTimeout(r, m)); + +export function isActiveModule(moduleName) { + return game.modules.has(moduleName) + && game.modules.get(moduleName).active === true; +} + +export function getMinPadding() { + return game.settings.get("tokenmagic", "minPadding"); +} + +export function isAdditivePaddingConfig() { + return game.settings.get("tokenmagic", "useAdditivePadding"); +} + +export function autosetPaddingMode() { + canvas.app.renderer.filter.useMaxPadding = !isAdditivePaddingConfig(); } export function log(output) { @@ -230,6 +264,29 @@ export function TokenMagic() { await placeable.setFlag("tokenmagic", "filters", placeableFlag); }; + async function addUpdateFilters(placeable, paramsArray) { + if (paramsArray instanceof Array && paramsArray.length > 0) { + for (const params of paramsArray) { + await addUpdateFilter(placeable, params); + } + } + }; + + async function addUpdateFilter(placeable, params) { + if (placeable == null + || params == null + || !params.hasOwnProperty("filterType") + || !FilterType.hasOwnProperty(params.filterType)) { + return; + } + + if (params.hasOwnProperty("filterId") && placeable.TMFXhasFilterId(params.filterId)) { + await updateFilterByPlaceable(params, placeable); + } else { + await addFilter(placeable, params); + } + }; + async function addFilters(placeable, paramsArray) { if (paramsArray instanceof Array && paramsArray.length > 0) { for (const params of paramsArray) { @@ -301,6 +358,14 @@ export function TokenMagic() { } } + async function updateFiltersByPlaceable(placeable, paramsArray) { + if (paramsArray instanceof Array && paramsArray.length > 0) { + for (const params of paramsArray) { + await updateFilterByPlaceable(params, placeable); + } + } + } + async function updateFilterByPlaceable(params, placeable) { var flags = placeable.getFlag("tokenmagic", "filters"); if (flags == null || !flags instanceof Array || flags.length < 1) { return; } // nothing to update... @@ -350,11 +415,53 @@ export function TokenMagic() { if (filterId == null) { await placeable.unsetFlag("tokenmagic", "filters"); } else if (typeof filterId === "string") { - var params = {}; - params.filterId = filterId; - params.destroy = true; - await updateFilterByPlaceable(params, placeable); + + var flags = placeable.getFlag("tokenmagic", "filters"); + if (flags == null || !flags instanceof Array || flags.length < 1) { return; } // nothing to delete... + + var workingFlags = new Array(); + flags.forEach(flag => { + if (flag.tmFilters.tmFilterId != filterId) { + workingFlags.push(duplicate(flag)); + } + }); + + if (workingFlags.length > 0) { + await placeable.setFlag("tokenmagic", "filters", workingFlags); + } else { + await placeable.unsetFlag("tokenmagic", "filters"); + } + } + }; + + function hasFilterType(placeable, filterType) { + if (placeable == null + || filterType == null + || !(placeable instanceof PlaceableObject)) { return null; } + + var flags = placeable.getFlag("tokenmagic", "filters"); + if (flags == null || !flags instanceof Array || flags.length < 1) { return false; } + + const found = flags.find(flag => flag.tmFilters.tmFilterType === filterType); + if (found === undefined) { + return false; } + return true; + }; + + function hasFilterId(placeable, filterId) { + if (placeable == null + || filterId == null + || !(placeable instanceof PlaceableObject)) { return null; } + + var flags = placeable.getFlag("tokenmagic", "filters"); + if (flags == null || !flags instanceof Array || flags.length < 1) { return false; } + + const found = flags.find(flag => flag.tmFilters.tmFilterId === filterId); + if (found === undefined) { + return false; + } + return true; }; // TODO : to improve @@ -390,6 +497,7 @@ export function TokenMagic() { function _assignFilter(placeable, filterInfo) { if (filterInfo == null) { return; } var workingFilterInfo = duplicate(filterInfo); + workingFilterInfo.tmFilters.tmParams.placeableId = placeable.id; var filter = new FilterType[workingFilterInfo.tmFilters.tmFilterType](workingFilterInfo.tmFilters.tmParams); setFilter(placeable, filter, filterInfo.tmFilters.tmParams); } @@ -405,6 +513,13 @@ export function TokenMagic() { } }; + function _singleLoadFilters(placeable) { + var filters = placeable.getFlag("tokenmagic", "filters"); + if (!(filters == null)) { + _assignFilters(placeable, filters); + } + }; + function _fxPseudoEqual(flagObject, filterObject) { function isObject(object) { @@ -452,24 +567,39 @@ export function TokenMagic() { var filters = placeable.getFlag("tokenmagic", "filters"); if (filters == null) { return; } + // Handling deleted filters + for (let anime of Anime.getAnimeMap().values()) { + var foundFilter = false; + filters.forEach((filterFlag) => { + if (anime.puppet.filterId === filterFlag.tmFilters.tmFilterId + && anime.puppet.filterInternalId === filterFlag.tmFilters.tmFilterInternalId + && anime.puppet.placeableId === filterFlag.tmFilters.tmParams.placeableId) { + foundFilter = true; + } + }); + + if (!foundFilter) { + Anime.removeAnimationByFilterId(data._id, anime.puppet.filterId); + this._clearImgFiltersByPlaceable(placeable, anime.puppet.filterId); + } + } + filters.forEach((filterFlag) => { if (filterFlag.tmFilters.hasOwnProperty("tmParams")) { - if (filterFlag.tmFilters.tmParams.hasOwnProperty("destroy") && filterFlag.tmFilters.tmParams.destroy) { - Anime.removeAnimationByFilterId(data._id, filterFlag.tmFilters.tmFilterId); - this._clearImgFiltersByPlaceable(placeable, filterFlag.tmFilters.tmFilterId); - } else { - var puppets = Anime.getPuppetsByParams(filterFlag.tmFilters.tmParams); - if (puppets.length > 0) { - for (const puppet of puppets) { - if (!_fxPseudoEqual(filterFlag.tmFilters.tmParams, puppet)) { - puppet.setTMParams(duplicate(filterFlag.tmFilters.tmParams)); - puppet.normalizeTMParams(); - } + var puppets = Anime.getPuppetsByParams(filterFlag.tmFilters.tmParams); + if (puppets.length > 0) { + // Handling modified filters + for (const puppet of puppets) { + if (!_fxPseudoEqual(filterFlag.tmFilters.tmParams, puppet)) { + puppet.setTMParams(duplicate(filterFlag.tmFilters.tmParams)); + puppet.normalizeTMParams(); } - } else { - _assignFilter(placeable, filterFlag); } + } else { + // Handling new filters + _assignFilter(placeable, filterFlag); } + } }); }; @@ -506,6 +636,8 @@ export function TokenMagic() { addFilterOnSelected: addFilterOnSelected, addFiltersOnSelected: addFiltersOnSelected, addFiltersOnTargeted: addFiltersOnTargeted, + addUpdateFilters: addUpdateFilters, + addUpdateFilter: addUpdateFilter, deleteFilters: deleteFilters, deleteFiltersOnSelected: deleteFiltersOnSelected, deleteFiltersOnTargeted: deleteFiltersOnTargeted, @@ -513,26 +645,33 @@ export function TokenMagic() { updateFilters: updateFilters, updateFiltersOnSelected: updateFiltersOnSelected, updateFiltersOnTargeted: updateFiltersOnTargeted, + updateFiltersByPlaceable: updateFiltersByPlaceable, updateFilterByPlaceable: updateFilterByPlaceable, + hasFilterType: hasFilterType, + hasFilterId: hasFilterId, _assignFilters: _assignFilters, _loadFilters: _loadFilters, _clearImgFiltersByPlaceable: _clearImgFiltersByPlaceable, _getAnimeMap: Anime.getAnimeMap, _updateFilters: _updateFilters, + _singleLoadFilters: _singleLoadFilters, }; } export const Magic = TokenMagic(); +Hooks.once("init", () => { + registerSettings(); +}); + Hooks.on("ready", () => { log("Hook -> ready"); window.TokenMagic = Magic; - loadHeavyFilters(); - //initSocket(); }); Hooks.on("canvasInit", (canvas) => { log("Hook -> canvasInit"); + autosetPaddingMode(); Anime.desactivateAnimation(); Anime.resetAnimation(); }); @@ -569,9 +708,46 @@ Hooks.on("deleteToken", (parent, doc, options, userId) => { } }); +Hooks.on("createToken", (scene, data, options) => { + log("Hook -> createToken"); + + if (!(scene == null) + && scene.id === game.user.viewedScene + && data.hasOwnProperty("flags") + && data.flags.hasOwnProperty("tokenmagic") + && data.flags.tokenmagic.hasOwnProperty("filters")) { + + var placeable = getPlaceableById(data._id, "Token"); + + (async () => { + await sleep(100); + Magic._singleLoadFilters(placeable); + })(); + } +}); + Hooks.on("updateToken", (scene, data, options) => { log("Hook -> updateToken"); - Magic._updateFilters(data, options, "Token"); + + if (options.hasOwnProperty("img") || options.hasOwnProperty("tint") + || options.hasOwnProperty("height") || options.hasOwnProperty("width") ) { + + var placeable = getPlaceableById(data._id, "Token"); + + // removing animations on this placeable + Anime.removeAnimation(data._id); + + // clearing the filters (owned by tokenmagic) + Magic._clearImgFiltersByPlaceable(placeable); + + (async () => { + await sleep(100); + Magic._singleLoadFilters(placeable); + })(); + + } else { + Magic._updateFilters(data, options, "Token"); + } }); Hooks.on("deleteTile", (parent, doc, options, userId) => { @@ -583,5 +759,24 @@ Hooks.on("deleteTile", (parent, doc, options, userId) => { Hooks.on("updateTile", (scene, data, options) => { log("Hook -> updateTile"); - Magic._updateFilters(data, options, "Tile"); + + if (options.hasOwnProperty("img") || options.hasOwnProperty("tint")) { + + var placeable = getPlaceableById(data._id, "Tile"); + + // removing animations on this placeable + Anime.removeAnimation(data._id); + + (async () => { + await sleep(100); + Magic._singleLoadFilters(placeable); + })(); + + } else { + Magic._updateFilters(data, options, "Tile"); + } +}); + +Hooks.on("closeSettingsConfig", () => { + autosetPaddingMode(); }); diff --git a/tokenmagic/packs/token-magic-portfolio.db b/tokenmagic/packs/token-magic-portfolio.db index b6a81db..32f53e9 100644 --- a/tokenmagic/packs/token-magic-portfolio.db +++ b/tokenmagic/packs/token-magic-portfolio.db @@ -1,94 +1,46 @@ -{"_id":"2zRNjnw7Ps26h5xz","name":"22 - Smoke Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"smoke\",\r\n color: 0x00FF00,\r\n time: 0,\r\n blend: 0,\r\n dimX: 1,\r\n dimY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: -0.006, \r\n animType: \"move\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"37aHASDQzFvbqmJG","name":"15 - Cosmic Ray Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0xCF8000,\r\n alpha: 0.5,\r\n divisor: 32,\r\n anchorX: 0,\r\n anchorY: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"07 - Distortion Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// you can change the mask of the filter\r\n// the mask must have a power of 2 h and w (512x512, 128x128, ...) \r\n// the distortion applies on black and white and shades of grey\r\n// after testing the first version of this macro try this :\r\n// -> maskPath: \"/modules/tokenmagic/fx/assets/waves-2.png\"\r\n\r\nlet params =\r\n{\r\n filterType: \"distortion\",\r\n maskPath: \"/modules/tokenmagic/fx/assets/distortion-1.png\",\r\n maskSpriteScaleX: 5,\r\n maskSpriteScaleY: 5,\r\n padding: 20,\r\n animated:\r\n {\r\n maskSpriteX: { active: true, speed: 0.05, animType: \"move\" },\r\n maskSpriteY: { active: true, speed: 0.07, animType: \"move\" }\r\n }\r\n};\r\n\r\nTokenMagic.addFilterOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"AHoBr50LyDjnphDw"} -{"_id":"As1JrHLEm38Nm667","name":"Delete filters by Placeable","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Delete all filters on the placeable in parameter (token or tile)\r\nTokenMagic.deleteFilters(_token);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"CdFhWPKBMb5wj7cM","name":"11 - Blur Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"blur\",\r\n padding: 10,\r\n quality: 4.0,\r\n blur: 0,\r\n blurX: 0,\r\n blurY: 0,\r\n animated:\r\n {\r\n blurX: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\", \r\n loopDuration: 500, \r\n val1: 0, \r\n val2: 6\r\n },\r\n blurY: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\", \r\n loopDuration: 750, \r\n val1: 0, \r\n val2: 6}\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"DCRnfJDBd25fOQxc","name":"Delete filters on Selected","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Delete all filters on the selected tokens/tiles\r\nTokenMagic.deleteFiltersOnSelected();","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"DoXvYWKPRcTpHbPG","name":"20 - Waves Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Below, you can turn on the anchor animation.\r\nlet params =\r\n[{\r\n filterType: \"wave\",\r\n time: 0,\r\n anchorX: 0.5,\r\n anchorY: 0.5,\r\n strength: 0.015,\r\n frequency: 60,\r\n color: 0xFFFFFF,\r\n maxIntensity: 3.0,\r\n minIntensity: 0.8,\r\n padding:10,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0085, \r\n animType: \"move\" \r\n },\r\n anchorX :\r\n {\r\n active: false,\r\n val1: 0.15,\r\n val2: 0.85,\r\n animType: \"syncCosOscillation\",\r\n loopDuration: 20000\r\n },\r\n anchorY :\r\n {\r\n active: false,\r\n val1: 0.15,\r\n val2: 0.85,\r\n animType: \"syncSinOscillation\",\r\n loopDuration: 20000\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"Edw0KaZiBtWEG86g","name":"16 - Inner Fog Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fog\",\r\n color: 0xFFFFFF,\r\n density: 0.45,\r\n time: 0,\r\n dimX: 1,\r\n dimY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 1.2, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"F47j6ivhmXxeYVmY","name":"19 - Fire Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fire\",\r\n intensity: 1,\r\n color: 0xFFFFFF,\r\n amplitude: 1,\r\n time: 0,\r\n blend: 2,\r\n fireBlend : 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: -0.0019, \r\n animType: \"move\" \r\n },\r\n intensity:\r\n {\r\n active:true,\r\n loopDuration: 15485,\r\n val1: 1,\r\n val2: 2,\r\n animType: \"syncCosOscillation\"\r\n },\r\n amplitude:\r\n {\r\n active:true,\r\n loopDuration: 4567,\r\n val1: 1,\r\n val2: 2,\r\n animType: \"syncCosOscillation\"\r\n }\r\n \r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"FBQzhLveCvFKOvJ7","name":"10 - BulgePinch Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"bulgepinch\",\r\n padding: 150,\r\n strength: 0,\r\n zIndex: 2,\r\n radiusPercent: 200,\r\n animated:\r\n {\r\n strength: \r\n { \r\n active: true, \r\n animType: \"cosOscillation\", \r\n loopDuration: 2000, \r\n val1: 0, \r\n val2: 0.8\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"GvYp56Thtf3n9RYy","name":"01 - Bevel Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"bevel\",\r\n rotation: 0,\r\n thickness: 4,\r\n lightColor: 0x00FF00,\r\n lightAlpha: 0.7,\r\n shadowColor: 0xFF0000,\r\n shadowAlpha: 0.4,\r\n animated :\r\n {\r\n rotation: \r\n { \r\n active: true,\r\n clockWise: true, \r\n loopDuration: 500, \r\n animType: \"syncRotation\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"H3rF4XGEf76ZylwP","name":"14 - Remove Shadow Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// this simple filter remove pixels with a certain amount of alpha\r\n// it can be useful to remove shadows before using glow or outline filters.\r\n\r\nlet params =\r\n[{\r\n filterType: \"zapshadow\",\r\n alphaTolerance: 0.60\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"D - Auto-Destroy Example","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"bevel\",\r\n autoDestroy: true,\r\n rotation: 0,\r\n thickness: 5,\r\n lightColor: 0x00FF00,\r\n lightAlpha: 0.7,\r\n shadowColor: 0xFF0000,\r\n shadowAlpha: 0.4,\r\n animated :\r\n {\r\n rotation: \r\n { \r\n active: true,\r\n clockWise: true, \r\n loopDuration: 1000,\r\n loops: 5,\r\n animType: \"rotation\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"HjzhkTFUng8sxWkH"} -{"_id":"Ia0tPcllVQq96yXF","name":"C - Electric Multi-Filters","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// works better with tokens or tiles with no shadows\r\nlet params =\r\n[{\r\n filterType: \"shadow\",\r\n blur: 2,\r\n quality: 5,\r\n distance: 0,\r\n alpha: 1.,\r\n padding: 100,\r\n color: 0xFFFFFF,\r\n animated:\r\n {\r\n blur: \r\n { \r\n active: true, \r\n loopDuration: 500, \r\n animType: \"syncCosOscillation\", \r\n val1: 2, \r\n val2: 4\r\n },\r\n }\r\n},\r\n{\r\n filterType: \"electric\",\r\n color: 0xFFFFFF,\r\n time: 0,\r\n blend: 2,\r\n intensity: 5,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0020, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"OWgJD9lvBlDzXALz","name":"09 - Twist Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"twist\",\r\n radiusPercent: 120,\r\n angle: 0,\r\n animated:\r\n {\r\n angle: \r\n { \r\n active: true, \r\n animType: \"sinOscillation\",\r\n loopDuration: 10000, \r\n val1: -0.6*Math.PI, \r\n val2: +0.6*Math.PI\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"VWTz2fKfSb6WK7Mo","name":"02 - Adjustment Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"adjustment\",\r\n saturation: 1,\r\n brightness: 1,\r\n contrast: 1,\r\n gamma: 1,\r\n red: 4,\r\n green: 0.5,\r\n blue: 0.5,\r\n alpha: 0.5,\r\n animated:\r\n {\r\n alpha: \r\n { \r\n active: true, \r\n loopDuration: 5000, \r\n animType: \"syncCosOscillation\",\r\n val1: 0.5,\r\n val2: 1 }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"YJjeB7N0L1rGfZD2","name":"18 - Electric Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"electric\",\r\n color: 0xFFFFFF,\r\n time: 0,\r\n blend: 1,\r\n intensity: 5,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0020, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"b5Enw7tEwfjDNHuY","name":"04 - Outline Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""}},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"outline\",\r\n padding: 10,\r\n color: 0x05B0B0,\r\n thickness: 1,\r\n quality: 10,\r\n animated :\r\n {\r\n thickness: \r\n { \r\n active: true,\r\n loopDuration: 1000,\r\n animType: \"syncCosOscillation\",\r\n val1: 1, \r\n val2: 8\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"cCEOQFsJvjhSTbbM","name":"06 - Bloom Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"xbloom\",\r\n threshold: 0.35,\r\n bloomScale: 0,\r\n brightness: 1.2,\r\n blur: 0.1,\r\n padding: 10,\r\n quality: 15,\r\n blendMode: 0,\r\n animated:\r\n {\r\n bloomScale: \r\n { \r\n active: true, \r\n loopDuration: 2000, \r\n animType: \"syncCosOscillation\", \r\n val1: 0, \r\n val2: 2\r\n },\r\n threshold: \r\n { \r\n active: false, \r\n loopDuration: 2000, \r\n animType: \"syncCosOscillation\", \r\n val1: 0.05, \r\n val2: 1.9\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"eJnsq5g4Pldh8Z6Q","name":"B - Multi-Filters Example","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"distortion\",\r\n maskPath: \"/modules/tokenmagic/fx/assets/waves-2.png\",\r\n maskSpriteScaleX: 7,\r\n maskSpriteScaleY: 7,\r\n padding: 50,\r\n animated:\r\n {\r\n maskSpriteX: { active: true, speed: 0.05, animType: \"move\" },\r\n maskSpriteY: { active: true, speed: 0.07, animType: \"move\" }\r\n }\r\n},\r\n{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0xEF9000,\r\n alpha: 0.25,\r\n divisor: 32,\r\n anchorY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n},\r\n{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0xB03000,\r\n quality: 0.5,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0xB03000, \r\n val2:0xFFD010\r\n }\r\n }\r\n}\r\n];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"ebWbFeiJP8UZG4Fd","name":"17 - Fumes Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fumes\",\r\n color: 0x909090,\r\n time: 0,\r\n blend: 8,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.001, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"g7O4u4dTaWcnajW7","name":"05 - Glow Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0x003000,\r\n quality: 0.5,\r\n padding: 10,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0x003000, \r\n val2:0x00FF00\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"hayiRem3LXoEP3tL","name":"03 - Drop Shadow Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"shadow\",\r\n rotation: 35,\r\n blur: 2,\r\n quality: 5,\r\n distance: 20,\r\n alpha: 0.7,\r\n padding: 10,\r\n shadowOnly: false,\r\n color: 0x000000,\r\n animated:\r\n {\r\n blur: \r\n { \r\n active: true, \r\n loopDuration: 500, \r\n animType: \"syncCosOscillation\", \r\n val1: 2, \r\n val2: 4\r\n },\r\n rotation:\r\n {\r\n active: true,\r\n loopDuration: 100,\r\n animType: \"syncSinOscillation\",\r\n val1: 33,\r\n val2: 37\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"lH53KTce3zYEFXos","name":"08 - Old film Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// special : the OldFilm filter need an Outline filter to be contained (or else, it will affect all the container)\r\nlet params =\r\n[{\r\n filterType: \"oldfilm\",\r\n sepia: 0.9,\r\n noise: 0.3,\r\n noiseSize: 1.0,\r\n scratch: 0.8,\r\n scratchDensity: 0.5,\r\n scratchWidth: 1.2,\r\n vignetting: 0.3,\r\n vignettingAlpha: 0.7,\r\n vignettingBlur: 0.3,\r\n animated:\r\n {\r\n seed: \r\n { \r\n active: true, \r\n animType: \"randomNumber\", \r\n val1: 0, \r\n val2: 1 \r\n },\r\n vignetting: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\" , \r\n loopDuration: 2000, \r\n val1: 0.2, \r\n val2: 0.4 }\r\n }\r\n},\r\n{\r\n filterType: \"outline\",\r\n color: 0x000000,\r\n thickness: 0,\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"r3JzTibAUnlpgPsD","name":"13 - Shockwave Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"shockwave\",\r\n time: 0,\r\n amplitude: 8,\r\n wavelength: 75,\r\n radius: 500,\r\n brightness: 1.5,\r\n speed: 25,\r\n padding: 0,\r\n animated:\r\n {\r\n time: \r\n { \r\n animType: \"cosOscillation\",\r\n active: true, \r\n loopDuration: 1800, \r\n val1: -4, val2: +4\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"t2MjFs4cVUCYsbMr","name":"12 - Zoom Blur Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"zoomblur\",\r\n strength: 0.3,\r\n innerRadiusPercent: 70,\r\n radiusPercent: 120,\r\n padding: 30,\r\n animated:\r\n {\r\n innerRadiusPercent: \r\n { \r\n active: true, \r\n animType: \"sinOscillation\", \r\n loopDuration: 500, \r\n val1: 65, \r\n val2: 75\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"tvDGSwbeQ97HNS8v","name":"A - Multi-Filters Example","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fog\",\r\n color: 0x00FF50,\r\n density: 0.20,\r\n time: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 1.2, \r\n animType: \"move\" \r\n }\r\n }\r\n},\r\n{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0x00DE50,\r\n alpha: 0.25,\r\n divisor: 32,\r\n anchorY: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n},\r\n{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0x003000,\r\n quality: 0.5,\r\n padding: 10,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0x003000, \r\n val2:0x00EF00\r\n }\r\n }\r\n}\r\n];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"zCCp4x0EResFji7O","name":"21 - Flood Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"flood\",\r\n time: 0,\r\n color: 0x0020BB,\r\n billowy: 0.43,\r\n tintIntensity: 0.72,\r\n glint: 0.31,\r\n scale: 70,\r\n padding: 10,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0006, \r\n animType: \"move\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"23 - Mirror Images Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"images\",\r\n time: 0,\r\n padding: 60,\r\n alpha: 0.9,\r\n blend: 4,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0010, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"s01RgeSRy4En1aKP"} -{"name":"24 - 01 - HexaShield Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"EQ8Xz4hZbbUsNB7m"} -{"name":"24 - 02 - Fire Shield Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 1,\r\n gridPadding: 2,\r\n color: 0xD08050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.15,\r\n lightAlpha: 2,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"ci0e7KxLl8IpjPRc"} -{"$$deleted":true,"_id":"EQ8Xz4hZbbUsNB7m"} -{"name":"24 - 01 - Hexa-Field Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"MBFPf6M4VdUdbMwp"} -{"$$deleted":true,"_id":"MBFPf6M4VdUdbMwp"} -{"name":"24 - T1 - Hexa-Force Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"sbP8KX50YRYtxVyB"} -{"$$deleted":true,"_id":"ci0e7KxLl8IpjPRc"} -{"name":"24 - T2 - Fire Shield Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 1,\r\n gridPadding: 2,\r\n color: 0xD08050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.15,\r\n lightAlpha: 2,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"IA3ofbRDpi3Rjgcy"} -{"name":"24 - T3 - Poisoned Smoke Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 3,\r\n gridPadding: 1,\r\n color: 0x106040,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"SSY0fjib0PgJaKEK"} -{"name":"24 - T4 - Earth Carapace Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 4,\r\n gridPadding: 2,\r\n color: 0x755050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"359Mw23cvaEDevkP"} -{"_id":"359Mw23cvaEDevkP","name":"24 - T4 - Earth Shell Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 4,\r\n gridPadding: 2,\r\n color: 0x755050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"sbP8KX50YRYtxVyB","name":"24 - T1 - Hexa Force Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"24 - T5 - Mega Earth Carapace (on top)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 5,\r\n gridPadding: 3,\r\n color: 0x905555,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.2,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n zIndex: 5,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"LrfXNjrImAWK5Hb2"} -{"_id":"LrfXNjrImAWK5Hb2","name":"24 - T5 - Mega Earth Shell (on top)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 5,\r\n gridPadding: 3,\r\n color: 0x905555,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.2,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n zIndex: 5,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"24 - T6 - Air Bubble Filter","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 6,\r\n gridPadding: 1,\r\n color: 0x306090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.3,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"6Do4AOxfbtCG8R4j"} -{"_id":"GvYp56Thtf3n9RYy","name":"01 - Bevel","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"bevel\",\r\n rotation: 0,\r\n thickness: 4,\r\n lightColor: 0x00FF00,\r\n lightAlpha: 0.7,\r\n shadowColor: 0xFF0000,\r\n shadowAlpha: 0.4,\r\n animated :\r\n {\r\n rotation: \r\n { \r\n active: true,\r\n clockWise: true, \r\n loopDuration: 500, \r\n animType: \"syncRotation\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"VWTz2fKfSb6WK7Mo","name":"02 - Adjustment","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"adjustment\",\r\n saturation: 1,\r\n brightness: 1,\r\n contrast: 1,\r\n gamma: 1,\r\n red: 4,\r\n green: 0.5,\r\n blue: 0.5,\r\n alpha: 0.5,\r\n animated:\r\n {\r\n alpha: \r\n { \r\n active: true, \r\n loopDuration: 5000, \r\n animType: \"syncCosOscillation\",\r\n val1: 0.5,\r\n val2: 1 }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"hayiRem3LXoEP3tL","name":"03 - Drop Shadow","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"shadow\",\r\n rotation: 35,\r\n blur: 2,\r\n quality: 5,\r\n distance: 20,\r\n alpha: 0.7,\r\n padding: 10,\r\n shadowOnly: false,\r\n color: 0x000000,\r\n animated:\r\n {\r\n blur: \r\n { \r\n active: true, \r\n loopDuration: 500, \r\n animType: \"syncCosOscillation\", \r\n val1: 2, \r\n val2: 4\r\n },\r\n rotation:\r\n {\r\n active: true,\r\n loopDuration: 100,\r\n animType: \"syncSinOscillation\",\r\n val1: 33,\r\n val2: 37\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"b5Enw7tEwfjDNHuY","name":"04 - Outline","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""}},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"outline\",\r\n padding: 10,\r\n color: 0x05B0B0,\r\n thickness: 1,\r\n quality: 10,\r\n animated :\r\n {\r\n thickness: \r\n { \r\n active: true,\r\n loopDuration: 1000,\r\n animType: \"syncCosOscillation\",\r\n val1: 1, \r\n val2: 8\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"g7O4u4dTaWcnajW7","name":"05 - Glow","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0x003000,\r\n quality: 0.5,\r\n padding: 10,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0x003000, \r\n val2:0x00FF00\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"cCEOQFsJvjhSTbbM","name":"06 - Bloom","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"xbloom\",\r\n threshold: 0.35,\r\n bloomScale: 0,\r\n brightness: 1.2,\r\n blur: 0.1,\r\n padding: 10,\r\n quality: 15,\r\n blendMode: 0,\r\n animated:\r\n {\r\n bloomScale: \r\n { \r\n active: true, \r\n loopDuration: 2000, \r\n animType: \"syncCosOscillation\", \r\n val1: 0, \r\n val2: 2\r\n },\r\n threshold: \r\n { \r\n active: false, \r\n loopDuration: 2000, \r\n animType: \"syncCosOscillation\", \r\n val1: 0.05, \r\n val2: 1.9\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"name":"24 - T12 - Warp Time Aura","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 12,\r\n gridPadding: 2,\r\n color: 0xAAAAAA,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.1,\r\n lightAlpha: 0.5,\r\n lightSize: 0.3,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"2IOkNL2J1jETUvSP"} +{"_id":"2zRNjnw7Ps26h5xz","name":"22 - Smoke","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"smoke\",\r\n color: 0x00FF00,\r\n time: 0,\r\n blend: 0,\r\n dimX: 1,\r\n dimY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: -0.006, \r\n animType: \"move\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"359Mw23cvaEDevkP","name":"24 - T04 - Earth Shell","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 4,\r\n gridPadding: 2,\r\n color: 0x755050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"37aHASDQzFvbqmJG","name":"15 - Cosmic Ray","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0xCF8000,\r\n alpha: 0.5,\r\n divisor: 32,\r\n anchorX: 0,\r\n anchorY: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"name":"24 - T10 - Evil Aura","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 10,\r\n gridPadding: 1,\r\n color: 0x902005,\r\n time: 0,\r\n blend: 5,\r\n intensity: 1,\r\n lightAlpha: 4,\r\n lightSize: 0.8,\r\n scale: 0.5,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"4Ywsytul1no7EwKb"} +{"_id":"6Do4AOxfbtCG8R4j","name":"24 - T06 - Air Bubble","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 6,\r\n gridPadding: 1,\r\n color: 0x306090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.3,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"6ZIpqLC3agLw2Vgx","name":"24 - T07 - Mage Armor","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 7,\r\n gridPadding: 1,\r\n color: 0x777777,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"AHoBr50LyDjnphDw","name":"07 - Distortion","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// you can change the mask of the filter\r\n// the mask must have a power of 2 h and w (512x512, 128x128, ...) \r\n// the distortion applies on black and white and shades of grey\r\n// after testing the first version of this macro try this :\r\n// -> maskPath: \"/modules/tokenmagic/fx/assets/waves-2.png\"\r\n\r\nlet params =\r\n{\r\n filterType: \"distortion\",\r\n maskPath: \"/modules/tokenmagic/fx/assets/distortion-1.png\",\r\n maskSpriteScaleX: 5,\r\n maskSpriteScaleY: 5,\r\n padding: 20,\r\n animated:\r\n {\r\n maskSpriteX: { active: true, speed: 0.05, animType: \"move\" },\r\n maskSpriteY: { active: true, speed: 0.07, animType: \"move\" }\r\n }\r\n};\r\n\r\nTokenMagic.addFilterOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"lH53KTce3zYEFXos","name":"08 - Old film","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// special : the OldFilm filter need an Outline filter to be contained (or else, it will affect all the container)\r\nlet params =\r\n[{\r\n filterType: \"oldfilm\",\r\n sepia: 0.9,\r\n noise: 0.3,\r\n noiseSize: 1.0,\r\n scratch: 0.8,\r\n scratchDensity: 0.5,\r\n scratchWidth: 1.2,\r\n vignetting: 0.3,\r\n vignettingAlpha: 0.7,\r\n vignettingBlur: 0.3,\r\n animated:\r\n {\r\n seed: \r\n { \r\n active: true, \r\n animType: \"randomNumber\", \r\n val1: 0, \r\n val2: 1 \r\n },\r\n vignetting: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\" , \r\n loopDuration: 2000, \r\n val1: 0.2, \r\n val2: 0.4 }\r\n }\r\n},\r\n{\r\n filterType: \"outline\",\r\n color: 0x000000,\r\n thickness: 0,\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"OWgJD9lvBlDzXALz","name":"09 - Twist","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"twist\",\r\n radiusPercent: 120,\r\n angle: 0,\r\n animated:\r\n {\r\n angle: \r\n { \r\n active: true, \r\n animType: \"sinOscillation\",\r\n loopDuration: 10000, \r\n val1: -0.6*Math.PI, \r\n val2: +0.6*Math.PI\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"FBQzhLveCvFKOvJ7","name":"10 - BulgePinch","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"bulgepinch\",\r\n padding: 150,\r\n strength: 0,\r\n zIndex: 2,\r\n radiusPercent: 200,\r\n animated:\r\n {\r\n strength: \r\n { \r\n active: true, \r\n animType: \"cosOscillation\", \r\n loopDuration: 2000, \r\n val1: 0, \r\n val2: 0.8\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"As1JrHLEm38Nm667","name":"F - 01 - Delete filters by Placeable","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Delete all filters on the placeable in parameter (token or tile)\r\nTokenMagic.deleteFilters(_token);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"BGz9j7xPy0H2QlBf","name":"E - Click, click, click and click !","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let glowFunc = async function() {\r\n\r\n const tokens = canvas.tokens.placeables;\r\n\r\n for (const token of tokens){\r\n if (token.TMFXhasFilterId(\"funnyAlternateGlow\")) {\r\n await token.TMFXdeleteFilters(\"funnyAlternateGlow\");\r\n } else {\r\n let params =\r\n [{\r\n filterType: \"glow\",\r\n filterId: \"funnyAlternateGlow\",\r\n color: Math.floor(Math.random() * 16777215),\r\n animated: null\r\n }];\r\n await token.TMFXaddUpdateFilters(params);\r\n }\r\n }\r\n};\r\n\r\nglowFunc();","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"CdFhWPKBMb5wj7cM","name":"11 - Blur","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"blur\",\r\n padding: 10,\r\n quality: 4.0,\r\n blur: 0,\r\n blurX: 0,\r\n blurY: 0,\r\n animated:\r\n {\r\n blurX: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\", \r\n loopDuration: 500, \r\n val1: 0, \r\n val2: 6\r\n },\r\n blurY: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\", \r\n loopDuration: 750, \r\n val1: 0, \r\n val2: 6}\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"t2MjFs4cVUCYsbMr","name":"12 - Zoom Blur","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"zoomblur\",\r\n strength: 0.3,\r\n innerRadiusPercent: 70,\r\n radiusPercent: 120,\r\n padding: 30,\r\n animated:\r\n {\r\n innerRadiusPercent: \r\n { \r\n active: true, \r\n animType: \"sinOscillation\", \r\n loopDuration: 500, \r\n val1: 65, \r\n val2: 75\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"r3JzTibAUnlpgPsD","name":"13 - Shockwave","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"shockwave\",\r\n time: 0,\r\n amplitude: 8,\r\n wavelength: 75,\r\n radius: 500,\r\n brightness: 1.5,\r\n speed: 25,\r\n padding: 0,\r\n animated:\r\n {\r\n time: \r\n { \r\n animType: \"cosOscillation\",\r\n active: true, \r\n loopDuration: 1800, \r\n val1: -4, val2: +4\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"H3rF4XGEf76ZylwP","name":"14 - Remove Shadow","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// this simple filter remove pixels with a certain amount of alpha\r\n// it can be useful to remove shadows before using glow or outline filters.\r\n\r\nlet params =\r\n[{\r\n filterType: \"zapshadow\",\r\n alphaTolerance: 0.60\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"37aHASDQzFvbqmJG","name":"15 - Cosmic Ray","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0xCF8000,\r\n alpha: 0.5,\r\n divisor: 32,\r\n anchorX: 0,\r\n anchorY: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"DCRnfJDBd25fOQxc","name":"F - 02 - Delete filters on Selected","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Delete all filters on the selected tokens/tiles\r\nTokenMagic.deleteFiltersOnSelected();","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"DoXvYWKPRcTpHbPG","name":"20 - Waves","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Below, you can turn on the anchor animation.\r\nlet params =\r\n[{\r\n filterType: \"wave\",\r\n time: 0,\r\n anchorX: 0.5,\r\n anchorY: 0.5,\r\n strength: 0.015,\r\n frequency: 60,\r\n color: 0xFFFFFF,\r\n maxIntensity: 3.0,\r\n minIntensity: 0.8,\r\n padding:10,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0085, \r\n animType: \"move\" \r\n },\r\n anchorX :\r\n {\r\n active: false,\r\n val1: 0.15,\r\n val2: 0.85,\r\n animType: \"syncCosOscillation\",\r\n loopDuration: 20000\r\n },\r\n anchorY :\r\n {\r\n active: false,\r\n val1: 0.15,\r\n val2: 0.85,\r\n animType: \"syncSinOscillation\",\r\n loopDuration: 20000\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"Edw0KaZiBtWEG86g","name":"16 - Inner Fog","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fog\",\r\n color: 0xFFFFFF,\r\n density: 0.45,\r\n time: 0,\r\n dimX: 1,\r\n dimY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 1.2, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"ebWbFeiJP8UZG4Fd","name":"17 - Fumes","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fumes\",\r\n color: 0x909090,\r\n time: 0,\r\n blend: 8,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.001, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"YJjeB7N0L1rGfZD2","name":"18 - Electric","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"electric\",\r\n color: 0xFFFFFF,\r\n time: 0,\r\n blend: 1,\r\n intensity: 5,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0020, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"F47j6ivhmXxeYVmY","name":"19 - Fire","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fire\",\r\n intensity: 1,\r\n color: 0xFFFFFF,\r\n amplitude: 1,\r\n time: 0,\r\n blend: 2,\r\n fireBlend : 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: -0.0019, \r\n animType: \"move\" \r\n },\r\n intensity:\r\n {\r\n active:true,\r\n loopDuration: 15485,\r\n val1: 1,\r\n val2: 2,\r\n animType: \"syncCosOscillation\"\r\n },\r\n amplitude:\r\n {\r\n active:true,\r\n loopDuration: 4567,\r\n val1: 1,\r\n val2: 2,\r\n animType: \"syncCosOscillation\"\r\n }\r\n \r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"DoXvYWKPRcTpHbPG","name":"20 - Waves","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// Below, you can turn on the anchor animation.\r\nlet params =\r\n[{\r\n filterType: \"wave\",\r\n time: 0,\r\n anchorX: 0.5,\r\n anchorY: 0.5,\r\n strength: 0.015,\r\n frequency: 60,\r\n color: 0xFFFFFF,\r\n maxIntensity: 3.0,\r\n minIntensity: 0.8,\r\n padding:10,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0085, \r\n animType: \"move\" \r\n },\r\n anchorX :\r\n {\r\n active: false,\r\n val1: 0.15,\r\n val2: 0.85,\r\n animType: \"syncCosOscillation\",\r\n loopDuration: 20000\r\n },\r\n anchorY :\r\n {\r\n active: false,\r\n val1: 0.15,\r\n val2: 0.85,\r\n animType: \"syncSinOscillation\",\r\n loopDuration: 20000\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"zCCp4x0EResFji7O","name":"21 - Flood","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"flood\",\r\n time: 0,\r\n color: 0x0020BB,\r\n billowy: 0.43,\r\n tintIntensity: 0.72,\r\n glint: 0.31,\r\n scale: 70,\r\n padding: 10,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0006, \r\n animType: \"move\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"2zRNjnw7Ps26h5xz","name":"22 - Smoke","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"smoke\",\r\n color: 0x00FF00,\r\n time: 0,\r\n blend: 0,\r\n dimX: 1,\r\n dimY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: -0.006, \r\n animType: \"move\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"s01RgeSRy4En1aKP","name":"23 - Mirror Images","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"images\",\r\n time: 0,\r\n padding: 60,\r\n alpha: 0.9,\r\n blend: 4,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0010, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"sbP8KX50YRYtxVyB","name":"24 - T1 - Hexa Force Field","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"IA3ofbRDpi3Rjgcy","name":"24 - T2 - Fire Shield","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 1,\r\n gridPadding: 2,\r\n color: 0xD08050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.15,\r\n lightAlpha: 2,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"SSY0fjib0PgJaKEK","name":"24 - T3 - Poisoned Smoke","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 3,\r\n gridPadding: 1,\r\n color: 0x106040,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"359Mw23cvaEDevkP","name":"24 - T4 - Earth Shell","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 4,\r\n gridPadding: 2,\r\n color: 0x755050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"LrfXNjrImAWK5Hb2","name":"24 - T5 - Mega Earth Shell (on top)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 5,\r\n gridPadding: 3,\r\n color: 0x905555,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.2,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n zIndex: 5,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"6Do4AOxfbtCG8R4j","name":"24 - T6 - Air Bubble","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 6,\r\n gridPadding: 1,\r\n color: 0x306090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.3,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"24 - T7 - Mage Armor","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 7,\r\n gridPadding: 1,\r\n color: 0x777777,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"6ZIpqLC3agLw2Vgx"} -{"name":"24 - T8 - Chromatic Bubble","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 8,\r\n gridPadding: 2,\r\n color: 0x505050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0,\r\n lightSize: 0,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: true,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0045, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"f74nx1SMT5m8RRn8"} -{"name":"24 - T9 - Water Shell","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 9,\r\n gridPadding: 1,\r\n color: 0x1090CC,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"aoqr6qPxif62zWLo"} -{"_id":"aoqr6qPxif62zWLo","name":"24 - T9 - Water Defense","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 9,\r\n gridPadding: 1,\r\n color: 0x1090CC,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"24 - T10 - Evil Aura","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 10,\r\n gridPadding: 1,\r\n color: 0x902005,\r\n time: 0,\r\n blend: 5,\r\n intensity: 1,\r\n lightAlpha: 4,\r\n lightSize: 0.8,\r\n scale: 0.5,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"4Ywsytul1no7EwKb"} -{"_id":"sbP8KX50YRYtxVyB","name":"24 - T01 - Hexa Force Field","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"FBQzhLveCvFKOvJ7","name":"10 - BulgePinch","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"bulgepinch\",\r\n padding: 150,\r\n strength: 0,\r\n zIndex: 2,\r\n radiusPercent: 200,\r\n animated:\r\n {\r\n strength: \r\n { \r\n active: true, \r\n animType: \"cosOscillation\", \r\n loopDuration: 2000, \r\n val1: 0, \r\n val2: 0.8\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"GHbWoqQWjeUjcStr","name":"24 - T13 - Simple Color","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 13,\r\n gridPadding: 2,\r\n color: 0x006030,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0,\r\n lightSize: 0,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"GvYp56Thtf3n9RYy","name":"01 - Bevel","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"bevel\",\r\n rotation: 0,\r\n thickness: 4,\r\n lightColor: 0x00FF00,\r\n lightAlpha: 0.7,\r\n shadowColor: 0xFF0000,\r\n shadowAlpha: 0.4,\r\n animated :\r\n {\r\n rotation: \r\n { \r\n active: true,\r\n clockWise: true, \r\n loopDuration: 500, \r\n animType: \"syncRotation\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"H3rF4XGEf76ZylwP","name":"14 - Remove Shadow","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// this simple filter remove pixels with a certain amount of alpha\r\n// it can be useful to remove shadows before using glow or outline filters.\r\n\r\nlet params =\r\n[{\r\n filterType: \"zapshadow\",\r\n alphaTolerance: 0.60\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"HjzhkTFUng8sxWkH","name":"D - Auto-Destroy Example","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"bevel\",\r\n autoDestroy: true,\r\n rotation: 0,\r\n thickness: 5,\r\n lightColor: 0x00FF00,\r\n lightAlpha: 0.7,\r\n shadowColor: 0xFF0000,\r\n shadowAlpha: 0.4,\r\n animated :\r\n {\r\n rotation: \r\n { \r\n active: true,\r\n clockWise: true, \r\n loopDuration: 1000,\r\n loops: 5,\r\n animType: \"rotation\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"IA3ofbRDpi3Rjgcy","name":"24 - T02 - Fire Shield","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 1,\r\n gridPadding: 2,\r\n color: 0xD08050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.15,\r\n lightAlpha: 2,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"SSY0fjib0PgJaKEK","name":"24 - T03 - Poisoned Smoke","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 3,\r\n gridPadding: 1,\r\n color: 0x106040,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"359Mw23cvaEDevkP","name":"24 - T04 - Earth Shell","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 4,\r\n gridPadding: 2,\r\n color: 0x755050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"Ia0tPcllVQq96yXF","name":"C - Electric Multi-Filters","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// works better with tokens or tiles with no shadows\r\nlet params =\r\n[{\r\n filterType: \"shadow\",\r\n blur: 2,\r\n quality: 5,\r\n distance: 0,\r\n alpha: 1.,\r\n padding: 100,\r\n color: 0xFFFFFF,\r\n animated:\r\n {\r\n blur: \r\n { \r\n active: true, \r\n loopDuration: 500, \r\n animType: \"syncCosOscillation\", \r\n val1: 2, \r\n val2: 4\r\n },\r\n }\r\n},\r\n{\r\n filterType: \"electric\",\r\n color: 0xFFFFFF,\r\n time: 0,\r\n blend: 2,\r\n intensity: 5,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0020, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"LrfXNjrImAWK5Hb2","name":"24 - T05 - Mega Earth Shell (on top)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 5,\r\n gridPadding: 3,\r\n color: 0x905555,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.2,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n zIndex: 5,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"6Do4AOxfbtCG8R4j","name":"24 - T06 - Air Bubble","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 6,\r\n gridPadding: 1,\r\n color: 0x306090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.3,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"6ZIpqLC3agLw2Vgx","name":"24 - T07 - Mage Armor","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 7,\r\n gridPadding: 1,\r\n color: 0x777777,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"f74nx1SMT5m8RRn8","name":"24 - T08 - Chromatic Bubble","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 8,\r\n gridPadding: 2,\r\n color: 0x505050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0,\r\n lightSize: 0,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: true,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0045, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"aoqr6qPxif62zWLo","name":"24 - T09 - Water Defense","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 9,\r\n gridPadding: 1,\r\n color: 0x1090CC,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"24 - T11 - Grid Defense","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 11,\r\n gridPadding: 2,\r\n color: 0x009090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.3,\r\n scale: 0.5,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"VuMHH9LMD51MNJzZ"} +{"_id":"OWgJD9lvBlDzXALz","name":"09 - Twist","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"twist\",\r\n radiusPercent: 120,\r\n angle: 0,\r\n animated:\r\n {\r\n angle: \r\n { \r\n active: true, \r\n animType: \"sinOscillation\",\r\n loopDuration: 10000, \r\n val1: -0.6*Math.PI, \r\n val2: +0.6*Math.PI\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"SSY0fjib0PgJaKEK","name":"24 - T03 - Poisoned Smoke","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 3,\r\n gridPadding: 1,\r\n color: 0x106040,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"VWTz2fKfSb6WK7Mo","name":"02 - Adjustment","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"adjustment\",\r\n saturation: 1,\r\n brightness: 1,\r\n contrast: 1,\r\n gamma: 1,\r\n red: 4,\r\n green: 0.5,\r\n blue: 0.5,\r\n alpha: 0.5,\r\n animated:\r\n {\r\n alpha: \r\n { \r\n active: true, \r\n loopDuration: 5000, \r\n animType: \"syncCosOscillation\",\r\n val1: 0.5,\r\n val2: 1 }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"VuMHH9LMD51MNJzZ","name":"24 - T11 - Grid Force Field","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 11,\r\n gridPadding: 2,\r\n color: 0x009090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.3,\r\n scale: 0.5,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"name":"24 - T12 - Warp Time Aura","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 12,\r\n gridPadding: 2,\r\n color: 0xAAAAAA,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.1,\r\n lightAlpha: 0.5,\r\n lightSize: 0.3,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"2IOkNL2J1jETUvSP"} -{"name":"24 - T13 - Neutral Color","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 13,\r\n gridPadding: 2,\r\n color: 0x006030,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0,\r\n lightSize: 0,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"GHbWoqQWjeUjcStr"} -{"_id":"GHbWoqQWjeUjcStr","name":"24 - T13 - Simple Color","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 13,\r\n gridPadding: 2,\r\n color: 0x006030,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0,\r\n lightSize: 0,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0009, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} -{"_id":"IA3ofbRDpi3Rjgcy","name":"24 - T02 - Fire Shield","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 1,\r\n gridPadding: 2,\r\n color: 0xD08050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1.15,\r\n lightAlpha: 2,\r\n lightSize: 0.7,\r\n scale: 1,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"YJjeB7N0L1rGfZD2","name":"18 - Electric","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"electric\",\r\n color: 0xFFFFFF,\r\n time: 0,\r\n blend: 1,\r\n intensity: 5,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0020, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"aoqr6qPxif62zWLo","name":"24 - T09 - Water Defense","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 9,\r\n gridPadding: 1,\r\n color: 0x1090CC,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 1,\r\n lightSize: 0.7,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"b5Enw7tEwfjDNHuY","name":"04 - Outline","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{"combat-utility-belt":{"macroTrigger":""}},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"outline\",\r\n padding: 10,\r\n color: 0x05B0B0,\r\n thickness: 1,\r\n quality: 10,\r\n animated :\r\n {\r\n thickness: \r\n { \r\n active: true,\r\n loopDuration: 1000,\r\n animType: \"syncCosOscillation\",\r\n val1: 1, \r\n val2: 8\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"cCEOQFsJvjhSTbbM","name":"06 - Bloom","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params = \r\n[{\r\n filterType: \"xbloom\",\r\n threshold: 0.35,\r\n bloomScale: 0,\r\n brightness: 1.2,\r\n blur: 0.1,\r\n padding: 10,\r\n quality: 15,\r\n blendMode: 0,\r\n animated:\r\n {\r\n bloomScale: \r\n { \r\n active: true, \r\n loopDuration: 2000, \r\n animType: \"syncCosOscillation\", \r\n val1: 0, \r\n val2: 2\r\n },\r\n threshold: \r\n { \r\n active: false, \r\n loopDuration: 2000, \r\n animType: \"syncCosOscillation\", \r\n val1: 0.05, \r\n val2: 1.9\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);\r\n","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"cOaB7NxSQ5jNDd5g","name":"27 - T01 - Burning Aura (xglow)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"zapshadow\",\r\n filterId: \"myZapShadow\",\r\n alphaTolerance: 0.50\r\n},\r\n{\r\n filterType: \"xglow\",\r\n filterId: \"myMagicGlow\",\r\n auraType: 2,\r\n color: 0x903010,\r\n thickness: 4.8,\r\n scale: 4.,\r\n time: 0,\r\n auraIntensity: 2,\r\n subAuraIntensity: 1.5,\r\n threshold: 0.40,\r\n discard: true,\r\n animated:\r\n {\r\n time : \r\n { \r\n active: true,\r\n speed: 0.0027, \r\n animType: \"move\" \r\n },\r\n thickness:\r\n {\r\n active: true,\r\n loopDuration: 3000, \r\n animType: \"cosOscillation\", \r\n val1:4.5, \r\n val2:6\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"eJnsq5g4Pldh8Z6Q","name":"B - Multi-Filters Example","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"distortion\",\r\n maskPath: \"/modules/tokenmagic/fx/assets/waves-2.png\",\r\n maskSpriteScaleX: 7,\r\n maskSpriteScaleY: 7,\r\n padding: 50,\r\n animated:\r\n {\r\n maskSpriteX: { active: true, speed: 0.05, animType: \"move\" },\r\n maskSpriteY: { active: true, speed: 0.07, animType: \"move\" }\r\n }\r\n},\r\n{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0xEF9000,\r\n alpha: 0.25,\r\n divisor: 32,\r\n anchorY: 1,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n},\r\n{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0xB03000,\r\n quality: 0.5,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0xB03000, \r\n val2:0xFFD010\r\n }\r\n }\r\n}\r\n];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"ebWbFeiJP8UZG4Fd","name":"17 - Fumes","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fumes\",\r\n color: 0x909090,\r\n time: 0,\r\n blend: 8,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.001, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"f74nx1SMT5m8RRn8","name":"24 - T08 - Chromatic Bubble","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 8,\r\n gridPadding: 2,\r\n color: 0x505050,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0,\r\n lightSize: 0,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: true,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0045, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"g7O4u4dTaWcnajW7","name":"05 - Glow","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0x003000,\r\n quality: 0.5,\r\n padding: 10,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0x003000, \r\n val2:0x00FF00\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"hayiRem3LXoEP3tL","name":"03 - Drop Shadow","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"shadow\",\r\n rotation: 35,\r\n blur: 2,\r\n quality: 5,\r\n distance: 20,\r\n alpha: 0.7,\r\n padding: 10,\r\n shadowOnly: false,\r\n color: 0x000000,\r\n animated:\r\n {\r\n blur: \r\n { \r\n active: true, \r\n loopDuration: 500, \r\n animType: \"syncCosOscillation\", \r\n val1: 2, \r\n val2: 4\r\n },\r\n rotation:\r\n {\r\n active: true,\r\n loopDuration: 100,\r\n animType: \"syncSinOscillation\",\r\n val1: 33,\r\n val2: 37\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"lH53KTce3zYEFXos","name":"08 - Old film","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"// special : the OldFilm filter need an Outline filter to be contained (or else, it will affect all the container)\r\nlet params =\r\n[{\r\n filterType: \"oldfilm\",\r\n sepia: 0.9,\r\n noise: 0.3,\r\n noiseSize: 1.0,\r\n scratch: 0.8,\r\n scratchDensity: 0.5,\r\n scratchWidth: 1.2,\r\n vignetting: 0.3,\r\n vignettingAlpha: 0.7,\r\n vignettingBlur: 0.3,\r\n animated:\r\n {\r\n seed: \r\n { \r\n active: true, \r\n animType: \"randomNumber\", \r\n val1: 0, \r\n val2: 1 \r\n },\r\n vignetting: \r\n { \r\n active: true, \r\n animType: \"syncCosOscillation\" , \r\n loopDuration: 2000, \r\n val1: 0.2, \r\n val2: 0.4 }\r\n }\r\n},\r\n{\r\n filterType: \"outline\",\r\n color: 0x000000,\r\n thickness: 0,\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"r3JzTibAUnlpgPsD","name":"13 - Shockwave","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"shockwave\",\r\n time: 0,\r\n amplitude: 8,\r\n wavelength: 75,\r\n radius: 500,\r\n brightness: 1.5,\r\n speed: 25,\r\n padding: 0,\r\n animated:\r\n {\r\n time: \r\n { \r\n animType: \"cosOscillation\",\r\n active: true, \r\n loopDuration: 1800, \r\n val1: -4, val2: +4\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} {"_id":"s01RgeSRy4En1aKP","name":"23 - Mirror Images","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"images\",\r\n time: 0,\r\n padding: 60,\r\n alpha: 0.9,\r\n blend: 4,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0010, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"sbP8KX50YRYtxVyB","name":"24 - T01 - Hexa Force Field","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"field\",\r\n shieldType: 2,\r\n gridPadding: 0,\r\n color: 0x900090,\r\n time: 0,\r\n blend: 2,\r\n intensity: 1,\r\n lightAlpha: 0.75,\r\n lightSize: 0.45,\r\n scale: 2,\r\n radius: 1,\r\n chromatic: false,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0015, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"t2MjFs4cVUCYsbMr","name":"12 - Zoom Blur","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"zoomblur\",\r\n strength: 0.3,\r\n innerRadiusPercent: 70,\r\n radiusPercent: 120,\r\n padding: 30,\r\n animated:\r\n {\r\n innerRadiusPercent: \r\n { \r\n active: true, \r\n animType: \"sinOscillation\", \r\n loopDuration: 500, \r\n val1: 65, \r\n val2: 75\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"tvDGSwbeQ97HNS8v","name":"A - Multi-Filters Example","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"fog\",\r\n color: 0x00FF50,\r\n density: 0.20,\r\n time: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 1.2, \r\n animType: \"move\" \r\n }\r\n }\r\n},\r\n{\r\n filterType: \"ray\",\r\n time: 0,\r\n color: 0x00DE50,\r\n alpha: 0.25,\r\n divisor: 32,\r\n anchorY: 0,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0005, \r\n animType: \"move\" \r\n }\r\n }\r\n},\r\n{\r\n filterType: \"glow\",\r\n distance: 10,\r\n outerStrength: 8,\r\n innerStrength: 0,\r\n color: 0x003000,\r\n quality: 0.5,\r\n padding: 10,\r\n animated:\r\n {\r\n color: \r\n {\r\n active: true, \r\n loopDuration: 3000, \r\n animType: \"colorOscillation\", \r\n val1:0x003000, \r\n val2:0x00EF00\r\n }\r\n }\r\n}\r\n];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"_id":"wdbgHdNcBwBETc1y","name":"27 - T02 - Glacial Aura (xglow)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"zapshadow\",\r\n filterId: \"myZapShadow\",\r\n alphaTolerance: 0.50\r\n},\r\n{\r\n filterType: \"xglow\",\r\n filterId: \"myMagicGlow\",\r\n auraType: 1,\r\n color: 0x70BBFF,\r\n thickness: 3.3,\r\n scale: 0.25,\r\n time: 0,\r\n auraIntensity: 1,\r\n subAuraIntensity: 0.25,\r\n threshold: 0.25,\r\n discard: false,\r\n animated:\r\n {\r\n time : \r\n { \r\n active: true,\r\n speed: 0.0006, \r\n animType: \"move\" \r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} +{"name":"27 - T03 - Ugly villains Aura (xglow)","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"zapshadow\",\r\n filterId: \"myZapShadow\",\r\n alphaTolerance: 0.50\r\n},\r\n{\r\n filterType: \"xglow\",\r\n filterId: \"myMagicGlow\",\r\n auraType: 2,\r\n color: 0x050505,\r\n thickness: 2.7,\r\n scale: 7,\r\n time: 0,\r\n auraIntensity: 5,\r\n subAuraIntensity: 2,\r\n threshold: 0.08,\r\n discard: false,\r\n animated:\r\n {\r\n time : \r\n { \r\n active: true,\r\n speed: 0.0012, \r\n animType: \"move\" \r\n },\r\n auraIntensity:\r\n {\r\n active: true,\r\n loopDuration: 3000, \r\n animType: \"syncCosOscillation\", \r\n val1:5, \r\n val2:0\r\n },\r\n subAuraIntensity:\r\n {\r\n active: true,\r\n loopDuration: 3000, \r\n animType: \"syncCosOscillation\", \r\n val1:2, \r\n val2:0\r\n },\r\n color:\r\n {\r\n active: true,\r\n loopDuration: 6000, \r\n animType: \"syncColorOscillation\", \r\n val1:0x050505, \r\n val2:0x200000\r\n },\r\n threshold:\r\n {\r\n active: true,\r\n loopDuration: 1500, \r\n animType: \"syncCosOscillation\", \r\n val1:0.02, \r\n val2:0.50\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[],"_id":"ydY1XOCO4yIhunkj"} +{"_id":"zCCp4x0EResFji7O","name":"21 - Flood","permission":{"default":0,"Njc5YzFjZDI5NjZl":3},"type":"script","flags":{},"scope":"global","command":"let params =\r\n[{\r\n filterType: \"flood\",\r\n time: 0,\r\n color: 0x0020BB,\r\n billowy: 0.43,\r\n tintIntensity: 0.72,\r\n glint: 0.31,\r\n scale: 70,\r\n padding: 10,\r\n animated :\r\n {\r\n time : \r\n { \r\n active: true, \r\n speed: 0.0006, \r\n animType: \"move\"\r\n }\r\n }\r\n}];\r\n\r\nTokenMagic.addFiltersOnSelected(params);","author":"Njc5YzFjZDI5NjZl","img":"icons/svg/dice-target.svg","actorIds":[]} diff --git a/tokenmagic/updates/UPDATE-0.2.0.md b/tokenmagic/updates/UPDATE-0.2.0.md new file mode 100644 index 0000000..cc8f897 --- /dev/null +++ b/tokenmagic/updates/UPDATE-0.2.0.md @@ -0,0 +1,96 @@ +# Token Magic FX - Update v0.2.0-alpha + +*Added :* +- A copy of a token also copies the FX +- FX are now stored on prototype tokens (if you update your prototype with a FXified Token) +- An option panel is now available : + - You can desactivate additive padding in favor of max padding + - You can set a minimum padding for all applied FX + +*New FX :* +- An advanced Ray filter (with better quality than cosmic ray filter) + - blending options +- Another liquid filter (complementary with the flood filter) + - blending options + - spectral property +- A gleaming glow filter + - two glow types + - adjustable FX scale + - adjustable thickness + - and lot more options to create magical glows. + +The new filters have been added to the TokenMagic macro compendium. + +*Fixed issues :* +- autoDestroy property did not work properly (the effect was restored when reloading the scene) +- Freezing when updating image, dimensions or tint of a token. +- Freezing when updating image of a tile. +- An effect without animated properties could not be updated normally. +- The global animated property could not be unset (can be unset now with `animated: null`) + +## Filters handling + +*Added new functions :* + +To verify if a placeable has a filter with the specified `filterType` : +```javascript +TokenMagic.hasFilterType(,) + +// Example +... +if (TokenMagic.hasFilterType(myToken,"glow")) { + console.log("myToken has a glow filter."); +} +... +``` +To verify if a placeable has a filter with the specified `filterId` : +```javascript +TokenMagic.hasFilterId(,) + +// Example +... +if (TokenMagic.hasFilterId(myToken,"mySuperShadow_01")) { + console.log("myToken has my customized super shadow 1 filter."); +} +... +``` +Add or update filter(s) on a placeable. If a filter applied on an object has a filterType and a filterId identical to those found in the parameters, the values are updated with the new ones. Otherwise a new filter is created. +```javascript +(async) TokenMagic.addUpdateFilters(, ) +``` + +## PlaceableObject TMFX prototypes + +*Added new prototype functions in class PlaceableObject (Token, Tile, etc.), to facilitate coding :* + +```javascript +(async) .TMFXaddFilters() +(async) .TMFXupdateFilters() +(async) .TMFXaddUpdateFilters() +(async) .TMFXdeleteFilters(optional ) +.TMFXhasFilterType() +.TMFXhasFilterId() + +// Example 1 +let glowFunc = async function() { + + const tokens = canvas.tokens.placeables; + + for (const token of tokens){ + if (token.TMFXhasFilterId("funnyAlternateGlow")) { + await token.TMFXdeleteFilters("funnyAlternateGlow"); + } else { + let params = + [{ + filterType: "glow", + filterId: "funnyAlternateGlow", + color: Math.floor(Math.random() * 16777215), + animated: null + }]; + await token.TMFXaddUpdateFilters(params); + } + } +}; + +glowFunc(); +``` \ No newline at end of file