From 13a10508b3b50887051ca334a02fea3860c4cfab Mon Sep 17 00:00:00 2001 From: Mathis Brossier Date: Sun, 24 Nov 2024 13:12:10 +0100 Subject: [PATCH] fixes synchronization for automappers --- client/src/server/server.ts | 2 +- client/src/ui/lib/AutomapperConfig | 1 + client/src/ui/lib/automapper.svelte | 60 +++++++++++++---------------- client/src/ui/lib/editLayer.svelte | 46 +++++++++++++++------- client/src/ui/lib/editor.svelte | 42 ++++---------------- client/src/ui/lib/util.ts | 4 +- client/src/ui/routes/edit.svelte | 26 ++++++++++++- server/src/server.rs | 54 +++++++++++++------------- server/src/util.rs | 2 +- 9 files changed, 122 insertions(+), 115 deletions(-) create mode 100644 client/src/ui/lib/AutomapperConfig diff --git a/client/src/server/server.ts b/client/src/server/server.ts index 8c3a67c..0a48477 100755 --- a/client/src/server/server.ts +++ b/client/src/server/server.ts @@ -164,7 +164,7 @@ export class WebSocketServer extends EventDispatcher implements Server { // we predict an ok response from the server and dispatch right away. // if the server replies with err(), or if the requests are out of order, - // the history will take care of resyncing. + // the history will take care of resyncing by undoing dirty predictions. this.dispatch(type as any, content, promise.then()) this.socket.send(message) diff --git a/client/src/ui/lib/AutomapperConfig b/client/src/ui/lib/AutomapperConfig new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/client/src/ui/lib/AutomapperConfig @@ -0,0 +1 @@ + diff --git a/client/src/ui/lib/automapper.svelte b/client/src/ui/lib/automapper.svelte index 2731b51..0be02d4 100644 --- a/client/src/ui/lib/automapper.svelte +++ b/client/src/ui/lib/automapper.svelte @@ -1,22 +1,19 @@
diff --git a/client/src/ui/lib/editLayer.svelte b/client/src/ui/lib/editLayer.svelte index 010ff41..0ca7784 100644 --- a/client/src/ui/lib/editLayer.svelte +++ b/client/src/ui/lib/editLayer.svelte @@ -4,6 +4,7 @@ import type { Envelope } from '../../twmap/map' import { type FormInputEvent, layerKind } from './util' import { TilesLayerFlags } from '../../twmap/types' + import type { Group } from '../../twmap/group' import { AnyTilesLayer, TilesLayer, GameLayer } from '../../twmap/tilesLayer' import { QuadsLayer } from '../../twmap/quadsLayer' import { showInfo, showError, clearDialog } from '../lib/dialog' @@ -23,14 +24,28 @@ import type * as Info from '../../twmap/types' import type * as MapDir from '../../twmap/mapdir' import Number from './number.svelte' + import type { RenderLayer } from '../../gl/renderLayer' + import type { RenderGroup } from '../../gl/renderGroup' export let g: number, l: number + let rlayer: RenderLayer | null + let rgroup: RenderGroup | null + let layer: (TilesLayer | QuadsLayer) | null + let group: Group | null + $: rgroup = g === -1 ? null : $rmap.groups[g] $: rlayer = l === -1 ? null : rgroup.layers[l] $: group = rgroup === null ? null : rgroup.group $: layer = rlayer === null ? null : (rlayer.layer as TilesLayer | QuadsLayer) + let amCfgs: string[] + $: if (syncImg && $syncImg !== null) { + amCfgs = $automappers[$syncImg.name + '.rules']?.configs ?? [] + } else { + amCfgs = [] + } + function clamp(cur: number, min: number, max: number) { return Math.min(Math.max(min, cur), max) } @@ -75,11 +90,11 @@ } } - function amCfgName(img: string, cfg: number | null): string { - if (cfg === null) { + function amCfgName(cfgs: string[], cfg: number | null): string { + if (cfg === null || cfg === -1) { return 'None' } else { - return $automappers[img + '.rules']?.configs?.at(cfg) ?? `#${cfg} (missing)` + return cfgs.at(cfg) ?? `#${cfg} (missing)` } } @@ -112,7 +127,7 @@ } // new image from gallery else { - const [name, size] = e.detail + const [name, _size] = e.detail const url = externalImageUrl(name) const embed = await showInfo('Do you wish to embed this image?', 'yesno') if (embed) { @@ -175,7 +190,7 @@ let syncColorEnvOff: Writable let syncImgs: Readable let syncImg: Readable - let syncAmCfg: Readable + let syncAmCfg: Readable let syncColEnvs: Readable $: syncGroup = sync($server, g, { @@ -277,9 +292,9 @@ }, ]) $: if (layer && layer instanceof TilesLayer) { - syncAmCfg = read($server, layer.automapper.config === -1 ? null : layer.automapper.config, { + syncAmCfg = read($server, layer.automapper, { query: 'edit/layer', - match: [g, l, { automapper_config: { config: pick } }], + match: [g, l, { automapper_config: pick }], }) } $: if (layer && layer instanceof TilesLayer) { @@ -325,18 +340,17 @@ // $rmap.automapLayer(g, l, conf, tlayer.automapper.seed) // }, 5000) } - async function onAutomapperChange() { + async function onAutomapperChange(cfg: MapDir.AutomapperConfig) { if (!layer) return - const automapper = (layer as TilesLayer).automapper await $server.query('edit/layer', [ g, l, { type: layerKind(layer), automapper_config: { - config: automapper.config === -1 ? null : automapper.config, - seed: automapper.seed, - automatic: automapper.automatic, + config: cfg.config, + seed: cfg.seed, + automatic: cfg.automatic, }, }, ]) @@ -404,7 +418,7 @@ (automapperOpen = true)} /> @@ -412,7 +426,11 @@ - + onAutomapperChange(e.detail)} + />