This commit is contained in:
CDeenen
2021-12-20 03:41:38 +01:00
parent 4566b8ef53
commit dce419d7c3
14 changed files with 325 additions and 159 deletions

View File

@@ -111,38 +111,20 @@ export class ExternalModules{
let name = '';
if (type == 'weatherControls') {
const effect = (settings.weatherEffect == undefined) ? 'leaves' : settings.weatherEffect;
name = CONFIG.weatherEffects[effect].label;
icon = CONFIG.weatherEffects[effect].icon;
ring = this.findWeatherEffect(effect) != undefined ? 2 : 1;
name = CONFIG.fxmaster.weather[effect].label;
icon = CONFIG.fxmaster.weather[effect].icon;
ring = canvas.scene.getFlag("fxmaster", "effects")?.[`core_${effect}`] ? 2 : 1;
ringColor = ring < 2 ? '#000000' : "#00ff00";
}
else if (type == 'colorize') {
background = (settings.fxMasterColorizeColor == undefined) ? '#000000' : settings.fxMasterColorizeColor;
icon = "fas fa-palette";
name = game.i18n.localize("MaterialDeck.FxMaster.Colorize");
const filters = canvas.scene.getFlag("fxmaster", "filters");
ring = 2;
if (filters == undefined || filters['core_color'] == undefined) {
ringColor = "#000000";
}
else {
const colors = filters['core_color'].options;
let red = Math.ceil(colors.red*255).toString(16);
if (red.length == 1) red = '0' + red;
let green = Math.ceil(colors.green*255).toString(16);
if (green.length == 1) green = '0' + green;
let blue = Math.ceil(colors.blue*255).toString(16);
if (blue.length == 1) blue = '0' + blue;
ringColor = "#" + red + green + blue;
}
}
else if (type == 'filters') {
const filter = (settings.fxMasterFilter == undefined) ? 'underwater' : settings.fxMasterFilter;
name = CONFIG.fxmaster.filters[filter].label;
background = "#340057";
if (displayIcon){
if (filter == 'underwater') icon = "fas fa-water";
if (filter == 'lightning') icon = "fas fa-bolt";
else if (filter == 'underwater') icon = "fas fa-water";
else if (filter == 'predator') icon = "fas fa-wave-square";
else if (filter == 'color') icon = "fas fa-palette";
else if (filter == 'oldfilm') icon = "fas fa-film";
else if (filter == 'bloom') icon = "fas fa-ghost";
}
@@ -158,6 +140,7 @@ export class ExternalModules{
}
}
}
if (filter == 'color') background = settings.fxMasterFilterColor ? settings.fxMasterFilterColor : '#ffffff';
}
else if (type == 'clear'){
icon = "fas fa-trash";
@@ -170,15 +153,6 @@ export class ExternalModules{
streamDeck.setTitle(name,context);
}
hexToRgb(hex) {
var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
return result ? {
red: parseInt(result[1], 16)/256,
green: parseInt(result[2], 16)/256,
blue: parseInt(result[3], 16)/256
} : null;
}
keyPressFxMaster(settings,context,device){
if (game.user.isGM == false) return;
const fxmaster = game.modules.get("fxmaster");
@@ -188,91 +162,63 @@ export class ExternalModules{
if (type == 'weatherControls') {
const effect = (settings.weatherEffect == undefined) ? 'leaves' : settings.weatherEffect;
let exists = false;
let newEffects = {};
let effects = canvas.scene.getFlag("fxmaster", "effects");
if (effects != undefined){
const weatherIds = Object.keys(effects);
for (let i=0; i<weatherIds.length; i++){
const weather = effects[weatherIds[i]].type;
if (weather === effect) {
exists = true;
continue;
}
newEffects[weatherIds[i]] = effects[weatherIds[i]];
}
const options = {
density: (settings.densitySlider == undefined) ? 0.25 : settings.densitySlider,
speed: (settings.speedSlider == undefined) ? 1 : settings.speedSlider,
direction: (settings.directionSlider == undefined) ? 15 : settings.directionSlider,
scale: (settings.scaleSlider == undefined) ? 1 : settings.scaleSlider,
color: (settings.fxMasterWeatherColor == undefined) ? "#000000" : settings.fxMasterWeatherColor,
applyColor: (settings.fxWeatherEnColor == undefined) ? false : settings.fxWeatherEnColor
}
const density = (settings.densitySlider == undefined) ? 50 : settings.densitySlider;
const speed = (settings.speedSlider == undefined) ? 50 : settings.speedSlider;
const direction = (settings.directionSlider == undefined) ? 50 : settings.directionSlider;
const scale = (settings.scaleSlider == undefined) ? 50 : settings.scaleSlider;
const color = (settings.fxMasterWeatherColor == undefined) ? "#000000" : settings.fxMasterWeatherColor;
const applyColor = (settings.fxWeatherEnColor == undefined) ? false : settings.fxWeatherEnColor;
if (exists == false) {
newEffects[randomID()] = {
type: effect,
options: {
density: density,
speed: speed,
scale: scale,
tint: color,
direction: direction,
apply_tint: applyColor
}
};
}
canvas.scene.unsetFlag("fxmaster", "effects").then(() => {
canvas.scene.setFlag("fxmaster", "effects", newEffects);
});
}
else if (type == 'colorize') {
const color = (settings.fxMasterColorizeColor == undefined) ? '#000000' : settings.fxMasterColorizeColor;
const filters = canvas.scene.getFlag("fxmaster", "filters");
let newFilters = {};
if (filters != undefined){
const filterObjects = Object.keys(filters);
for (let i=0; i<filterObjects.length; i++){
if (filterObjects[i] == 'core_color'){
//continue;
}
newFilters[filterObjects[i]] = filters[filterObjects[i]];
}
}
newFilters['core_color'] = {
type : 'color',
options: this.hexToRgb(color)
};
canvas.scene.unsetFlag("fxmaster", "filters").then(() => {
canvas.scene.setFlag("fxmaster", "filters", newFilters);
});
Hooks.call("fxmaster.switchWeather", {
name: `core_${effect}`,
type: effect,
options,
});
}
else if (type == 'filters') {
const filter = (settings.fxMasterFilter == undefined) ? 'underwater' : settings.fxMasterFilter;
const filters = canvas.scene.getFlag("fxmaster", "filters");
let newFilters = {};
let exists = false;
if (filters != undefined){
const filterObjects = Object.keys(filters);
for (let i=0; i<filterObjects.length; i++){
if (filterObjects[i] == 'core_'+filter){
exists = true;
continue;
}
newFilters[filterObjects[i]] = filters[filterObjects[i]];
let options = {color: {value:"#000000", apply:false}};
if (filter == 'lightning') {
options.period = settings.fxMasterFilterPeriod ? parseFloat(settings.fxMasterFilterPeriod) : 500;
options.duration = settings.fxMasterFilterDuration ? parseFloat(settings.fxMasterFilterDuration) : 300;
options.brightness = settings.fxMasterFilterBrightness ? parseFloat(settings.fxMasterFilterBrightness) : 1.3;
}
else if (filter == 'underwater') {
options.speed = settings.fxMasterFilterSpeed ? parseFloat(settings.fxMasterFilterSpeed) : 0.3;
options.scale = settings.fxMasterFilterScale ? parseFloat(settings.fxMasterFilterScale) : 4;
}
else if (filter == 'predator') {
options.noise = settings.fxMasterFilterNoise ? parseFloat(settings.fxMasterFilterNoise) : 4;
options.speed = settings.fxMasterFilterSpeed ? parseFloat(settings.fxMasterFilterSpeed)*0.1 : 0.03;
}
else if (filter == 'bloom') {
options.blur = settings.fxMasterFilterBlur ? parseFloat(settings.fxMasterFilterBlur) : 1;
options.bloom = settings.fxMasterFilterBloom ? parseFloat(settings.fxMasterFilterBloom) : 0.1;
options.threshold = settings.fxMasterFilterThreshold ? parseFloat(settings.fxMasterFilterThreshold) : 0.5;
}
else if (filter == 'oldfilm') {
options.sepia = settings.fxMasterFilterSepia ? parseFloat(settings.fxMasterFilterSepia) : 0.3;
options.noise = settings.fxMasterFilterNoise ? parseFloat(settings.fxMasterFilterNoise) : 4;
}
if (filter == 'color') {
options.color = {
apply: settings.fxMasterFilterTint ? settings.fxMasterFilterTint : false,
value: settings.fxMasterFilterColor ? settings.fxMasterFilterColor : '#ffffff'
}
options.saturation = settings.fxMasterFilterSaturation ? parseFloat(settings.fxMasterFilterSaturation) : 1;
options.contrast = settings.fxMasterFilterContrast ? parseFloat(settings.fxMasterFilterContrast) : 1;
options.brightness = settings.fxMasterFilterBrightness ? parseFloat(settings.fxMasterFilterBrightness) : 1;
options.Gamma = settings.fxMasterFilterGamma ? parseFloat(settings.fxMasterFilterGamma) : 1;
}
if (exists == false) {
newFilters['core_'+filter] = {type : filter};
}
canvas.scene.unsetFlag("fxmaster", "filters").then(() => {
canvas.scene.setFlag("fxmaster", "filters", newFilters);
});
FXMASTER.filters.switch(`core_${filter}`, filter, options);
}
else if (type == 'clear'){
canvas.scene.unsetFlag("fxmaster", "filters");
@@ -280,18 +226,6 @@ export class ExternalModules{
}
}
findWeatherEffect(effect){
const effects = canvas.scene.getFlag("fxmaster", "effects");
if (effects == undefined) return undefined;
const weatherIds = Object.keys(effects);
for (let i = 0; i < weatherIds.length; ++i) {
const weather = effects[weatherIds[i]].type;
if (weather === effect) return weatherIds[i];
}
return undefined;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//GM Screen
//////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -1,15 +1,17 @@
import {sdVersion, msVersion, moduleName, getPermission, enableModule} from "../MaterialDeck.js";
import {sdVersion, msVersion, moduleName, getPermission, enableModule, streamDeck} from "../MaterialDeck.js";
import {macroControl,soundboard,playlistControl} from "../MaterialDeck.js";
export function compatibleCore(compatibleVersion){
let coreVersion = game.data.version;
let coreVersion = game.version == undefined ? game.data.version : `0.${game.version}`;
coreVersion = coreVersion.split(".");
compatibleVersion = compatibleVersion.split(".");
if (compatibleVersion[0] > coreVersion[0]) return false;
if (compatibleVersion[0] < coreVersion[0]) return true;
if (compatibleVersion[1] > coreVersion[1]) return false;
if (compatibleVersion[1] < coreVersion[1]) return true;
if (compatibleVersion[2] > coreVersion[2]) return false;
return true;
}
}
export class playlistConfigForm extends FormApplication {
constructor(data, options) {
@@ -1185,4 +1187,88 @@ export class downloadUtility extends FormApplication {
document.getElementById(elementId).innerHTML = 'Error';
}
}
}
export class deviceConfig extends FormApplication {
constructor(data, options) {
super(data, options);
this.devices = [];
}
/**
* Default Options for this FormApplication
*/
static get defaultOptions() {
return mergeObject(super.defaultOptions, {
id: "MD_DeviceConfig",
title: "Material Deck: " + game.i18n.localize("MaterialDeck.DeviceConfig.Title"),
template: "./modules/MaterialDeck/templates/deviceConfig.html",
width: 500,
height: "auto"
});
}
/**
* Provide data to the template
*/
getData() {
this.devices = [];
const dConfig = game.settings.get(moduleName, 'devices');
for (let d of streamDeck.buttonContext) {
let type;
if (d.type == 0) type = 'Stream Deck';
else if (d.type == 1) type = 'Stream Deck Mini';
else if (d.type == 2) type = 'Stream Deck XL';
else if (d.type == 3) type = 'Stream Deck Mobile';
else if (d.type == 4) type = 'Corsair G Keys';
const name = d.name;
const id = d.device;
let enable;
if (dConfig?.[id] == undefined) enable = true;
else enable = dConfig?.[id].enable;
const device = {
id,
name,
type,
en: enable
}
this.devices.push(device);
}
return {
devices: this.devices
}
}
/**
* Update on form submit
* @param {*} event
* @param {*} formData
*/
async _updateObject(event, formData) {
}
activateListeners(html) {
super.activateListeners(html);
html.find("input[name='enable']").on('change', (event) => {
const id = event.currentTarget.id;
for (let d of this.devices) {
if (d.id == id) {
let dConfig = game.settings.get(moduleName, 'devices');
delete dConfig[id];
dConfig[id] = {enable: event.currentTarget.checked}
game.settings.set(moduleName, 'devices', dConfig);
}
}
})
}
}

View File

@@ -7,6 +7,8 @@ export class OtherControls{
this.active = false;
this.rollData = {};
this.rollOption = 'dialog';
this.controlsOffset = 0;
this.toolsOffset = 0;
}
setRollOption(option) {
@@ -225,7 +227,9 @@ export class OtherControls{
const control = settings.control ? settings.control : 'dispControls';
const tool = settings.tool ? settings.tool : 'open';
let background = settings.background ? settings.background : '#000000';
let ringColor = '#000000'
let ringColor = '#000000';
const ringOffColor = settings.offRing ? settings.offRing : '#000000';
const ringOnColor = settings.onRing ? settings.onRing : '#00FF00';
let txt = "";
let src = "";
const activeControl = ui.controls.activeControl;
@@ -235,6 +239,7 @@ export class OtherControls{
let controlNr = parseInt(settings.controlNr);
if (isNaN(controlNr)) controlNr = 1;
controlNr--;
controlNr += this.controlsOffset;
const selectedControl = ui.controls.controls[controlNr];
@@ -255,6 +260,7 @@ export class OtherControls{
let controlNr = parseInt(settings.controlNr);
if (isNaN(controlNr)) controlNr = 1;
controlNr--;
controlNr += this.toolsOffset;
const selectedControl = ui.controls.controls.find(c => c.name == ui.controls.activeControl);
if (selectedControl != undefined){
@@ -275,6 +281,18 @@ export class OtherControls{
}
}
}
else if (control == 'controlsOffset') {
const display = settings.controlsOffsetDisplay ? settings.controlsOffsetDisplay : false;
const offsetType = settings.controlsOffsetType ? settings.controlsOffsetType : 'absoluteOffset';
if (display) txt = `${this.controlsOffset}`;
if (offsetType == 'absoluteOffset') ringColor = (this.controlsOffset == settings.controlsOffset) ? ringOnColor : ringOffColor;
}
else if (control == 'toolsOffset') {
const display = settings.controlsOffsetDisplay ? settings.controlsOffsetDisplay : false;
const offsetType = settings.controlsOffsetType ? settings.controlsOffsetType : 'absoluteOffset';
if (display) txt = `${this.toolsOffset}`;
if (offsetType == 'absoluteOffset') ringColor = (this.toolsOffset == settings.controlsOffset) ? ringOnColor : ringOffColor;
}
else { // specific control/tool
const selectedControl = ui.controls.controls.find(c => c.name == control);
if (selectedControl != undefined){
@@ -370,6 +388,16 @@ export class OtherControls{
}
}
}
else if (control == 'controlsOffset') {
const offsetType = settings.controlsOffsetType ? settings.controlsOffsetType : 'absoluteOffset';
if (offsetType == 'absoluteOffset') this.controlsOffset = parseInt(settings.controlsOffset);
else if (offsetType == 'relativeOffset') this.controlsOffset += parseInt(settings.controlsOffset);
}
else if (control == 'toolsOffset') {
const offsetType = settings.controlsOffsetType ? settings.controlsOffsetType : 'absoluteOffset';
if (offsetType == 'absoluteOffset') this.toolsOffset = parseInt(settings.controlsOffset);
else if (offsetType == 'relativeOffset') this.toolsOffset += parseInt(settings.controlsOffset);
}
else { //select control
const selectedControl = ui.controls.controls.find(c => c.name == control);
if (selectedControl != undefined){
@@ -588,6 +616,7 @@ export class OtherControls{
else if (nr == 'items') name = game.i18n.localize("SIDEBAR.TabItems");
else if (nr == 'journal') name = game.i18n.localize("SIDEBAR.TabJournal");
else if (nr == 'tables') name = game.i18n.localize("SIDEBAR.TabTables");
else if (nr == 'cards') name = game.i18n.localize("SIDEBAR.TabCards");
else if (nr == 'playlists') name = game.i18n.localize("SIDEBAR.TabPlaylists");
else if (nr == 'compendium') name = game.i18n.localize("SIDEBAR.TabCompendium");
else if (nr == 'settings') name = game.i18n.localize("SIDEBAR.TabSettings");
@@ -600,10 +629,11 @@ export class OtherControls{
if (nr == 'chat') icon = window.CONFIG.ChatMessage.sidebarIcon;
else if (nr == 'combat') icon = window.CONFIG.Combat.sidebarIcon;
else if (nr == 'scenes') icon = window.CONFIG.Scene.sidebarIcon;
else if (nr == 'actors') icon = window.CONFIG.Actor.sidebarIcon;
else if (nr == 'actors') icon = "fas fa-users";
else if (nr == 'items') icon = window.CONFIG.Item.sidebarIcon;
else if (nr == 'journal') icon = window.CONFIG.JournalEntry.sidebarIcon;
else if (nr == 'tables') icon = window.CONFIG.RollTable.sidebarIcon;
else if (nr == 'cards') icon = "fas fa-id-badge";
else if (nr == 'playlists') icon = window.CONFIG.Playlist.sidebarIcon;
else if (nr == 'compendium') icon = "fas fa-atlas";
else if (nr == 'settings') icon = "fas fa-cogs";

View File

@@ -229,6 +229,12 @@ export class PlaylistControl{
}
}
}
else if (playlistType == 'playNext') {
this.getPlaylist(playlistNr).playNext();
}
else if (playlistType == 'playPrev') {
this.getPlaylist(playlistNr).playNext(null,{direction:-1});
}
else if (playlistType == 'offset'){
if (playlistMode == 'playlist') {
this.playlistOffset = parseInt(settings.offset);

View File

@@ -1,5 +1,5 @@
import * as MODULE from "../MaterialDeck.js";
import { playlistConfigForm, macroConfigForm, soundboardConfigForm, downloadUtility } from "./misc.js";
import { playlistConfigForm, macroConfigForm, soundboardConfigForm, downloadUtility, deviceConfig } from "./misc.js";
let userPermissions = {};
const defaultEnable = [true,true,true,true];
@@ -133,6 +133,27 @@ export const registerSettings = async function() {
restricted: false
});
game.settings.registerMenu(MODULE.moduleName, 'downloadUtility',{
name: "MaterialDeck.DownloadUtility.Title",
label: "MaterialDeck.DownloadUtility.Title",
type: downloadUtility,
restricted: false
});
game.settings.registerMenu(MODULE.moduleName, 'deviceConfig',{
name: "MaterialDeck.DeviceConfig.Title",
label: "MaterialDeck.DeviceConfig.Title",
type: deviceConfig,
restricted: false
});
game.settings.register(MODULE.moduleName, 'devices', {
name: "devices",
scope: "client",
type: Object,
config: false
});
game.settings.registerMenu(MODULE.moduleName, 'permissionConfig',{
name: "MaterialDeck.Sett.Permission",
label: "MaterialDeck.Sett.Permission",
@@ -147,13 +168,6 @@ export const registerSettings = async function() {
config: false
});
game.settings.registerMenu(MODULE.moduleName, 'downloadUtility',{
name: "MaterialDeck.DownloadUtility.Title",
label: "MaterialDeck.DownloadUtility.Title",
type: downloadUtility,
restricted: false
});
/**
* Playlist soundboard
*/

View File

@@ -34,7 +34,26 @@ export class StreamDeck{
}
setContext(device,size,iteration,action,context,coordinates = {column:0,row:0},settings){
//getButtonContext
newDevice(iteration,device) {
if (this.buttonContext[iteration] == undefined) {
const deckSize = device.size.columns*device.size.rows;
let buttons = [];
for (let i=0; i<deckSize; i++){
buttons[i] = undefined;
}
this.buttonContext[iteration] = {
device: device.id,
name: device.name,
type: device.type,
size: size,
buttons: buttons
}
}
}
setContext(device,size,iteration,action,context,coordinates = {column:0,row:0},settings, name, type){
if (device == undefined) return;
if (this.buttonContext[iteration] == undefined) {
const deckSize = size.columns*size.rows;
@@ -44,6 +63,8 @@ export class StreamDeck{
}
this.buttonContext[iteration] = {
device: device,
name: name,
type: type,
size: size,
buttons: buttons
}
@@ -357,15 +378,13 @@ export class StreamDeck{
if(isNaN(parseInt(background[i],16)))
BGvalid = false;
if (BGvalid == false) background = '#000000';
let canvas;
if (canvas == null || canvas == undefined){
canvas = document.createElement('canvas');
canvas.width="144";
canvas.height="144";
canvas.style="background-color:transparent;visibility:hidden";
document.getElementById('sdCanvasBox').appendChild(canvas); // adds the canvas to #someBox
}
let canvas = document.createElement('canvas');
canvas.width="144";
canvas.height="144";
canvas.style="background-color:transparent;visibility:hidden;display:none";
document.getElementById('sdCanvasBox').appendChild(canvas); // adds the canvas to #someBox
this.counter++;
if (this.counter > 31) this.counter = 0;
@@ -413,6 +432,7 @@ export class StreamDeck{
if (format != 'jpg' && format != 'jpeg' && format != 'png' && format != 'PNG' && format != 'webm' && format != 'webp' && format != 'gif' && format != 'svg') url = "modules/MaterialDeck/img/transparant.png";
//if (url == "") url = "modules/MaterialDeck/img/transparant.png"
let resImageURL = url;
let img = new Image();
img.setAttribute('crossorigin', 'anonymous');

View File

@@ -125,7 +125,7 @@ export class wfrp4e {
getItemUses(item) {
console.log("getItemUses(" , item , ")")
//console.log("getItemUses(" , item , ")")
if ( item.type == 'ammunition') {
return {available: item.data.data.quantity.value};
}

View File

@@ -1,5 +1,6 @@
import * as MODULE from "../MaterialDeck.js";
import {streamDeck, macroControl, otherControls, tokenHelper} from "../MaterialDeck.js";
import { compatibleCore } from "./misc.js";
export class TokenControl{
constructor(){
@@ -625,7 +626,8 @@ export class TokenControl{
animation.speed = animationSpeed;
}
data.lightAnimation = animation;
token.update(data);
if (compatibleCore('0.8.1')) token.document.update(data);
else token.update(data);
}
else if (onClick == 'initiative'){
tokenHelper.toggleInitiative(token);
@@ -663,7 +665,8 @@ export class TokenControl{
else return;
iconSrc = images[imgNr];
token.update({img: iconSrc})
if (compatibleCore('0.8.1')) token.document.update({img: iconSrc});
else token.update({img: iconSrc})
}
else if (onClick == 'macro') { //call a macro
const settingsNew = {
@@ -806,7 +809,8 @@ export class TokenControl{
if (path != '') path += '.';
path += targetArray[i][j];
}
await token.update({[path]:value})
if (compatibleCore('0.8.1')) await token.document.update({[path]:value});
else await token.update({[path]:value})
this.update(token.id);
}