diff --git a/eslint.config.js b/eslint.config.js
index 7b73cc355..c707ee03e 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -41,7 +41,7 @@ export default [
// Disable rules that would fail. The failures should be fixed, and the entries here removed.
"@typescript-eslint/no-explicit-any": "off",
"@typescript-eslint/no-unused-expressions": "off",
- "@typescript-eslint/no-unused-vars": "off",
+ "no-unused-vars": "off",
},
},
{
@@ -50,6 +50,13 @@ export default [
"@typescript-eslint/prefer-nullish-coalescing": "error",
eqeqeq: "error",
"no-case-declarations": "error",
+ "@typescript-eslint/no-unused-vars": [
+ "error",
+ {
+ args: "none",
+ caughtErrors: "none",
+ },
+ ],
},
},
];
diff --git a/jest.config.ts b/jest.config.ts
index d1f6e3c7a..52d147124 100644
--- a/jest.config.ts
+++ b/jest.config.ts
@@ -17,7 +17,7 @@ export default {
coverageThreshold: {
global: {
statements: 21.5,
- branches: 17.0,
+ branches: 16.5,
lines: 22.0,
functions: 20.5,
},
diff --git a/package-lock.json b/package-lock.json
index 59adc6ea4..89b41aa45 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -3604,13 +3604,13 @@
}
},
"node_modules/@eslint/plugin-kit": {
- "version": "0.3.2",
- "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.2.tgz",
- "integrity": "sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==",
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz",
+ "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
- "@eslint/core": "^0.15.0",
+ "@eslint/core": "^0.15.2",
"levn": "^0.4.1"
},
"engines": {
@@ -3618,9 +3618,9 @@
}
},
"node_modules/@eslint/plugin-kit/node_modules/@eslint/core": {
- "version": "0.15.0",
- "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.0.tgz",
- "integrity": "sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==",
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz",
+ "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==",
"dev": true,
"license": "Apache-2.0",
"dependencies": {
@@ -18916,9 +18916,9 @@
}
},
"node_modules/tar-fs": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
- "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.4.tgz",
+ "integrity": "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ==",
"dev": true,
"license": "MIT",
"dependencies": {
diff --git a/resources/images/StopIconWhite.png b/resources/images/StopIconWhite.png
new file mode 100644
index 000000000..6e0e8ef64
Binary files /dev/null and b/resources/images/StopIconWhite.png differ
diff --git a/resources/images/TradingIconWhite.png b/resources/images/TradingIconWhite.png
new file mode 100644
index 000000000..5e9499a76
Binary files /dev/null and b/resources/images/TradingIconWhite.png differ
diff --git a/resources/images/TraitorIconLightRed.svg b/resources/images/TraitorIconLightRed.svg
new file mode 100644
index 000000000..b01325b0b
--- /dev/null
+++ b/resources/images/TraitorIconLightRed.svg
@@ -0,0 +1,89 @@
+
+
diff --git a/resources/lang/en.json b/resources/lang/en.json
index f4165a490..860f3f7ae 100644
--- a/resources/lang/en.json
+++ b/resources/lang/en.json
@@ -249,6 +249,7 @@
},
"game_starting_modal": {
"title": "Game is Starting...",
+ "code_license": "Code licensed under AGPL-3.0",
"desc": "Preparing for the lobby to start. Please wait."
},
"difficulty": {
@@ -496,6 +497,7 @@
"other_won": "{player} has won!",
"exit": "Exit Game",
"keep": "Keep Playing",
+ "spectate": "Spectate",
"wishlist": "Wishlist on Steam!"
},
"leaderboard": {
@@ -566,6 +568,11 @@
"upgrade": "Upgrade",
"level": "Level"
},
+ "player_type": {
+ "player": "Player",
+ "nation": "Nation",
+ "bot": "Bot"
+ },
"relation": {
"hostile": "Hostile",
"distrustful": "Distrustful",
@@ -581,23 +588,37 @@
"player_panel": {
"gold": "Gold",
"troops": "Troops",
- "betrayals": "Number of betrayals",
+ "betrayals": "Betrayals",
"traitor": "Traitor",
+ "stable": "Stable",
+ "trust": "Trust",
+ "trading": "Trading",
+ "active": "Active",
+ "stopped": "Stopped",
"alliance_time_remaining": "Alliance Expires In",
"embargo": "Stopped trading with you",
"nuke": "Nukes sent by them to you",
- "start_trade": "Start trading",
- "stop_trade": "Stop trading",
+ "start_trade": "Start Trading",
+ "stop_trade": "Stop Trading",
"yes": "Yes",
"no": "No",
"none": "None",
"alliances": "Alliances",
- "flag": "Flag"
+ "flag": "Flag",
+ "chat": "Chat",
+ "target": "Target",
+ "break": "Break",
+ "break_alliance": "Break Alliance",
+ "alliance": "Alliance",
+ "send_alliance": "Send Alliance",
+ "send_troops": "Send Troops",
+ "send_gold": "Send Gold",
+ "emotes": "Emojis"
},
"replay_panel": {
"replay_speed": "Replay speed",
"game_speed": "Game speed",
- "fastest_game_speed": "max"
+ "fastest_game_speed": "Max"
},
"error_modal": {
"crashed": "Game crashed!",
@@ -729,5 +750,17 @@
"map": "Map",
"difficulty": "Difficulty",
"type": "Type"
+ },
+ "player_stats_tree": {
+ "public": "Public",
+ "private": "Private",
+ "singleplayer": "Single Player",
+ "mode": "Mode",
+ "stats_wins": "Wins",
+ "stats_losses": "Losses",
+ "stats_wlr": "Win:Loss Ratio",
+ "stats_games_played": "Games Played",
+ "mode_ffa": "Free-for-All",
+ "mode_team": "Team"
}
}
diff --git a/src/client/GameStartingModal.ts b/src/client/GameStartingModal.ts
index 9ae0ad232..ebbeea98b 100644
--- a/src/client/GameStartingModal.ts
+++ b/src/client/GameStartingModal.ts
@@ -84,13 +84,20 @@ export class GameStartingModal extends LitElement {
.modal button:active {
transform: translateY(1px);
}
+
+ .copyright {
+ font-size: 32px;
+ margin-top: 20px;
+ opacity: 1;
+ }
`;
render() {
return html`
-
${translateText("game_starting_modal.title")}
-
${translateText("game_starting_modal.desc")}
+
© OpenFront
+
${translateText("game_starting_modal.code_license")}
+
${translateText("game_starting_modal.title")}
`;
}
diff --git a/src/client/components/Difficulties.ts b/src/client/components/Difficulties.ts
index 914c2e90e..aeafdd49d 100644
--- a/src/client/components/Difficulties.ts
+++ b/src/client/components/Difficulties.ts
@@ -74,6 +74,7 @@ export class DifficultyDisplay extends LitElement {
>
`;
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
const kingSkull = html`