From b8936ab53fac4424e1ce08caccdfc68244cdc370 Mon Sep 17 00:00:00 2001 From: Mike Bloy Date: Mon, 29 Jan 2024 23:42:49 -0600 Subject: [PATCH] change setTokenVision macro to detect blindsense --- macros/setTokenVision.js | 12 ++++++++++-- .../_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json | 6 +++--- .../Setting_Adjustments_YSuk1v59tLaL9XUK.json | 10 +++++----- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/macros/setTokenVision.js b/macros/setTokenVision.js index 9d85961..ff5506a 100644 --- a/macros/setTokenVision.js +++ b/macros/setTokenVision.js @@ -31,18 +31,26 @@ const RANGES = { dim: 200, dark: 200, pitchdark: 200 + }, + blindsense: { + bright: 5, + dim: 5, + dark: 5, + pitchdark: 5 } } const SIGHT_NAMES = { lowlight: 'low-light-vision', darkvision: 'darkvision', - nightvision: 'night-vision' + nightvision: 'night-vision', + blindsense: 'blindsense' } const SIGHT_MODES = { lowlight: 'lowlight', darkvision: 'darkvision', nightvision: 'darkvision', - basic: 'basic' + basic: 'basic', + blindsense: 'blindsense' } function findAbility (token, swid) { diff --git a/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json b/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json index 50abb5d..66f084d 100644 --- a/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json +++ b/packs/helper-macros/_source/Set_Token_Vision_arjbjmgKMjyp9tWE.json @@ -4,7 +4,7 @@ "author": "sVoCvBU1knmXzoYe", "img": "icons/magic/perception/orb-crystal-ball-scrying-blue.webp", "scope": "global", - "command": "const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null\n// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values\n// will guess based on scene darkness\nconst BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark']\nconst THRESHOLDS = {\n dim: 0.4,\n dark: 0.6,\n pitchdark: 0.8\n}\nconst RANGES = {\n basic: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0\n },\n lowlight: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0\n },\n darkvision: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 10\n },\n nightvision: {\n bright: 200,\n dim: 200,\n dark: 200,\n pitchdark: 200\n }\n}\nconst SIGHT_NAMES = {\n lowlight: 'low-light-vision',\n darkvision: 'darkvision',\n nightvision: 'night-vision'\n}\nconst SIGHT_MODES = {\n lowlight: 'lowlight',\n darkvision: 'darkvision',\n nightvision: 'darkvision',\n basic: 'basic'\n}\n\nfunction findAbility (token, swid) {\n return token.actor.items.find(i => i.type === 'ability' && i.system.swid === swid)\n}\n\nasync function main () {\n const scene = game.scenes.current\n let sceneBright = BRIGHT_LEVELS[0]\n if (scene.darkness > THRESHOLDS.pitchdark) {\n sceneBright = BRIGHT_LEVELS[3]\n } else if (scene.darkness > THRESHOLDS.dark) {\n sceneBright = BRIGHT_LEVELS[2]\n } else if (scene.darkness > THRESHOLDS.dim) {\n sceneBright = BRIGHT_LEVELS[1]\n }\n let bright = sceneBright\n if (argBright && BRIGHT_LEVELS.includes(argBright)) {\n bright = argBright\n }\n const menuData = {\n inputs: [\n { type: 'radio', label: 'Bright Light', options: ['bright', bright === BRIGHT_LEVELS[0]] },\n { type: 'radio', label: 'Dim Light', options: ['bright', bright === BRIGHT_LEVELS[1]] },\n { type: 'radio', label: 'Dark', options: ['bright', bright === BRIGHT_LEVELS[2]] },\n { type: 'radio', label: 'Pitch Dark', options: ['bright', bright === BRIGHT_LEVELS[3]] }\n ],\n buttons: [\n { label: 'Select Scene Brightness', value: 'ok', default: true },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const menuConfig = { title: 'Select scene brightness' }\n const result = await warpgate.menu(menuData, menuConfig)\n if (result.buttons !== 'ok') { return }\n\n for (let i = 0; i < 4; i++) {\n if (result.inputs[i]) { bright = BRIGHT_LEVELS[i] }\n }\n console.log(`Scene brightness is ${bright}`)\n\n for (const tokenId of scene.tokens.map(t => t.id)) {\n const token = scene.tokens.get(tokenId)\n if (!token.sight.enabled) {\n console.log(`Skipping ${token.name}, vision not enabled`)\n continue\n // don't set sight on a token where it's not enabled\n }\n let sightType = 'basic'\n for (const sight in SIGHT_NAMES) {\n console.log(`checking ${token} for ${SIGHT_NAMES[sight]}`)\n if (findAbility(token, SIGHT_NAMES[sight])) {\n sightType = sight\n console.log(`${token.name} has ${sightType}`)\n }\n }\n const range = RANGES[sightType][bright]\n const sightMode = SIGHT_MODES[sightType]\n const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults\n const data = {\n 'sight.range': range,\n 'sight.visionMode': sightMode,\n 'sight.attenuation': visionModeData.attenuation,\n 'sight.brightness': visionModeData.brightness,\n 'sight.saturation': visionModeData.saturation,\n 'sight.contrast': visionModeData.contrast\n }\nconsole.log(`Updating ${token.name}:`, data)\n await token.update(data)\n }\n}\n\nmain()", + "command": "const argBright = typeof args === 'undefined' ? null : args.length > 0 ? args[0] : null\n// argument can be one of 'bright', 'dim', 'dark', 'pitchdark'. Other values\n// will guess based on scene darkness\nconst BRIGHT_LEVELS = ['bright', 'dim', 'dark', 'pitchdark']\nconst THRESHOLDS = {\n dim: 0.4,\n dark: 0.6,\n pitchdark: 0.8\n}\nconst RANGES = {\n basic: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0\n },\n lowlight: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 0\n },\n darkvision: {\n bright: 25,\n dim: 25,\n dark: 10,\n pitchdark: 10\n },\n nightvision: {\n bright: 200,\n dim: 200,\n dark: 200,\n pitchdark: 200\n },\n blindsense: {\n bright: 5,\n dim: 5,\n dark: 5,\n pitchdark: 5\n }\n}\nconst SIGHT_NAMES = {\n lowlight: 'low-light-vision',\n darkvision: 'darkvision',\n nightvision: 'night-vision',\n blindsense: 'blindsense'\n}\nconst SIGHT_MODES = {\n lowlight: 'lowlight',\n darkvision: 'darkvision',\n nightvision: 'darkvision',\n basic: 'basic',\n blindsense: 'blindsense'\n}\n\nfunction findAbility (token, swid) {\n return token.actor.items.find(i => i.type === 'ability' && i.system.swid === swid)\n}\n\nasync function main () {\n const scene = game.scenes.current\n let sceneBright = BRIGHT_LEVELS[0]\n if (scene.darkness > THRESHOLDS.pitchdark) {\n sceneBright = BRIGHT_LEVELS[3]\n } else if (scene.darkness > THRESHOLDS.dark) {\n sceneBright = BRIGHT_LEVELS[2]\n } else if (scene.darkness > THRESHOLDS.dim) {\n sceneBright = BRIGHT_LEVELS[1]\n }\n let bright = sceneBright\n if (argBright && BRIGHT_LEVELS.includes(argBright)) {\n bright = argBright\n }\n const menuData = {\n inputs: [\n { type: 'radio', label: 'Bright Light', options: ['bright', bright === BRIGHT_LEVELS[0]] },\n { type: 'radio', label: 'Dim Light', options: ['bright', bright === BRIGHT_LEVELS[1]] },\n { type: 'radio', label: 'Dark', options: ['bright', bright === BRIGHT_LEVELS[2]] },\n { type: 'radio', label: 'Pitch Dark', options: ['bright', bright === BRIGHT_LEVELS[3]] }\n ],\n buttons: [\n { label: 'Select Scene Brightness', value: 'ok', default: true },\n { label: 'Cancel', value: 'cancel' }\n ]\n }\n const menuConfig = { title: 'Select scene brightness' }\n const result = await warpgate.menu(menuData, menuConfig)\n if (result.buttons !== 'ok') { return }\n\n for (let i = 0; i < 4; i++) {\n if (result.inputs[i]) { bright = BRIGHT_LEVELS[i] }\n }\n console.log(`Scene brightness is ${bright}`)\n\n for (const tokenId of scene.tokens.map(t => t.id)) {\n const token = scene.tokens.get(tokenId)\n if (!token.sight.enabled) {\n console.log(`Skipping ${token.name}, vision not enabled`)\n continue\n // don't set sight on a token where it's not enabled\n }\n let sightType = 'basic'\n for (const sight in SIGHT_NAMES) {\n console.log(`checking ${token} for ${SIGHT_NAMES[sight]}`)\n if (findAbility(token, SIGHT_NAMES[sight])) {\n sightType = sight\n console.log(`${token.name} has ${sightType}`)\n }\n }\n const range = RANGES[sightType][bright]\n const sightMode = SIGHT_MODES[sightType]\n const visionModeData = CONFIG.Canvas.visionModes[sightMode].vision.defaults\n const data = {\n 'sight.range': range,\n 'sight.visionMode': sightMode,\n 'sight.attenuation': visionModeData.attenuation,\n 'sight.brightness': visionModeData.brightness,\n 'sight.saturation': visionModeData.saturation,\n 'sight.contrast': visionModeData.contrast\n }\nconsole.log(`Updating ${token.name}:`, data)\n await token.update(data)\n }\n}\n\nmain()", "folder": null, "ownership": { "default": 0, @@ -18,8 +18,8 @@ "systemVersion": "3.2.5", "coreVersion": "11.315", "createdTime": 1702934878750, - "modifiedTime": 1702959790712, - "lastModifiedBy": "sVoCvBU1knmXzoYe" + "modifiedTime": 1706592965168, + "lastModifiedBy": "Aqnn9hCDQPbyTWiq" }, "_id": "arjbjmgKMjyp9tWE", "sort": 100000, diff --git a/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json b/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json index 90ece84..aa8dfac 100644 --- a/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json +++ b/packs/module-docs/_source/Setting_Adjustments_YSuk1v59tLaL9XUK.json @@ -13,7 +13,7 @@ "image": {}, "text": { "format": 1, - "content": "

SWADE MB Helpers does some modification of the vision modes to make them more in line with SWADE's lighting methods:

  1. Basic sight is desaturated and not artificially brightened, but things look normal in lighting (or global illumination.

  2. Low Light Vision is a new lighting mode that is slightly desaturated and artificially brightens the canvas some, but not as much as dim light.

  3. Darkvision is normal saturation level and just slightly less bright than bright light. In addition, Darkvision treats dim light as bright light.

" + "content": "

SWADE MB Helpers does some modification of the vision modes to make them more in line with SWADE's lighting methods:

  1. Basic sight is desaturated and not artificially brightened, but things look normal in lighting (or global illumination.

  2. Low Light Vision is a new lighting mode that is slightly desaturated and artificially brightens the canvas some, but not as much as dim light.

  3. Darkvision is normal saturation level and just slightly less bright than bright light. In addition, Darkvision treats dim light as bright light.

  4. Blindsense is a new lighting mode that is completely desaturated and ignores canvas illumination and light sources, leaving only the character's vision radius.

" }, "video": { "controls": true, @@ -31,8 +31,8 @@ "systemVersion": "3.2.5", "coreVersion": "11.315", "createdTime": 1702880436985, - "modifiedTime": 1702880706703, - "lastModifiedBy": "sVoCvBU1knmXzoYe" + "modifiedTime": 1706593246943, + "lastModifiedBy": "Aqnn9hCDQPbyTWiq" }, "_key": "!journal.pages!YSuk1v59tLaL9XUK.BlDoYgdTxhyCBP3Y" }, @@ -85,8 +85,8 @@ "systemVersion": "3.2.5", "coreVersion": "11.315", "createdTime": 1695618001902, - "modifiedTime": 1703379713144, - "lastModifiedBy": "sVoCvBU1knmXzoYe" + "modifiedTime": 1706593246943, + "lastModifiedBy": "Aqnn9hCDQPbyTWiq" }, "_id": "YSuk1v59tLaL9XUK", "sort": 0,