diff --git a/resources/images/AllianceIcon.png b/resources/images/AllianceIcon.png new file mode 100644 index 000000000..6bd140a6d Binary files /dev/null and b/resources/images/AllianceIcon.png differ diff --git a/src/client/graphics/GameRenderer.ts b/src/client/graphics/GameRenderer.ts index 4edf943a6..120a47273 100644 --- a/src/client/graphics/GameRenderer.ts +++ b/src/client/graphics/GameRenderer.ts @@ -17,7 +17,7 @@ export function createRenderer(game: Game, eventBus: EventBus, clientID: ClientI const layers: Layer[] = [ new TerrainLayer(game), new TerritoryLayer(game, eventBus), - new NameLayer(game, game.config().theme(), transformHandler), + new NameLayer(game, game.config().theme(), transformHandler, clientID), new UILayer(eventBus, game, game.config().theme(), clientID, transformHandler) ] diff --git a/src/client/graphics/layers/NameLayer.ts b/src/client/graphics/layers/NameLayer.ts index bc0889674..d4251833d 100644 --- a/src/client/graphics/layers/NameLayer.ts +++ b/src/client/graphics/layers/NameLayer.ts @@ -7,6 +7,8 @@ import {placeName} from "../NameBoxCalculator" import {TransformHandler} from "../TransformHandler" import {renderTroops} from "../Utils" import traitorIcon from '../../../../resources/images/TraitorIcon.png'; +import allianceIcon from '../../../../resources/images/AllianceIcon.png'; +import {ClientID} from "../../../core/Schemas" class RenderInfo { @@ -30,18 +32,24 @@ export class NameLayer implements Layer { private renders: RenderInfo[] = [] private seenPlayers: Set = new Set() private traitorIconImage: HTMLImageElement; + private allianceIconImage: HTMLImageElement; + + private myPlayer: Player | null = null - constructor(private game: Game, private theme: Theme, private transformHandler: TransformHandler) { + + constructor(private game: Game, private theme: Theme, private transformHandler: TransformHandler, private clientID: ClientID) { this.traitorIconImage = new Image(); this.traitorIconImage.src = traitorIcon; + + this.allianceIconImage = new Image() + this.allianceIconImage.src = allianceIcon } shouldTransform(): boolean { return true } - public init() { } @@ -132,6 +140,17 @@ export class NameLayer implements Layer { ); } + const myPlayer = this.getPlayer() + if (myPlayer != null && myPlayer.alliedWith(render.player)) { + context.drawImage( + this.allianceIconImage, + nameCenterX - iconSize / 2, + nameCenterY - iconSize / 2, + iconSize, + iconSize + ); + } + context.textRendering = "optimizeSpeed"; context.font = `${render.fontSize}px ${this.theme.font()}`; @@ -144,4 +163,12 @@ export class NameLayer implements Layer { context.fillText(renderTroops(render.player.troops()), nameCenterX, nameCenterY + render.fontSize); } + + private getPlayer(): Player | null { + if(this.myPlayer != null) { + return this.myPlayer + } + this.myPlayer = this.game.players().find(p => p.clientID() == this.clientID) + return this.myPlayer + } } \ No newline at end of file diff --git a/src/core/game/PlayerImpl.ts b/src/core/game/PlayerImpl.ts index 51426884e..9cd61a472 100644 --- a/src/core/game/PlayerImpl.ts +++ b/src/core/game/PlayerImpl.ts @@ -124,6 +124,9 @@ export class PlayerImpl implements MutablePlayer { } alliedWith(other: Player): boolean { + if (other == this) { + return false + } return this.alliances().find(a => a.recipient() == other || a.requestor() == other) != null }