combined alternative modules

This commit is contained in:
tresabhi committed 2026-05-11 17:00:30 -05:00
1 parent 3a91e082d5
commit 32f6916266
3 files changed
+49 -26

No files matched your search

+2 -1
View File
@@ -199,7 +199,8 @@
"tanks": { "tanks": {
"loadout": { "loadout": {
"modules": "Modules" "modules": "Modules",
"alternative": "Alt"
}, },
"search": { "search": {
@@ -16,6 +16,8 @@
img { img {
width: 1em; width: 1em;
height: 1em; height: 1em;
transform: translate(var(--space-1), var(--space-1));
} }
.tier { .tier {
@@ -24,9 +26,5 @@
top: var(--space-2); top: var(--space-2);
} }
} }
.arrow {
display: contents;
}
} }
} }
@@ -1,6 +1,6 @@
import type { UpgradeLine } from "@blitzkit/closed/protos/game/proto/legacy/blitz_static_tank_upgrade_line"; import type { UpgradeLine } from "@blitzkit/closed/protos/game/proto/legacy/blitz_static_tank_upgrade_line";
import { romanize } from "@blitzkit/core"; import { romanize } from "@blitzkit/core";
import { Fragment } from "react"; import { Fragment, useMemo } from "react";
import { api } from "../../core/api/dynamic"; import { api } from "../../core/api/dynamic";
import { useAwait } from "../../hooks/useAwait"; import { useAwait } from "../../hooks/useAwait";
import { useStrings } from "../../hooks/useStrings"; import { useStrings } from "../../hooks/useStrings";
@@ -23,7 +23,11 @@ export function TankopediaLoadout() {
<div className={styles.lines}> <div className={styles.lines}>
{tank.tank!.upgrade_lines.map((line) => ( {tank.tank!.upgrade_lines.map((line) => (
<Line key={line.name} line={line} /> <Line
key={line.name}
line={line.name}
lines={tank.tank!.upgrade_lines}
/>
))} ))}
</div> </div>
</Section> </Section>
@@ -31,36 +35,56 @@ export function TankopediaLoadout() {
} }
interface LineProps { interface LineProps {
line: UpgradeLine; line: string;
lines: UpgradeLine[];
} }
function Line({ line }: LineProps) { const mergeLines = {
const upgrades = Tankopedia.use((state) => state.protagonist.upgrades); alternative_guns: "guns",
const id = Tankopedia.use((state) => state.protagonist.id); } as Record<string, string>;
const tank = useAwait(() => api.tank(id), `tank-${id}`);
function Line({ line, lines }: LineProps) {
const combinedLines = useMemo(() => {
const lines: string[] = [line];
for (const key in mergeLines) {
if (mergeLines[key] === line) {
lines.push(key);
}
}
return lines;
}, [line]);
return ( return (
<div className={styles.line}> <div className={styles.line}>
{line.name} {!(line in mergeLines) &&
combinedLines.map((line) => <LineInner line={line} lines={lines} />)}
</div>
);
}
{line.stages.map((stage, index) => { function LineInner({ line, lines }: LineProps) {
const isSelected = upgrades[line.name] === index; const id = Tankopedia.use((state) => state.protagonist.id);
const upgrades = Tankopedia.use((state) => state.protagonist.upgrades);
const tank = useAwait(() => api.tank(id), `tank-${id}`);
const strings = useStrings();
return lines
.find((l) => l.name === line)!
.stages.map((stage, index) => {
const isSelected = upgrades[line] === index;
return ( return (
<Fragment key={stage.tech_name}> <Fragment key={stage.tech_name}>
{/* {index !== 0 && (
<Text lowContrast className={styles.arrow}>
<CaretRightIcon width="1em" height="1em" />
</Text>
)} */}
<IconButton <IconButton
variant={isSelected ? "solid" : "surface"} variant={isSelected ? "solid" : "surface"}
radius="1" radius="1"
className={styles.stage} className={styles.stage}
onClick={() => { onClick={() => {
Tankopedia.mutate((draft) => { Tankopedia.mutate((draft) => {
draft.protagonist.upgrades[line.name] = index; draft.protagonist.upgrades[line] = index;
for (const required of stage.required_upgrades) { for (const required of stage.required_upgrades) {
for (const line of tank.tank!.upgrade_lines) { for (const line of tank.tank!.upgrade_lines) {
@@ -113,12 +137,12 @@ function Line({ line }: LineProps) {
{/* {stage.grade} */} {/* {stage.grade} */}
<Text lowContrast size="minor" className={styles.tier}> <Text lowContrast size="minor" className={styles.tier}>
{romanize(stage.number)} {line in mergeLines
? strings.tanks.loadout.alternative
: romanize(stage.number)}
</Text> </Text>
</IconButton> </IconButton>
</Fragment> </Fragment>
); );
})} });
</div>
);
} }