mirror of
https://github.com/openfrontio/OpenFrontIO.git
synced 2026-07-28 15:07:53 +00:00
Feat: Add troop count bar to PlayerInfoOverlay (#2773)
## Description: This feature adds a troop count bar into the PlayerInfoOverlay that visualizes how many troops a player/nation has, how big of an attack they are sending, and in general the percentages of their overall troop count. I originally added the toggling of this feature as a setting but thought it might be too narrow to need it's own setting. Would appreciate anyone's thoughts on adding it back in or not. Inspired by [this comment](https://discord.com/channels/1359946986937258015/1359949371956789289/1452559404401430674) in the Dev Discord. ### Video Demo https://github.com/user-attachments/assets/4a4397f7-c0a1-475a-867d-ef00b57661c4 ## Please complete the following: - [x] I have added screenshots for all UI updates - [x] I process any text displayed to the user through translateText() and I've added it to the en.json file - [x] I have added relevant tests to the test directory - [x] I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced ## Please put your Discord username so you can be contacted if a bug or regression is found: bijx
This commit is contained in:
@@ -259,6 +259,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
|
|||||||
.outgoingAttacks()
|
.outgoingAttacks()
|
||||||
.map((a) => a.troops)
|
.map((a) => a.troops)
|
||||||
.reduce((a, b) => a + b, 0);
|
.reduce((a, b) => a + b, 0);
|
||||||
|
const totalTroops = player.troops();
|
||||||
|
|
||||||
if (player.type() === PlayerType.Nation && myPlayer !== null && !isAllied) {
|
if (player.type() === PlayerType.Nation && myPlayer !== null && !isAllied) {
|
||||||
const relation =
|
const relation =
|
||||||
@@ -378,6 +379,7 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
|
|||||||
</span>
|
</span>
|
||||||
</div>`
|
</div>`
|
||||||
: ""}
|
: ""}
|
||||||
|
${this.renderTroopBar(totalTroops, attackingTroops, maxTroops)}
|
||||||
<div
|
<div
|
||||||
class="flex p-1 mb-1 mt-1 w-full border rounded-md border-yellow-400
|
class="flex p-1 mb-1 mt-1 w-full border rounded-md border-yellow-400
|
||||||
font-bold text-yellow-400 text-sm opacity-80"
|
font-bold text-yellow-400 text-sm opacity-80"
|
||||||
@@ -438,6 +440,43 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
|
|||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private renderTroopBar(
|
||||||
|
totalTroops: number,
|
||||||
|
attackingTroops: number,
|
||||||
|
maxTroops: number,
|
||||||
|
) {
|
||||||
|
const base = Math.max(maxTroops, 1);
|
||||||
|
const greenPercentRaw = (totalTroops / base) * 100;
|
||||||
|
const orangePercentRaw = (attackingTroops / base) * 100;
|
||||||
|
|
||||||
|
const greenPercent = Math.max(0, Math.min(100, greenPercentRaw));
|
||||||
|
const orangePercent = Math.max(
|
||||||
|
0,
|
||||||
|
Math.min(100 - greenPercent, orangePercentRaw),
|
||||||
|
);
|
||||||
|
|
||||||
|
return html`
|
||||||
|
<div
|
||||||
|
class="w-full mt-2 mb-2 h-5 border border-gray-600 rounded-md bg-gray-900/60 overflow-hidden"
|
||||||
|
>
|
||||||
|
<div class="h-full flex">
|
||||||
|
${greenPercent > 0
|
||||||
|
? html`<div
|
||||||
|
class="h-full bg-green-500 transition-[width] duration-200"
|
||||||
|
style="width: ${greenPercent}%;"
|
||||||
|
></div>`
|
||||||
|
: ""}
|
||||||
|
${orangePercent > 0
|
||||||
|
? html`<div
|
||||||
|
class="h-full bg-orange-400 transition-[width] duration-200"
|
||||||
|
style="width: ${orangePercent}%;"
|
||||||
|
></div>`
|
||||||
|
: ""}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
}
|
||||||
|
|
||||||
private renderUnitInfo(unit: UnitView) {
|
private renderUnitInfo(unit: UnitView) {
|
||||||
const isAlly =
|
const isAlly =
|
||||||
(unit.owner() === this.game.myPlayer() ||
|
(unit.owner() === this.game.myPlayer() ||
|
||||||
|
|||||||
Reference in New Issue
Block a user