From 47c5eecd9c24c84ee81662bab9a3baacdbcade3a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Manuel=20V=C3=B6gele?= Date: Sun, 14 Mar 2021 00:30:40 +0100 Subject: [PATCH] Add option for synchronizing the secret door state (resolves #3) --- CHANGELOG.md | 4 ++++ lang/en.json | 3 ++- src/features/synchronized_doors.js | 32 +++++++++++++++++++++++++----- src/features/toggle_secret_door.js | 9 ++++++++- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index db7fb98..05ff736 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +## In development +### New features +- Synchronized doors can now be configured to synchronize their secret door status as well + ## v1.2.4 ### Bugfix - Fixed a race condition that may cause doors to not be properly synchronized across scenes diff --git a/lang/en.json b/lang/en.json index 00a9dd3..42bce1b 100644 --- a/lang/en.json +++ b/lang/en.json @@ -34,7 +34,8 @@ }, "synchronizedDoors": { "description": "State changes of doors in the same synchronization group will be synchronized across scenes. Leave blank to disable synchronization for this door.", - "groupName": "Synchronization Group" + "groupName": "Synchronization Group", + "synchronizeSecretStatus": "Synchronize Secret Status" } } } diff --git a/src/features/synchronized_doors.js b/src/features/synchronized_doors.js index c9118fd..fed64af 100644 --- a/src/features/synchronized_doors.js +++ b/src/features/synchronized_doors.js @@ -11,13 +11,18 @@ export function onRederWallConfig(wallConfig, html, data) { +
+ + +
` html.find(".form-group").last().after(synchronizedSettings) const smartdoorsData = data.object.flags.smartdoors // Fill the injected input fields with values - const input = (name) => html.find(`input[name="${name}"]`) + const input = (name) => html.find(`input[name="${name}"]`); // input is a helper function to search for a input field by it's name input("synchronizationGroup").prop("value", smartdoorsData?.synchronizationGroup) + input("synchronizeSecretStatus").prop("checked", smartdoorsData?.synchronizeSecretStatus); // Recalculate config window height wallConfig.setPosition({height: "auto"}) @@ -26,7 +31,8 @@ export function onRederWallConfig(wallConfig, html, data) { // Store our custom data from the WallConfig dialog export async function onWallConfigUpdate(event, formData) { - const updateData = {flags: {smartdoors: {synchronizationGroup: formData.synchronizationGroup}}} + const synchronizeSecretStatus = formData.synchronizeSecretStatus; + const updateData = {flags: {smartdoors: {synchronizationGroup: formData.synchronizationGroup}}}; let ids = this.options.editTargets; if (ids.length == 0) { ids = [this.object.data._id]; @@ -34,6 +40,9 @@ export async function onWallConfigUpdate(event, formData) { // If a synchronization group is set, get the state of existing doors and assume their state if (formData.synchronizationGroup) { + // Update the synchronizeSecretStatus flag + updateData.flags.smartdoors.synchronizeSecretStatus = synchronizeSecretStatus; + // Search for other doors in the synchronization group that aren't in the list of edited doors const doorInGroup = Util.findInAllWalls(wall => { // We only search for doors @@ -47,8 +56,15 @@ export async function onWallConfigUpdate(event, formData) { return false return true }) - if (doorInGroup) + if (doorInGroup) { + // ds is the door sate in foundry updateData.ds = doorInGroup.ds; + + if (synchronizeSecretStatus) { + // door is the door type in foundry + updateData.door = doorInGroup.door + } + } } // Update all the edited walls @@ -56,7 +72,13 @@ export async function onWallConfigUpdate(event, formData) { dataset.push({_id: id, ...updateData}) return dataset }, []) - return canvas.scene.updateEmbeddedEntity("Wall", updateDataset) + const updateResult = await canvas.scene.updateEmbeddedEntity("Wall", updateDataset); + + // If door is synchronized, synchronize secret status among synchronized doors + if (formData.synchronizationGroup) + await updateSynchronizedDoors(updateData, formData.synchronizationGroup); + + return updateResult; } // Update the state of all synchronized doors @@ -121,7 +143,7 @@ export function onDoorRightClick() { } // Updates all doors in the specified synchronization group with the provided data -async function updateSynchronizedDoors(updateData, synchronizationGroup) { +export async function updateSynchronizedDoors(updateData, synchronizationGroup) { // Search for doors belonging to the synchronization group in all scenes let scenes = Util.filterAllWalls(wall => wall.door && wall.flags.smartdoors?.synchronizationGroup === synchronizationGroup); diff --git a/src/features/toggle_secret_door.js b/src/features/toggle_secret_door.js index eeeb168..47c8643 100644 --- a/src/features/toggle_secret_door.js +++ b/src/features/toggle_secret_door.js @@ -1,4 +1,5 @@ import {settingsKey} from "../settings.js" +import {updateSynchronizedDoors} from "./synchronized_doors.js"; // Toggles between normal and secret doors export function onDoorLeftClick(event) { @@ -6,7 +7,13 @@ export function onDoorLeftClick(event) { if (game.settings.get(settingsKey, "toggleSecretDoors") && event.data?.originalEvent?.ctrlKey && game.user.isGM) { const types = CONST.WALL_DOOR_TYPES const newtype = this.wall.data.door === types.DOOR ? types.SECRET : types.DOOR - this.wall.update({door: newtype}) + const updateData = {door: newtype} + const synchronizationGroup = this.wall.data.flags.smartdoors?.synchronizationGroup + if (game.settings.get(settingsKey, "synchronizedDoors") && synchronizationGroup && this.wall.data.flags.smartdoors?.synchronizeSecretStatus) + updateSynchronizedDoors(updateData, synchronizationGroup) + else + this.wall.update(updateData) + return true } return false