Multi-level radial menu (#1018)

## Description:

- Refactored the radial menu to enable multi-level functionality.
- Organized the actions into submenus.

<img width="192" alt="Знімок екрана 2025-06-03 о 16 33 24"
src="https://github.com/user-attachments/assets/6dae9792-bcae-4fc9-8ce4-1203d0efbfac"
/>
<img width="313" alt="Знімок екрана 2025-06-03 о 16 34 17"
src="https://github.com/user-attachments/assets/5d78098f-b05b-40c4-bd70-8f2e3c08da2b"
/>
<img width="308" alt="Знімок екрана 2025-06-03 о 16 40 22"
src="https://github.com/user-attachments/assets/01b00906-9e8b-47e9-8f97-cfd3c023c352"
/>
<img width="277" alt="Знімок екрана 2025-06-03 о 16 37 04"
src="https://github.com/user-attachments/assets/60718c5b-8544-43e6-b891-2833d7fb789a"
/>
<img width="353" alt="Знімок екрана 2025-06-03 о 16 36 32"
src="https://github.com/user-attachments/assets/8c35a0f8-5588-470f-8af4-8e6d4ba66d88"
/>


## 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
- [x] I understand that submitting code with bugs that could have been
caught through manual testing blocks releases and new features for all
contributors

## Please put your Discord username so you can be contacted if a bug or
regression is found:

oleksandr037617_47021

---------

Co-authored-by: Oleksandr Shysh <oleksandr.s@develops.today>
Co-authored-by: evanpelle <evanpelle@gmail.com>
This commit is contained in:
oleksandr-shysh
2025-06-07 03:04:24 +03:00
committed by evanpelle
parent ad2928e084
commit 8a1eeacafd
11 changed files with 2194 additions and 478 deletions
+8 -6
View File
@@ -19,7 +19,7 @@ import { BuildUnitIntentEvent } from "../../Transport";
import { renderNumber } from "../../Utils";
import { Layer } from "./Layer";
interface BuildItemDisplay {
export interface BuildItemDisplay {
unitType: UnitType;
icon: string;
description?: string;
@@ -27,7 +27,7 @@ interface BuildItemDisplay {
countable?: boolean;
}
const buildTable: BuildItemDisplay[][] = [
export const buildTable: BuildItemDisplay[][] = [
[
{
unitType: UnitType.AtomBomb,
@@ -96,12 +96,14 @@ const buildTable: BuildItemDisplay[][] = [
],
];
export const flattenedBuildTable = buildTable.flat();
@customElement("build-menu")
export class BuildMenu extends LitElement implements Layer {
public game: GameView;
public eventBus: EventBus;
private clickedTile: TileRef;
private playerActions: PlayerActions | null;
public playerActions: PlayerActions | null;
private filteredBuildTable: BuildItemDisplay[][] = buildTable;
tick() {
@@ -302,7 +304,7 @@ export class BuildMenu extends LitElement implements Layer {
@state()
private _hidden = true;
private canBuild(item: BuildItemDisplay): boolean {
public canBuild(item: BuildItemDisplay): boolean {
if (this.game?.myPlayer() === null || this.playerActions === null) {
return false;
}
@@ -314,7 +316,7 @@ export class BuildMenu extends LitElement implements Layer {
return unit[0].canBuild !== false;
}
private cost(item: BuildItemDisplay): Gold {
public cost(item: BuildItemDisplay): Gold {
for (const bu of this.playerActions?.buildableUnits ?? []) {
if (bu.type === item.unitType) {
return bu.cost;
@@ -323,7 +325,7 @@ export class BuildMenu extends LitElement implements Layer {
return 0n;
}
private count(item: BuildItemDisplay): string {
public count(item: BuildItemDisplay): string {
const player = this.game?.myPlayer();
if (!player) {
return "?";