Add option for synchronizing the secret door state (resolves #3)

This commit is contained in:
2021-03-14 00:30:40 +01:00
parent 0f1975f9ae
commit 47c5eecd9c
4 changed files with 41 additions and 7 deletions

View File

@@ -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 ## v1.2.4
### Bugfix ### Bugfix
- Fixed a race condition that may cause doors to not be properly synchronized across scenes - Fixed a race condition that may cause doors to not be properly synchronized across scenes

View File

@@ -34,7 +34,8 @@
}, },
"synchronizedDoors": { "synchronizedDoors": {
"description": "State changes of doors in the same synchronization group will be synchronized across scenes. Leave blank to disable synchronization for this door.", "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"
} }
} }
} }

View File

@@ -11,13 +11,18 @@ export function onRederWallConfig(wallConfig, html, data) {
<label for="synchronizationGroup">${game.i18n.localize("smart-doors.ui.synchronizedDoors.groupName")}</label> <label for="synchronizationGroup">${game.i18n.localize("smart-doors.ui.synchronizedDoors.groupName")}</label>
<input type="text" name="synchronizationGroup"/> <input type="text" name="synchronizationGroup"/>
</div> </div>
<div class="form-group">
<label for="synchronizeSecretStatus">${game.i18n.localize("smart-doors.ui.synchronizedDoors.synchronizeSecretStatus")}</label>
<input type="checkbox" name="synchronizeSecretStatus" value="true"/>
</div>
` `
html.find(".form-group").last().after(synchronizedSettings) html.find(".form-group").last().after(synchronizedSettings)
const smartdoorsData = data.object.flags.smartdoors const smartdoorsData = data.object.flags.smartdoors
// Fill the injected input fields with values // 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("synchronizationGroup").prop("value", smartdoorsData?.synchronizationGroup)
input("synchronizeSecretStatus").prop("checked", smartdoorsData?.synchronizeSecretStatus);
// Recalculate config window height // Recalculate config window height
wallConfig.setPosition({height: "auto"}) wallConfig.setPosition({height: "auto"})
@@ -26,7 +31,8 @@ export function onRederWallConfig(wallConfig, html, data) {
// Store our custom data from the WallConfig dialog // Store our custom data from the WallConfig dialog
export async function onWallConfigUpdate(event, formData) { 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; let ids = this.options.editTargets;
if (ids.length == 0) { if (ids.length == 0) {
ids = [this.object.data._id]; 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 a synchronization group is set, get the state of existing doors and assume their state
if (formData.synchronizationGroup) { 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 // Search for other doors in the synchronization group that aren't in the list of edited doors
const doorInGroup = Util.findInAllWalls(wall => { const doorInGroup = Util.findInAllWalls(wall => {
// We only search for doors // We only search for doors
@@ -47,8 +56,15 @@ export async function onWallConfigUpdate(event, formData) {
return false return false
return true return true
}) })
if (doorInGroup) if (doorInGroup) {
// ds is the door sate in foundry
updateData.ds = doorInGroup.ds; updateData.ds = doorInGroup.ds;
if (synchronizeSecretStatus) {
// door is the door type in foundry
updateData.door = doorInGroup.door
}
}
} }
// Update all the edited walls // Update all the edited walls
@@ -56,7 +72,13 @@ export async function onWallConfigUpdate(event, formData) {
dataset.push({_id: id, ...updateData}) dataset.push({_id: id, ...updateData})
return dataset 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 // 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 // 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 // Search for doors belonging to the synchronization group in all scenes
let scenes = Util.filterAllWalls(wall => wall.door && wall.flags.smartdoors?.synchronizationGroup === synchronizationGroup); let scenes = Util.filterAllWalls(wall => wall.door && wall.flags.smartdoors?.synchronizationGroup === synchronizationGroup);

View File

@@ -1,4 +1,5 @@
import {settingsKey} from "../settings.js" import {settingsKey} from "../settings.js"
import {updateSynchronizedDoors} from "./synchronized_doors.js";
// Toggles between normal and secret doors // Toggles between normal and secret doors
export function onDoorLeftClick(event) { 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) { if (game.settings.get(settingsKey, "toggleSecretDoors") && event.data?.originalEvent?.ctrlKey && game.user.isGM) {
const types = CONST.WALL_DOOR_TYPES const types = CONST.WALL_DOOR_TYPES
const newtype = this.wall.data.door === types.DOOR ? types.SECRET : types.DOOR 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 true
} }
return false return false