From e1ed8dbe367ebdb0071c9a2e93ce876e957eca4c Mon Sep 17 00:00:00 2001 From: Maeght Loan <37497007+loan-mgt@users.noreply.github.com> Date: Sat, 8 Mar 2025 19:44:27 +0100 Subject: [PATCH] Boat attack event (#177) Allow user to focus on outgoing boats Partial #133 https://github.com/user-attachments/assets/0e287bf5-71bb-4def-a3ca-f0b652ed6d69 --- src/client/graphics/TransformHandler.ts | 12 +++++- src/client/graphics/layers/EventsDisplay.ts | 47 +++++++++++++++++++-- src/client/graphics/layers/Leaderboard.ts | 10 +++-- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/src/client/graphics/TransformHandler.ts b/src/client/graphics/TransformHandler.ts index 5ee69af27..5228ce851 100644 --- a/src/client/graphics/TransformHandler.ts +++ b/src/client/graphics/TransformHandler.ts @@ -6,7 +6,7 @@ import { calculateBoundingBoxCenter, } from "../../core/Util"; import { ZoomEvent, DragEvent, CenterCameraEvent } from "../InputHandler"; -import { GoToPlayerEvent } from "./layers/Leaderboard"; +import { GoToPlayerEvent, GoToUnitEvent } from "./layers/Leaderboard"; import { placeName } from "./NameBoxCalculator"; import { GameView } from "../../core/game/GameView"; @@ -27,6 +27,7 @@ export class TransformHandler { this.eventBus.on(ZoomEvent, (e) => this.onZoom(e)); this.eventBus.on(DragEvent, (e) => this.onMove(e)); this.eventBus.on(GoToPlayerEvent, (e) => this.onGoToPlayer(e)); + this.eventBus.on(GoToUnitEvent, (e) => this.onGoToUnit(e)); this.eventBus.on(CenterCameraEvent, () => this.centerCamera()); } @@ -149,6 +150,15 @@ export class TransformHandler { this.intervalID = setInterval(() => this.goTo(), 1); } + onGoToUnit(event: GoToUnitEvent) { + this.clearTarget(); + this.target = new Cell( + this.game.x(event.unit.lastTile()), + this.game.y(event.unit.lastTile()), + ); + this.intervalID = setInterval(() => this.goTo(), 1); + } + centerCamera() { this.clearTarget(); const player = this.game.myPlayer(); diff --git a/src/client/graphics/layers/EventsDisplay.ts b/src/client/graphics/layers/EventsDisplay.ts index 8458c1faf..6b494d7f1 100644 --- a/src/client/graphics/layers/EventsDisplay.ts +++ b/src/client/graphics/layers/EventsDisplay.ts @@ -6,6 +6,7 @@ import { MessageType, PlayerType, Tick, + UnitType, } from "../../../core/game/Game"; import { AttackUpdate, @@ -28,9 +29,9 @@ import { unsafeHTML, UnsafeHTMLDirective } from "lit/directives/unsafe-html.js"; import { DirectiveResult } from "lit/directive.js"; import { onlyImages, sanitize } from "../../../core/Util"; -import { GameView, PlayerView } from "../../../core/game/GameView"; +import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; import { renderTroops } from "../../Utils"; -import { GoToPlayerEvent } from "./Leaderboard"; +import { GoToPlayerEvent, GoToUnitEvent } from "./Leaderboard"; interface Event { description: string; @@ -60,6 +61,7 @@ export class EventsDisplay extends LitElement implements Layer { private events: Event[] = []; @state() private incomingAttacks: AttackUpdate[] = []; @state() private outgoingAttacks: AttackUpdate[] = []; + @state() private outgoingBoats: UnitView[] = []; @state() private _hidden: boolean = false; @state() private newEvents: number = 0; @@ -88,6 +90,7 @@ export class EventsDisplay extends LitElement implements Layer { this.events = []; this.incomingAttacks = []; this.outgoingAttacks = []; + this.outgoingBoats = []; } init() {} @@ -131,6 +134,11 @@ export class EventsDisplay extends LitElement implements Layer { .outgoingAttacks() .filter((a) => a.targetID != 0); + this.outgoingBoats = myPlayer + .units() + .filter((u) => u.type() === UnitType.TransportShip); + console.log("loan", this.outgoingBoats); + this.requestUpdate(); } @@ -322,6 +330,10 @@ export class EventsDisplay extends LitElement implements Layer { this.eventBus.emit(new GoToPlayerEvent(attacker)); } + emitGoToUnitEvent(unit: UnitView) { + this.eventBus.emit(new GoToUnitEvent(unit)); + } + onEmojiMessageEvent(update: EmojiUpdate) { const myPlayer = this.game.playerByClientID(this.clientID); if (!myPlayer) return; @@ -448,11 +460,38 @@ export class EventsDisplay extends LitElement implements Layer { `; } + private renderBoats() { + if (this.outgoingBoats.length === 0) { + return html``; + } + + return html` + ${this.outgoingBoats.length > 0 + ? html` + + + ${this.outgoingBoats.map( + (boats) => html` + + `, + )} + + + ` + : ""} + `; + } + render() { if ( this.events.length === 0 && this.incomingAttacks.length === 0 && - this.outgoingAttacks.length === 0 + this.outgoingAttacks.length === 0 && + this.outgoingBoats.length === 0 ) { return html``; } @@ -553,7 +592,7 @@ export class EventsDisplay extends LitElement implements Layer { `, )} - ${this.renderAttacks()} + ${this.renderAttacks()} ${this.renderBoats()} diff --git a/src/client/graphics/layers/Leaderboard.ts b/src/client/graphics/layers/Leaderboard.ts index b1cdc8317..3ec1d1318 100644 --- a/src/client/graphics/layers/Leaderboard.ts +++ b/src/client/graphics/layers/Leaderboard.ts @@ -2,7 +2,7 @@ import { LitElement, css, html } from "lit"; import { customElement, state } from "lit/decorators.js"; import { unsafeHTML } from "lit/directives/unsafe-html.js"; import { EventBus, GameEvent } from "../../../core/EventBus"; -import { GameView, PlayerView } from "../../../core/game/GameView"; +import { GameView, PlayerView, UnitView } from "../../../core/game/GameView"; import { ClientID } from "../../../core/Schemas"; import { renderNumber } from "../../Utils"; import { Layer } from "./Layer"; @@ -21,6 +21,10 @@ export class GoToPlayerEvent implements GameEvent { constructor(public player: PlayerView) {} } +export class GoToUnitEvent implements GameEvent { + constructor(public unit: UnitView) {} +} + @customElement("leader-board") export class Leaderboard extends LitElement implements Layer { public game: GameView; @@ -116,7 +120,7 @@ export class Leaderboard extends LitElement implements Layer { this.requestUpdate(); } - private handleRowClick(player: PlayerView) { + private handleRowClickPlayer(player: PlayerView) { this.eventBus.emit(new GoToPlayerEvent(player)); } @@ -274,7 +278,7 @@ export class Leaderboard extends LitElement implements Layer { (player) => html` this.handleRowClick(player.player)} + @click=${() => this.handleRowClickPlayer(player.player)} > ${player.position} ${unsafeHTML(player.name)}