diff --git a/resources/lang/en.json b/resources/lang/en.json index 0422bd517..e39b0a6b5 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -228,6 +228,8 @@ "total_gold": "Total", "all_gold": "All gold", "trade": "Trade", + "train_trade": "Train", + "naval_trade": "Tradeship", "conquest_gold": "Conquered player gold", "stolen_gold": "Stolen with warships", "num_of_conquests": "Number of conquered players", diff --git a/src/client/GameInfoModal.ts b/src/client/GameInfoModal.ts index a1f50e4b7..917665a93 100644 --- a/src/client/GameInfoModal.ts +++ b/src/client/GameInfoModal.ts @@ -49,7 +49,9 @@ export class GameInfoModal extends LitElement { title="${translateText("game_info_modal.title")}" translationKey="main.game_info" > -
+
${this.isLoadingGame ? this.renderLoadingAnimation() @@ -108,7 +110,7 @@ export class GameInfoModal extends LitElement { const isUnusualThumbnailSize = hasUnusualThumbnailSize(info.config.gameMap); return html`
${this.mapImage ? html` 0 ? this.score(this.rankedPlayers[0]) : 0; return html` -
    +
      `} ${!this.hideHeader && this.title ? html`
      ${this.title}
      ` diff --git a/src/client/components/baseComponents/ranking/GameInfoRanking.ts b/src/client/components/baseComponents/ranking/GameInfoRanking.ts index 015d6ae40..fa78d36f0 100644 --- a/src/client/components/baseComponents/ranking/GameInfoRanking.ts +++ b/src/client/components/baseComponents/ranking/GameInfoRanking.ts @@ -2,6 +2,8 @@ import { AnalyticsRecord, PlayerRecord } from "../../../../core/Schemas"; import { GOLD_INDEX_STEAL, GOLD_INDEX_TRADE, + GOLD_INDEX_TRAIN_OTHER, + GOLD_INDEX_TRAIN_SELF, GOLD_INDEX_WAR, } from "../../../../core/StatsSchemas"; @@ -12,7 +14,8 @@ export enum RankType { MIRV = "MIRV", TotalGold = "TotalGold", StolenGold = "StolenGold", - TradedGold = "TradedGold", + NavalTrade = "NavalTrade", + TrainTrade = "TrainTrade", ConqueredGold = "ConqueredGold", Lifetime = "Lifetime", } @@ -134,10 +137,15 @@ export class Ranking { return Number(player.gold.reduce((sum, gold) => sum + gold, 0n)); case RankType.StolenGold: return Number(player.gold[GOLD_INDEX_STEAL] ?? 0n); - case RankType.TradedGold: + case RankType.NavalTrade: return Number(player.gold[GOLD_INDEX_TRADE] ?? 0n); case RankType.ConqueredGold: return Number(player.gold[GOLD_INDEX_WAR] ?? 0n); + case RankType.TrainTrade: { + const ownTrains = player.gold[GOLD_INDEX_TRAIN_SELF] ?? 0n; + const otherTrains = player.gold[GOLD_INDEX_TRAIN_OTHER] ?? 0n; + return Number(ownTrains + otherTrains); + } } } diff --git a/src/client/components/baseComponents/ranking/PlayerRow.ts b/src/client/components/baseComponents/ranking/PlayerRow.ts index 2ebe635ed..773188c8b 100644 --- a/src/client/components/baseComponents/ranking/PlayerRow.ts +++ b/src/client/components/baseComponents/ranking/PlayerRow.ts @@ -1,5 +1,10 @@ import { LitElement, html } from "lit"; import { customElement, property } from "lit/decorators.js"; +import { + GOLD_INDEX_TRADE, + GOLD_INDEX_TRAIN_OTHER, + GOLD_INDEX_TRAIN_SELF, +} from "src/core/StatsSchemas"; import { renderNumber } from "../../../Utils"; import { PlayerInfo, RankType } from "./GameInfoRanking"; @@ -22,15 +27,13 @@ export class PlayerRow extends LitElement { const visibleBorder = player.winner || this.currentPlayer; return html`
    • ${Number(this.score).toFixed(0)}
      @@ -99,24 +104,25 @@ export class PlayerRow extends LitElement { const width = Math.min(Math.max((this.score / bestScore) * 100, 0), 100); return html`
      -
      +
      `; } - private renderBombType(value: number, highlight: boolean) { + + private renderMultiScoreType(value: number, highlight: boolean) { return html`
      - ${value} + ${renderNumber(value)}
      `; } @@ -124,17 +130,17 @@ export class PlayerRow extends LitElement { private renderAllBombs() { return html`
      - ${this.renderBombType( + ${this.renderMultiScoreType( this.player.atoms, this.rankType === RankType.Atoms, )} / - ${this.renderBombType( + ${this.renderMultiScoreType( this.player.hydros, this.rankType === RankType.Hydros, )} / - ${this.renderBombType( + ${this.renderMultiScoreType( this.player.mirv, this.rankType === RankType.MIRV, )} @@ -142,9 +148,28 @@ export class PlayerRow extends LitElement { `; } + private renderAllTrades() { + const navalTrade = this.player.gold[GOLD_INDEX_TRADE] ?? 0n; + const ownTrainTrade = this.player.gold[GOLD_INDEX_TRAIN_SELF] ?? 0n; + const otherTrainTrade = this.player.gold[GOLD_INDEX_TRAIN_OTHER] ?? 0n; + return html` +
      + ${this.renderMultiScoreType( + Number(ownTrainTrade + otherTrainTrade), + this.rankType === RankType.TrainTrade, + )} + / + ${this.renderMultiScoreType( + Number(navalTrade), + this.rankType === RankType.NavalTrade, + )} +
      + `; + } + private renderBombScore() { return html` -
      +
      ${this.renderPlayerIcon()}
      ${this.renderPlayerName()} ${this.renderAllBombs()} @@ -157,13 +182,12 @@ export class PlayerRow extends LitElement { return html`
      ${this.renderPlayerIcon()} -
      - ${this.renderPlayerName()} -
      +
      ${this.renderPlayerName()}
      +
      ${renderNumber(this.score)}
      @@ -172,12 +196,32 @@ export class PlayerRow extends LitElement { `; } + private renderTradeScore() { + return html` +
      +
      + ${this.renderPlayerIcon()} +
      + ${this.renderPlayerName()} +
      +
      + +
      +
      + ${this.renderAllTrades()} +
      + +
      +
      + `; + } + private renderPlayerName() { return html`
      ${this.player.tag ? this.renderTag(this.player.tag) : ""}
      ${this.player.username}
      @@ -188,7 +232,7 @@ export class PlayerRow extends LitElement { private renderTag(tag: string) { return html`
      ${tag}
      diff --git a/src/client/components/baseComponents/ranking/RankingControls.ts b/src/client/components/baseComponents/ranking/RankingControls.ts index 59e3ea76c..e32933efe 100644 --- a/src/client/components/baseComponents/ranking/RankingControls.ts +++ b/src/client/components/baseComponents/ranking/RankingControls.ts @@ -7,8 +7,10 @@ const economyRankings = new Set([ RankType.TotalGold, RankType.StolenGold, RankType.ConqueredGold, - RankType.TradedGold, + RankType.NavalTrade, + RankType.TrainTrade, ]); +const tradeRankings = new Set([RankType.NavalTrade, RankType.TrainTrade]); const bombRankings = new Set([RankType.Atoms, RankType.Hydros, RankType.MIRV]); const warRankings = new Set([ RankType.Conquests, @@ -18,6 +20,7 @@ const warRankings = new Set([ ]); const isEconomyRanking = (t: RankType) => economyRankings.has(t); +const isTradeRanking = (t: RankType) => tradeRankings.has(t); const isBombRanking = (t: RankType) => bombRankings.has(t); const isWarRanking = (t: RankType) => warRankings.has(t); @@ -54,9 +57,9 @@ export class RankingControls extends LitElement { private renderButton(type: RankType, active: boolean, label: string) { return html`