Merge main into v25

This commit is contained in:
Scott Anderson
2025-07-27 15:25:29 -04:00
28 changed files with 1576 additions and 232 deletions
+2
View File
@@ -24,6 +24,7 @@ import pl from "../../resources/lang/pl.json";
import pt_BR from "../../resources/lang/pt-BR.json";
import ru from "../../resources/lang/ru.json";
import sh from "../../resources/lang/sh.json";
import sl from "../../resources/lang/sl.json";
import sv_SE from "../../resources/lang/sv-SE.json";
import tp from "../../resources/lang/tp.json";
import tr from "../../resources/lang/tr.json";
@@ -69,6 +70,7 @@ export class LangSelector extends LitElement {
"zh-CN": zh_CN,
ko,
gl,
sl,
};
createRenderRoot() {
+7 -5
View File
@@ -17,7 +17,7 @@ import {
centerButtonElement,
COLORS,
MenuElementParams,
rootMenuItems,
rootMenuElement,
} from "./RadialMenuElements";
import swordIcon from "../../../../resources/images/SwordIconWhite.svg";
@@ -56,7 +56,12 @@ export class MainRadialMenu extends LitElement implements Layer {
`,
};
this.radialMenu = new RadialMenu(this.eventBus, menuConfig);
this.radialMenu = new RadialMenu(
this.eventBus,
rootMenuElement,
centerButtonElement,
menuConfig,
);
this.playerActionHandler = new PlayerActionHandler(
this.eventBus,
@@ -64,13 +69,10 @@ export class MainRadialMenu extends LitElement implements Layer {
);
this.chatIntegration = new ChatIntegration(this.game, this.eventBus);
this.radialMenu.setRootMenuItems(rootMenuItems, centerButtonElement);
}
init() {
this.radialMenu.init();
this.radialMenu.setRootMenuItems(rootMenuItems, centerButtonElement);
this.eventBus.on(ContextMenuEvent, (event) => {
const worldCoords = this.transformHandler.screenToWorldCoordinates(
event.x,
+42 -20
View File
@@ -170,6 +170,18 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
}
}
private displayUnitCount(
player: PlayerView,
type: UnitType,
description: string,
) {
return !this.game.config().isUnitDisabled(type)
? html`<div class="text-sm opacity-80" translate="no">
${translateText(description)}: ${player.totalUnitLevels(type)}
</div>`
: "";
}
private renderPlayerInfo(player: PlayerView) {
const myPlayer = this.game.myPlayer();
const isFriendly = myPlayer?.isFriendly(player);
@@ -255,26 +267,36 @@ export class PlayerInfoOverlay extends LitElement implements Layer {
${translateText("player_info_overlay.gold")}:
${renderNumber(player.gold())}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.ports")}:
${player.totalUnitLevels(UnitType.Port)}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.cities")}:
${player.totalUnitLevels(UnitType.City)}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.missile_launchers")}:
${player.totalUnitLevels(UnitType.MissileSilo)}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.sams")}:
${player.totalUnitLevels(UnitType.SAMLauncher)}
</div>
<div class="text-sm opacity-80" translate="no">
${translateText("player_info_overlay.warships")}:
${player.units(UnitType.Warship).length}
</div>
${this.displayUnitCount(
player,
UnitType.Port,
"player_info_overlay.ports",
)}
${this.displayUnitCount(
player,
UnitType.City,
"player_info_overlay.cities",
)}
${this.displayUnitCount(
player,
UnitType.Factory,
"player_info_overlay.factories",
)}
${this.displayUnitCount(
player,
UnitType.MissileSilo,
"player_info_overlay.missile_launchers",
)}
${this.displayUnitCount(
player,
UnitType.SAMLauncher,
"player_info_overlay.sams",
)}
${this.displayUnitCount(
player,
UnitType.Warship,
"player_info_overlay.warships",
)}
${relationHtml}
</div>
`;
+3 -15
View File
@@ -44,13 +44,11 @@ export class RadialMenu implements Layer {
private currentLevel: number = 0; // Current menu level (0 = main menu, 1 = submenu, etc.)
private menuStack: MenuElement[][] = []; // Stack to track menu navigation history
private currentMenuItems: MenuElement[] = []; // Current active menu items (changes based on level)
private rootMenuItems: MenuElement[] = []; // Store the original root menu items
private readonly config: RequiredRadialMenuConfig;
private readonly backIconSize: number;
private centerButtonState: CenterButtonState = "default";
private centerButtonElement: CenterButtonElement | null = null;
private isTransitioning: boolean = false;
private lastHideTime: number = 0;
@@ -79,6 +77,8 @@ export class RadialMenu implements Layer {
constructor(
private eventBus: EventBus,
private rootMenu: MenuElement,
private centerButtonElement: CenterButtonElement,
config: RadialMenuConfig = {},
) {
this.config = {
@@ -904,18 +904,6 @@ export class RadialMenu implements Layer {
return this.currentLevel;
}
public setRootMenuItems(
items: MenuElement[],
centerButton: CenterButtonElement,
) {
this.currentMenuItems = [...items];
this.rootMenuItems = [...items];
this.centerButtonElement = centerButton;
if (this.isVisible) {
this.refreshMenu();
}
}
public setParams(params: MenuElementParams) {
this.params = params;
}
@@ -928,7 +916,7 @@ export class RadialMenu implements Layer {
this.currentLevel = 0;
this.menuStack = [];
this.currentMenuItems = [...this.rootMenuItems];
this.currentMenuItems = this.rootMenu.subMenu!(this.params!);
this.navigationInProgress = false;
@@ -433,8 +433,17 @@ export const centerButtonElement: CenterButtonElement = {
},
};
export const rootMenuItems: MenuElement[] = [
infoMenuElement,
boatMenuElement,
buildMenuElement,
];
export const rootMenuElement: MenuElement = {
id: "root",
name: "root",
disabled: () => false,
icon: infoIcon,
color: COLORS.info,
subMenu: (params: MenuElementParams) => {
let ally = allyRequestElement;
if (params.selected?.isAlliedWith(params.myPlayer)) {
ally = allyBreakElement;
}
return [infoMenuElement, boatMenuElement, ally, buildMenuElement];
},
};