Compare commits

...
2 Commits
Author SHA1 Message Date
TrèsAbhi e66daed7ae feat: dpm 2025-12-19 14:51:18 -06:00
TrèsAbhi f2d0f68f07 feat: primary_armor 2025-12-19 14:34:17 -06:00
4 changed files with 56 additions and 29 deletions

No files matched your search

@@ -75,36 +75,34 @@ function patch(stage0: StageParameters, stage1: StageParameters) {
}
for (const penetrationGroupUpgrade1 of stage1.penetration_groups_upgrades) {
if (penetrationGroupUpgrade1.primary_armor.length > 0) {
throw new Error("Primary armor is not empty; implement this");
}
let penetrationGroupUpgrade0 = stage0.penetration_groups_upgrades.find(
const penetrationGroupUpgrade0 = stage0.penetration_groups_upgrades.find(
(group) => group.tank_part === penetrationGroupUpgrade1.tank_part
);
if (!penetrationGroupUpgrade0) {
penetrationGroupUpgrade0 = PenetrationGroupUpgrade.create({
tank_part: penetrationGroupUpgrade1.tank_part,
});
if (penetrationGroupUpgrade0) {
penetrationGroupUpgrade0.primary_armor = [
...penetrationGroupUpgrade1.primary_armor,
];
stage0.penetration_groups_upgrades.push(penetrationGroupUpgrade0);
}
for (const penetrationGroup1 of penetrationGroupUpgrade1.penetration_groups) {
const penetrationGroup0 =
penetrationGroupUpgrade0.penetration_groups.find(
(baseGroup) => baseGroup.group_name === penetrationGroup1.group_name
);
for (const penetrationGroup1 of penetrationGroupUpgrade1.penetration_groups) {
const penetrationGroup0 =
penetrationGroupUpgrade0.penetration_groups.find(
(baseGroup) => baseGroup.group_name === penetrationGroup1.group_name
);
if (penetrationGroup0) {
penetrationGroup0.common_data = penetrationGroup1.common_data;
penetrationGroup0.armor = penetrationGroup1.armor;
} else {
penetrationGroupUpgrade0.penetration_groups.push(
PenetrationGroup.create(penetrationGroup1)
);
if (penetrationGroup0) {
penetrationGroup0.common_data = penetrationGroup1.common_data;
penetrationGroup0.armor = penetrationGroup1.armor;
} else {
penetrationGroupUpgrade0.penetration_groups.push(
PenetrationGroup.create(penetrationGroup1)
);
}
}
} else {
stage0.penetration_groups_upgrades.push(
PenetrationGroupUpgrade.create(penetrationGroupUpgrade1)
);
}
}
@@ -22,16 +22,20 @@ export enum GunType {
}
export const characteristics = {
gun_type({ attribute }) {
clip_size({ attribute }) {
return attribute(
TankAttributeChange_AttributeName.ATTRIBUTE_NAME_CLIP_SIZE
);
},
gun_type({ attribute, characteristic }) {
const isPump = attribute(
TankAttributeChange_AttributeName.ATTRIBUTE_NAME_IS_PUMP
);
if (isPump === 1) return GunType.AutoReloader;
const clipSize = attribute(
TankAttributeChange_AttributeName.ATTRIBUTE_NAME_CLIP_SIZE
);
const clipSize = characteristic("clip_size")!;
if (clipSize === 1) return GunType.Regular;
@@ -59,13 +63,25 @@ export const characteristics = {
reload({ characteristic, attribute }) {
const gunType = characteristic("gun_type")!;
if (gunType !== GunType.Regular) return null;
if (gunType === GunType.AutoReloader) return null;
return attribute(
TankAttributeChange_AttributeName.ATTRIBUTE_NAME_RELOAD_TIME
);
},
intra_clip({ characteristic, attribute }) {
const gunType = characteristic("gun_type")!;
if (gunType === GunType.Regular) return null;
const clipRate = attribute(
TankAttributeChange_AttributeName.ATTRIBUTE_NAME_CLIP_RATE
);
return 60 / clipRate;
},
dpm({ characteristic }) {
let dps: number;
const gunType = characteristic("gun_type")!;
@@ -74,10 +90,20 @@ export const characteristics = {
switch (gunType) {
case GunType.Regular: {
const reload = characteristic("reload")!;
dps = damage / reload;
break;
}
case GunType.AutoLoader: {
const reload = characteristic("reload")!;
const intraClip = characteristic("intra_clip")!;
const clipSize = characteristic("clip_size")!;
dps = (damage * clipSize) / (reload + (clipSize - 1) * intraClip);
break;
}
default:
throw new Error("Unknown gun type");
}
@@ -27,7 +27,9 @@ export const characteristicsGroups: CharacteristicsOrder = [
{ name: "damage" },
{ name: "module_damage" },
{ name: "penetration" },
{ name: "clip_size" },
{ name: "reload" },
{ name: "intra_clip" },
{ toy: "reload" },
@@ -76,6 +76,7 @@ function Content({ id }: { id: string }) {
{order.map((entry) => {
if ("toy" in entry) {
return <p>toy: {entry.toy}</p>;
} else {
const characteristic = characteristics[entry.name];