mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-06-28 17:34:18 +00:00
513fcb0944
## Description: When building a structure in the same location as a nearby structure, it will update the existing structure instead of creating a new one. Also fix ctrl+click shortcut to bring up the build menu. ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced - [x] I understand that submitting code with bugs that could have been caught through manual testing blocks releases and new features for all contributors ## Please put your Discord username so you can be contacted if a bug or regression is found: evan
102 lines
2.8 KiB
TypeScript
102 lines
2.8 KiB
TypeScript
import { EventBus } from "../../../core/EventBus";
|
|
import { Cell, PlayerActions, PlayerID } from "../../../core/game/Game";
|
|
import { TileRef } from "../../../core/game/GameMap";
|
|
import { PlayerView } from "../../../core/game/GameView";
|
|
import {
|
|
SendAllianceRequestIntentEvent,
|
|
SendAttackIntentEvent,
|
|
SendBoatAttackIntentEvent,
|
|
SendBreakAllianceIntentEvent,
|
|
SendDonateGoldIntentEvent,
|
|
SendDonateTroopsIntentEvent,
|
|
SendEmbargoIntentEvent,
|
|
SendEmojiIntentEvent,
|
|
SendQuickChatEvent,
|
|
SendSpawnIntentEvent,
|
|
SendTargetPlayerIntentEvent,
|
|
} from "../../Transport";
|
|
import { UIState } from "../UIState";
|
|
|
|
export class PlayerActionHandler {
|
|
constructor(
|
|
private eventBus: EventBus,
|
|
private uiState: UIState,
|
|
) {}
|
|
|
|
async getPlayerActions(
|
|
player: PlayerView,
|
|
tile: TileRef,
|
|
): Promise<PlayerActions> {
|
|
return await player.actions(tile);
|
|
}
|
|
|
|
handleAttack(player: PlayerView, targetId: string | null) {
|
|
this.eventBus.emit(
|
|
new SendAttackIntentEvent(
|
|
targetId,
|
|
this.uiState.attackRatio * player.troops(),
|
|
),
|
|
);
|
|
}
|
|
|
|
handleBoatAttack(
|
|
player: PlayerView,
|
|
targetId: PlayerID | null,
|
|
targetTile: TileRef,
|
|
spawnTile: TileRef | null,
|
|
) {
|
|
this.eventBus.emit(
|
|
new SendBoatAttackIntentEvent(
|
|
targetId,
|
|
targetTile,
|
|
this.uiState.attackRatio * player.troops(),
|
|
spawnTile,
|
|
),
|
|
);
|
|
}
|
|
|
|
async findBestTransportShipSpawn(
|
|
player: PlayerView,
|
|
tile: TileRef,
|
|
): Promise<TileRef | false> {
|
|
return await player.bestTransportShipSpawn(tile);
|
|
}
|
|
handleSpawn(spawnCell: Cell) {
|
|
this.eventBus.emit(new SendSpawnIntentEvent(spawnCell));
|
|
}
|
|
|
|
handleAllianceRequest(player: PlayerView, recipient: PlayerView) {
|
|
this.eventBus.emit(new SendAllianceRequestIntentEvent(player, recipient));
|
|
}
|
|
|
|
handleBreakAlliance(player: PlayerView, recipient: PlayerView) {
|
|
this.eventBus.emit(new SendBreakAllianceIntentEvent(player, recipient));
|
|
}
|
|
|
|
handleTargetPlayer(targetId: string | null) {
|
|
if (!targetId) return;
|
|
|
|
this.eventBus.emit(new SendTargetPlayerIntentEvent(targetId));
|
|
}
|
|
|
|
handleDonateGold(recipient: PlayerView) {
|
|
this.eventBus.emit(new SendDonateGoldIntentEvent(recipient, null));
|
|
}
|
|
|
|
handleDonateTroops(recipient: PlayerView) {
|
|
this.eventBus.emit(new SendDonateTroopsIntentEvent(recipient, null));
|
|
}
|
|
|
|
handleEmbargo(recipient: PlayerView, action: "start" | "stop") {
|
|
this.eventBus.emit(new SendEmbargoIntentEvent(recipient, action));
|
|
}
|
|
|
|
handleEmoji(targetPlayer: PlayerView | "AllPlayers", emojiIndex: number) {
|
|
this.eventBus.emit(new SendEmojiIntentEvent(targetPlayer, emojiIndex));
|
|
}
|
|
|
|
handleQuickChat(recipient: PlayerView, chatKey: string, params: any = {}) {
|
|
this.eventBus.emit(new SendQuickChatEvent(recipient, chatKey, params));
|
|
}
|
|
}
|