Compare commits

...
6 Commits
Author SHA1 Message Date
tresabhi a38239a6f9 tankClassOrder 2026-09-23 13:58:29 -05:00
tresabhi 9e26da3205 checkpoint 2026-09-23 13:48:50 -05:00
tresabhi 750bdd236a useCompatibility 2026-09-23 10:39:12 -05:00
tresabhi 33bb8ead3c reorganize 2026-09-23 10:25:47 -05:00
tresabhi 79e282e70e strings 2026-09-23 10:23:59 -05:00
tresabhi e911f36ea3 createTankStatus 2026-09-23 10:22:57 -05:00
104 changed files with 360 additions and 598 deletions

No files matched your search

+2 -2
View File
@@ -1,2 +1,2 @@
export * from './fetchPB';
export * from './pbMap';
export * from "./fetchJSON";
export * from "./fetchPB";
-41
View File
@@ -1,41 +0,0 @@
import { TankClass, TankType } from "@blitzkit/protos";
import type { BlitzStats } from "../statistics";
export const TANK_TYPES = [
TankType.TANK_TYPE_RESEARCHABLE,
TankType.TANK_TYPE_PREMIUM,
TankType.TANK_TYPE_COLLECTOR,
];
export const TANK_TYPE_COMMAND_NAMES = {
[TankType.TANK_TYPE_RESEARCHABLE]: "researchable",
[TankType.TANK_TYPE_PREMIUM]: "premium",
[TankType.TANK_TYPE_COLLECTOR]: "collector",
};
export const TANK_CLASSES = [
TankClass.TANK_CLASS_LIGHT,
TankClass.TANK_CLASS_MEDIUM,
TankClass.TANK_CLASS_HEAVY,
TankClass.TANK_CLASS_TANK_DESTROYER,
];
export const emptyAllStats: BlitzStats = {
battles: 0,
capture_points: 0,
damage_dealt: 0,
damage_received: 0,
dropped_capture_points: 0,
frags: 0,
frags8p: 0,
hits: 0,
losses: 0,
max_frags: 0,
max_xp: 0,
shots: 0,
spotted: 0,
survived_battles: 0,
xp: 0,
win_and_survived: 0,
wins: 0,
};
-1
View File
@@ -1,7 +1,6 @@
export * from "./canSplash";
export * from "./clans";
export * from "./classes";
export * from "./constants";
export * from "./equipmentPrice";
export * from "./fetchBlitz";
export * from "./fetchGlossary";
@@ -11,12 +11,10 @@ export abstract class ServerBlitzKitAPI6 extends ServerBlitzKitAPI5 {
async consumables() {
const consumableDefinitions = ConsumableDefinitions.create();
Object.entries(this.consumablesCommon).forEach(([key, consumable]) => {
Object.entries(this.consumablesCommon).forEach(([, consumable]) => {
const entry: Consumable = {
id: consumable.id,
game_mode_exclusive: "gameModeFilter" in consumable,
cooldown: consumable.script.cooldown,
duration: consumable.script.duration,
name: this.getString(consumable.userString),
exclude: [],
include: [],
@@ -3,7 +3,6 @@ import {
ProvisionDefinitions,
TankDefinition,
} from "../../../protos/src/blitzkit";
import { checkConsumableProvisionInclusivity } from "./checkConsumableProvisionInclusivity";
export function availableProvisions(
tank: TankDefinition,
@@ -1,22 +0,0 @@
import { emptyAllStats } from '../../blitz/constants';
import { Samples } from '../../../../protos/src/blitzkit';
import type { BlitzkitStats } from '../../statistics';
export const emptyAverageDefinitionsAllStats: BlitzkitStats = {
...emptyAllStats,
battle_life_time: 0,
};
export const averageDefinitionsAllStatsKeys = Object.keys(
emptyAverageDefinitionsAllStats,
) as (keyof BlitzkitStats)[];
export const emptySamples: Samples = {
d_1: 0,
d_7: 0,
d_30: 0,
d_60: 0,
d_90: 0,
d_120: 0,
total: 0,
};
@@ -1,17 +0,0 @@
import { staticAsset } from "@blitzkit/core";
import { AverageDefinitions } from "../../../../protos/src/blitzkit";
import { fetchPB } from "../../api";
export interface AverageDefinitionsManifest {
version: 1;
/**
* epoch in days
*/
latest: number;
}
export async function fetchAverage() {
return await fetchPB(staticAsset("averages.pb"), AverageDefinitions);
}
export * from "./constants";
-1
View File
@@ -2,7 +2,6 @@ export * from "./alias";
export * from "./api";
export * from "./assertSecret";
export * from "./availableProvisions";
export * from "./averageDefinitions";
export * from "./coefficient";
export * from "./createDefaultProvisions";
export * from "./createDefaultSkills";
+5 -9
View File
@@ -1,11 +1,6 @@
import { GameDefinitions, TankDefinition, TankType } from "@blitzkit/protos";
import { TANK_CLASSES } from "../blitz/constants";
const treeTypeOrder = [
TankType.TANK_TYPE_RESEARCHABLE,
TankType.TANK_TYPE_PREMIUM,
TankType.TANK_TYPE_COLLECTOR,
];
import { GameDefinitions, TankDefinition } from "@blitzkit/protos";
import { tankClassOrder } from "../config/tankClassOrder";
import { treeTypeOrder } from "../config/treeTypeOrder";
export function metaSortTank(
tanks: TankDefinition[],
@@ -17,7 +12,8 @@ export function metaSortTank(
(a, b) => treeTypeOrder.indexOf(b.type) - treeTypeOrder.indexOf(a.type),
)
.sort(
(a, b) => TANK_CLASSES.indexOf(b.class) - TANK_CLASSES.indexOf(a.class),
(a, b) =>
tankClassOrder.indexOf(b.class) - tankClassOrder.indexOf(a.class),
)
.sort(
(a, b) =>
@@ -0,0 +1,8 @@
import { TankClass } from "@blitzkit/protos";
export const tankClassOrder = [
TankClass.TANK_CLASS_LIGHT,
TankClass.TANK_CLASS_MEDIUM,
TankClass.TANK_CLASS_HEAVY,
TankClass.TANK_CLASS_TANK_DESTROYER,
];
@@ -0,0 +1,7 @@
import { TankType } from "@blitzkit/protos";
export const treeTypeOrder = [
TankType.TANK_TYPE_RESEARCHABLE,
TankType.TANK_TYPE_PREMIUM,
TankType.TANK_TYPE_COLLECTOR,
];
+83 -314
View File
@@ -1,4 +1,87 @@
{
"tanks": {
"characteristics": {
"titles": {
"gun": "Gun",
"clip": "Clip",
"shell": "Shell",
"accuracy": "Accuracy",
"flexibility": "Flexibility",
"maneuverability": "Maneuverability",
"survivability": "Survivability",
"concealment": "Concealment"
},
"items": {
"gun_type": "Gun type",
"dpm": "Damage per minute",
"damage": "Damage",
"module_damage": "Module damage",
"reload": "Reload",
"reloads": "Reloads",
"clipping_potential": "Clipping potential",
"clip_size": "Clip size",
"optimal_shell": "Optimal shell",
"intra_clip": "Intra-clip",
"burst_size": "Burst size",
"intra_burst": "Intra-burst",
"penetration": "Penetration",
"penetration_loss_by_distance": "Penetration loss by distance",
"penetration_loss_after_ricochet": "Penetration loss after ricochet",
"shell_velocity": "Shell velocity",
"shell_range": "Shell range",
"shell_capacity": "Shell capacity",
"caliber": "Caliber",
"normalization": "Normalization",
"ricochet": "Ricochet",
"aim_time": "Aim time",
"dispersion": "Dispersion",
"dispersion_angle": "Dispersion angle",
"gun_depression": "Gun depression",
"gun_elevation": "Gun elevation",
"azimuth_left": "Azimuth left",
"azimuth_right": "Azimuth right",
"speed_forward": "Speed forward",
"speed_backward": "Speed backward",
"engine_power": "Engine power",
"brake_force": "Brake force",
"weight": "Weight",
"power_to_weight": "Power to weight",
"terrain_coefficient": "Terrain coefficient",
"hull_traverse_speed": "Hull traverse speed",
"turret_traverse_speed": "Turret traverse speed",
"gun_traverse_speed": "Gun traverse speed",
"health": "Health",
"fire_chance": "Fire chance",
"fire_rate": "Fire rate",
"ramming_resistance": "Ramming resistance",
"view_range": "View range",
"camouflage": "Camouflage",
"width": "Width",
"height": "Height",
"length": "Length"
}
},
"navigation": {
"tank": "Tank",
"characteristics": "Characteristics"
},
"loadout": {
"dynamics": "Dynamics",
"status": "Status",
"consumables": "Consumables",
"modules": "Modules",
"equipment": "Equipment",
"alternative": "Alt"
},
"search": {
"placeholder": "Search tanks..."
}
},
"home": {
"tanks": "Tanks",
"players": "Players",
@@ -424,320 +507,6 @@
"tier": "Tier {tier}"
},
"tanks": {
"search": "Search a stat...",
"name": "Tankopedia",
"description": "Blitz tank encyclopedia",
"seo_description": "Statistics, armor, and more for all tanks in World of Tanks Blitz",
"tank_seo_title": "{name} - Tier {tier} {nationality} {class} | {website} Tankopedia | World of Tanks Blitz (WoTB)",
"tank_seo_description": "{name} armor, statistics, equipment, provisions, and more. {dpm} DPM, {alpha}hp alpha, {penetration}mm penetration, {speed}kph top speed, {health}hp health.",
"visualizers": {
"reload": {
"skip": "Skip"
},
"assault": {
"title": "Assault shells"
},
"rotator": {
"hull": "Hull",
"turret": "Turret",
"hard": "Hard",
"medium": "Medium",
"soft": "Soft",
"effective": "Effective"
},
"ricochet": {
"angle": "Angle",
"normalization": "Normalization",
"effective_angle": "Effective angle",
"armor": "Armor",
"no_ricochet": "Explosive shells don't ricochet"
},
"view_range": {
"camo": "Camo",
"ghost_factory": "Ghost Factory",
"dead_rail": "Dead Rail"
},
"flexibility": {
"yaw": "Yaw",
"pitch": "Pitch",
"min": "Min",
"max": "Max"
}
},
"sandbox": {
"poses": {
"hull_down": "Hull down",
"face_hug": "Face hug",
"default": "Default"
},
"settings": {
"armor": "Armor",
"green_penetration": "Green penetration",
"hide_model_under_armor": "Hide model under armor",
"opaque": "Opaque",
"dev_wireframe": "DEV: wireframe"
},
"screenshot": {
"download": "Download",
"copy": "Copy"
},
"model": {
"name": "Model"
},
"dynamic": {
"name": "Dynamic armor",
"custom_shell": {
"type": "Type",
"caliber": "Caliber",
"penetration": "Penetration",
"normalization": "Normalization",
"ricochet": "Ricochet",
"explosion_radius": "Explosion radius",
"exit": "Exit",
"reset": "Reset"
},
"advanced": "Advanced highlighting",
"shot_card": {
"element": {
"primary": "Primary",
"spaced": "Spaced",
"external": "External",
"gap": "Gap",
"gun": "Gun",
"track": "Tracks"
},
"status": {
"penetration": "{damage}hp penetration",
"blocked": "Blocked",
"ricochet": "Ricochet",
"splash": "{damage}hp splash"
},
"stats": {
"thickness_and_angle": "{thickness}mm {angle}°",
"nominal": "{thickness}mm nominal",
"ricochet_loss": "{loss}% penetration"
}
}
},
"static": {
"name": "Static armor",
"primary": "Primary",
"spaced": "Spaced",
"external": "External",
"edit": {
"label": "Edit",
"reset": "Reset"
}
}
},
"meta": {
"back": "Back",
"compare": "Compare",
"swap": {
"button": "Swap",
"title": "Swap tanks"
},
"vanilla": "Vanilla",
"opentest": "OpenTest",
"full_name": "Full name",
"nation": "Nation",
"class": "Class",
"tier": "Tier",
"type": "Type",
"dev_id": "DEV: ID",
"dev_name": "DEV: NAME",
"purchase": "Purchase price",
"restoration": "Restoration price",
"sale": "Sale price",
"research": "Research XP"
},
"tech_tree": {
"title": "Tech tree",
"battle": "1 battle",
"battles": "{count} battles",
"route": "Route {index} of {count}"
},
"game_modes": {
"title": "Game mode abilities"
},
"review": {
"title": "Review videos",
"join": "Apply to {name} YouTuber program"
},
"configuration": {
"title": "Configuration",
"equalizer": {
"title": "Equalizer",
"equalize": "Equalize",
"beta": "Beta"
},
"modules": {
"title": "Modules",
"stock": "Stock",
"upgrade": "Upgrade"
},
"equipment": {
"title": "Equipment",
"clear": "Clear"
},
"provisions": {
"title": "Provisions",
"clear": "Clear"
},
"consumables": {
"title": "Consumables",
"clear": "Clear",
"info": "Yellow consumables do not affect the statistics."
},
"skills": {
"title": "Crew skills",
"clear": "Clear",
"maximize": "Maximize",
"info": "Yellow skills only apply under special circumstances. Hold Space to quickly toggle between level 0 and 7."
},
"miscellaneous": {
"title": "Miscellaneous"
}
},
"characteristics": {
"title": "Characteristics",
"compare": {
"label": "Compare",
"class": "{tier} {class}",
"tier": "All tier {tier}",
"all": "All tanks"
},
"values": {
"shell_index": "Shell {index}",
"at_distance": "At {distance}m",
"at_distance_slider_label": "Distance",
"dispersion_at_distance": "Dispersion at {distance}m",
"gun_flexibility": "Gun flexibility",
"speed": "Speed",
"terrain_coefficients": "Terrain coefficients",
"raw_terrain_coefficients": "Raw terrain coefficients",
"power_to_weight_ratio": "Power to weight ratio",
"hull_traverse_speed": "Hull traverse speed",
"camouflage": "Camouflage",
"reload": "Reload",
"crewCount": "Crew count",
"shellNormalization": "Normalization",
"shellRicochet": "Ricochet",
"dpm": "DPM",
"dpmEffective": "Effective at 60s",
"shells": "Shells",
"mostOptimalShellIndex": "Most optimal shell",
"shellReloads": "Reloads",
"shellReload": "Reload",
"intraClip": "Intra-clip",
"caliber": "Caliber",
"penetration": "Penetration",
"damage": "Damage",
"damageWithoutAssault": "Damage without assault shells",
"clipDamage": "Clipping potential",
"moduleDamage": "Module damage",
"explosionRadius": "Explosion radius",
"shellVelocity": "Shell velocity",
"aimTime": "Aim time",
"dispersion": "Dispersion still",
"dispersionMoving": "Moving",
"dispersionHullTraversing": "Hull traversing",
"dispersionTurretTraversing": "Turret traversing",
"dispersionShooting": "Shooting",
"dispersionGunDamaged": "Gun damaged",
"gunDepression": "Depression",
"gunElevation": "Elevation",
"gunFrontalDepression": "Frontal depression",
"gunFrontalElevation": "Frontal elevation",
"gunRearDepression": "Rear depression",
"gunRearElevation": "Rear elevation",
"azimuthLeft": "Azimuth left",
"azimuthRight": "Azimuth right",
"speedForwards": "Speed forwards",
"speedBackwards": "Backwards",
"hardTerrainCoefficient": "Terrain coefficient hard",
"hardTerrainCoefficientRaw": "Raw terrain coefficient hard",
"mediumTerrainCoefficient": "Medium",
"mediumTerrainCoefficientRaw": "Medium",
"softTerrainCoefficient": "Soft",
"softTerrainCoefficientRaw": "Soft",
"enginePower": "Engine power",
"powerToWeightRatioHardTerrain": "Power to weight ratio hard",
"powerToWeightRatioMediumTerrain": "Medium",
"powerToWeightRatioSoftTerrain": "Soft",
"weight": "Weight",
"turretTraverseSpeed": "Turret traverse speed",
"gunTraverseSpeed": "Gun traverse speed",
"hullTraverseHardTerrain": "Hull traverse hard",
"hullTraverseMediumTerrain": "Medium",
"hullTraverseSoftTerrain": "Soft",
"health": "Health",
"fireChance": "Fire chance",
"viewRange": "View range",
"camouflageStill": "Camouflage still",
"camouflageMoving": "Moving",
"camouflageShootingStill": "Still",
"camouflageShootingMoving": "Moving",
"camouflageCaughtOnFire": "Caught on fire",
"width": "Width",
"height": "Height",
"length": "Length",
"volume": "Volume",
"shellRange": "Shell range",
"shellCapacity": "Shell capacity",
"gunType": "Gun type",
"penetrationAt250m": "Penetration at 250m",
"burstShells": "Burst shell count",
"burstInterShell": "Burst inter-shell"
}
},
"firepower": {
"title": "Firepower"
},
"crew": {
"title": "Crew training",
"info": "represents the other roles a crew member can take.",
"count": "Crew count",
"commander": "Commander",
"gunner": "Gunner",
"driver": "Driver",
"radioman": "Radioman",
"loader": "Loader"
},
"maneuverability": {
"title": "Maneuverability"
},
"survivability": {
"title": "Survivability"
}
},
"compare": {
"name": "Compare",
"description": "Compare tank statistics",
@@ -9,14 +9,14 @@ message ConsumableDefinitions {
}
message Consumable {
required uint32 id = 1;
required I18nString name = 2;
required bool game_mode_exclusive = 5;
repeated ConsumableTankFilter include = 6;
repeated ConsumableTankFilter exclude = 7;
required uint32 id = 1;
required I18nString name = 2;
required bool game_mode_exclusive = 5;
repeated TankInclusivityFilter include = 6;
repeated TankInclusivityFilter exclude = 7;
}
message ConsumableTankFilter {
message TankInclusivityFilter {
oneof filter_type {
ConsumableTankTierFilter tiers = 1;
ConsumableTankIdsFilter ids = 2;
@@ -12,9 +12,9 @@ message ProvisionDefinitions {
message Provision {
reserved 3; // crew
required uint32 id = 1;
required I18nString name = 2;
required bool game_mode_exclusive = 5;
repeated ConsumableTankFilter include = 6;
repeated ConsumableTankFilter exclude = 7;
required uint32 id = 1;
required I18nString name = 2;
required bool game_mode_exclusive = 5;
repeated TankInclusivityFilter include = 6;
repeated TankInclusivityFilter exclude = 7;
}
File renamed without changes.
@@ -3,7 +3,7 @@ import { literals } from "@blitzkit/i18n/src/literals";
import fuzzysort from "fuzzysort";
import { times } from "lodash-es";
import { useMemo, useState } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { Gallery } from "../../stores/gallery";
import type { MaybeSkeletonComponentProps } from "../../types/maybeSkeletonComponentProps";
@@ -11,7 +11,7 @@ import {
Text,
} from "@radix-ui/themes";
import { times } from "lodash-es";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import type { TankCharacteristics } from "../../core/blitzkit/tankCharacteristics";
import { Var } from "../../core/radix/var";
import { useLocale } from "../../hooks/useLocale";
@@ -1,6 +1,6 @@
import { PlusIcon, TrashIcon } from "@radix-ui/react-icons";
import { Button, Dialog, Flex, SegmentedControl } from "@radix-ui/themes";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { tankToCompareMember } from "../../core/blitzkit/tankToCompareMember";
import { useLocale } from "../../hooks/useLocale";
import { CompareEphemeral } from "../../stores/compareEphemeral";
@@ -1,7 +1,7 @@
import { ExternalLinkIcon, LoopIcon, TrashIcon } from "@radix-ui/react-icons";
import { Dialog, Flex, IconButton } from "@radix-ui/themes";
import { useState } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { tankToCompareMember } from "../../core/blitzkit/tankToCompareMember";
import { useLocale } from "../../hooks/useLocale";
import { CompareEphemeral } from "../../stores/compareEphemeral";
@@ -1,6 +1,6 @@
import { alias, permanentSkills, romanize } from "@blitzkit/core";
import { Flex } from "@radix-ui/themes";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { GenericTankComponentButton } from "./ModuleButtons/GenericTankComponentButton";
interface CrewSkillManagerProps {
@@ -12,9 +12,9 @@ import { STRINGS } from "@blitzkit/i18n";
import { ReloadIcon } from "@radix-ui/react-icons";
import { ContextMenu } from "@radix-ui/themes";
import { useEffect, useMemo, useState } from "react";
import { api } from "../../api/dynamic";
import { breakdownConfig } from "../../constants/embeds";
import { awaitableAverageDefinitions } from "../../core/awaitables/averageDefinitions";
import { api } from "../../blitzkit/api";
import { EmbedBreakdown } from "../../stores/embedBreakdown";
import { useEmbedStateCurry } from "../../stores/embedState/utilities";
import { BreakdownEmbedCard, BreakdownEmbedWrapper } from "../TanksEmbed";
@@ -1,6 +1,6 @@
import { Box } from "@radix-ui/themes";
import { useEffect } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { tankToDuelMember } from "../../core/blitzkit/tankToDuelMember";
import { Var } from "../../core/radix/var";
import { Duel } from "../../stores/duel";
+1 -1
View File
@@ -29,8 +29,8 @@ import {
import fuzzysort from "fuzzysort";
import { debounce, times } from "lodash-es";
import { useCallback, useEffect, useRef, useState } from "react";
import { api } from "../api/dynamic";
import { awaitableTankNames } from "../core/awaitables/tankNames";
import { api } from "../blitzkit/api";
import { useLocale } from "../hooks/useLocale";
import { Guess, GuessState } from "../stores/guess";
import { classIcons } from "./ClassIcon";
@@ -1,7 +1,7 @@
---
import { literals } from "@blitzkit/i18n";
import locales from "@blitzkit/i18n/locales.json";
import { getStrings } from "../core/i18n/getStrings";
import { api } from "../api/dynamic";
import { Link } from "./Link";
interface Props {
@@ -10,7 +10,7 @@ interface Props {
const { locale } = Astro.props;
const strings = getStrings(locale)
const strings = await api.strings(locale);
---
<style>
@@ -1,6 +1,6 @@
---
import { api } from "../api/dynamic";
import { tools } from "../constants/tools";
import { getStrings } from "../core/i18n/getStrings";
import { Heading } from "./Heading";
import { Section } from "./Section";
import ToolCard from "./ToolCard.astro";
@@ -13,7 +13,7 @@ interface Props {
const { locale } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
---
<Section>
@@ -1,6 +1,6 @@
---
import { api } from "../api/dynamic";
import { tools } from "../constants/tools";
import { getStrings } from "../core/i18n/getStrings";
import { Heading } from "./Heading";
import { Section } from "./Section";
import ToolCard from "./ToolCard.astro";
@@ -13,7 +13,7 @@ interface Props {
const { locale } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
---
<Section>
@@ -1,8 +1,8 @@
import { literals } from "@blitzkit/i18n/src/literals";
import { EyeOpenIcon } from "@radix-ui/react-icons";
import { Box, Flex, Heading, Text } from "@radix-ui/themes";
import { api } from "../api/dynamic";
import { awaitablePopularTanks } from "../core/awaitables/popularTanks";
import { api } from "../blitzkit/api";
import {
LocaleProvider,
useLocale,
@@ -1,6 +1,6 @@
---
import { api } from "../api/dynamic";
import { tools } from "../constants/tools";
import { getStrings } from "../core/i18n/getStrings";
import { Heading } from "./Heading";
import { Section } from "./Section";
import ToolCard from "./ToolCard.astro";
@@ -13,7 +13,7 @@ interface Props {
const { locale } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
---
<Section>
@@ -1,6 +1,6 @@
---
import { api } from "../api/dynamic";
import { tools } from "../constants/tools";
import { getStrings } from "../core/i18n/getStrings";
import { Heading } from "./Heading";
import { Section } from "./Section";
import ToolCard from "./ToolCard.astro";
@@ -12,7 +12,7 @@ interface Props {
}
const { locale } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
---
<Section>
@@ -1,6 +1,6 @@
---
import { api } from "../api/dynamic";
import { tools } from "../constants/tools";
import { getStrings } from "../core/i18n/getStrings";
import { Heading } from "./Heading";
import { Section } from "./Section";
import ToolCard from "./ToolCard.astro";
@@ -13,7 +13,7 @@ interface Props {
const { locale } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
---
<Section>
@@ -2,7 +2,7 @@ import { useThree, type ThreeEvent } from "@react-three/fiber";
import type { QuicklimeEvent } from "quicklime";
import { useCallback, useEffect, useRef } from "react";
import { Group, Vector2 } from "three";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
import { jsxTree } from "../../../core/blitzkit/jsxTree";
import {
modelTransformEvent,
@@ -1,7 +1,7 @@
import { alias } from "@blitzkit/core";
import { ClockIcon, ReloadIcon } from "@radix-ui/react-icons";
import { Flex, Text } from "@radix-ui/themes";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useDelta } from "../../hooks/useDelta";
import { useLocale } from "../../hooks/useLocale";
import { GenericTankComponentButton } from "./GenericTankComponentButton";
@@ -1,5 +1,5 @@
import { alias } from "@blitzkit/core";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { GenericTankComponentButton } from "./GenericTankComponentButton";
import type { TankComponentButtonProps } from "./TankComponentButton";
@@ -1,5 +1,5 @@
import { alias } from "@blitzkit/core";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { GenericTankComponentButton } from "./GenericTankComponentButton";
import type { TankComponentButtonProps } from "./TankComponentButton";
@@ -10,8 +10,8 @@ import {
useState,
} from "react";
import usePromise from "react-promise-suspense";
import { api } from "../../api/dynamic";
import { awaitableAverageDefinitions } from "../../core/awaitables/averageDefinitions";
import { api } from "../../blitzkit/api";
import { filterTanks } from "../../core/blitzkit/filterTanks";
import { useAveragesExclusionRatio } from "../../hooks/useAveragesExclusionRatio";
import { useLocale } from "../../hooks/useLocale";
@@ -12,7 +12,7 @@ import {
} from "@radix-ui/themes";
import { useMemo, useState } from "react";
import usePromise from "react-promise-suspense";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { filterTanks } from "../core/blitzkit/filterTanks";
import { generatePlaylist } from "../core/blitzkit/generatePlaylist";
import { useLocale } from "../hooks/useLocale";
@@ -5,7 +5,7 @@ import {
} from "@radix-ui/react-icons";
import { Checkbox, Flex, IconButton, Table, Text } from "@radix-ui/themes";
import { memo } from "react";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { useLocale } from "../hooks/useLocale";
import { Playlist, type PlaylistEntry } from "../stores/playlist";
import { TankRowHeaderCell } from "./TankRowHeaderCell";
@@ -1,5 +1,5 @@
import { Flex } from "@radix-ui/themes";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { ProvisionButton } from "./ModuleButtons/ProvisionButton";
interface ProvisionsManagerProps {
@@ -1,6 +1,6 @@
import { isEqual } from "lodash-es";
import { useMemo } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { TankFilters } from "../../stores/tankFilters";
import { TankopediaPersistent } from "../../stores/tankopediaPersistent";
@@ -1,7 +1,7 @@
import { alias, TankType, type TankDefinition } from "@blitzkit/core";
import { uniq } from "lodash-es";
import { type ReactNode } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { TankopediaPersistent } from "../../stores/tankopediaPersistent";
import type { MaybeSkeletonComponentProps } from "../../types/maybeSkeletonComponentProps";
@@ -5,7 +5,7 @@ import {
type TankDefinition,
} from "@blitzkit/core";
import { useMemo } from "react";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
import { resolveReload } from "../../../core/blitzkit/resolveReload";
import { TankSort } from "../../../stores/tankopediaSort";
import { TankCard } from "../../TankCard";
@@ -11,8 +11,8 @@ import fuzzysort from "fuzzysort";
import { uniq } from "lodash-es";
import { memo, useMemo } from "react";
import usePromise from "react-promise-suspense";
import { api } from "../../api/dynamic";
import { awaitableTankNames } from "../../core/awaitables/tankNames";
import { api } from "../../blitzkit/api";
import { filterTanks } from "../../core/blitzkit/filterTanks";
import { resolveReload } from "../../core/blitzkit/resolveReload";
import { useLocale } from "../../hooks/useLocale";
@@ -1,23 +1,23 @@
import {
alias,
GunDefinition,
ShellType,
TANK_CLASSES,
TANK_TYPES,
TankType,
TIER_ROMAN_NUMERALS,
alias,
GunDefinition,
ShellType,
TANK_CLASSES,
TANK_TYPES,
TankType,
TIER_ROMAN_NUMERALS,
} from "@blitzkit/core";
import { literals } from "@blitzkit/i18n";
import locales from "@blitzkit/i18n/locales.json";
import {
LockClosedIcon,
LockOpen2Icon,
ResetIcon,
TrashIcon,
LockClosedIcon,
LockOpen2Icon,
ResetIcon,
TrashIcon,
} from "@radix-ui/react-icons";
import { times } from "lodash-es";
import { Fragment, type ComponentProps, type ReactNode } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { App } from "../../stores/app";
import { TankFilters, type CaseType } from "../../stores/tankFilters";
@@ -3,7 +3,7 @@ import { MinusCircledIcon } from "@radix-ui/react-icons";
import { Callout, Flex } from "@radix-ui/themes";
import { uniq } from "lodash-es";
import { useEffect } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { Duel } from "../../stores/duel";
import { TankopediaPersistent } from "../../stores/tankopediaPersistent";
import { AesonPlug } from "../AesonPlug";
@@ -3,7 +3,7 @@ import { literals } from "@blitzkit/i18n";
import { AccessibilityIcon, InfoCircledIcon } from "@radix-ui/react-icons";
import { Flex, Heading, IconButton, Popover, Text } from "@radix-ui/themes";
import { Fragment } from "react/jsx-runtime";
import { api } from "../../../../../../blitzkit/api";
import { api } from "../../../../../../api/dynamic";
import { useEquipment } from "../../../../../../hooks/useEquipment";
import { useLocale } from "../../../../../../hooks/useLocale";
import { Duel } from "../../../../../../stores/duel";
@@ -1,7 +1,7 @@
import type { QuicklimeEvent } from "quicklime";
import { useEffect, useRef } from "react";
import type { Group } from "three";
import { api } from "../../../../../../../../blitzkit/api";
import { api } from "../../../../../../../../api/dynamic";
import {
modelTransformEvent,
type ModelTransformEventData,
@@ -1,6 +1,6 @@
import { mauveDark } from "@radix-ui/colors";
import { LineBasicMaterial, MeshBasicMaterial } from "three";
import { api } from "../../../../../../../../blitzkit/api";
import { api } from "../../../../../../../../api/dynamic";
import { jsxTree } from "../../../../../../../../core/blitzkit/jsxTree";
import { useModel } from "../../../../../../../../hooks/useModel";
import { Duel } from "../../../../../../../../stores/duel";
@@ -3,11 +3,11 @@ import { Box, Card, Flex } from "@radix-ui/themes";
import { clamp } from "lodash-es";
import { useRef, useState } from "react";
import { degToRad, radToDeg } from "three/src/math/MathUtils.js";
import { api } from "../../../../../../../api/dynamic";
import {
DEFAULT_PITCH_TRANSITION,
applyPitchYawLimits,
} from "../../../../../../../core/blitz/applyPitchYawLimits";
import { api } from "../../../../../../../blitzkit/api";
import { hasEquipment } from "../../../../../../../core/blitzkit/hasEquipment";
import { modelTransformEvent } from "../../../../../../../core/blitzkit/modelTransform";
import { Var } from "../../../../../../../core/radix/var";
@@ -2,7 +2,7 @@ import { createDefaultSkills } from "@blitzkit/core";
import { Flex, Progress, Text } from "@radix-ui/themes";
import { clamp } from "lodash-es";
import { memo, useMemo, type ComponentProps, type ReactNode } from "react";
import { api } from "../../../../../../blitzkit/api";
import { api } from "../../../../../../api/dynamic";
import {
tankCharacteristics,
type TankCharacteristics,
@@ -1,7 +1,7 @@
import { Flex } from "@radix-ui/themes";
import { useEffect } from "react";
import { api } from "../../../../../api/dynamic";
import { applyPitchYawLimits } from "../../../../../core/blitz/applyPitchYawLimits";
import { api } from "../../../../../blitzkit/api";
import { modelTransformEvent } from "../../../../../core/blitzkit/modelTransform";
import { tankCharacteristics } from "../../../../../core/blitzkit/tankCharacteristics";
import { useEquipment } from "../../../../../hooks/useEquipment";
@@ -8,7 +8,7 @@ import {
Popover,
Text,
} from "@radix-ui/themes";
import { api } from "../../../../blitzkit/api";
import { api } from "../../../../api/dynamic";
import { useEquipment } from "../../../../hooks/useEquipment";
import { useLocale } from "../../../../hooks/useLocale";
import { Duel } from "../../../../stores/duel";
@@ -1,5 +1,5 @@
import { Button, Flex, Heading } from "@radix-ui/themes";
import { api } from "../../../../blitzkit/api";
import { api } from "../../../../api/dynamic";
import { useLocale } from "../../../../hooks/useLocale";
import { Duel } from "../../../../stores/duel";
import { EquipmentManager } from "../../../EquipmentManager";
@@ -20,7 +20,7 @@ import {
Text,
Tooltip,
} from "@radix-ui/themes";
import { api } from "../../../../blitzkit/api";
import { api } from "../../../../api/dynamic";
import { useLocale } from "../../../../hooks/useLocale";
import { Duel } from "../../../../stores/duel";
import { LinkI18n } from "../../../LinkI18n";
@@ -1,6 +1,6 @@
import { availableProvisions } from "@blitzkit/core";
import { Button, Flex, Heading } from "@radix-ui/themes";
import { api } from "../../../../blitzkit/api";
import { api } from "../../../../api/dynamic";
import { useLocale } from "../../../../hooks/useLocale";
import { Duel } from "../../../../stores/duel";
import { ProvisionsManager } from "../../../ProvisionsManager";
@@ -1,6 +1,6 @@
import { alias } from "@blitzkit/core";
import { Box, Flex, Heading, Text } from "@radix-ui/themes";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { useLocale } from "../../hooks/useLocale";
import { Duel } from "../../stores/duel";
@@ -5,8 +5,8 @@ import type { QuicklimeEvent } from "quicklime";
import { useEffect, useRef } from "react";
import { PerspectiveCamera, Vector3 } from "three";
import { OrbitControls as OrbitControlsClass } from "three-stdlib";
import { api } from "../../../../../../api/dynamic";
import { applyPitchYawLimits } from "../../../../../../core/blitz/applyPitchYawLimits";
import { api } from "../../../../../../blitzkit/api";
import { hasEquipment } from "../../../../../../core/blitzkit/hasEquipment";
import { Pose, poseEvent } from "../../../../../../core/blitzkit/pose";
import { controlsEnabledEvent } from "../../../../../../core/controlsEnabled";
@@ -1,7 +1,7 @@
import { useEffect } from "react";
import { degToRad } from "three/src/math/MathUtils.js";
import { api } from "../../../../../../api/dynamic";
import { applyPitchYawLimits } from "../../../../../../core/blitz/applyPitchYawLimits";
import { api } from "../../../../../../blitzkit/api";
import { modelTransformEvent } from "../../../../../../core/blitzkit/modelTransform";
import { Duel } from "../../../../../../stores/duel";
@@ -1,7 +1,7 @@
import { Box, Flex } from "@radix-ui/themes";
import { times } from "lodash-es";
import { useEffect, useMemo, useRef } from "react";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
import { defaultEqualizer } from "../../../core/blitzkit/tankToDuelMember";
import { useFullScreen } from "../../../hooks/useFullScreen";
import { Duel } from "../../../stores/duel";
@@ -1,8 +1,8 @@
import { alias, formatCompact, TIER_ROMAN_NUMERALS } from "@blitzkit/core";
import { literals } from "@blitzkit/i18n/src/literals";
import { Box, Flex, Skeleton, Text } from "@radix-ui/themes";
import { api } from "../../../../api/dynamic";
import { awaitableAverageDefinitions } from "../../../../core/awaitables/averageDefinitions";
import { api } from "../../../../blitzkit/api";
import { useLocale } from "../../../../hooks/useLocale";
import { Tankopedia } from "../../../../stores/tankopedia";
import type { MaybeSkeletonComponentProps } from "../../../../types/maybeSkeletonComponentProps";
@@ -3,7 +3,7 @@ import { literals } from "@blitzkit/i18n/src/literals";
import { CaretLeftIcon, CaretRightIcon, PlusIcon } from "@radix-ui/react-icons";
import { Flex, Heading, IconButton, ScrollArea, Text } from "@radix-ui/themes";
import { Fragment, useEffect, useMemo, useRef, useState } from "react";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
import { useLocale } from "../../../hooks/useLocale";
import { Duel } from "../../../stores/duel";
import { Tankopedia } from "../../../stores/tankopedia";
@@ -1,8 +1,18 @@
import type { Consumable } from "@blitzkit/core";
import { TrashIcon } from "@radix-ui/react-icons";
import { useCompatibility } from "../../hooks/useCompatibility";
import { useConsumables } from "../../hooks/useConsumables";
import { useProtagonist } from "../../hooks/useProtagonist";
import { useProtagonistGun } from "../../hooks/useProtagonistGun";
import { useStrings } from "../../hooks/useStrings";
import { Tankopedia } from "../../stores/tankopedia";
import { hasUpgrades } from "../../tankopedia/hasUpgrades";
import { vehicleStatusKeys } from "../../tankopedia/tankState";
import type { ComputedCharacteristics } from "../../types/characteristics";
import { Heading } from "../Heading";
import { IconButton } from "../IconButton";
import { Tooltip } from "../Tooltip";
import styles from "./index.module.css";
interface TankopediaLoadoutProps {
characteristics: ComputedCharacteristics;
@@ -111,7 +121,8 @@ function Consumables({ characteristics }: ConsumablesProps) {
const strings = useStrings();
const consumables = useConsumables();
const tank = useProtagonist();
const isCompatible = useCompatibility(tank, characteristics);
const gun = useProtagonistGun();
const isCompatible = useCompatibility(tank, gun);
return (
<div className={styles.section}>
@@ -131,56 +142,35 @@ function Consumables({ characteristics }: ConsumablesProps) {
</div>
<div className={styles.consumables}>
{Object.entries(consumables.consumables).map(
([id, { compatibility, consumable, purchase }]) => {
if (!isCompatible(compatibility!)) return null;
{Object.entries(consumables.consumables).map(([id, consumable]) => {
if (!isCompatible(consumable.include, consumable.exclude)) {
return null;
}
return (
<Consumable
key={id}
id={id}
consumable={consumable!}
purchase={purchase!}
/>
);
},
)}
return (
<Consumable key={id} id={Number(id)} consumable={consumable} />
);
})}
</div>
</div>
);
}
interface ConsumableProps {
id: string;
consumable: ConsumableComponent;
purchase: BlitzStaticPurchaseComponent;
id: number;
consumable: Consumable;
}
function Consumable({ id, consumable, purchase }: ConsumableProps) {
const gameStrings = useGameStrings("ConsumableEntity");
function Consumable({ id, consumable }: ConsumableProps) {
const isSelected = Tankopedia.use((state) =>
state.protagonist.consumables.includes(id),
);
const tank = useProtagonist();
const tierPrices = useTierPrices();
const price = useMemo(() => {
const { prices } = tierPrices.prices[purchase.price_per_tier_catalog_id];
for (const { tier_catalog_id, unlock_price } of prices) {
if (tier_catalog_id === tank.tank!.tier_catalog_id) {
return unlock_price;
}
}
throw new Error(
`No price found for tier catalog id ${tank.tank!.tier_catalog_id}`,
);
}, [tank.id, purchase.price_per_tier_catalog_id]);
const unwrap = useUnwrap();
return (
<div className={styles["consumable-wrapper"]}>
<Tooltip tooltip={gameStrings[consumable!.name_key]}>
<Tooltip tooltip={unwrap(consumable.name)}>
<Button
radius="1"
variant={isSelected ? "surface" : "soft"}
@@ -1,6 +1,6 @@
import { Flex, Table } from "@radix-ui/themes";
import { useEffect, useRef } from "react";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
import { TierList } from "../../../stores/tierList";
import { tierListRowElements } from "../Table/constants";
import { TierListTile } from "../Tile";
@@ -2,7 +2,7 @@ import { metaSortTank } from "@blitzkit/core";
import { times } from "lodash-es";
import { useMemo, useState } from "react";
import usePromise from "react-promise-suspense";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { filterTanks } from "../../core/blitzkit/filterTanks";
import { TankFilters } from "../../stores/tankFilters";
import { TierList } from "../../stores/tierList";
@@ -1,5 +1,5 @@
import { useEffect } from "react";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
import { generateTierListParams } from "../../core/blitzkit/generateTierListParams";
import { TierList } from "../../stores/tierList";
@@ -1,6 +1,6 @@
---
import { api } from "../api/dynamic";
import type { Tool } from "../constants/tools";
import { getStrings } from "../core/i18n/getStrings";
import { Heading } from "./Heading";
import { LinkI18n } from "./LinkI18n";
@@ -11,7 +11,7 @@ interface Props {
}
const { locale, tool, minor } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
const toolStrings =
strings.website.tools[
(tool.strings ?? tool.id) as keyof typeof strings.website.tools
@@ -1,4 +1,4 @@
import { fetchTankNames } from "@blitzkit/core";
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
export const awaitableTankNames = fetchTankNames(api);
@@ -1,4 +1,4 @@
import { api } from "../../blitzkit/api";
import { api } from "../../api/dynamic";
const tankDefinitions = await api.tanks();
const modelDefinitions = await api.models();
@@ -1,8 +1,8 @@
import type { TankDefinition } from "@blitzkit/core";
import { checkConsumableProvisionInclusivity } from "@blitzkit/core/src/blitzkit/checkConsumableProvisionInclusivity";
import { times } from "lodash-es";
import { api } from "../../api/dynamic";
import type { TankFilters } from "../../stores/tankFilters";
import { api } from "../../blitzkit/api";
const SHELLS = times(3, (index) => index);
@@ -4,10 +4,10 @@ import {
idToRegion,
type IndividualTankStats,
} from "@blitzkit/core";
import { api } from "../../api/dynamic";
import { App } from "../../stores/app";
import { Playlist } from "../../stores/playlist";
import { TankFilters } from "../../stores/tankFilters";
import { api } from "../../blitzkit/api";
import { filterTanks } from "./filterTanks";
const tankDefinitions = await api.tanks();
@@ -1,5 +1,5 @@
import { api } from "../../api/dynamic";
import type { EquipmentMatrix } from "../../stores/duel";
import { api } from "../../blitzkit/api";
const equipmentDefinitions = await api.equipment();
@@ -1,17 +1,26 @@
import {
Consumable,
ConsumableTankCategoryFilterCategory,
GunDefinition,
Provision,
TankDefinition,
} from "@blitzkit/protos";
type GunDefinition,
type TankDefinition,
type TankInclusivityFilter,
} from "@blitzkit/core";
export function checkConsumableProvisionInclusivity(
consumableProvision: Consumable | Provision,
export function useCompatibility(tank: TankDefinition, gun: GunDefinition) {
return function (
include?: TankInclusivityFilter[],
exclude?: TankInclusivityFilter[],
) {
return tankCompatibility(tank, gun, include, exclude);
};
}
function tankCompatibility(
tank: TankDefinition,
gun: GunDefinition,
include?: TankInclusivityFilter[],
exclude?: TankInclusivityFilter[],
) {
const included = consumableProvision.include?.every((rule) => {
const included = include?.every((rule) => {
switch (rule.filter_type!.$case) {
case "tiers":
return (
@@ -29,7 +38,7 @@ export function checkConsumableProvisionInclusivity(
throw new SyntaxError("Category filtering found in include rule");
}
});
const excluded = consumableProvision.exclude?.some((rule) => {
const excluded = exclude?.some((rule) => {
switch (rule.filter_type!.$case) {
case "tiers":
return (
@@ -53,5 +62,5 @@ export function checkConsumableProvisionInclusivity(
}
});
return consumableProvision.include?.length > 0 && included && !excluded;
return include !== undefined && include?.length > 0 && included && !excluded;
}
@@ -0,0 +1,7 @@
import { api } from "../api/dynamic";
import { useAwait } from "./useAwait";
export function useConsumables() {
const consumables = useAwait(() => api.consumables(), "consumables");
return consumables;
}
@@ -1,7 +1,7 @@
import { TankDefinition } from "@blitzkit/core";
import { sumBy } from "lodash-es";
import { useMemo } from "react";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { Duel } from "../stores/duel";
export enum UseEccentricityMode {
+1 -1
View File
@@ -1,5 +1,5 @@
import { useMemo } from "react";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { Duel } from "../stores/duel";
const equipmentDefinitions = await api.equipment();
@@ -1,4 +1,4 @@
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
const equipmentDefinitions = await api.equipment();
+1 -2
View File
@@ -1,10 +1,9 @@
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { Tankopedia } from "../stores/tankopedia";
import { useAwait } from "./useAwait";
export function useProtagonist() {
const id = Tankopedia.use((state) => state.protagonist.tank);
const tank = useAwait(() => api.tank(id), `tank-${id}`);
return tank;
}
@@ -0,0 +1,8 @@
import { Tankopedia } from "../stores/tankopedia";
import { useProtagonistTurret } from "./useProtagonistTurret";
export function useProtagonistGun() {
const id = Tankopedia.use((state) => state.protagonist.gun);
const turret = useProtagonistTurret();
return turret.guns[id];
}
@@ -0,0 +1,8 @@
import { Tankopedia } from "../stores/tankopedia";
import { useProtagonist } from "./useProtagonist";
export function useProtagonistTurret() {
const id = Tankopedia.use((state) => state.protagonist.gun);
const tank = useProtagonist();
return tank.turrets[id];
}
+1 -1
View File
@@ -1,4 +1,4 @@
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import { useAwait } from "./useAwait";
import { useLocale } from "./useLocale";
@@ -1,5 +1,5 @@
import { CamouflageDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { ConsumableDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { EquipmentDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { Gallery } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { GameDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { MapDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { ModelDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { ProvisionDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,4 +1,4 @@
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { SkillDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,5 +1,5 @@
import { TankDefinitions } from "@blitzkit/core";
import { api } from "../../../blitzkit/api";
import { api } from "../../../api/dynamic";
export { getStaticPaths } from "../_index";
@@ -1,7 +1,7 @@
import locales from "@blitzkit/i18n/locales.json";
import type { APIContext } from "astro";
import { api } from "../../../api/dynamic";
import { mixStaticPaths } from "../../../astro/mixStaticPaths";
import { api } from "../../../blitzkit/api";
import { getStaticPaths as _getStaticPaths } from "../_index";
export const getStaticPaths = mixStaticPaths(_getStaticPaths, () => {
@@ -1,4 +1,4 @@
import { api } from "../../../../blitzkit/api";
import { api } from "../../../../api/dynamic";
import { mixStaticPaths } from "../../../../astro/mixStaticPaths";
import { getStaticPaths as _getStaticPaths } from "../../_index";
@@ -1,6 +1,6 @@
import { createDefaultSkills } from "@blitzkit/core";
import { useEffect, useMemo, useState } from "react";
import { api } from "../../../../blitzkit/api";
import { api } from "../../../../api/dynamic";
import { CompareTable } from "../../../../components/Compare/CompareTable";
import { Controls } from "../../../../components/Compare/Controls";
import { DamageWarning } from "../../../../components/DamageWarning";
@@ -1,11 +1,11 @@
import { Box, Flex, Heading } from "@radix-ui/themes";
import { Suspense, useEffect } from "react";
import { api } from "../../../../api/dynamic";
import { GuessBackground } from "../../../../components/GuessBackground";
import { Guesser } from "../../../../components/Guesser";
import { GuessRenderer } from "../../../../components/GuessRenderer";
import { GuessRendererLoader } from "../../../../components/GuessRendererLoader";
import { PageWrapper } from "../../../../components/PageWrapper";
import { api } from "../../../../blitzkit/api";
import {
type LocaleAcceptorProps,
LocaleProvider,
@@ -2,6 +2,7 @@
import { AstroSeo } from "@astrolib/seo";
import { assertSecret } from "@blitzkit/core";
import locales from "@blitzkit/i18n/locales.json";
import { api } from "../../../api/dynamic";
import { mixStaticPaths } from "../../../astro/mixStaticPaths";
import { AesonPlug } from "../../../components/AesonPlug";
import HelpTranslate from "../../../components/HelpTranslate.astro";
@@ -11,7 +12,6 @@ import HomePlayers from "../../../components/HomePlayers.astro";
import HomeTanks from "../../../components/HomeTanks.astro";
import HomeTechnical from "../../../components/HomeTechnical.astro";
import { tools, type Tool } from "../../../constants/tools";
import { getStrings } from "../../../core/i18n/getStrings";
import BaseLayout from "../../../layouts/BaseLayout.astro";
import { getStaticPaths as _getStaticPaths } from "../_index";
@@ -19,7 +19,7 @@ const MAX_TOOLS_PER_ROW = 2;
const environment = assertSecret(import.meta.env.PUBLIC_ENVIRONMENT);
const { locale } = Astro.props;
const strings = getStrings(locale);
const strings = await api.strings(locale);
const rows: Tool[][] = [];
for (const id in tools) {
@@ -19,12 +19,12 @@ import {
type ButtonProps,
} from "@radix-ui/themes";
import { useRef, useState } from "react";
import { api } from "../../../../api/dynamic";
import { MixerScene } from "../../../../components/MixerScene";
import { ModuleButton } from "../../../../components/ModuleButtons/ModuleButton";
import { PageWrapper } from "../../../../components/PageWrapper";
import { ScreenshotButton } from "../../../../components/ScreenshotButton";
import { TankSearch } from "../../../../components/TankSearch";
import { api } from "../../../../blitzkit/api";
import { curateMixer } from "../../../../core/blitzkit/curateMixer";
import {
LocaleProvider,
@@ -33,12 +33,12 @@ import {
} from "@radix-ui/themes";
import { debounce } from "lodash-es";
import { useEffect, useMemo, useRef, useState } from "react";
import { api } from "../../../../api/dynamic";
import { PageWrapper } from "../../../../components/PageWrapper";
import { StickyRowHeaderCell } from "../../../../components/StickyRowHeaderCell";
import { StickyTableRoot } from "../../../../components/StickyTableRoot";
import { TankRowHeaderCell } from "../../../../components/TankRowHeaderCell";
import { awaitableAverageDefinitions } from "../../../../core/awaitables/averageDefinitions";
import { api } from "../../../../blitzkit/api";
import {
type LocaleAcceptorProps,
LocaleProvider,
@@ -1,6 +1,6 @@
import { useMemo } from "react";
import { api } from "../../../../../blitzkit/api";
import { computeCharacteristics } from "../../../../../blitzkit/computeCharacteristics";
import { api } from "../../../../../api/dynamic";
import { computeCharacteristics } from "../../../../../tankopedia/computeCharacteristics";
import { withErrorWrapper } from "../../../../../hocs/withErrorWrapper";
import { withLocale } from "../../../../../hocs/withLocale";
import { useAwait } from "../../../../../hooks/useAwait";
@@ -1,7 +1,7 @@
---
import "@radix-ui/colors/violet-dark.css";
import { api } from "../../../../../api/dynamic";
import { mixStaticPaths } from "../../../../../astro/mixStaticPaths";
import { api } from "../../../../../blitzkit/api";
import ColorScale from "../../../../../components/ColorScale.astro";
import BaseLayout from "../../../../../layouts/BaseLayout.astro";
import { getStaticPaths as _getStaticPaths } from "../index.astro";
+3 -28
View File
@@ -2,18 +2,15 @@ import {
createDefaultSkills,
ShellDefinition,
TankDefinition,
type ModelDefinition,
} from "@blitzkit/core";
import type { Vector3 } from "three";
import { Varuna } from "varuna";
import { api } from "../blitzkit/api";
import { api } from "../api/dynamic";
import type { ArmorType } from "../components/Armor/components/SpacedArmorScene";
import type { ExternalModuleVariant } from "../components/Armor/components/SpacedArmorSceneComponent";
import type { XP_MULTIPLIERS } from "../components/Tankopedia/TechTreeSection";
import {
createTankState,
type EquipmentMatrix,
} from "../tankopedia/createTankState";
import { createTankState } from "../tankopedia/createTankState";
import type { TankState } from "../tankopedia/tankState";
import { TankopediaDisplay } from "./tankopediaPersistent/constants";
export interface ShotLayerBase {
@@ -81,28 +78,6 @@ export enum TankopediaRelativeAgainst {
All,
}
export interface TankState {
tank: number;
engine: number;
turret: number;
gun: number;
shell: number;
track: number;
assault_distance: number;
speed: number;
model: ModelDefinition;
equipment_matrix: EquipmentMatrix;
consumables: number[];
provisions: number[];
camouflage: boolean;
cooldown_booster: number;
}
interface Tankopedia {
disturbed: boolean;
revealed: boolean;
Loaded 100 of 104 files, more files were not shown because too many files have changed in this diff. Show more