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