feat: start of mechanics

This commit is contained in:
TrèsAbhi committed 2025-12-26 20:07:22 -06:00
1 parent 01409985a2
commit da1af66c77
6 files changed
+37 -21

No files matched your search

@@ -1,12 +1,11 @@
import { TankClass } from "@blitzkit/core"; import { TankClass } from "@blitzkit/core";
import type { CompensationComponent } from "@protos/blitz_static_compensation_component";
import { type TankCatalogComponent } from "@protos/blitz_static_tank_component";
import { import {
ShellUpgrageSingleChange_AttributeName, ShellUpgrageSingleChange_AttributeName,
StageParameters, StageParameters,
TankAttributeChange_AttributeName, TankAttributeChange_AttributeName,
} from "@protos/blitz_static_tank_upgrade_single_stage"; } from "@protos/blitz_static_tank_upgrade_single_stage";
import { radToDeg } from "three/src/math/MathUtils.js"; import { radToDeg } from "three/src/math/MathUtils.js";
import type { Tank } from "../../protos/tank";
import { applyPitchYawLimits } from "./applyPitchYawLimits"; import { applyPitchYawLimits } from "./applyPitchYawLimits";
import { TerrainHardness, type TankState } from "./tankState"; import { TerrainHardness, type TankState } from "./tankState";
@@ -19,9 +18,8 @@ type Characteristic = (helpers: {
shell: (name: ShellUpgrageSingleChange_AttributeName) => number; shell: (name: ShellUpgrageSingleChange_AttributeName) => number;
shellSafe: (name: ShellUpgrageSingleChange_AttributeName) => number | null; shellSafe: (name: ShellUpgrageSingleChange_AttributeName) => number | null;
state: TankState; state: TankState;
tank: TankCatalogComponent; tank: Tank;
parameters: StageParameters; parameters: StageParameters;
compensation: CompensationComponent;
id: string; id: string;
}) => CharacteristicOutput; }) => CharacteristicOutput;
@@ -349,7 +347,7 @@ export const characteristics = {
}, },
class({ tank }) { class({ tank }) {
return tank.tank_class; return tank.tank!.tank_class;
}, },
camouflage({ attribute, characteristic, attributeSafe, state }) { camouflage({ attribute, characteristic, attributeSafe, state }) {
@@ -396,26 +394,30 @@ export const characteristics = {
}, },
nation({ tank }) { nation({ tank }) {
return tank.nation; return tank.tank!.nation;
}, },
name({ tank }) { name({ tank }) {
return tank.name!.value; return tank.tank!.name!.value;
}, },
tier({ tank }) { tier({ tank }) {
return tank.tier_catalog_id; return tank.tank!.tier_catalog_id;
}, },
type({ tank }) { type({ tank }) {
return tank.tank_type; return tank.tank!.tank_type;
}, },
id({ id }) { id({ id }) {
return id; return id;
}, },
compensation({ compensation }) { slug({ tank }) {
return compensation.compensation?.currency_reward?.amount ?? null; return tank.slug;
},
compensation({ tank }) {
return tank.compensation!.compensation?.currency_reward?.amount ?? null;
}, },
} satisfies Record<string, Characteristic>; } satisfies Record<string, Characteristic>;
@@ -57,6 +57,7 @@ export const characteristicsOrder: CharacteristicsOrder = [
}, },
{ name: "compensation" }, { name: "compensation" },
{ name: "id" }, { name: "id" },
{ name: "slug" },
], ],
}, },
{ {
@@ -1,9 +1,8 @@
import type { CompensationComponent } from "@protos/blitz_static_compensation_component";
import type { TankCatalogComponent } from "@protos/blitz_static_tank_component";
import { import {
ShellUpgrageSingleChange_AttributeName, ShellUpgrageSingleChange_AttributeName,
TankAttributeChange_AttributeName, TankAttributeChange_AttributeName,
} from "@protos/blitz_static_tank_upgrade_single_stage"; } from "@protos/blitz_static_tank_upgrade_single_stage";
import type { Tank } from "../../protos/tank";
import { aggregateStageParameters } from "./aggregateStageParameters"; import { aggregateStageParameters } from "./aggregateStageParameters";
import { import {
characteristics, characteristics,
@@ -19,13 +18,12 @@ export type ComputedCharacteristics = Record<
export function computeCharacteristics( export function computeCharacteristics(
id: string, id: string,
tank: TankCatalogComponent, tank: Tank,
compensation: CompensationComponent,
state: TankState state: TankState
) { ) {
const parameters = aggregateStageParameters( const parameters = aggregateStageParameters(
tank.base_stats!, tank.tank!.base_stats!,
tank.upgrade_stages.slice(0, state.stage) tank.tank!.upgrade_stages.slice(0, state.stage)
); );
const computed: Partial<ComputedCharacteristics> = {}; const computed: Partial<ComputedCharacteristics> = {};
@@ -97,7 +95,6 @@ export function computeCharacteristics(
tank, tank,
parameters, parameters,
id, id,
compensation,
}); });
computed[name] = value; computed[name] = value;
} }
@@ -0,0 +1,12 @@
import type { APIContext } from "astro";
import { api } from "../../../core/api/dynamic";
export { getStaticPaths } from "./[id].pb";
/**
* Even Noah can't save these animals.
*/
export async function GET({ params }: APIContext<never, { id: string }>) {
const tank = await api.tank(params.id);
return Response.json(tank);
}
@@ -4,7 +4,6 @@ import { Tank } from "../../../protos/tank";
export const getStaticPaths = (async () => { export const getStaticPaths = (async () => {
const { list } = await api.tankList(); const { list } = await api.tankList();
return list.map(({ id }) => ({ params: { id } })); return list.map(({ id }) => ({ params: { id } }));
}) satisfies GetStaticPaths; }) satisfies GetStaticPaths;
@@ -27,8 +27,7 @@ function Content({ id }: { id: string }) {
const protagonist = Tankopedia.use((state) => state.protagonist); const protagonist = Tankopedia.use((state) => state.protagonist);
const compare = Tankopedia.use((state) => state.compare); const compare = Tankopedia.use((state) => state.compare);
const characteristics = useMemo( const characteristics = useMemo(
() => () => computeCharacteristics(id, tank, protagonist),
computeCharacteristics(id, tank.tank!, tank.compensation!, protagonist),
[protagonist] [protagonist]
); );
// const otherCharacteristics = useMemo( // const otherCharacteristics = useMemo(
@@ -53,6 +52,12 @@ function Content({ id }: { id: string }) {
<> <>
<h1>{id}</h1> <h1>{id}</h1>
<div style={{ display: "flex", flexWrap: "wrap", gap: "1rem" }}>
{tank.tank?.feature_screens?.tags.map((tag) => (
<span>{tag.value}</span>
))}
</div>
<br /> <br />
<div style={{ display: "flex", flexWrap: "wrap" }}> <div style={{ display: "flex", flexWrap: "wrap" }}>