From 5ffb90dce81a0e1e634411773a961842be15f791 Mon Sep 17 00:00:00 2001 From: scamiv <6170744+scamiv@users.noreply.github.com> Date: Fri, 9 Jan 2026 18:08:53 +0100 Subject: [PATCH] Enhance TerritoryLayer with palette signature management - Added `lastPaletteSignature` to track palette changes. - Implemented `computePaletteSignature()` to generate a unique signature based on player views and settings. - Introduced `refreshPaletteIfNeeded()` to refresh the palette when the signature changes, ensuring visual consistency in the TerritoryLayer. --- src/client/graphics/layers/TerritoryLayer.ts | 24 ++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/client/graphics/layers/TerritoryLayer.ts b/src/client/graphics/layers/TerritoryLayer.ts index 7d406bfa2..72c3dd1c7 100644 --- a/src/client/graphics/layers/TerritoryLayer.ts +++ b/src/client/graphics/layers/TerritoryLayer.ts @@ -65,6 +65,7 @@ export class TerritoryLayer implements Layer { private lastFocusedPlayer: PlayerView | null = null; private lastMyPlayerSmallId: number | null = null; + private lastPaletteSignature: string | null = null; constructor( private game: GameView, @@ -100,6 +101,7 @@ export class TerritoryLayer implements Layer { this.cachedTerritoryPatternsEnabled = patternsEnabled; this.redraw(); } + this.refreshPaletteIfNeeded(); this.game.recentlyUpdatedTiles().forEach((t) => this.enqueueTile(t)); const updates = this.game.updatesSinceLastTick(); @@ -458,6 +460,7 @@ export class TerritoryLayer implements Layer { strategy.setHoverHighlightOptions(this.hoverHighlightOptions()); strategy.setHover(this.highlightedTerritory?.smallID() ?? null); this.territoryRenderer = strategy; + this.lastPaletteSignature = this.computePaletteSignature(); return; } @@ -466,6 +469,7 @@ export class TerritoryLayer implements Layer { this.territoryRenderer.setHoverHighlightOptions( this.hoverHighlightOptions(), ); + this.lastPaletteSignature = null; } private hoverHighlightOptions() { @@ -675,4 +679,24 @@ export class TerritoryLayer implements Layer { ctx.fillStyle = radGrad2; ctx.fill(); } + + private computePaletteSignature(): string { + let maxSmallId = 0; + for (const player of this.game.playerViews()) { + maxSmallId = Math.max(maxSmallId, player.smallID()); + } + const patternsEnabled = this.userSettings.territoryPatterns(); + return `${this.game.playerViews().length}:${maxSmallId}:${patternsEnabled ? 1 : 0}`; + } + + private refreshPaletteIfNeeded() { + if (!this.territoryRenderer?.isWebGL()) { + return; + } + const signature = this.computePaletteSignature(); + if (signature !== this.lastPaletteSignature) { + this.lastPaletteSignature = signature; + this.territoryRenderer.refreshPalette(); + } + } }