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.
This commit is contained in:
scamiv
2026-01-09 18:08:53 +01:00
parent 46e713baf6
commit 5ffb90dce8
@@ -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();
}
}
}