28 lines
4.1 KiB
JSON
28 lines
4.1 KiB
JSON
{
|
|
"name": "Set Token Vision",
|
|
"type": "script",
|
|
"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()",
|
|
"folder": null,
|
|
"ownership": {
|
|
"default": 0,
|
|
"sVoCvBU1knmXzoYe": 3
|
|
},
|
|
"flags": {
|
|
"core": {}
|
|
},
|
|
"_stats": {
|
|
"systemId": "swade",
|
|
"systemVersion": "3.2.5",
|
|
"coreVersion": "11.315",
|
|
"createdTime": 1702934878750,
|
|
"modifiedTime": 1702959790712,
|
|
"lastModifiedBy": "sVoCvBU1knmXzoYe"
|
|
},
|
|
"_id": "arjbjmgKMjyp9tWE",
|
|
"sort": 100000,
|
|
"_key": "!macros!arjbjmgKMjyp9tWE"
|
|
}
|