diff --git a/src/client/graphics/layers/Leaderboard.ts b/src/client/graphics/layers/Leaderboard.ts index 2bcca0e8d..0749a90aa 100644 --- a/src/client/graphics/layers/Leaderboard.ts +++ b/src/client/graphics/layers/Leaderboard.ts @@ -44,6 +44,12 @@ export class Leaderboard extends LitElement implements Layer { private _shownOnInit = false; private showTopFive = true; + @state() + private _sortKey: "tiles" | "gold" | "troops" = "tiles"; + + @state() + private _sortOrder: "asc" | "desc" = "desc"; + init() {} tick() { @@ -62,13 +68,37 @@ export class Leaderboard extends LitElement implements Layer { } } + private setSort(key: "tiles" | "gold" | "troops") { + if (this._sortKey === key) { + this._sortOrder = this._sortOrder === "asc" ? "desc" : "asc"; + } else { + this._sortKey = key; + this._sortOrder = "desc"; + } + this.updateLeaderboard(); + } + private updateLeaderboard() { if (this.game === null) throw new Error("Not initialized"); const myPlayer = this.game.myPlayer(); - const sorted = this.game - .playerViews() - .sort((a, b) => b.numTilesOwned() - a.numTilesOwned()); + let sorted = this.game.playerViews(); + + const compare = (a: number, b: number) => + this._sortOrder === "asc" ? a - b : b - a; + + switch (this._sortKey) { + case "gold": + sorted = sorted.sort((a, b) => compare(a.gold(), b.gold())); + break; + case "troops": + sorted = sorted.sort((a, b) => compare(a.troops(), b.troops())); + break; + default: + sorted = sorted.sort((a, b) => + compare(a.numTilesOwned(), b.numTilesOwned()), + ); + } const numTilesWithoutFallout = this.game.numLandTiles() - this.game.numTilesWithFallout(); @@ -174,6 +204,8 @@ export class Leaderboard extends LitElement implements Layer { th { background-color: rgb(31 41 55 / 0.5); color: white; + cursor: pointer; + user-select: none; } .myPlayer { font-weight: bold; @@ -275,9 +307,30 @@ export class Leaderboard extends LitElement implements Layer { ${translateText("leaderboard.rank")} ${translateText("leaderboard.player")} - ${translateText("leaderboard.owned")} - ${translateText("leaderboard.gold")} - ${translateText("leaderboard.troops")} + this.setSort("tiles")}> + ${translateText("leaderboard.owned")} + ${this._sortKey === "tiles" + ? this._sortOrder === "asc" + ? "⬆️" + : "⬇️" + : ""} + + this.setSort("gold")}> + ${translateText("leaderboard.gold")} + ${this._sortKey === "gold" + ? this._sortOrder === "asc" + ? "⬆️" + : "⬇️" + : ""} + + this.setSort("troops")}> + ${translateText("leaderboard.troops")} + ${this._sortKey === "troops" + ? this._sortOrder === "asc" + ? "⬆️" + : "⬇️" + : ""} +