2026-09-23 17:37:52 -05:00
|
|
|
import type {
|
|
|
|
|
EngineDefinition,
|
|
|
|
|
GunDefinition,
|
|
|
|
|
ShellDefinition,
|
|
|
|
|
TankDefinition,
|
|
|
|
|
TrackDefinition,
|
|
|
|
|
TurretDefinition,
|
|
|
|
|
} from "@blitzkit/protos";
|
|
|
|
|
import { api } from "../api/dynamic";
|
|
|
|
|
import { Tankopedia } from "../stores/tankopedia";
|
|
|
|
|
import type { DuelSide } from "./useEquipment";
|
|
|
|
|
|
|
|
|
|
export enum DuelModule {
|
|
|
|
|
Tank,
|
|
|
|
|
Track,
|
|
|
|
|
Engine,
|
|
|
|
|
Turret,
|
|
|
|
|
Gun,
|
|
|
|
|
Shell,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const tanks = await api.tanks();
|
|
|
|
|
|
|
|
|
|
export function useDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Tank,
|
|
|
|
|
): TankDefinition;
|
|
|
|
|
export function useDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Track,
|
|
|
|
|
): TrackDefinition;
|
|
|
|
|
export function useDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Engine,
|
|
|
|
|
): EngineDefinition;
|
|
|
|
|
export function useDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Turret,
|
|
|
|
|
): TurretDefinition;
|
|
|
|
|
export function useDuel(side: DuelSide, module: DuelModule.Gun): GunDefinition;
|
|
|
|
|
export function useDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Shell,
|
|
|
|
|
): ShellDefinition;
|
|
|
|
|
|
|
|
|
|
export function useDuel(side: DuelSide, module: DuelModule) {
|
|
|
|
|
const tankId = Tankopedia.use((state) => state[side].tank);
|
|
|
|
|
const tank = tanks.tanks[tankId];
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Tank) return tank;
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Track) {
|
|
|
|
|
const trackId = Tankopedia.use((state) => state[side].track);
|
|
|
|
|
return tank.tracks.find((track) => track.id === trackId)!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Engine) {
|
|
|
|
|
const engineId = Tankopedia.use((state) => state[side].engine);
|
|
|
|
|
return tank.engines.find((engine) => engine.id === engineId)!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const turretId = Tankopedia.use((state) => state[side].turret);
|
|
|
|
|
const turret = tank.turrets.find((turret) => turret.id === turretId)!;
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Turret) return turret;
|
|
|
|
|
|
|
|
|
|
const gunId = Tankopedia.use((state) => state[side].gun);
|
|
|
|
|
const gun = turret.guns.find((gun) => gun.id === gunId)!;
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Gun) return gun;
|
|
|
|
|
|
|
|
|
|
const shellId = Tankopedia.use((state) => state[side].shell);
|
|
|
|
|
return gun.shells.find((shell) => shell.id === shellId)!;
|
|
|
|
|
}
|
2026-09-27 16:26:28 -05:00
|
|
|
|
|
|
|
|
export function getDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Tank,
|
|
|
|
|
): TankDefinition;
|
|
|
|
|
export function getDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Track,
|
|
|
|
|
): TrackDefinition;
|
|
|
|
|
export function getDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Engine,
|
|
|
|
|
): EngineDefinition;
|
|
|
|
|
export function getDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Turret,
|
|
|
|
|
): TurretDefinition;
|
|
|
|
|
export function getDuel(side: DuelSide, module: DuelModule.Gun): GunDefinition;
|
|
|
|
|
export function getDuel(
|
|
|
|
|
side: DuelSide,
|
|
|
|
|
module: DuelModule.Shell,
|
|
|
|
|
): ShellDefinition;
|
|
|
|
|
|
|
|
|
|
export function getDuel(side: DuelSide, module: DuelModule) {
|
|
|
|
|
const tank = tanks.tanks[Tankopedia.state[side].tank];
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Tank) return tank;
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Track) {
|
|
|
|
|
return tank.tracks.find(
|
|
|
|
|
(track) => track.id === Tankopedia.state[side].track,
|
|
|
|
|
)!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Engine) {
|
|
|
|
|
return tank.engines.find(
|
|
|
|
|
(engine) => engine.id === Tankopedia.state[side].engine,
|
|
|
|
|
)!;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const turret = tank.turrets.find(
|
|
|
|
|
(turret) => turret.id === Tankopedia.state[side].turret,
|
|
|
|
|
)!;
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Turret) return turret;
|
|
|
|
|
|
|
|
|
|
const gun = turret.guns.find((gun) => gun.id === Tankopedia.state[side].gun)!;
|
|
|
|
|
|
|
|
|
|
if (module === DuelModule.Gun) return gun;
|
|
|
|
|
|
|
|
|
|
return gun.shells.find((shell) => shell.id === Tankopedia.state[side].shell)!;
|
|
|
|
|
}
|