From fe9eb8700c82644e5a9aa6aebda9ed76db8dae43 Mon Sep 17 00:00:00 2001 From: BeGj Date: Tue, 4 Mar 2025 12:03:30 +0000 Subject: [PATCH 1/6] handle findWarshipsNearCell when clicking outside the map --- src/client/graphics/layers/UnitLayer.ts | 65 +++++++++++++------------ 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index 5cae90c36..84c9fd1b7 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -1,22 +1,22 @@ import { Colord } from "colord"; -import { Theme } from "../../../core/configuration/Config"; -import { Unit, UnitType, Player } from "../../../core/game/Game"; -import { Layer } from "./Layer"; import { EventBus } from "../../../core/EventBus"; -import { - AlternateViewEvent, - MouseUpEvent, - UnitSelectionEvent, -} from "../../InputHandler"; import { ClientID } from "../../../core/Schemas"; -import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; +import { Theme } from "../../../core/configuration/Config"; +import { UnitType } from "../../../core/game/Game"; import { euclDistFN, manhattanDistFN, TileRef, } from "../../../core/game/GameMap"; import { GameUpdateType } from "../../../core/game/GameUpdates"; +import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; +import { + AlternateViewEvent, + MouseUpEvent, + UnitSelectionEvent, +} from "../../InputHandler"; import { TransformHandler } from "../TransformHandler"; +import { Layer } from "./Layer"; enum Relationship { Self, @@ -82,29 +82,34 @@ export class UnitLayer implements Layer { * @returns Array of player's warships in range, sorted by distance (closest first) */ private findWarshipsNearCell(cell: { x: number; y: number }): UnitView[] { - const clickRef = this.game.ref(cell.x, cell.y); + try { + const clickRef = this.game.ref(cell.x, cell.y); - // Make sure we have the current player - if (this.myPlayer == null) { - this.myPlayer = this.game.playerByClientID(this.clientID); + // Make sure we have the current player + if (this.myPlayer == null) { + this.myPlayer = this.game.playerByClientID(this.clientID); + } + + // Only select warships owned by the player + return this.game + .units(UnitType.Warship) + .filter( + (unit) => + unit.isActive() && + unit.owner() === this.myPlayer && // Only allow selecting own warships + this.game.manhattanDist(unit.tile(), clickRef) <= + this.WARSHIP_SELECTION_RADIUS, + ) + .sort((a, b) => { + // Sort by distance (closest first) + const distA = this.game.manhattanDist(a.tile(), clickRef); + const distB = this.game.manhattanDist(b.tile(), clickRef); + return distA - distB; + }); + } catch (err) { + console.debug("User click outside the game. Ignoring the click event"); + return []; } - - // Only select warships owned by the player - return this.game - .units(UnitType.Warship) - .filter( - (unit) => - unit.isActive() && - unit.owner() === this.myPlayer && // Only allow selecting own warships - this.game.manhattanDist(unit.tile(), clickRef) <= - this.WARSHIP_SELECTION_RADIUS, - ) - .sort((a, b) => { - // Sort by distance (closest first) - const distA = this.game.manhattanDist(a.tile(), clickRef); - const distB = this.game.manhattanDist(b.tile(), clickRef); - return distA - distB; - }); } private onMouseUp(event: MouseUpEvent) { From a60bef97f0fa57afb72d2581521d436d4f71d731 Mon Sep 17 00:00:00 2001 From: BeGj Date: Tue, 4 Mar 2025 12:06:42 +0000 Subject: [PATCH 2/6] reverted organized imports --- src/client/graphics/layers/UnitLayer.ts | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index 84c9fd1b7..57f34ae9f 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -1,22 +1,22 @@ import { Colord } from "colord"; -import { EventBus } from "../../../core/EventBus"; -import { ClientID } from "../../../core/Schemas"; import { Theme } from "../../../core/configuration/Config"; -import { UnitType } from "../../../core/game/Game"; +import { Unit, UnitType, Player } from "../../../core/game/Game"; +import { Layer } from "./Layer"; +import { EventBus } from "../../../core/EventBus"; +import { + AlternateViewEvent, + MouseUpEvent, + UnitSelectionEvent, +} from "../../InputHandler"; +import { ClientID } from "../../../core/Schemas"; +import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; import { euclDistFN, manhattanDistFN, TileRef, } from "../../../core/game/GameMap"; import { GameUpdateType } from "../../../core/game/GameUpdates"; -import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; -import { - AlternateViewEvent, - MouseUpEvent, - UnitSelectionEvent, -} from "../../InputHandler"; import { TransformHandler } from "../TransformHandler"; -import { Layer } from "./Layer"; enum Relationship { Self, From 276eee11523c6aab7776d41da687f4e2cb5b65d5 Mon Sep 17 00:00:00 2001 From: BeGj Date: Tue, 4 Mar 2025 12:12:20 +0000 Subject: [PATCH 3/6] validates coordinates in onMouseUp --- src/client/graphics/layers/UnitLayer.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index 57f34ae9f..1f8b2d23f 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -118,6 +118,9 @@ export class UnitLayer implements Layer { event.x, event.y, ); + if (!this.game.isValidCoord(cell.x, cell.y)) { + return; + } // Find warships near this cell, sorted by distance const nearbyWarships = this.findWarshipsNearCell(cell); From de07fd0b4f8c081d89b09fb0fb13674098fba291 Mon Sep 17 00:00:00 2001 From: BeGj Date: Tue, 4 Mar 2025 12:24:35 +0000 Subject: [PATCH 4/6] removed isValidCoord in onMouseUp --- src/client/graphics/layers/UnitLayer.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index 1f8b2d23f..57f34ae9f 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -118,9 +118,6 @@ export class UnitLayer implements Layer { event.x, event.y, ); - if (!this.game.isValidCoord(cell.x, cell.y)) { - return; - } // Find warships near this cell, sorted by distance const nearbyWarships = this.findWarshipsNearCell(cell); From abf79f4c8d4b7616f860885b055d6569ca4e7d7f Mon Sep 17 00:00:00 2001 From: BeGj Date: Tue, 4 Mar 2025 12:25:01 +0000 Subject: [PATCH 5/6] console.debug is unecessary, code comment instead. --- src/client/graphics/layers/UnitLayer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index 57f34ae9f..53717f8d9 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -107,7 +107,7 @@ export class UnitLayer implements Layer { return distA - distB; }); } catch (err) { - console.debug("User click outside the game. Ignoring the click event"); + // The cell coordinate were invalid (user probably clicked outside the map), therefore no warships can be found return []; } } From 2685891e7aa93d7246bf61ec3cdc84fa5826e489 Mon Sep 17 00:00:00 2001 From: BeGj Date: Tue, 4 Mar 2025 14:30:31 +0000 Subject: [PATCH 6/6] checks if valid coord before referencing the tile. --- src/client/graphics/layers/UnitLayer.ts | 49 ++++++++++++------------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/src/client/graphics/layers/UnitLayer.ts b/src/client/graphics/layers/UnitLayer.ts index 53717f8d9..3e59dc7ba 100644 --- a/src/client/graphics/layers/UnitLayer.ts +++ b/src/client/graphics/layers/UnitLayer.ts @@ -82,34 +82,33 @@ export class UnitLayer implements Layer { * @returns Array of player's warships in range, sorted by distance (closest first) */ private findWarshipsNearCell(cell: { x: number; y: number }): UnitView[] { - try { - const clickRef = this.game.ref(cell.x, cell.y); - - // Make sure we have the current player - if (this.myPlayer == null) { - this.myPlayer = this.game.playerByClientID(this.clientID); - } - - // Only select warships owned by the player - return this.game - .units(UnitType.Warship) - .filter( - (unit) => - unit.isActive() && - unit.owner() === this.myPlayer && // Only allow selecting own warships - this.game.manhattanDist(unit.tile(), clickRef) <= - this.WARSHIP_SELECTION_RADIUS, - ) - .sort((a, b) => { - // Sort by distance (closest first) - const distA = this.game.manhattanDist(a.tile(), clickRef); - const distB = this.game.manhattanDist(b.tile(), clickRef); - return distA - distB; - }); - } catch (err) { + if (!this.game.isValidCoord(cell.x, cell.y)) { // The cell coordinate were invalid (user probably clicked outside the map), therefore no warships can be found return []; } + const clickRef = this.game.ref(cell.x, cell.y); + + // Make sure we have the current player + if (this.myPlayer == null) { + this.myPlayer = this.game.playerByClientID(this.clientID); + } + + // Only select warships owned by the player + return this.game + .units(UnitType.Warship) + .filter( + (unit) => + unit.isActive() && + unit.owner() === this.myPlayer && // Only allow selecting own warships + this.game.manhattanDist(unit.tile(), clickRef) <= + this.WARSHIP_SELECTION_RADIUS, + ) + .sort((a, b) => { + // Sort by distance (closest first) + const distA = this.game.manhattanDist(a.tile(), clickRef); + const distB = this.game.manhattanDist(b.tile(), clickRef); + return distA - distB; + }); } private onMouseUp(event: MouseUpEvent) {