diff --git a/src/client/ClientGameRunner.ts b/src/client/ClientGameRunner.ts index 575977f9a..f58312fcb 100644 --- a/src/client/ClientGameRunner.ts +++ b/src/client/ClientGameRunner.ts @@ -186,7 +186,12 @@ async function createClientGame( lobbyConfig, eventBus, gameRenderer, - new InputHandler(gameRenderer.uiState, canvas, eventBus), + new InputHandler( + gameRenderer.uiState, + canvas, + eventBus, + gameRenderer.transformHandler, + ), transport, worker, gameView, diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index a793bd59f..8eccf0423 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -25,7 +25,7 @@ import { MultiTabModal } from "./layers/MultiTabModal"; import { NameLayer } from "./layers/NameLayer"; import { NukeTrajectoryPreviewLayer } from "./layers/NukeTrajectoryPreviewLayer"; import { PerformanceOverlay } from "./layers/PerformanceOverlay"; -import { PingTargetPreviewLayer } from "./layers/PingTargetPreviewLayer"; +import { PingTrajectoryPreviewLayer } from "./layers/PingTrajectoryPreviewLayer"; import { PlayerInfoOverlay } from "./layers/PlayerInfoOverlay"; import { PlayerPanel } from "./layers/PlayerPanel"; import { RailroadLayer } from "./layers/RailroadLayer"; @@ -211,7 +211,7 @@ export function createRenderer( transformHandler, uiState, ); - const pingTargetPreviewLayer = new PingTargetPreviewLayer( + const pingTrajectoryPreviewLayer = new PingTrajectoryPreviewLayer( game, eventBus, transformHandler, @@ -251,7 +251,7 @@ export function createRenderer( new FxLayer(game, eventBus), new UILayer(game, eventBus, transformHandler), new NukeTrajectoryPreviewLayer(game, eventBus, transformHandler), - pingTargetPreviewLayer, + pingTrajectoryPreviewLayer, new StructureIconsLayer(game, eventBus, uiState, transformHandler), new NameLayer(game, transformHandler, eventBus), eventsDisplay, diff --git a/src/client/graphics/layers/FxLayer.ts b/src/client/graphics/layers/FxLayer.ts index 56cffef94..1f56635f4 100644 --- a/src/client/graphics/layers/FxLayer.ts +++ b/src/client/graphics/layers/FxLayer.ts @@ -371,10 +371,13 @@ export class FxLayer implements Layer { this.pingEventCleanup(); this.pingEventCleanup = undefined; } - this.pingEventCleanup = this.eventBus.on(PingPlacedEvent, (event) => { - const pingFx = new PingFx(this.game, event.type, event.tile); - this.allFx.push(pingFx); - }); + this.pingEventCleanup = this.eventBus.on( + PingPlacedEvent, + (event: PingPlacedEvent) => { + const pingFx = new PingFx(this.game, event.type, event.tile); + this.allFx.push(pingFx); + }, + ); } redraw(): void { diff --git a/src/client/graphics/layers/Layer.ts b/src/client/graphics/layers/Layer.ts index 239937435..12333e343 100644 --- a/src/client/graphics/layers/Layer.ts +++ b/src/client/graphics/layers/Layer.ts @@ -4,4 +4,5 @@ export interface Layer { renderLayer?: (context: CanvasRenderingContext2D) => void; shouldTransform?: () => boolean; redraw?: () => void; + destroy?: () => void; } diff --git a/src/core/EventBus.ts b/src/core/EventBus.ts index 008cc7320..59e8ac474 100644 --- a/src/core/EventBus.ts +++ b/src/core/EventBus.ts @@ -21,12 +21,13 @@ export class EventBus { on( eventType: EventConstructor, callback: (event: T) => void, - ): void { + ): () => void { if (!this.listeners.has(eventType)) { this.listeners.set(eventType, []); } - const callbacks = this.listeners.get(eventType)!; - callbacks.push(callback as (event: GameEvent) => void); + this.listeners.get(eventType)!.push(callback as (event: GameEvent) => void); + + return () => this.off(eventType, callback); } off( diff --git a/src/core/game/Ping.ts b/src/core/game/Ping.ts index c0aec19c8..dd19879b2 100644 --- a/src/core/game/Ping.ts +++ b/src/core/game/Ping.ts @@ -6,3 +6,10 @@ export type Ping = { type: PingType; tile: TileRef; }; + +export class PingPlacedEvent { + constructor( + public readonly type: PingType, + public readonly tile: TileRef, + ) {} +}