diff --git a/packages/game/game.csproj b/packages/game/game.csproj index 515925ed5..10270d57a 100644 --- a/packages/game/game.csproj +++ b/packages/game/game.csproj @@ -2,6 +2,7 @@ BlitzKit.Game net9.0 + win-x64 enable enable esm diff --git a/packages/game/src/index.ts b/packages/game/src/index.ts index 55045b8a2..29664b507 100644 --- a/packages/game/src/index.ts +++ b/packages/game/src/index.ts @@ -1 +1 @@ -export * from "../bin/Debug/net9.0/game"; +export * from "../bin/Debug/net9.0/win-x64/game"; diff --git a/packages/website-ue/src/components/HomeTanks.astro b/packages/website-ue/src/components/HomeTanks.astro index ddd4550e9..39ffcaf34 100644 --- a/packages/website-ue/src/components/HomeTanks.astro +++ b/packages/website-ue/src/components/HomeTanks.astro @@ -2,9 +2,8 @@ import { api } from "../core/api/dynamic"; import { tools } from "../core/tools/tools"; import { Heading } from "./Heading"; -import { Scroller } from "./Scroller"; +import { HomeTanksPopular } from "./HomeTanksPopular"; import { Section } from "./Section"; -import { TankCard } from "./TankCard"; import ToolCard from "./ToolCard.astro"; import ToolsWrapper from "./ToolsWrapper.astro"; @@ -13,37 +12,19 @@ interface Props { } const { locale } = Astro.props; - const strings = await api.strings(locale); -const popular = (await api.popularTanks()).tanks.slice(0, 8); - -console.log(popular.length); ---
{strings.home.tanks} - -
- {popular.map((tank) => )} -
-
+ diff --git a/packages/website-ue/src/components/HomeTanksPopular/index.module.css b/packages/website-ue/src/components/HomeTanksPopular/index.module.css new file mode 100644 index 000000000..12b9aedc3 --- /dev/null +++ b/packages/website-ue/src/components/HomeTanksPopular/index.module.css @@ -0,0 +1,9 @@ +.tanks { + z-index: 1; + + .content { + display: flex; + + gap: 2rem; + } +} diff --git a/packages/website-ue/src/components/HomeTanksPopular/index.tsx b/packages/website-ue/src/components/HomeTanksPopular/index.tsx new file mode 100644 index 000000000..0d67b8dbe --- /dev/null +++ b/packages/website-ue/src/components/HomeTanksPopular/index.tsx @@ -0,0 +1,32 @@ +import { api } from "../../core/api/dynamic"; +import { useAwait } from "../../hooks/useAwait"; +import { + LocaleProvider, + type LocaleAcceptorProps, +} from "../../hooks/useLocale"; +import { Scroller } from "../Scroller"; +import { TankCard } from "../TankCard"; +import styles from "./index.module.css"; + +export function HomeTanksPopular({ locale }: LocaleAcceptorProps) { + return ( + + + + ); +} + +function Content() { + const popular = useAwait(() => api.popularTanks(), "popular-tanks"); + const trimmed = popular.tanks.slice(0, 32); + + return ( + +
+ {trimmed.map((tank) => ( + + ))} +
+
+ ); +} diff --git a/packages/website-ue/src/components/TankCard/index.module.css b/packages/website-ue/src/components/TankCard/index.module.css index 52601ccda..7b2be21fa 100644 --- a/packages/website-ue/src/components/TankCard/index.module.css +++ b/packages/website-ue/src/components/TankCard/index.module.css @@ -2,7 +2,10 @@ display: flex; flex-direction: column; align-items: center; - gap: var(--space-2); + gap: var(--space-4); + + overflow: hidden; + min-width: min-content; .icon-wrapper { position: relative; @@ -20,12 +23,19 @@ } .icon { - width: 7rem; - aspect-ratio: 4 / 3; + width: 13rem; + height: 8rem; position: relative; - background-size: 150%; - background-position: center; + background-size: 140%; + background-position: 40% center; } } + + .name { + white-space: nowrap; + overflow: hidden; + max-width: 100%; + text-overflow: ellipsis; + } } diff --git a/packages/website-ue/src/components/TankCard/index.tsx b/packages/website-ue/src/components/TankCard/index.tsx index 86aceef9a..9b49c054a 100644 --- a/packages/website-ue/src/components/TankCard/index.tsx +++ b/packages/website-ue/src/components/TankCard/index.tsx @@ -1,8 +1,14 @@ +import { api } from "../../core/api/dynamic"; +import { useAwait } from "../../hooks/useAwait"; +import { useGameStrings } from "../../hooks/useGameStrings"; import type { PopularTank } from "../../protos/popular_tanks"; import { Text } from "../Text"; import styles from "./index.module.css"; export function TankCard({ id }: PopularTank) { + const tank = useAwait(() => api.tank(id), `tank-${id}`); + const gameStrings = useGameStrings("TankEntity"); + return (
@@ -21,7 +27,7 @@ export function TankCard({ id }: PopularTank) { />
- {id} + {gameStrings[tank.tank!.name!.value]}
); } diff --git a/packages/website-ue/src/core/api/client.ts b/packages/website-ue/src/core/api/client.ts index 747b903c4..cf1c75060 100644 --- a/packages/website-ue/src/core/api/client.ts +++ b/packages/website-ue/src/core/api/client.ts @@ -1,9 +1,10 @@ import { fetchPB } from "@blitzkit/core"; import type { Strings } from "@blitzkit/i18n"; import { Avatars } from "../../protos/avatars"; +import { PopularTanks } from "../../protos/popular_tanks"; +import { Tank } from "../../protos/tank"; import { AbstractAPI } from "./abstract"; -//@ts-expect-error export class ClientAPI extends AbstractAPI { protected _avatars() { return fetchPB("/api/avatars/all.pb", Avatars); @@ -24,4 +25,12 @@ export class ClientAPI extends AbstractAPI { const json = (await response.json()) as Strings; return json; } + + protected _popularTanks() { + return fetchPB("/api/tanks/popular.pb", PopularTanks); + } + + protected _tank(id: string) { + return fetchPB(`/api/tanks/${id}.pb`, Tank); + } } diff --git a/packages/website-ue/src/core/game/game.ts b/packages/website-ue/src/core/game/game.ts index 1a6efb54a..696ab4e8e 100644 --- a/packages/website-ue/src/core/game/game.ts +++ b/packages/website-ue/src/core/game/game.ts @@ -1,5 +1,5 @@ import { GameInterface } from "@blitzkit/game"; export const game = new GameInterface( - "/mnt/c/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest", + "C:/Program Files (x86)/Steam/steamapps/common/World of Tanks Blitz Playtest", ); diff --git a/packages/website-ue/src/pages/api/tanks/popular.pb.ts b/packages/website-ue/src/pages/api/tanks/popular.pb.ts new file mode 100644 index 000000000..1e2a2fcde --- /dev/null +++ b/packages/website-ue/src/pages/api/tanks/popular.pb.ts @@ -0,0 +1,7 @@ +import { api } from "../../../core/api/dynamic"; +import { PopularTanks } from "../../../protos/popular_tanks"; + +export async function GET() { + const popular = await api.popularTanks(); + return new Response(PopularTanks.encode(popular).finish()); +}