Files
blitzkit/src/core/blitzkrieg/tankDefinitions.ts
T

230 lines
5.3 KiB
TypeScript
Raw Normal View History

2023-08-10 01:46:39 +00:00
import { deburr } from 'lodash';
2024-01-10 17:36:11 -06:00
import { Vector2Tuple } from 'three';
2024-01-27 17:36:29 -06:00
import { TankType, TreeType } from '../../components/Tanks';
2023-12-14 22:19:01 -06:00
import { asset } from './asset';
2024-02-07 10:02:00 -06:00
import { fetchCdonLz4 } from './fetchCdonLz4';
2023-08-10 01:03:53 +00:00
2023-12-14 22:19:01 -06:00
export type ShellType = 'ap' | 'ap_cr' | 'hc' | 'he';
2023-12-17 20:47:30 -06:00
2024-01-07 19:41:37 -06:00
export const SHELL_NAMES: Record<ShellType, string> = {
ap: 'AP',
ap_cr: 'APCR',
hc: 'HEAT',
he: 'HE',
};
2024-02-16 10:20:20 -06:00
export type CrewMember =
| 'commander'
| 'radioman'
| 'gunner'
| 'driver'
| 'loader';
2023-12-17 20:47:30 -06:00
export type TankDefinitions = Record<number, TankDefinition>;
2024-02-16 21:07:48 -06:00
export const CREW_MEMBER_NAMES: Record<CrewMember, string> = {
commander: 'Commander',
radioman: 'Radioman',
gunner: 'Gunner',
driver: 'Driver',
loader: 'Loader',
};
export interface Crew {
type: CrewMember;
count?: number;
substitute?: CrewMember[];
}
2023-12-17 20:47:30 -06:00
export interface TankDefinition {
id: number;
2024-02-22 10:56:45 -06:00
fixedCamouflage?: boolean;
2024-02-16 21:07:48 -06:00
crew: Crew[];
2024-01-27 19:06:02 -06:00
health: number;
2023-12-17 20:47:30 -06:00
nation: string;
name: string;
2024-02-03 15:54:21 -06:00
nameFull?: string;
treeType: TreeType;
2024-01-25 12:20:34 -06:00
consumables: number;
2024-01-25 13:10:20 -06:00
provisions: number;
2023-12-17 20:47:30 -06:00
tier: Tier;
type: TankType;
testing?: boolean;
turrets: TurretDefinition[];
2024-01-28 19:06:38 -06:00
engines: EngineDefinition[];
2024-02-08 10:58:03 -06:00
tracks: TrackDefinition[];
2023-12-17 20:47:30 -06:00
price: TankDefinitionPrice;
2024-02-05 12:57:03 -06:00
speed: {
forwards: number;
backwards: number;
};
2024-01-28 19:32:12 -06:00
camouflage: {
still: number;
moving: number;
onFire: number;
};
2024-02-08 10:58:03 -06:00
equipment: string;
weight: number;
}
export interface TrackDefinition {
id: number;
2024-02-08 11:08:22 -06:00
tier: Tier;
2024-02-08 10:58:03 -06:00
weight: number;
2024-02-03 15:54:21 -06:00
traverseSpeed: number;
dispersion: {
move: number;
traverse: number;
};
2024-02-08 10:58:03 -06:00
resistance: {
hard: number;
medium: number;
soft: number;
};
2023-12-17 20:47:30 -06:00
}
2024-01-28 19:06:38 -06:00
export interface EngineDefinition {
id: number;
name: string;
tier: Tier;
2024-02-08 10:58:03 -06:00
fireChance: number;
power: number;
weight: number;
2024-01-28 19:06:38 -06:00
}
2023-12-17 20:47:30 -06:00
export type TankDefinitionPrice =
| { type: 'credits'; value: number }
| { type: 'gold'; value: number };
export interface TurretDefinition {
2024-01-27 19:06:02 -06:00
health: number;
2024-02-03 15:54:21 -06:00
viewRange: number;
traverseSpeed: number;
2023-12-17 20:47:30 -06:00
id: number;
name: string;
tier: Tier;
guns: GunDefinition[];
2024-02-08 10:58:03 -06:00
weight: number;
2023-12-17 20:47:30 -06:00
}
2024-02-03 15:54:21 -06:00
export type GunDefinition =
| GunDefinitionRegular
| GunDefinitionAutoLoader
| GunDefinitionAutoReloader;
2024-01-02 20:17:10 -06:00
interface GunDefinitionBase {
2024-02-03 16:28:33 -06:00
rotationSpeed: number;
2024-02-08 10:58:03 -06:00
weight: number;
2023-12-17 20:47:30 -06:00
id: number;
name: string;
tier: Tier;
shells: ShellDefinition[];
2024-01-28 19:32:12 -06:00
camouflageLoss: number;
2024-02-03 15:54:21 -06:00
aimTime: number;
dispersion: {
base: number;
traverse: number;
shot: number;
damaged: number;
};
2023-12-17 20:47:30 -06:00
}
2024-02-03 15:54:21 -06:00
interface GunDefinitionRegular extends GunDefinitionBase {
2023-12-17 20:47:30 -06:00
type: 'regular';
reload: number;
}
2024-02-03 15:54:21 -06:00
interface GunDefinitionAutoLoader extends GunDefinitionBase {
type: 'autoLoader';
2023-12-17 20:47:30 -06:00
reload: number;
interClip: number;
count: number;
}
2024-02-03 15:54:21 -06:00
interface GunDefinitionAutoReloader extends GunDefinitionBase {
type: 'autoReloader';
2023-12-17 20:47:30 -06:00
reload: number[];
interClip: number;
count: number;
}
2024-01-20 13:43:03 -06:00
export type ShellDefinition = {
2023-12-14 22:19:01 -06:00
id: number;
name: string;
speed: number;
2024-01-27 19:06:02 -06:00
damage: { armor: number; module: number };
2023-12-14 22:19:01 -06:00
caliber: number;
icon: string;
2024-01-10 17:36:11 -06:00
penetration: number | Vector2Tuple;
2024-01-12 13:57:32 -06:00
type: ShellType;
normalization?: number;
ricochet?: number;
2024-01-20 13:43:03 -06:00
explosionRadius?: number;
};
2023-11-29 12:17:21 -06:00
2024-02-01 11:52:48 -06:00
export const GUN_TYPE_NAMES: Record<GunDefinition['type'], string> = {
regular: 'Regular',
2024-02-03 15:54:21 -06:00
autoLoader: 'Auto loader',
autoReloader: 'Auto reloader',
2024-02-01 11:52:48 -06:00
};
2024-02-07 10:02:00 -06:00
export const tankDefinitions = fetchCdonLz4<TankDefinitions>(
asset('definitions/tanks.cdon.lz4'),
2024-02-05 13:33:23 -06:00
);
2023-12-05 17:36:18 -06:00
2023-12-14 22:19:01 -06:00
const entries = new Promise<TankDefinition[]>(async (resolve) => {
2023-12-05 17:36:18 -06:00
resolve(Object.entries(await tankDefinitions).map(([, entry]) => entry));
});
2023-12-14 22:19:01 -06:00
export const tanksDefinitionsArray = new Promise<TankDefinition[]>(
2023-11-29 12:17:21 -06:00
async (resolve) => {
resolve((await entries).map((entry) => entry));
},
);
2024-01-21 16:28:26 -06:00
export const tankNames = tanksDefinitionsArray.then((tanks) =>
2023-08-10 01:46:39 +00:00
Promise.all(
2024-01-21 16:28:26 -06:00
tanks.map(async (tank, index) => {
2023-12-05 17:36:18 -06:00
const { id } = (await tanksDefinitionsArray)[index];
2023-08-10 01:46:39 +00:00
return {
2023-08-11 17:57:44 +00:00
id,
2024-01-21 16:28:26 -06:00
original: tank.name,
2024-02-03 15:54:21 -06:00
combined: `${tank.name}${deburr(tank.name)}${tank.nameFull ? `${tank.nameFull}${deburr(tank.nameFull)}` : ''}`,
2023-08-10 01:46:39 +00:00
};
}),
),
);
2023-05-30 18:42:34 +00:00
2023-12-01 12:36:31 -06:00
export const TANK_ICONS: Record<TankType, string> = {
2024-02-03 15:54:21 -06:00
tankDestroyer: 'https://i.imgur.com/BIHSEH0.png',
2023-12-05 19:14:53 -06:00
light: 'https://i.imgur.com/CSNha5V.png',
medium: 'https://i.imgur.com/wvf3ltm.png',
heavy: 'https://i.imgur.com/ECeqlZa.png',
2023-06-05 18:47:00 +00:00
};
2023-12-01 12:36:31 -06:00
export const TANK_ICONS_PREMIUM: Record<TankType, string> = {
2024-02-03 15:54:21 -06:00
tankDestroyer: 'https://i.imgur.com/TCu3EdR.png',
2023-12-05 19:14:53 -06:00
light: 'https://i.imgur.com/zdkpTRb.png',
medium: 'https://i.imgur.com/3z7eHX6.png',
heavy: 'https://i.imgur.com/P3vbmyA.png',
2023-07-09 00:47:03 +00:00
};
2023-12-01 12:36:31 -06:00
export const TANK_ICONS_COLLECTOR: Record<TankType, string> = {
2024-02-03 15:54:21 -06:00
tankDestroyer: 'https://i.imgur.com/WTjeirB.png',
2023-12-05 19:14:53 -06:00
light: 'https://i.imgur.com/EwhtKkU.png',
medium: 'https://i.imgur.com/u8YDMBh.png',
heavy: 'https://i.imgur.com/8xRf3nc.png',
2023-07-10 18:16:33 +00:00
};
2023-12-04 12:35:27 -06:00
export const TIERS = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] as const;
2023-06-19 18:08:34 +00:00
2023-12-04 12:35:27 -06:00
export type Tier = (typeof TIERS)[number];
2023-12-04 11:47:33 -06:00
2023-06-19 18:08:34 +00:00
export const TIER_ROMAN_NUMERALS: Record<Tier, string> = {
2023-06-05 18:47:00 +00:00
1: 'I',
2: 'II',
3: 'III',
4: 'IV',
5: 'V',
6: 'VI',
7: 'VII',
8: 'VIII',
9: 'IX',
10: 'X',
2023-05-30 18:42:34 +00:00
};
2023-12-04 19:10:26 -06:00
2023-12-05 17:36:18 -06:00
export const NATIONS = tanksDefinitionsArray.then((tanks) => {
2024-02-06 13:34:23 -06:00
const nations = Array.from(
new Set<string>(Object.values(tanks).map((tank) => tank.nation)),
);
2023-12-04 19:10:26 -06:00
2024-02-06 13:34:23 -06:00
nations.splice(nations.indexOf('other'), 1);
nations.push('other');
2023-12-04 19:10:26 -06:00
2024-02-06 13:34:23 -06:00
return nations;
2023-12-04 19:10:26 -06:00
});