e.preventDefault()}
diff --git a/src/client/graphics/layers/ImmunityTimer.ts b/src/client/graphics/layers/ImmunityTimer.ts
index cfb44ae2b..d52baa8de 100644
--- a/src/client/graphics/layers/ImmunityTimer.ts
+++ b/src/client/graphics/layers/ImmunityTimer.ts
@@ -1,14 +1,21 @@
import { LitElement, html } from "lit";
import { customElement } from "lit/decorators.js";
+import { EventBus, GameEvent } from "../../../core/EventBus";
import { GameMode } from "../../../core/game/Game";
import { GameView } from "../../../core/game/GameView";
import { Layer } from "./Layer";
+export class ImmunityBarVisibleEvent implements GameEvent {
+ constructor(public readonly visible: boolean) {}
+}
+
@customElement("immunity-timer")
export class ImmunityTimer extends LitElement implements Layer {
public game: GameView;
+ public eventBus: EventBus;
private isVisible = false;
+ private _barVisible = false;
private isActive = false;
private progressRatio = 0;
@@ -46,24 +53,24 @@ export class ImmunityTimer extends LitElement implements Layer {
this.game.inSpawnPhase()
) {
this.setInactive();
- return;
+ } else {
+ const immunityEnd = spawnPhaseTurns + immunityDuration;
+ const ticks = this.game.ticks();
+
+ if (ticks >= immunityEnd || ticks < spawnPhaseTurns) {
+ this.setInactive();
+ } else {
+ const elapsedTicks = Math.max(0, ticks - spawnPhaseTurns);
+ this.progressRatio = Math.min(
+ 1,
+ Math.max(0, elapsedTicks / immunityDuration),
+ );
+ this.isActive = true;
+ this.requestUpdate();
+ }
}
- const immunityEnd = spawnPhaseTurns + immunityDuration;
- const ticks = this.game.ticks();
-
- if (ticks >= immunityEnd || ticks < spawnPhaseTurns) {
- this.setInactive();
- return;
- }
-
- const elapsedTicks = Math.max(0, ticks - spawnPhaseTurns);
- this.progressRatio = Math.min(
- 1,
- Math.max(0, elapsedTicks / immunityDuration),
- );
- this.isActive = true;
- this.requestUpdate();
+ this.emitBarVisibility();
}
private setInactive() {
@@ -73,6 +80,14 @@ export class ImmunityTimer extends LitElement implements Layer {
}
}
+ private emitBarVisibility() {
+ const nowVisible = this.isVisible && this.isActive;
+ if (nowVisible !== this._barVisible) {
+ this._barVisible = nowVisible;
+ this.eventBus?.emit(new ImmunityBarVisibleEvent(this._barVisible));
+ }
+ }
+
shouldTransform(): boolean {
return false;
}
diff --git a/src/client/graphics/layers/Leaderboard.ts b/src/client/graphics/layers/Leaderboard.ts
index 6de7e0f10..4dfe4fcae 100644
--- a/src/client/graphics/layers/Leaderboard.ts
+++ b/src/client/graphics/layers/Leaderboard.ts
@@ -55,6 +55,12 @@ export class Leaderboard extends LitElement implements Layer {
init() {}
+ willUpdate(changed: Map
) {
+ if (changed.has("visible") && this.visible) {
+ this.updateLeaderboard();
+ }
+ }
+
getTickIntervalMs() {
return 1000;
}
@@ -184,10 +190,10 @@ export class Leaderboard extends LitElement implements Layer {
@contextmenu=${(e: Event) => e.preventDefault()}
>
-
+
#
@@ -234,28 +240,51 @@ export class Leaderboard extends LitElement implements Layer {
${repeat(
this.players,
(p) => p.player.id(),
- (player) => html`
+ (player, index) => html`
this.handleRowClickPlayer(player.player)}
>
-
+
${player.position}
${player.name}
-
+
${player.score}
-
+
${player.gold}
-
@@ -265,9 +294,9 @@ export class Leaderboard extends LitElement implements Layer {