feat: abilites

This commit is contained in:
TrèsAbhi committed 2024-08-16 12:52:29 -05:00
1 parent b25814e399
commit e9d5de7e97
10 files changed
+101 -55

No files matched your search

+33 -3
View File
@@ -499,18 +499,33 @@ export async function definitions(production: boolean) {
const squadBattleTypeStyles = await readYAMLDVPL<SquadBattleTypeStyles>( const squadBattleTypeStyles = await readYAMLDVPL<SquadBattleTypeStyles>(
`${DATA}/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml.dvpl`, `${DATA}/UI/Screens3/Lobby/Hangar/Squad/SquadBattleType.yaml.dvpl`,
); );
const gameTypeSelectorStyles = await readYAMLDVPL<SquadBattleTypeStyles>(
`${DATA}/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml.dvpl`,
);
const gameModeNativeNames: Record<string, number> = {};
for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll( for (const match of squadBattleTypeStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll(
/"(\d+)" -> "(battleType\/[a-zA-Z]+)"/g, /"(\d+)" -> "(battleType\/([a-zA-Z]+))"/g,
)) { )) {
const id = Number(match[1]); const id = Number(match[1]);
const name = strings[match[2]]; const name = strings[match[2]];
gameModeNativeNames[match[3]] = id;
gameDefinitions.gameModes[id] = { gameDefinitions.gameModes[id] = {
name, name,
}; };
} }
for (const match of gameTypeSelectorStyles.Prototypes[0].components.UIDataLocalBindingsComponent.data[1][2].matchAll(
/eGameMode\.([a-zA-Z]+) -> "~res:\/Gfx\/UI\/Hangar\/GameTypes\/battle-type_([^"]+)"/g,
)) {
Object.entries(gameModeNativeNames).forEach(([key, value]) => {
if (key.toLowerCase() === match[2].toLowerCase()) {
gameModeNativeNames[match[1]] = value;
}
});
}
camouflagesXmlEntries.forEach(([camoKey, camo]) => { camouflagesXmlEntries.forEach(([camoKey, camo]) => {
const yamlEntry = camouflagesYaml[camoKey]; const yamlEntry = camouflagesYaml[camoKey];
const fullName = yamlEntry.userString const fullName = yamlEntry.userString
@@ -706,7 +721,7 @@ export async function definitions(production: boolean) {
tankDefinitions[tankId] = { tankDefinitions[tankId] = {
id: tankId, id: tankId,
roles: tank.combatRole ?? {}, roles: {},
camouflages: camouflages.length === 0 ? undefined : camouflages, camouflages: camouflages.length === 0 ? undefined : camouflages,
description: description:
wargamingTankopedia.data[tankId]?.description ?? undefined, wargamingTankopedia.data[tankId]?.description ?? undefined,
@@ -747,6 +762,22 @@ export async function definitions(production: boolean) {
tracks: [], tracks: [],
}; };
if (tank.combatRole) {
Object.entries(tank.combatRole).forEach(([gameMode, role]) => {
const id = Object.entries(gameModeNativeNames).find(
([key]) => key.toLowerCase() === gameMode.toLowerCase(),
)?.[1];
if (id === undefined) {
throw new Error(
`Unknown game mode in tank ${tankKey}: ${gameMode}`,
);
}
tankDefinitions[tankId].roles[id] = role;
});
}
if (tankDefinitions[tankId].name === tankDefinitions[tankId].nameFull) { if (tankDefinitions[tankId].name === tankDefinitions[tankId].nameFull) {
delete tankDefinitions[tankId].nameFull; delete tankDefinitions[tankId].nameFull;
} }
@@ -1336,7 +1367,6 @@ export async function definitions(production: boolean) {
}; };
}); });
return;
await commitAssets( await commitAssets(
'definitions', 'definitions',
[ [
@@ -6,7 +6,9 @@ import { FileChange } from '../../src/core/blitzkit/commitMultipleFiles';
import { DATA } from './constants'; import { DATA } from './constants';
import { SquadBattleTypeStyles } from './definitions'; import { SquadBattleTypeStyles } from './definitions';
export async function gameModeIcons(production: boolean) { export async function gameModeBanners(production: boolean) {
console.log('Building game mode banners...');
const changes: FileChange[] = []; const changes: FileChange[] = [];
const gameTypeSelectorStyles = await readYAMLDVPL<SquadBattleTypeStyles>( const gameTypeSelectorStyles = await readYAMLDVPL<SquadBattleTypeStyles>(
`${DATA}/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml.dvpl`, `${DATA}/UI/Screens/Lobby/Hangar/GameTypeSelector.yaml.dvpl`,
@@ -48,5 +50,5 @@ export async function gameModeIcons(production: boolean) {
}); });
} }
await commitAssets('game mode icons', changes, production); await commitAssets('game mode banners', changes, production);
} }
+2 -2
View File
@@ -17,7 +17,7 @@ import { consumableProvisionIcons } from './consumableProvisionIcons';
import { currencies } from './currencies'; import { currencies } from './currencies';
import { definitions } from './definitions'; import { definitions } from './definitions';
import { equipmentIcons } from './equipmentIcons'; import { equipmentIcons } from './equipmentIcons';
import { gameModeIcons } from './gameModeIcons'; import { gameModeBanners } from './gameModeBanners';
import { moduleIcons } from './moduleIcons'; import { moduleIcons } from './moduleIcons';
import { scratchedFlags } from './scratchedFlags'; import { scratchedFlags } from './scratchedFlags';
import { shellIcons } from './shellIcons'; import { shellIcons } from './shellIcons';
@@ -30,7 +30,7 @@ import { videos } from './videos';
if (!targets && !allTargets) throw new Error('No target(s) specified'); if (!targets && !allTargets) throw new Error('No target(s) specified');
const methods = [ const methods = [
gameModeIcons, gameModeBanners,
definitions, definitions,
tankIcons, tankIcons,
videos, videos,
@@ -0,0 +1,56 @@
import { Box, Flex, Heading } from '@radix-ui/themes';
import { use } from 'react';
import { asset } from '../../../../../../core/blitzkit/asset';
import { gameDefinitions } from '../../../../../../core/blitzkit/gameDefinitions';
import * as Duel from '../../../../../../stores/duel';
export function GameModeSection() {
const tank = Duel.use((state) => state.protagonist.tank);
const awaitedGameDefinitions = use(gameDefinitions);
return (
<Flex direction="column" gap="4" align="center">
<Heading size="6">Game mode abilities</Heading>
<Flex justify="center" gap="4" wrap="wrap">
{Object.entries(tank.roles).map(([key, value]) => {
const id = Number(key);
const gameMode = awaitedGameDefinitions.gameModes[id];
return (
<Flex
// width="256px"
height="256px"
overflow="hidden"
style={{
borderRadius: 'var(--radius-3)',
background: `url(${asset(`icons/game_mode_banners/${id}.webp`)})`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
>
<Box
style={{
aspectRatio: '1 / 2',
background: `url(${asset(`icons/game_mode_banners/${id}.webp`)})`,
backgroundSize: 'cover',
backgroundPosition: 'center',
}}
/>
<Flex
flexGrow="1"
p="3"
style={{
backdropFilter: 'blur(4rem)',
}}
>
<Heading size="4">{gameMode.name}</Heading>
</Flex>
</Flex>
);
})}
</Flex>
</Flex>
);
}
@@ -1,30 +0,0 @@
import { Flex, Link, Text } from '@radix-ui/themes';
import PageWrapper from '../../../../../../components/PageWrapper';
import { PatreonIcon } from '../../../../../../icons/Patreon';
export function TankopediaPlug() {
return (
<PageWrapper>
<Flex justify="center">
<Text>
Liking BlitzKit? Consider donating on{' '}
<Link
href="https://www.patreon.com/tresabhi"
target="_blank"
underline="hover"
>
<PatreonIcon
style={{
width: '1em',
height: '1em',
transform: 'translateY(12.5%)',
}}
/>{' '}
Patreon
</Link>
.
</Text>
</Flex>
</PageWrapper>
);
}
@@ -126,6 +126,7 @@ export function TechTreeSection() {
return ( return (
<Flex <Flex
my="6"
p="5" p="5"
style={{ style={{
overflow: 'hidden', overflow: 'hidden',
+2
View File
@@ -8,6 +8,7 @@ import * as Duel from '../../../../stores/duel';
import * as TankopediaEphemeral from '../../../../stores/tankopediaEphemeral'; import * as TankopediaEphemeral from '../../../../stores/tankopediaEphemeral';
import { HistorySection } from './components/HistorySection'; import { HistorySection } from './components/HistorySection';
import { CharacteristicsSection } from './components/Model/CharacteristicsSection'; import { CharacteristicsSection } from './components/Model/CharacteristicsSection';
import { GameModeSection } from './components/Model/GameModeSection';
import { HeroSection } from './components/Model/HeroSection'; import { HeroSection } from './components/Model/HeroSection';
import { TechTreeSection } from './components/Model/TechTreeSection'; import { TechTreeSection } from './components/Model/TechTreeSection';
import { ShotDisplaySection } from './components/ShotDisplaySection'; import { ShotDisplaySection } from './components/ShotDisplaySection';
@@ -79,6 +80,7 @@ export default function Page({ params }: { params: { id: string } }) {
{!exempt && <AdMidSectionResponsive />} {!exempt && <AdMidSectionResponsive />}
<CharacteristicsSection /> <CharacteristicsSection />
{!exempt && <AdMidSectionResponsive />} {!exempt && <AdMidSectionResponsive />}
<GameModeSection />
<TechTreeSection /> <TechTreeSection />
<VideoSection /> <VideoSection />
<HistorySection /> <HistorySection />
@@ -7,7 +7,6 @@ import { useArmor } from '../../../hooks/useArmor';
import { useTankModelDefinition } from '../../../hooks/useTankModelDefinition'; import { useTankModelDefinition } from '../../../hooks/useTankModelDefinition';
import { useTankTransform } from '../../../hooks/useTankTransform'; import { useTankTransform } from '../../../hooks/useTankTransform';
import * as Duel from '../../../stores/duel'; import * as Duel from '../../../stores/duel';
import * as TankopediaPersistent from '../../../stores/tankopediaPersistent';
import { ModelTankWrapper } from './ModelTankWrapper'; import { ModelTankWrapper } from './ModelTankWrapper';
import { PrimaryArmorSceneComponent } from './PrimaryArmorSceneComponent'; import { PrimaryArmorSceneComponent } from './PrimaryArmorSceneComponent';
@@ -29,13 +28,6 @@ export const PrimaryArmorScene = memo(() => {
const hullOrigin = correctZYTuple(trackModelDefinition.origin); const hullOrigin = correctZYTuple(trackModelDefinition.origin);
const turretOrigin = correctZYTuple(tankModelDefinition.turretOrigin); const turretOrigin = correctZYTuple(tankModelDefinition.turretOrigin);
const gunOrigin = correctZYTuple(turretModelDefinition.gunOrigin); const gunOrigin = correctZYTuple(turretModelDefinition.gunOrigin);
const tankopediaPersistentStore = TankopediaPersistent.useStore();
console.log(
tankModelDefinition.armor,
turretModelDefinition.armor,
gunModelDefinition.armor,
);
useTankTransform(protagonist, turretContainer, gunContainer); useTankTransform(protagonist, turretContainer, gunContainer);
-2
View File
@@ -75,8 +75,6 @@ export function tankCharacteristics(
provisionDefinitions: ProvisionDefinitions; provisionDefinitions: ProvisionDefinitions;
}, },
) { ) {
console.log(tank.crew);
const presetRows = equipmentDefinitions.presets[tank.equipment]; const presetRows = equipmentDefinitions.presets[tank.equipment];
const turretModelDefinition = tankModelDefinition.turrets[turret.id]; const turretModelDefinition = tankModelDefinition.turrets[turret.id];
const gunModelDefinition = turretModelDefinition.guns[gun.id]; const gunModelDefinition = turretModelDefinition.guns[gun.id];
+3 -8
View File
@@ -40,7 +40,7 @@ export type ModuleDefinition =
| GunDefinition; | GunDefinition;
export interface TankDefinition { export interface TankDefinition {
id: number; id: number;
roles: Record<string, string>; roles: Record<number, string>;
description?: string; description?: string;
fixedCamouflage?: boolean; fixedCamouflage?: boolean;
camouflages?: number[]; camouflages?: number[];
@@ -173,13 +173,8 @@ export const tankDefinitions = fetchCdonLz4<TankDefinitions>(
asset('definitions/tanks.cdon.lz4'), asset('definitions/tanks.cdon.lz4'),
); );
const entries = new Promise<TankDefinition[]>(async (resolve) => { export const tanksDefinitionsArray = tankDefinitions.then((tanks) =>
resolve(Object.entries(await tankDefinitions).map(([, entry]) => entry)); Object.values(tanks),
});
export const tanksDefinitionsArray = new Promise<TankDefinition[]>(
async (resolve) => {
resolve((await entries).map((entry) => entry)); // TODO: wtf?
},
); );
export type Tier = (typeof TIERS)[number]; export type Tier = (typeof TIERS)[number];