useCompatibility

This commit is contained in:
tresabhi committed 2026-09-23 10:39:12 -05:00
1 parent 33bb8ead3c
commit 750bdd236a
7 files changed
+59 -38

No files matched your search

@@ -0,0 +1,66 @@
import {
ConsumableTankCategoryFilterCategory,
type GunDefinition,
type TankDefinition,
type TankInclusivityFilter,
} from "@blitzkit/core";
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 = include?.every((rule) => {
switch (rule.filter_type!.$case) {
case "tiers":
return (
rule.filter_type!.value.min <= tank.tier &&
tank.tier <= rule.filter_type!.value.max
);
case "ids":
return rule.filter_type!.value.ids.includes(tank.id);
case "nations":
return rule.filter_type!.value.nations.includes(tank.nation);
case "categories":
throw new SyntaxError("Category filtering found in include rule");
}
});
const excluded = exclude?.some((rule) => {
switch (rule.filter_type!.$case) {
case "tiers":
return (
rule.filter_type!.value.min <= tank.tier &&
tank.tier <= rule.filter_type!.value.max
);
case "ids":
return rule.filter_type!.value.ids.includes(tank.id);
case "nations":
return rule.filter_type!.value.nations.includes(tank.nation);
case "categories":
return rule.filter_type!.value.categories.some((category) => {
switch (category) {
case ConsumableTankCategoryFilterCategory.CONSUMABLE_TANK_CATEGORY_FILTER_CATEGORY_CLIP:
return gun.gun_type!.$case !== "regular";
}
});
}
});
return include !== undefined && include?.length > 0 && included && !excluded;
}
@@ -5,6 +5,5 @@ 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];
}