fix overly-aggressive tank exclusive compatibility

This commit is contained in:
tresabhi committed 2026-05-26 12:07:00 -05:00
1 parent 7a7c73d77b
commit 6fb51e703d
1 file changed
+33 -15
@@ -1,5 +1,9 @@
import type { CompatibilityComponent } from "@protos/blitz_static_compatibility_component"; import type { CompatibilityComponent } from "@protos/blitz_static_compatibility_component";
import type { TankCompatibility_Include } from "@protos/blitz_static_tank_compatibility"; import type {
TankCompatibility,
TankCompatibility_Exclude,
TankCompatibility_Include,
} from "@protos/blitz_static_tank_compatibility";
import { TankTraits } from "@protos/blitz_static_tank_compatibility"; import { TankTraits } from "@protos/blitz_static_tank_compatibility";
import { TankAttributeChange_AttributeName } from "@protos/blitz_static_tank_upgrade_single_stage"; import { TankAttributeChange_AttributeName } from "@protos/blitz_static_tank_upgrade_single_stage";
import type { Sets } from "@protos/sets"; import type { Sets } from "@protos/sets";
@@ -26,40 +30,54 @@ export function useCompatibility(
} }
return ( return (
compatibility.tank_compatibility === undefined || compatibility.tank_compatibility &&
(tankCompatibilityApplies( tankCompatibility(
compatibility.tank_compatibility.include, compatibility.tank_compatibility,
tank, tank,
sets, sets,
characteristics, characteristics,
) && )
!tankCompatibilityApplies( );
compatibility.tank_compatibility.exclude, };
}
function tankCompatibility(
compatibility: TankCompatibility,
tank: Tank,
sets: Sets,
characteristics: ComputedCharacteristics,
) {
return (
(compatibility.include === undefined ||
tankCompatibilityInequality(
compatibility.include,
tank,
sets,
characteristics,
)) &&
(compatibility.exclude === undefined ||
!tankCompatibilityInequality(
compatibility.exclude,
tank, tank,
sets, sets,
characteristics, characteristics,
)) ))
); );
};
} }
function tankCompatibilityApplies( function tankCompatibilityInequality(
include: TankCompatibility_Include | undefined, include: TankCompatibility_Include | TankCompatibility_Exclude,
tank: Tank, tank: Tank,
sets: Sets, sets: Sets,
characteristics: ComputedCharacteristics, characteristics: ComputedCharacteristics,
) { ) {
if (include === undefined) {
return true;
}
if (include.is_special) { if (include.is_special) {
throw new Error("is_special Not implemented"); throw new Error("is_special Not implemented");
} }
return ( return (
include.nations.some((nation) => nation === tank.tank!.nation) || include.nations.some((nation) => nation === tank.tank!.nation) ||
include.tiers.some((tier) => tier === tank.tank!.tier) || // include.tiers.some((tier) => tier === tank.tank!.tier) ||
include.tier_catalog_ids.some( include.tier_catalog_ids.some(
(tier) => tier === tank.tank!.tier_catalog_id, (tier) => tier === tank.tank!.tier_catalog_id,
) || ) ||