diff --git a/packages/i18n/src/unwrapper.ts b/packages/i18n/src/unwrapper.ts
index 3f155b352..d063bef17 100644
--- a/packages/i18n/src/unwrapper.ts
+++ b/packages/i18n/src/unwrapper.ts
@@ -2,7 +2,11 @@ import locales from "@blitzkit/i18n/locales.json";
import { I18nString } from "@blitzkit/protos";
export function unwrapper(locale: string) {
- return function (i18nString: I18nString) {
+ return function (i18nString?: I18nString) {
+ if (i18nString === undefined) {
+ throw new Error("i18nString is undefined");
+ }
+
if (locale in i18nString.locales) {
return i18nString.locales[locale];
}
diff --git a/packages/protos/src/blitzkit/equipment_definitions.proto b/packages/protos/src/blitzkit/equipment_definitions.proto
index ba4cf0cb4..fcd46bb19 100644
--- a/packages/protos/src/blitzkit/equipment_definitions.proto
+++ b/packages/protos/src/blitzkit/equipment_definitions.proto
@@ -1,4 +1,4 @@
-syntax = "proto2";
+syntax = "proto3";
package blitzkit;
@@ -10,8 +10,8 @@ message EquipmentDefinitions {
}
message Equipment {
- required I18nString name = 1;
- required I18nString description = 2;
+ I18nString name = 1;
+ I18nString description = 2;
}
message EquipmentPreset {
@@ -19,6 +19,5 @@ message EquipmentPreset {
}
message EquipmentSlot {
- required uint32 left = 1;
- required uint32 right = 2;
+ repeated uint32 options = 1;
}
\ No newline at end of file
diff --git a/packages/website/src/components/TankopediaLoadout/index.tsx b/packages/website/src/components/TankopediaLoadout/index.tsx
index 2c0ef6e9f..22b214d3e 100644
--- a/packages/website/src/components/TankopediaLoadout/index.tsx
+++ b/packages/website/src/components/TankopediaLoadout/index.tsx
@@ -1,30 +1,38 @@
-import type { Consumable } from "@blitzkit/core";
-import { TrashIcon } from "@radix-ui/react-icons";
+import type { Consumable, EquipmentSlot } from "@blitzkit/protos";
+import { ClockIcon, ResetIcon, TrashIcon } from "@radix-ui/react-icons";
+import { chunk } from "lodash-es";
+import { api } from "../../api/dynamic";
+import { equipmentColumns } from "../../config/equipment";
import { useConsumables } from "../../hooks/useConsumables";
-import { useProtagonistGun } from "../../hooks/useProtagonistGun";
-import { useProtagonistTank } from "../../hooks/useProtagonistTank";
+import { DuelModule, useDuel } from "../../hooks/useDuel";
+import { useEquipmentPreset } from "../../hooks/useEquipmentPreset";
import { useStrings } from "../../hooks/useStrings";
import { useTankCompatibility } from "../../hooks/useTankCompatibility";
+import { useUnwrapper } from "../../hooks/useUnwrapper";
import { Tankopedia } from "../../stores/tankopedia";
import { hasUpgrades } from "../../tankopedia/hasUpgrades";
import { vehicleStatusKeys } from "../../tankopedia/tankState";
import type { ComputedCharacteristics } from "../../types/characteristics";
+import { Button } from "../Button";
import { Heading } from "../Heading";
import { IconButton } from "../IconButton";
+import { Text } from "../Text";
import { Tooltip } from "../Tooltip";
import styles from "./index.module.css";
+const equipment = await api.equipment();
+
interface TankopediaLoadoutProps {
characteristics: ComputedCharacteristics;
}
export function TankopediaLoadout({ characteristics }: TankopediaLoadoutProps) {
- const tank = useProtagonistTank();
+ const tank = useDuel("protagonist", DuelModule.Tank);
const showModules = hasUpgrades(tank);
return (
<>
- {showModules && }
+ {/* {showModules && } */}
@@ -120,8 +128,8 @@ interface ConsumablesProps {
function Consumables({ characteristics }: ConsumablesProps) {
const strings = useStrings();
const consumables = useConsumables();
- const tank = useProtagonistTank();
- const gun = useProtagonistGun();
+ const tank = useDuel("protagonist", DuelModule.Tank);
+ const gun = useDuel("protagonist", DuelModule.Gun);
const isCompatible = useTankCompatibility(tank, gun);
return (
@@ -148,7 +156,7 @@ function Consumables({ characteristics }: ConsumablesProps) {
}
return (
-
+
);
})}
@@ -161,12 +169,12 @@ interface ConsumableProps {
consumable: Consumable;
}
-function Consumable({ id, consumable }: ConsumableProps) {
+function ConsumableEntry({ id, consumable }: ConsumableProps) {
const isSelected = Tankopedia.use((state) =>
state.protagonist.consumables.includes(id),
);
- const tank = useProtagonistTank();
- const unwrap = useUnwrap();
+ const tank = useDuel("protagonist", DuelModule.Tank);
+ const unwrap = useUnwrapper();
return (
@@ -207,15 +215,15 @@ function Consumable({ id, consumable }: ConsumableProps) {
-
+ {/*
*/}
);
}
function Equipment() {
const strings = useStrings();
- const tank = useProtagonistTank();
- const equipment = useEquipment(tank.tank!);
+ const tank = useDuel("protagonist", DuelModule.Tank);
+ const equipment = useEquipmentPreset(tank.equipment_preset);
return (
@@ -237,7 +245,7 @@ function Equipment() {
- {chunk(equipment.preset.slots, equipmentColumns).map((chunk, index) => (
+ {chunk(equipment.slots, equipmentColumns).map((chunk, index) => (
))}
@@ -246,7 +254,7 @@ function Equipment() {
}
interface EquipmentRowProps {
- chunk: BlitzStaticEquipmentPresetComponent_EquipmentSlot[];
+ chunk: EquipmentSlot[];
rowIndex: number;
}
@@ -254,7 +262,7 @@ function EquipmentRow({ chunk, rowIndex }: EquipmentRowProps) {
return (
{chunk.map((slot, index) => (
-
- {slot.options_catalog_i_ds.map((id, index) => (
+ {slot.options.map((id, index) => (
-
+ {/* */}
);
}
@@ -307,11 +319,14 @@ function EquipmentOption({
columnIndex,
}: EquipmentOptionProps) {
const equipmentIndex = rowIndex * equipmentColumns + columnIndex;
- const tank = useProtagonistTank();
- const equipment = useEquipment(tank.tank!);
- const slot = equipment.preset.slots[equipmentIndex];
- const id = slot.options_catalog_i_ds[optionIndex];
- const gameStrings = useGameStrings("EquipmentEntity");
+
+ const tank = useDuel("protagonist", DuelModule.Tank);
+ const equipmentPreset = useEquipmentPreset(tank.equipment_preset);
+ const unwrap = useUnwrapper();
+
+ const slot = equipmentPreset.slots[equipmentIndex];
+ const id = slot.options[optionIndex];
+ const specificEquipment = equipment.equipments[id];
const isSelected = Tankopedia.use(
(state) =>
@@ -320,13 +335,13 @@ function EquipmentOption({
);
return (
-
+