From f4a074a3fbf14884a6bd3f9f65e9ab14e1d7c230 Mon Sep 17 00:00:00 2001 From: evanpelle Date: Fri, 4 Oct 2024 13:46:07 -0700 Subject: [PATCH] emoji icons show above players (just fire emoji for now) --- src/client/graphics/layers/NameLayer.ts | 14 +++++++++++- src/client/graphics/layers/RadialMenu.ts | 12 ++++++----- src/core/configuration/DevConfig.ts | 27 ++++++++++++------------ src/core/game/PlayerImpl.ts | 6 ++++-- 4 files changed, 38 insertions(+), 21 deletions(-) diff --git a/src/client/graphics/layers/NameLayer.ts b/src/client/graphics/layers/NameLayer.ts index dbc62c988..3303ff322 100644 --- a/src/client/graphics/layers/NameLayer.ts +++ b/src/client/graphics/layers/NameLayer.ts @@ -1,4 +1,4 @@ -import {Cell, Game, Player, PlayerType} from "../../../core/game/Game" +import {AllPlayers, Cell, Game, Player, PlayerType} from "../../../core/game/Game" import {PseudoRandom} from "../../../core/PseudoRandom" import {calculateBoundingBox} from "../../../core/Util" import {Theme} from "../../../core/configuration/Config" @@ -188,6 +188,18 @@ export class NameLayer implements Layer { ); } + if (myPlayer != null) { + const emojis = render.player.outgoingEmojis().filter(e => e.recipient == AllPlayers || e.recipient == myPlayer) + if (emojis.length > 0) { + context.font = `${render.fontSize * 4}px ${this.theme.font()}`; + context.fillStyle = this.theme.playerInfoColor(render.player.id()).toHex(); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + + context.fillText(emojis[0].emoji, nameCenterX, nameCenterY + render.fontSize / 2); + } + } + context.textRendering = "optimizeSpeed"; context.font = `${render.fontSize}px ${this.theme.font()}`; diff --git a/src/client/graphics/layers/RadialMenu.ts b/src/client/graphics/layers/RadialMenu.ts index fc6502fb0..6b4720ca0 100644 --- a/src/client/graphics/layers/RadialMenu.ts +++ b/src/client/graphics/layers/RadialMenu.ts @@ -226,11 +226,13 @@ export class RadialMenu implements Layer { if (tile.hasOwner()) { const target = tile.owner() == myPlayer ? AllPlayers : (tile.owner() as Player) - this.activateMenuElement(Slot.Emoji, "#ebe250", emojiIcon, () => { - this.eventBus.emit( - new SendEmojiIntentEvent(target, Emoji.Fire) - ) - }) + if (myPlayer.canSendEmoji(target)) { + this.activateMenuElement(Slot.Emoji, "#ebe250", emojiIcon, () => { + this.eventBus.emit( + new SendEmojiIntentEvent(target, Emoji.Fire) + ) + }) + } } if (tile.owner() != myPlayer && tile.isLand() && myPlayer.sharesBorderWith(other)) { diff --git a/src/core/configuration/DevConfig.ts b/src/core/configuration/DevConfig.ts index 5912d6eea..63033ec31 100644 --- a/src/core/configuration/DevConfig.ts +++ b/src/core/configuration/DevConfig.ts @@ -1,3 +1,4 @@ +import {PlayerInfo} from "../game/Game"; import {DefaultConfig} from "./DefaultConfig"; export const devConfig = new class extends DefaultConfig { @@ -5,14 +6,14 @@ export const devConfig = new class extends DefaultConfig { return 95 } numSpawnPhaseTurns(): number { - return 80 + return 40 + } + gameCreationRate(): number { + return 2 * 1000 + } + lobbyLifetime(): number { + return 2 * 1000 } - // gameCreationRate(): number { - // return 2 * 1000 - // } - // lobbyLifetime(): number { - // return 2 * 1000 - // } turnIntervalMs(): number { return 100 } @@ -29,12 +30,12 @@ export const devConfig = new class extends DefaultConfig { // return 1 // } - // startTroops(playerInfo: PlayerInfo): number { - // if (playerInfo.isBot) { - // return 5000 - // } - // return 5000 - // } + startTroops(playerInfo: PlayerInfo): number { + // if (playerInfo.isBot) { + // return 5000 + // } + return 50000 + } // troopAdditionRate(player: Player): number { // if (player.isBot()) { diff --git a/src/core/game/PlayerImpl.ts b/src/core/game/PlayerImpl.ts index 84598f027..7ffb4c17d 100644 --- a/src/core/game/PlayerImpl.ts +++ b/src/core/game/PlayerImpl.ts @@ -219,10 +219,12 @@ export class PlayerImpl implements MutablePlayer { } outgoingEmojis(): EmojiMessage[] { - return null + return this.outgoingEmojis_ + .filter(e => this.gs.ticks() - e.createdAt < this.gs.config().emojiMessageDuration()) + .sort((a, b) => b.createdAt - a.createdAt) } - canSendEmoji(recipient: Player | null): boolean { + canSendEmoji(recipient: Player | typeof AllPlayers): boolean { const prevMsgs = this.outgoingEmojis_.filter(msg => msg.recipient == recipient) for (const msg of prevMsgs) { if (this.gs.ticks() - msg.createdAt < this.gs.config().emojiMessageCooldown()) {