diff --git a/README.md b/README.md index e988fa1ce..bc8b36783 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ npm run rename-badge -- sundae "New 4v4 Sundaes" While in the folder with the images: ```bash -for i in *; do npx @squoosh/cli --avif '{"cqLevel":33,"cqAlphaLevel":-1,"denoiseLevel":0,"tileColsLog2":0,"tileRowsLog2":0,"speed":6,"subsample":1,"chromaDeltaQ":false,"sharpness":0,"tune":0}' $i; done +for i in *.png; do npx @squoosh/cli --avif '{"cqLevel":33,"cqAlphaLevel":-1,"denoiseLevel":0,"tileColsLog2":0,"tileRowsLog2":0,"speed":6,"subsample":1,"chromaDeltaQ":false,"sharpness":0,"tune":0}' $i; done ``` ## How to... diff --git a/app/components/Placement.tsx b/app/components/Placement.tsx new file mode 100644 index 000000000..05843f9de --- /dev/null +++ b/app/components/Placement.tsx @@ -0,0 +1,57 @@ +import { getEnglishOrdinalSuffix } from "~/utils/strings"; + +export type PlacementProps = { + placement: number; + iconClassName?: string; + textClassName?: string; +}; + +const getSpecialPlacementIconPath = (placement: number): string | null => { + switch (placement) { + case 3: + return "/svg/placements/third.svg"; + case 2: + return "/svg/placements/second.svg"; + case 1: + return "/svg/placements/first.svg"; + default: + return null; + } +}; + +export function Placement({ + placement, + iconClassName, + textClassName, +}: PlacementProps) { + /* + Placements are using english ordinal syntax only. + If wished for, we could look into properly adding translations here, but + english-style ordinals are commonly used internationally as well. + */ + const ordinalSuffix = getEnglishOrdinalSuffix(placement); + const iconPath = getSpecialPlacementIconPath(placement); + + if (!iconPath) { + return ( + + {placement} + {ordinalSuffix} + + ); + } + + const placementString = `${placement}${ordinalSuffix}`; + + return ( + {placementString} + ); +} diff --git a/app/modules/analyzer/constants.ts b/app/modules/analyzer/constants.ts index 89b7e959a..031244f12 100644 --- a/app/modules/analyzer/constants.ts +++ b/app/modules/analyzer/constants.ts @@ -1,2 +1,32 @@ export const MAX_LDE_INTENSITY = 21; export const MAX_AP = 57; + +export const DAMAGE_RECEIVERS = [ + "Bomb_TorpedoBullet", // Torpedo + "Chariot", // Crab Tank + "Gachihoko_Barrier", // Rainmaker Shield + "GreatBarrier_Barrier", // Big Bubbler Shield + "GreatBarrier_WeakPoint", // Big Bubbler Weak Point + "InkRail", // InkRail + "NiceBall_Armor", // Booyah Bomb Armor + "ShockSonar", // Wave Breaker + "Sponge_Versus", // Sponge + "Wsb_Flag", // Squid Beakon + "Wsb_Shield", // Splash Wall + "Wsb_Sprinkler", // Sprinkler + "BulletUmbrellaCanopyCompact", // Undercover Brella Canopy + "BulletUmbrellaCanopyNormal", // Splat Brella Canopy + "BulletUmbrellaCanopyWide", // Tenta Brella Canopy +] as const; + +export const DAMAGE_TYPE = [ + "NORMAL_MIN", + "NORMAL_MAX", + "DIRECT", + "FULL_CHARGE", + "MAX_CHARGE", + "TAP_SHOT", + "DISTANCE", + "BOMB_NORMAL", + "BOMB_DIRECT", +] as const; diff --git a/app/modules/analyzer/damageMultipliers.ts b/app/modules/analyzer/damageMultipliers.ts new file mode 100644 index 000000000..b83fa374e --- /dev/null +++ b/app/modules/analyzer/damageMultipliers.ts @@ -0,0 +1,74 @@ +import type { DamageType } from "./types"; +import objectDamages from "./object-dmg.json"; +import type { + MainWeaponId, + SpecialWeaponId, + SubWeaponId, +} from "../in-game-lists"; +import { DAMAGE_RECEIVERS } from "./constants"; + +const objectDamageJsonKeyPriority: Record< + DamageType, + Array +> = { + NORMAL_MIN: ["Shooter"], + NORMAL_MAX: ["Shooter"], + DIRECT: [], + FULL_CHARGE: [], + MAX_CHARGE: [], + TAP_SHOT: [], + DISTANCE: [], + BOMB_NORMAL: [], + BOMB_DIRECT: [], +}; + +export function damageTypeToMultipliers({ + type, + weapon, +}: { + type: DamageType; + weapon: + | { + type: "MAIN"; + id: MainWeaponId; + } + | { + type: "SUB"; + id: SubWeaponId; + } + | { + type: "SPECIAL"; + id: SpecialWeaponId; + }; +}) { + for (const key of objectDamageJsonKeyPriority[type]) { + const objectDamagesObj = objectDamages[key]; + + let ok = false; + + if (weapon.type === "MAIN") { + ok = (objectDamagesObj.mainWeaponIds as MainWeaponId[]).includes( + weapon.id + ); + } else if (weapon.type === "SUB") { + ok = (objectDamagesObj.subWeaponIds as SubWeaponId[]).includes(weapon.id); + } else if (weapon.type === "SPECIAL") { + ok = (objectDamagesObj.specialWeaponIds as SpecialWeaponId[]).includes( + weapon.id + ); + } + + if (ok) return objectDamagesObj.rates; + } + + return null; +} + +export function fallbackRates( + multipliers: ReturnType +) { + return DAMAGE_RECEIVERS.map((receiver) => ({ + target: receiver, + rate: multipliers?.find((m) => m.target === receiver)?.rate ?? 1, + })); +} diff --git a/app/modules/analyzer/index.ts b/app/modules/analyzer/index.ts index c60392b72..31afacf81 100644 --- a/app/modules/analyzer/index.ts +++ b/app/modules/analyzer/index.ts @@ -9,6 +9,8 @@ export type { export { useAnalyzeBuild } from "./useAnalyzeBuild"; -export { MAX_LDE_INTENSITY } from "./constants"; +export { useObjectDamage } from "./useObjectDamage"; + +export { MAX_LDE_INTENSITY, DAMAGE_RECEIVERS, DAMAGE_TYPE } from "./constants"; export { lastDitchEffortIntensityToAp } from "./specialEffects"; diff --git a/app/modules/analyzer/object-dmg.json b/app/modules/analyzer/object-dmg.json new file mode 100644 index 000000000..d5f332f4b --- /dev/null +++ b/app/modules/analyzer/object-dmg.json @@ -0,0 +1,5579 @@ +{ + "Blaster_BlasterMiddle": { + "mainWeaponIds": [20900, 210, 20210, 10210, 30200, 30210], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.6 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.9 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.9 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.9 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnBoxL", + "rate": 10 + }, + { + "target": "MsnBoxS", + "rate": 10 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 1.5 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "Blaster_BlasterShort": { + "mainWeaponIds": [200, 20200, 10200], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3.6 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.1 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnBoxL", + "rate": 10 + }, + { + "target": "MsnBoxS", + "rate": 10 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 1.5 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "Blaster_KillOneShot": { + "mainWeaponIds": [ + 20900, 220, 20220, 10220, 210, 20210, 10210, 30200, 30210, 20200, 10200 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.6 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.9 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.9 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.9 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnBoxL", + "rate": 10 + }, + { + "target": "MsnBoxS", + "rate": 10 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 1.5 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "Blaster": { + "mainWeaponIds": [ + 250, 20250, 10250, 230, 20230, 10230, 240, 20240, 10240, 220, 20220, 10220 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.6 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.1 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnBoxL", + "rate": 10 + }, + { + "target": "MsnBoxS", + "rate": 10 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 1.5 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "BlowerExhale_BombCore": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [8, 10008], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 7 + }, + { + "target": "Chariot", + "rate": 2.8 + }, + { + "target": "Gachihoko_Barrier", + "rate": 5.6 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 5.6 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.8 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 4 + }, + { + "target": "ShockSonar", + "rate": 5.6 + }, + { + "target": "Sponge_Versus", + "rate": 5.6 + }, + { + "target": "Wsb_Flag", + "rate": 5.6 + }, + { + "target": "Wsb_Shield", + "rate": 5.6 + }, + { + "target": "Wsb_Sprinkler", + "rate": 5.6 + } + ] + }, + "BlowerInhale": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [8, 10008], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + } + ] + }, + "BombFlower": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + } + ] + }, + "Bomb_CurlingBullet": { + "mainWeaponIds": [], + "subWeaponIds": [6, 11006, 10006, 30006], + "specialWeaponIds": [], + "rates": [ + { + "target": "AttractTarget", + "rate": 1 + }, + { + "target": "Bomb_TorpedoBullet", + "rate": 0.5 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "MsnGoal", + "rate": 5 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "Bomb_DirectHit": { + "mainWeaponIds": [], + "subWeaponIds": [ + 2, 11002, 10002, 30002, 7, 10007, 30007, 0, 21000, 20000, 11000, 10000, + 30000 + ], + "specialWeaponIds": [], + "rates": [ + { + "target": "AttractTarget", + "rate": 1 + }, + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 1 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.5 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Bomb_Fizzy": { + "mainWeaponIds": [], + "subWeaponIds": [5], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 3.6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3.6 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 3.6 + }, + { + "target": "Chariot", + "rate": 1.6 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3.6 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3.6 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.9 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnBoxL", + "rate": 5 + }, + { + "target": "MsnBoxS", + "rate": 4 + }, + { + "target": "MsnGoal", + "rate": 5 + }, + { + "target": "NiceBall_Armor", + "rate": 2.4 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "ShockSonar", + "rate": 1.8 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 3.2 + }, + { + "target": "Wsb_Shield", + "rate": 3.6 + }, + { + "target": "Wsb_Sprinkler", + "rate": 3.2 + } + ] + }, + "Bomb_Suction": { + "mainWeaponIds": [], + "subWeaponIds": [1, 10001], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.5 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 5 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Bomb_TorpedoBullet": { + "mainWeaponIds": [], + "subWeaponIds": [13], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 4 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 4 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 4 + }, + { + "target": "Chariot", + "rate": 2 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 5 + }, + { + "target": "NiceBall_Armor", + "rate": 2.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 3 + }, + { + "target": "Wsb_Flag", + "rate": 3 + }, + { + "target": "Wsb_Shield", + "rate": 4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 3 + } + ] + }, + "Bomb_TorpedoSplashBurst": { + "mainWeaponIds": [], + "subWeaponIds": [13], + "specialWeaponIds": [], + "rates": [ + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "Propeller", + "rate": 5 + } + ] + }, + "Bomb_Trap": { + "mainWeaponIds": [], + "subWeaponIds": [10, 10010], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnEnemyEscape", + "rate": 2.5 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Bomb": { + "mainWeaponIds": [], + "subWeaponIds": [ + 6, 11006, 10006, 30006, 2, 11002, 10002, 30002, 7, 10007, 30007, 0, 21000, + 20000, 11000, 10000, 30000 + ], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 1 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.5 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "BrushCore": { + "mainWeaponIds": [1100, 21100, 11100, 1110, 21110, 11110, 31100, 31110], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "CoopGoldenIkuraBox", + "rate": 1 + }, + { + "target": "CoopSpawnBox", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "InkRail", + "rate": 12 + }, + { + "target": "MsnBoxHard", + "rate": 0.6 + }, + { + "target": "MsnBoxL", + "rate": 100 + }, + { + "target": "MsnBoxS", + "rate": 100 + }, + { + "target": "MsnGoal", + "rate": 6 + }, + { + "target": "Sponge_Versus", + "rate": 2.189 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "BrushSplash": { + "mainWeaponIds": [1100, 21100, 11100, 1110, 21110, 11110, 31100, 31110], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.5 + }, + { + "target": "Chariot", + "rate": 1.4 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.8 + }, + { + "target": "MsnBoxHard", + "rate": 0.8 + }, + { + "target": "MsnGoal", + "rate": 4 + }, + { + "target": "NiceBall_Armor", + "rate": 1.4 + }, + { + "target": "ShockSonar", + "rate": 1.8 + }, + { + "target": "Sponge_Versus", + "rate": 1.8 + }, + { + "target": "Wsb_Flag", + "rate": 1.8 + }, + { + "target": "Wsb_Shield", + "rate": 1.8 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1.8 + } + ] + }, + "CannonMissile": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + } + ] + }, + "ChargerFull_Light": { + "mainWeaponIds": [22900, 2050, 22050, 12050], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 0.8 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 0.9 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 1.6 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 1.6 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "ChargerFull_Long": { + "mainWeaponIds": [2040, 12040, 2030, 22030, 12030], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2.4 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.3 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.3 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.725 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.35 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2.2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2.2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "ChargerFull": { + "mainWeaponIds": [ + 2060, 22060, 12060, 2020, 12020, 2010, 22010, 12010, 2000, 22000, 12000 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.5 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Charger_Light": { + "mainWeaponIds": [22900, 2050, 22050, 12050], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 0.8 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 0.9 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 1.6 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 1.6 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Charger_Long": { + "mainWeaponIds": [2040, 12040, 2030, 22030, 12030], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2.4 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.35 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2.2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2.2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Charger": { + "mainWeaponIds": [ + 2060, 22060, 12060, 2020, 12020, 2010, 22010, 12010, 2000, 22000, 12000 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Chariot_Body": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [12, 20012, 10012], + "rates": [ + { + "target": "EnemyRockBall", + "rate": 10 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 1 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Shield", + "rate": 100 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "Chariot_Cannon": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [12, 20012, 10012], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 3 + }, + { + "target": "Chariot", + "rate": 1.5 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.5 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnEnemyShield", + "rate": 20 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 3 + }, + { + "target": "Sponge_Versus", + "rate": 3 + }, + { + "target": "Wsb_Flag", + "rate": 3 + }, + { + "target": "Wsb_Shield", + "rate": 3 + }, + { + "target": "Wsb_Sprinkler", + "rate": 3 + } + ] + }, + "Default": { + "mainWeaponIds": [ + 20900, 220, 20220, 10220, 210, 20210, 10210, 30200, 30210, 20200, 10200, + 1100, 21100, 11100, 1110, 21110, 11110, 31100, 31110, 22900, 2060, 22060, + 12060, 2050, 22050, 12050, 2040, 12040, 2030, 42030, 22030, 12030, 2020, + 12020, 2010, 22010, 12010, 2000, 22000, 12000, 40000, 1000, 21000, 11000, + 1020, 21020, 11020, 1030, 21030, 11030, 1010, 21010, 11010, 31000, 31010, + 26900, 6020, 26020, 16020, 6000, 26000, 16000, 36000, 36010, 6010, 26010, + 16010, 40040, 40042, 40041 + ], + "subWeaponIds": [8, 6, 11006, 10006, 30006, 12, 10012, 9, 11, 10100], + "specialWeaponIds": [ + 12, 20012, 10012, 15, 20, 2, 30002, 10100, 7, 20007, 10007, 30007 + ], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 1 + } + ] + }, + "EnemyFlyingHohei_BombCore": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "Propeller", + "rate": 5 + } + ] + }, + "GachihokoTimeUpBurst": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 1 + } + ] + }, + "Gachihoko_BombCore": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [20], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.5 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "Gachihoko_Bullet": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [20], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.75 + }, + { + "target": "Propeller", + "rate": 1 + } + ] + }, + "Geyser": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + } + ] + }, + "GoldenIkuraAttack": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + } + ] + }, + "InkStormRain": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [5, 30005], + "rates": [ + { + "target": "BlowerInhale", + "rate": 1 + } + ] + }, + "InkStorm": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [5, 10005, 30005], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.25 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 3 + }, + { + "target": "Chariot", + "rate": 2.5 + }, + { + "target": "Gachihoko_Barrier", + "rate": 5 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 5 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 5 + }, + { + "target": "NiceBall_Armor", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 3 + }, + { + "target": "Sponge_Versus", + "rate": 5 + }, + { + "target": "Wsb_Shield", + "rate": 3 + } + ] + }, + "Jetpack_BombCore": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [10], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 3.5 + }, + { + "target": "Chariot", + "rate": 1.4 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.1 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnBoxL", + "rate": 2 + }, + { + "target": "MsnEnemyShield", + "rate": 20 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2.8 + }, + { + "target": "Sponge_Versus", + "rate": 2.8 + }, + { + "target": "Wsb_Flag", + "rate": 2.8 + }, + { + "target": "Wsb_Shield", + "rate": 2.8 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.8 + } + ] + }, + "Jetpack_Bullet": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [10, 10010, 30010], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 3.5 + }, + { + "target": "Chariot", + "rate": 0.8334 + }, + { + "target": "CoopEnemySakeTamaireOneBomb", + "rate": 1 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.1 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnBoxL", + "rate": 2 + }, + { + "target": "MsnEnemyShield", + "rate": 20 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3334 + }, + { + "target": "ShockSonar", + "rate": 2.8 + }, + { + "target": "Sponge_Versus", + "rate": 2.8 + }, + { + "target": "Wsb_Flag", + "rate": 2.8 + }, + { + "target": "Wsb_Shield", + "rate": 2.8 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.8 + } + ] + }, + "Jetpack_Coop": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [20010], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "ShockSonar", + "rate": 1 + }, + { + "target": "Sponge_Versus", + "rate": 1 + }, + { + "target": "Wsb_Flag", + "rate": 1 + }, + { + "target": "Wsb_Shield", + "rate": 1 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1 + } + ] + }, + "Jetpack_Jet": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [10, 20010, 30010], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.8 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 2.8 + }, + { + "target": "Wsb_Flag", + "rate": 2.8 + }, + { + "target": "Wsb_Shield", + "rate": 2.8 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.8 + } + ] + }, + "Maneuver_Short": { + "mainWeaponIds": [5000, 25000, 15000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.1 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.6 + } + ] + }, + "Maneuver": { + "mainWeaponIds": [ + 5030, 25030, 15030, 5020, 25020, 15020, 5010, 25010, 15010, 35000, 35010, + 5040, 25040, 15040 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.6 + } + ] + }, + "MicroLaser": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [9, 20009, 10009], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.5 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 0.5 + }, + { + "target": "CoopEnemySakelienTowerPart", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "ShockSonar", + "rate": 2.4 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + } + ] + }, + "MissionSalmonBuddy": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnBoxL", + "rate": 1.6 + }, + { + "target": "MsnGoal", + "rate": 45 + }, + { + "target": "NiceBall_Armor", + "rate": 1 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 5 + } + ] + }, + "MovePainter_Burst": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "MsnEnemy", + "rate": 10 + }, + { + "target": "MsnEnemyShield", + "rate": 40 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 10 + }, + { + "target": "SnakeBlock", + "rate": 8 + }, + { + "target": "Sponge_Versus", + "rate": 10 + } + ] + }, + "MovePainter_Direct": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "MsnEnemyShield", + "rate": 20 + } + ] + }, + "MultiMissile_BombCore": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [4, 10004, 30004], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.5 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.75 + }, + { + "target": "MsnBoxHard", + "rate": 2.5 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 5 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "MultiMissile_Bullet": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [4, 10004, 30004], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.5 + }, + { + "target": "Chariot", + "rate": 1.5 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.75 + }, + { + "target": "MsnBoxHard", + "rate": 8 + }, + { + "target": "MsnBoxS", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "NiceBall": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [6, 20006], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2.5 + }, + { + "target": "Chariot", + "rate": 2 + }, + { + "target": "CoopEnemyHardBody", + "rate": 1 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "ShockSonar", + "rate": 3 + }, + { + "target": "Sponge_Versus", + "rate": 3 + }, + { + "target": "Wsb_Shield", + "rate": 3 + } + ] + }, + "ObjectEffect_Up": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 1.3 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.1 + }, + { + "target": "InkRail", + "rate": 1.3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.1 + }, + { + "target": "ShockSonar", + "rate": 1.25 + }, + { + "target": "Sponge_Versus", + "rate": 1.3 + }, + { + "target": "Wsb_Flag", + "rate": 10 + }, + { + "target": "Wsb_Shield", + "rate": 1.5 + }, + { + "target": "Wsb_Sprinkler", + "rate": 10 + } + ] + }, + "RollerCore": { + "mainWeaponIds": [ + 1000, 21000, 11000, 1020, 21020, 11020, 1030, 21030, 11030, 1010, 21010, + 11010, 31000, 31010 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "CoopGoldenIkuraBox", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "InkRail", + "rate": 12 + }, + { + "target": "MsnBoxHard", + "rate": 1 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 0.5 + }, + { + "target": "Sponge_Versus", + "rate": 0.344 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "RollerSplash_Compact": { + "mainWeaponIds": [1000, 21000, 11000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.8 + }, + { + "target": "Chariot", + "rate": 1.4 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.8 + }, + { + "target": "MsnBoxHard", + "rate": 1 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.43 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 1.2 + }, + { + "target": "Wsb_Flag", + "rate": 2.88 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.88 + } + ] + }, + "RollerSplash_Heavy": { + "mainWeaponIds": [1020, 21020, 11020], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.5 + }, + { + "target": "Chariot", + "rate": 1.6 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.35 + }, + { + "target": "MsnBoxHard", + "rate": 1 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 1.8 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.6 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 1.2 + }, + { + "target": "Wsb_Flag", + "rate": 2.88 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.88 + } + ] + }, + "RollerSplash_Hunter": { + "mainWeaponIds": [1030, 21030, 11030], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.5 + }, + { + "target": "Chariot", + "rate": 1.4 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.35 + }, + { + "target": "MsnBoxHard", + "rate": 1 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.4 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 1.2 + }, + { + "target": "Wsb_Flag", + "rate": 2.88 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.88 + } + ] + }, + "RollerSplash": { + "mainWeaponIds": [1010, 21010, 11010, 31000, 31010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.78 + }, + { + "target": "Chariot", + "rate": 1.4 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.8 + }, + { + "target": "MsnBoxHard", + "rate": 1 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.43 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 1.2 + }, + { + "target": "Wsb_Flag", + "rate": 2.88 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.88 + } + ] + }, + "Saber_ChargeShot": { + "mainWeaponIds": [8010, 28010, 8000, 28000, 18000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 4.8 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 4.8 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 4.8 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 4.8 + }, + { + "target": "Chariot", + "rate": 2.6 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3.2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 4.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnEnemyShield", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 2.6 + }, + { + "target": "ShockSonar", + "rate": 4.8 + }, + { + "target": "Sponge_Versus", + "rate": 4.8 + }, + { + "target": "Wsb_Flag", + "rate": 4.8 + }, + { + "target": "Wsb_Shield", + "rate": 4.8 + }, + { + "target": "Wsb_Sprinkler", + "rate": 4.8 + } + ] + }, + "Saber_ChargeSlash": { + "mainWeaponIds": [8010, 28010, 8000, 28000, 18000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 1.2 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.2 + }, + { + "target": "Chariot", + "rate": 0.65 + }, + { + "target": "Gachihoko_Barrier", + "rate": 0.8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.9 + }, + { + "target": "MsnBoxHard", + "rate": 10 + }, + { + "target": "MsnEnemyShield", + "rate": 10 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 4 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 0.65 + }, + { + "target": "ShockSonar", + "rate": 1.2 + }, + { + "target": "Sponge_Versus", + "rate": 1.2 + }, + { + "target": "Wsb_Flag", + "rate": 1.2 + }, + { + "target": "Wsb_Shield", + "rate": 1.2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1.2 + } + ] + }, + "Saber_Shot": { + "mainWeaponIds": [8010, 28010, 8000, 28000, 18000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 4.8 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 4.8 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 4.8 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 4.8 + }, + { + "target": "Chariot", + "rate": 2.6 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3.2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 4.8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 3.6 + }, + { + "target": "MsnEnemyShield", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 2.6 + }, + { + "target": "ShockSonar", + "rate": 4.8 + }, + { + "target": "Sponge_Versus", + "rate": 4.8 + }, + { + "target": "Wsb_Flag", + "rate": 4.8 + }, + { + "target": "Wsb_Shield", + "rate": 4.8 + }, + { + "target": "Wsb_Sprinkler", + "rate": 4.8 + } + ] + }, + "Saber_Slash": { + "mainWeaponIds": [8010, 28010, 8000, 28000, 18000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2.4 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.6 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.8 + }, + { + "target": "MsnBoxHard", + "rate": 3 + }, + { + "target": "MsnEnemyShield", + "rate": 10 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3 + }, + { + "target": "ShockSonar", + "rate": 2.4 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "SakerocketBullet": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Chariot", + "rate": 2.5 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Default", + "rate": 1 + }, + { + "target": "MsnSharkKing", + "rate": 1 + }, + { + "target": "ShockSonar", + "rate": 1 + } + ] + }, + "ShelterCanopy_Compact": { + "mainWeaponIds": [6020, 26020, 16020], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 5 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Shield", + "rate": 1 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "ShelterCanopy_Wide": { + "mainWeaponIds": [6010, 26010, 16010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 5 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Shield", + "rate": 1 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "ShelterCanopy": { + "mainWeaponIds": [26900, 6000, 26000, 16000, 36000, 36010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 5 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "Propeller", + "rate": 3 + }, + { + "target": "ShockSonar", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Shield", + "rate": 1 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "ShelterShot_Compact": { + "mainWeaponIds": [6020, 26020, 16020], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "InkRail", + "rate": 1.175 + }, + { + "target": "NiceBall_Armor", + "rate": 1.56 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2.4 + }, + { + "target": "Sponge_Versus", + "rate": 2.88 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "ShelterShot_Wide": { + "mainWeaponIds": [6010, 26010, 16010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2.4 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "ShelterShot": { + "mainWeaponIds": [26900, 6000, 26000, 16000, 36000, 36010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 2.4 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 1.3 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2.4 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 2.4 + }, + { + "target": "Wsb_Shield", + "rate": 2.4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.4 + } + ] + }, + "Shield": { + "mainWeaponIds": [], + "subWeaponIds": [4], + "specialWeaponIds": [], + "rates": [ + { + "target": "Gachihoko_Barrier", + "rate": 0.2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 0.2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.2 + }, + { + "target": "NiceBall_Armor", + "rate": 3.75 + }, + { + "target": "Sponge_Versus", + "rate": 0.2 + } + ] + }, + "ShockSonar_Wave": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [7, 20007, 10007, 30007], + "rates": [ + { + "target": "Chariot", + "rate": 2 + }, + { + "target": "Gachihoko_Barrier", + "rate": 8 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 8 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 8 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 100 + }, + { + "target": "Wsb_Shield", + "rate": 100 + }, + { + "target": "Wsb_Sprinkler", + "rate": 100 + } + ] + }, + "Shooter_Blaze": { + "mainWeaponIds": [30, 20030, 10030], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.1 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + } + ] + }, + "Shooter_Expert": { + "mainWeaponIds": [70, 20070, 10070], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.6 + } + ] + }, + "Shooter_First": { + "mainWeaponIds": [10, 20010, 10010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.1 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + } + ] + }, + "Shooter_FlashRepeat": { + "mainWeaponIds": [400, 20400, 10400], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + }, + { + "target": "ShockSonar", + "rate": 1.1 + }, + { + "target": "Wsb_Shield", + "rate": 1.1 + } + ] + }, + "Shooter_Flash": { + "mainWeaponIds": [400, 20400, 10400], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + }, + { + "target": "ShockSonar", + "rate": 1.1 + }, + { + "target": "Wsb_Shield", + "rate": 1.1 + } + ] + }, + "Shooter_Gravity": { + "mainWeaponIds": [50], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.85 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + }, + { + "target": "ShockSonar", + "rate": 1.1 + }, + { + "target": "Wsb_Shield", + "rate": 1.1 + } + ] + }, + "Shooter_Heavy": { + "mainWeaponIds": [80], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.1 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.6 + }, + { + "target": "ShockSonar", + "rate": 1.1 + }, + { + "target": "Wsb_Shield", + "rate": 1.1 + } + ] + }, + "Shooter_Long": { + "mainWeaponIds": [90, 20090, 10090], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.6 + } + ] + }, + "Shooter_Precision": { + "mainWeaponIds": [20, 20020, 10020], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.1 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + } + ] + }, + "Shooter_Short": { + "mainWeaponIds": [0, 20000, 10000], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.1 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + }, + { + "target": "Sponge_Versus", + "rate": 1 + } + ] + }, + "Shooter_TripleMiddle": { + "mainWeaponIds": [310], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.8 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.8 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.8 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.2 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + }, + { + "target": "Sponge_Versus", + "rate": 1.2 + }, + { + "target": "Wsb_Flag", + "rate": 1.2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1.2 + } + ] + }, + "Shooter_TripleQuick": { + "mainWeaponIds": [300], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.85 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.85 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.85 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.15 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.15 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.15 + }, + { + "target": "NiceBall_Armor", + "rate": 0.65 + }, + { + "target": "Sponge_Versus", + "rate": 1.1 + }, + { + "target": "Wsb_Flag", + "rate": 1.2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1.2 + } + ] + }, + "Shooter": { + "mainWeaponIds": [ + 400, 20400, 10400, 20050, 10050, 20080, 10080, 10900, 10910, 10920, 40, + 20040, 45, 10040, 60, 20060, 10060, 30000, 30010, 20310, 10310, 20300, + 10300 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.7 + } + ] + }, + "Skewer_Body": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [13, 20013, 10013], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 100 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 100 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 100 + }, + { + "target": "Chariot", + "rate": 7.28 + }, + { + "target": "CoopEnemyHardBody", + "rate": 1 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 0.45 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 5 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 5 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 7.5 + }, + { + "target": "ShockSonar", + "rate": 5 + }, + { + "target": "Wsb_Flag", + "rate": 5 + }, + { + "target": "Wsb_Shield", + "rate": 5 + }, + { + "target": "Wsb_Sprinkler", + "rate": 5 + } + ] + }, + "Skewer": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [13, 20013, 10013], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 9.5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 6 + }, + { + "target": "Chariot", + "rate": 7.28 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 0.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 5 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 5 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 5 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 7.5 + }, + { + "target": "ShockSonar", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 5 + }, + { + "target": "Wsb_Flag", + "rate": 5 + }, + { + "target": "Wsb_Shield", + "rate": 5 + }, + { + "target": "Wsb_Sprinkler", + "rate": 5 + } + ] + }, + "Slosher_Bathtub": { + "mainWeaponIds": [3030, 23030, 13030], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 1.6 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.6 + }, + { + "target": "Default", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 2.5 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.5 + } + ] + }, + "Slosher_Bear": { + "mainWeaponIds": [23900], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemyHardBody", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 1.25 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 2.5 + }, + { + "target": "Wsb_Shield", + "rate": 2.5 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.5 + } + ] + }, + "Slosher_WashtubBombCore": { + "mainWeaponIds": [3040, 23040, 13040], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakeTamaireOneBomb", + "rate": 1 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3.2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3.2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.8 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 4 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 4 + } + ] + }, + "Slosher_Washtub": { + "mainWeaponIds": [3040, 23040, 13040], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3.6 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3.6 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.9 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 1.25 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 5 + }, + { + "target": "Wsb_Shield", + "rate": 2.5 + }, + { + "target": "Wsb_Sprinkler", + "rate": 5 + } + ] + }, + "Slosher": { + "mainWeaponIds": [ + 3010, 23010, 13010, 3020, 23020, 13020, 33000, 33010, 3000, 23000, 13000 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakelienTowerUnite", + "rate": 1 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2.4 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.4 + }, + { + "target": "MsnBoxHard", + "rate": 1.5 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 1.25 + }, + { + "target": "Sponge_Versus", + "rate": 2.4 + }, + { + "target": "Wsb_Flag", + "rate": 2.5 + }, + { + "target": "Wsb_Shield", + "rate": 2.5 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2.5 + } + ] + }, + "Spinner": { + "mainWeaponIds": [ + 4030, 24030, 14030, 4020, 24020, 14020, 4000, 24000, 14000, 4040, 24040, + 14040, 4010, 24010, 14010 + ], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 0.7 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 0.7 + }, + { + "target": "Chariot", + "rate": 1 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1 + }, + { + "target": "NiceBall_Armor", + "rate": 0.6 + } + ] + }, + "Sprinkler": { + "mainWeaponIds": [], + "subWeaponIds": [3], + "specialWeaponIds": [], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.5 + }, + { + "target": "Gachihoko_Barrier", + "rate": 0.6 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 0.6 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 0.6 + }, + { + "target": "Sponge_Versus", + "rate": 0.6 + } + ] + }, + "Stringer_Short": { + "mainWeaponIds": [7020, 27020], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 1.5556 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2.3333 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 1.5556 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.5556 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.5556 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.5556 + }, + { + "target": "ShockSonar", + "rate": 1.5556 + }, + { + "target": "Sponge_Versus", + "rate": 1.5556 + }, + { + "target": "Wsb_Flag", + "rate": 1.5556 + }, + { + "target": "Wsb_Shield", + "rate": 1.5556 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1.5556 + } + ] + }, + "Stringer": { + "mainWeaponIds": [27900, 7010, 27010, 17010], + "subWeaponIds": [], + "specialWeaponIds": [], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 1.3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnBoxHard", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 3 + }, + { + "target": "NiceBall_Armor", + "rate": 1.3 + }, + { + "target": "Propeller", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "SuperHook": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [3, 10003], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnBoxHard", + "rate": 2 + }, + { + "target": "MsnEnemy", + "rate": 2 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 2 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "SnakeBlock", + "rate": 12 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "SuperLanding": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [101, 20101, 30101], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.6 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 10 + }, + { + "target": "EnemyRockBall", + "rate": 2 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "MsnBossWeak", + "rate": 5 + }, + { + "target": "MsnBoxHard", + "rate": 5 + }, + { + "target": "MsnBoxL", + "rate": 2.5 + }, + { + "target": "MsnBoxS", + "rate": 2 + }, + { + "target": "MsnEnemyShield", + "rate": 20 + }, + { + "target": "MsnEnemyTakopodDEV", + "rate": 4 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "MsnLeaderMoray", + "rate": 2 + }, + { + "target": "MsnMantaShadow", + "rate": 2 + }, + { + "target": "MsnRailKingHand", + "rate": 5 + }, + { + "target": "MsnSharkKing", + "rate": 2.5 + }, + { + "target": "NiceBall_Armor", + "rate": 1.5 + }, + { + "target": "Propeller", + "rate": 5 + }, + { + "target": "SnakeBlock", + "rate": 3 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "TripleTornado": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [14, 20014, 10014], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 2 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 2 + }, + { + "target": "Chariot", + "rate": 2 + }, + { + "target": "CoopEnemyHardBody", + "rate": 1 + }, + { + "target": "CoopEnemySakeTamaire", + "rate": 0.8 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2 + }, + { + "target": "NiceBall_Armor", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 2 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 2 + }, + { + "target": "Wsb_Sprinkler", + "rate": 2 + } + ] + }, + "UltraShot": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [1, 20001, 10001], + "rates": [ + { + "target": "BlowoutsRoll", + "rate": 3 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 6 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 6 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 6 + }, + { + "target": "Chariot", + "rate": 1.5 + }, + { + "target": "CoopEnemySakelienCupTwins", + "rate": 1 + }, + { + "target": "EnemyRockBall", + "rate": 3 + }, + { + "target": "Gachihoko_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 2 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.5 + }, + { + "target": "MsnBoxHard", + "rate": 10 + }, + { + "target": "MsnEnemyShield", + "rate": 20 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 2 + }, + { + "target": "ShockSonar", + "rate": 1 + }, + { + "target": "SnakeBlock", + "rate": 5 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Shield", + "rate": 6 + } + ] + }, + "UltraStamp_Swing": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [11, 10011], + "rates": [ + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 20 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 20 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 20 + }, + { + "target": "Chariot", + "rate": 1.5 + }, + { + "target": "EnemyRockBall", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 3 + }, + { + "target": "MsnEnemyShield", + "rate": 10 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.8 + }, + { + "target": "ShockSonar", + "rate": 20 + }, + { + "target": "Sponge_Versus", + "rate": 2 + }, + { + "target": "Wsb_Flag", + "rate": 3 + }, + { + "target": "Wsb_Shield", + "rate": 20 + }, + { + "target": "Wsb_Sprinkler", + "rate": 3 + } + ] + }, + "UltraStamp_Throw_BombCore": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [11, 10011], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 1 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 5 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 5 + }, + { + "target": "Chariot", + "rate": 2 + }, + { + "target": "EnemyRockBall", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 3.5 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 3.5 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 2.625 + }, + { + "target": "NiceBall_Armor", + "rate": 2.5 + }, + { + "target": "ShockSonar", + "rate": 4 + }, + { + "target": "Sponge_Versus", + "rate": 3 + }, + { + "target": "Wsb_Flag", + "rate": 3 + }, + { + "target": "Wsb_Shield", + "rate": 4 + }, + { + "target": "Wsb_Sprinkler", + "rate": 3 + } + ] + }, + "UltraStamp_Throw": { + "mainWeaponIds": [], + "subWeaponIds": [], + "specialWeaponIds": [11, 10011], + "rates": [ + { + "target": "Bomb_TorpedoBullet", + "rate": 0.545 + }, + { + "target": "BulletUmbrellaCanopyCompact", + "rate": 4.091 + }, + { + "target": "BulletUmbrellaCanopyNormal", + "rate": 4.091 + }, + { + "target": "BulletUmbrellaCanopyWide", + "rate": 4.091 + }, + { + "target": "Chariot", + "rate": 1.091 + }, + { + "target": "EnemyRockBall", + "rate": 10 + }, + { + "target": "Gachihoko_Barrier", + "rate": 1.909 + }, + { + "target": "GreatBarrier_Barrier", + "rate": 1.909 + }, + { + "target": "GreatBarrier_WeakPoint", + "rate": 1.4318 + }, + { + "target": "MsnGoal", + "rate": 10 + }, + { + "target": "NiceBall_Armor", + "rate": 1.364 + }, + { + "target": "ShockSonar", + "rate": 2.182 + }, + { + "target": "Sponge_Versus", + "rate": 1.636 + }, + { + "target": "Wsb_Flag", + "rate": 1.636 + }, + { + "target": "Wsb_Shield", + "rate": 2.182 + }, + { + "target": "Wsb_Sprinkler", + "rate": 1.636 + } + ] + } +} diff --git a/app/modules/analyzer/stats.ts b/app/modules/analyzer/stats.ts index 4582d4442..39812f140 100644 --- a/app/modules/analyzer/stats.ts +++ b/app/modules/analyzer/stats.ts @@ -10,7 +10,7 @@ import type { StatFunctionInput, SubWeaponParams, } from "./types"; -import { DAMAGE_TYPE } from "./types"; +import { DAMAGE_TYPE } from "./constants"; import { INK_CONSUME_TYPES } from "./types"; import invariant from "tiny-invariant"; import { @@ -24,13 +24,13 @@ import { semiRandomId } from "~/utils/strings"; import { roundToTwoDecimalPlaces } from "~/utils/number"; export function buildStats({ - abilityPoints, weaponSplId, - mainOnlyAbilities, + abilityPoints = new Map(), + mainOnlyAbilities = [], }: { - abilityPoints: AbilityPoints; weaponSplId: MainWeaponId; - mainOnlyAbilities: Array; + abilityPoints?: AbilityPoints; + mainOnlyAbilities?: Array; }): AnalyzedBuild { const mainWeaponParams = weaponParams().mainWeapons[weaponSplId]; invariant(mainWeaponParams, `Weapon with splId ${weaponSplId} not found`); @@ -515,6 +515,7 @@ function swimSpeed( const RESPAWN_CHASE_FRAME = 150; const OWN_RESPAWN_PUNISHER_EXTRA_RESPAWN_FRAMES = 68; +const SPLATOON_3_FASTER_RESPAWN = 60; function quickRespawnTime( args: StatFunctionInput ): AnalyzedBuild["stats"]["quickRespawnTime"] { @@ -546,10 +547,17 @@ function quickRespawnTime( return { baseValue: framesToSeconds( - RESPAWN_CHASE_FRAME + chase.baseEffect + around.baseEffect + RESPAWN_CHASE_FRAME + + chase.baseEffect + + around.baseEffect - + SPLATOON_3_FASTER_RESPAWN ), value: framesToSeconds( - RESPAWN_CHASE_FRAME + chase.effect + around.effect + extraFrames + RESPAWN_CHASE_FRAME + + chase.effect + + around.effect + + extraFrames - + SPLATOON_3_FASTER_RESPAWN ), modifiedBy: [QUICK_RESPAWN_TIME_ABILITY, "RP"], }; diff --git a/app/modules/analyzer/types.ts b/app/modules/analyzer/types.ts index cb372e50e..3021f2e9d 100644 --- a/app/modules/analyzer/types.ts +++ b/app/modules/analyzer/types.ts @@ -7,6 +7,7 @@ import type { import type { SPECIAL_EFFECTS } from "./specialEffects"; import type weaponParams from "./weapon-params.json"; import type abilityValues from "./ability-values.json"; +import type { DAMAGE_RECEIVERS, DAMAGE_TYPE } from "./constants"; type Overwrites = Record< string, @@ -159,20 +160,10 @@ export interface FullInkTankOption { type: InkConsumeType; } -export const DAMAGE_TYPE = [ - "NORMAL_MIN", - "NORMAL_MAX", - "DIRECT", - "FULL_CHARGE", - "MAX_CHARGE", - "TAP_SHOT", - "DISTANCE", - "BOMB_NORMAL", - "BOMB_DIRECT", -] as const; - export type DamageType = typeof DAMAGE_TYPE[number]; +export type DamageReceiver = typeof DAMAGE_RECEIVERS[number]; + export interface Damage { value: number; type: DamageType; diff --git a/app/modules/analyzer/useAnalyzeBuild.ts b/app/modules/analyzer/useAnalyzeBuild.ts index 593653042..a1f8382fd 100644 --- a/app/modules/analyzer/useAnalyzeBuild.ts +++ b/app/modules/analyzer/useAnalyzeBuild.ts @@ -3,10 +3,8 @@ import { EMPTY_BUILD } from "~/constants"; import { type BuildAbilitiesTupleWithUnknown, type MainWeaponId, - mainWeaponIds, abilities, isAbility, - weaponCategories, } from "../in-game-lists"; import type { Ability, @@ -17,7 +15,10 @@ import { MAX_LDE_INTENSITY } from "./constants"; import { applySpecialEffects, SPECIAL_EFFECTS } from "./specialEffects"; import { buildStats } from "./stats"; import type { SpecialEffectType } from "./types"; -import { buildToAbilityPoints } from "./utils"; +import { + buildToAbilityPoints, + validatedWeaponIdFromSearchParams, +} from "./utils"; const UNKNOWN_SHORT = "U"; @@ -88,20 +89,6 @@ function serializeBuild(build: BuildAbilitiesTupleWithUnknown) { .join(","); } -function validatedWeaponIdFromSearchParams( - searchParams: URLSearchParams -): MainWeaponId { - const weaponId = searchParams.get("weapon") - ? Number(searchParams.get("weapon")) - : null; - - if (mainWeaponIds.includes(weaponId as any)) { - return weaponId as MainWeaponId; - } - - return weaponCategories[0].weaponIds[0]; -} - function validatedBuildFromSearchParams( searchParams: URLSearchParams ): BuildAbilitiesTupleWithUnknown { diff --git a/app/modules/analyzer/useObjectDamage.ts b/app/modules/analyzer/useObjectDamage.ts new file mode 100644 index 000000000..02ba6bcfe --- /dev/null +++ b/app/modules/analyzer/useObjectDamage.ts @@ -0,0 +1,48 @@ +import { useSearchParams } from "@remix-run/react"; +import { type MainWeaponId } from "../in-game-lists"; +import { damageTypeToMultipliers, fallbackRates } from "./damageMultipliers"; +import { buildStats } from "./stats"; +import { validatedWeaponIdFromSearchParams } from "./utils"; + +export function useObjectDamage() { + const [searchParams, setSearchParams] = useSearchParams(); + + const mainWeaponId = validatedWeaponIdFromSearchParams(searchParams); + + const handleChange = ({ + newMainWeaponId = mainWeaponId, + }: { + newMainWeaponId?: MainWeaponId; + }) => { + setSearchParams( + { + weapon: String(newMainWeaponId), + }, + { replace: true, state: { scroll: false } } + ); + }; + + const analyzed = buildStats({ + weaponSplId: mainWeaponId, + }); + + const multipliers = Object.fromEntries( + analyzed.stats.damages.map((damage) => { + return [ + damage.type, + fallbackRates( + damageTypeToMultipliers({ + type: damage.type, + weapon: { type: "MAIN", id: mainWeaponId }, + }) + ), + ]; + }) + ); + + return { + mainWeaponId, + handleChange, + multipliers, + }; +} diff --git a/app/modules/analyzer/utils.ts b/app/modules/analyzer/utils.ts index f36064971..8dcff6526 100644 --- a/app/modules/analyzer/utils.ts +++ b/app/modules/analyzer/utils.ts @@ -1,4 +1,5 @@ import type { Ability, BuildAbilitiesTupleWithUnknown } from "../in-game-lists"; +import { mainWeaponIds, weaponCategories } from "../in-game-lists"; import { abilities } from "../in-game-lists"; import weaponParamsJson from "./weapon-params.json"; import abilityValuesJson from "./ability-values.json"; @@ -10,7 +11,7 @@ import type { SubWeaponParams, } from "./types"; import invariant from "tiny-invariant"; -import type { AbilityWithUnknown } from "../in-game-lists/types"; +import type { AbilityWithUnknown, MainWeaponId } from "../in-game-lists/types"; export function weaponParams(): ParamsJson { return weaponParamsJson as ParamsJson; @@ -150,3 +151,17 @@ export function hasEffect({ return high !== mid || mid !== low; } + +export function validatedWeaponIdFromSearchParams( + searchParams: URLSearchParams +): MainWeaponId { + const weaponId = searchParams.get("weapon") + ? Number(searchParams.get("weapon")) + : null; + + if (mainWeaponIds.includes(weaponId as any)) { + return weaponId as MainWeaponId; + } + + return weaponCategories[0].weaponIds[0]; +} diff --git a/app/modules/i18n/config.ts b/app/modules/i18n/config.ts index a4f392437..828ddcc48 100644 --- a/app/modules/i18n/config.ts +++ b/app/modules/i18n/config.ts @@ -52,4 +52,7 @@ export const config = { fallbackLng: DEFAULT_LANGUAGE, defaultNS: "common", react: { useSuspense: false }, + interpolation: { + escapeValue: false, + }, }; diff --git a/app/modules/map-list-generator/map-list.ts b/app/modules/map-list-generator/map-list.ts index fc3f125ee..58f890d97 100644 --- a/app/modules/map-list-generator/map-list.ts +++ b/app/modules/map-list-generator/map-list.ts @@ -59,7 +59,9 @@ export function generateMapList( } function isValid(stageId: StageId, mapHistory: StageId[]) { - return !mapHistory.slice(-BACKLOG, mapHistory.length).includes(stageId); + // [1,2,3,4,5,6,7,8,9,10].slice(-2) + // > (2) [9, 10] + return !mapHistory.slice(-BACKLOG).includes(stageId); } function addAndReturnMap( @@ -154,8 +156,28 @@ function getMap( for (let bucketNum = 0; bucketNum < buckets.size; bucketNum++) { const item = buckets.get(bucketNum); shuffle(item![mode]); - for (const stageId of item![mode]) { - if (isValid(stageId, mapHistory)) { + + for (const [i, stageId] of item![mode].entries()) { + // fallback solution, might happen if map pool is small + const isLast = () => { + // is actually last + if (bucketNum === buckets.size - 1 && i === item![mode].length - 1) { + return true; + } + + // is last in bucket and next is empty + const nextBucket = buckets.get(bucketNum + 1); + if ( + i === item![mode].length - 1 && + nextBucket && + nextBucket[mode].length === 0 + ) { + return true; + } + + return false; + }; + if (isLast() || isValid(stageId, mapHistory)) { return addAndReturnMap(stageId, mode, buckets, bucketNum); } } diff --git a/app/routes/badges/$id/edit.tsx b/app/routes/badges/$id/edit.tsx index d597b644c..ed7fb1cf1 100644 --- a/app/routes/badges/$id/edit.tsx +++ b/app/routes/badges/$id/edit.tsx @@ -72,8 +72,8 @@ export default function EditBadgePage() { const { badgeName } = useOutletContext(); return ( - -
+ +

Editing winners of {badgeName} diff --git a/app/routes/calendar/$id/index.tsx b/app/routes/calendar/$id/index.tsx index 5e17d4188..2ba78c7fb 100644 --- a/app/routes/calendar/$id/index.tsx +++ b/app/routes/calendar/$id/index.tsx @@ -15,6 +15,7 @@ import { Avatar } from "~/components/Avatar"; import { LinkButton } from "~/components/Button"; import { Image } from "~/components/Image"; import { Main } from "~/components/Main"; +import { Placement } from "~/components/Placement"; import { Section } from "~/components/Section"; import { db } from "~/db"; import { useIsMounted } from "~/hooks/useIsMounted"; @@ -28,7 +29,7 @@ import calendarStyles from "~/styles/calendar-event.css"; import mapsStyles from "~/styles/maps.css"; import { databaseTimestampToDate } from "~/utils/dates"; import { notFoundIfFalsy } from "~/utils/remix"; -import { discordFullName, makeTitle, placementString } from "~/utils/strings"; +import { discordFullName, makeTitle } from "~/utils/strings"; import { calendarEditPage, calendarReportWinnersPage, @@ -200,7 +201,9 @@ function Results() { {data.results.map((result, i) => ( - {placementString(result.placement)} + + + {result.teamName}
    diff --git a/app/routes/maps.tsx b/app/routes/maps.tsx index bb9b8c929..6d4589039 100644 --- a/app/routes/maps.tsx +++ b/app/routes/maps.tsx @@ -1,4 +1,9 @@ -import type { LinksFunction, LoaderArgs } from "@remix-run/node"; +import type { + LinksFunction, + LoaderArgs, + MetaFunction, + SerializeFrom, +} from "@remix-run/node"; import type { ShouldReloadFunction } from "@remix-run/react"; import { Link } from "@remix-run/react"; import { useLoaderData, useSearchParams } from "@remix-run/react"; @@ -13,6 +18,7 @@ import { Label } from "~/components/Label"; import { Main } from "~/components/Main"; import { Toggle } from "~/components/Toggle"; import { db } from "~/db"; +import { i18next } from "~/modules/i18n"; import { modes, stageIds, @@ -31,6 +37,7 @@ import { } from "~/modules/map-pool-serializer"; import type { MapPool } from "~/modules/map-pool-serializer/types"; import styles from "~/styles/maps.css"; +import { makeTitle } from "~/utils/strings"; import { calendarEventPage, ipLabsMaps, @@ -46,13 +53,24 @@ export const links: LinksFunction = () => { return [{ rel: "stylesheet", href: styles }]; }; +export const meta: MetaFunction = (args) => { + const data = args.data as SerializeFrom | null; + + if (!data) return {}; + + return { + title: data.title, + }; +}; + export const handle = { i18n: "game-misc", }; -export const loader = ({ request }: LoaderArgs) => { +export const loader = async ({ request }: LoaderArgs) => { const url = new URL(request.url); const calendarEventId = url.searchParams.get("eventId"); + const t = await i18next.getFixedT(request); const event = calendarEventId ? db.calendarEvents.findById(Number(calendarEventId)) @@ -68,6 +86,7 @@ export const loader = ({ request }: LoaderArgs) => { mapPool: event ? db.calendarEvents.findMapPoolByEventId(event.eventId) : null, + title: makeTitle([t("pages.maps")]), }; }; @@ -216,7 +235,6 @@ function MapPoolSelector({ ); } -// xxx: crashes if only one map in mode function MapListCreator({ mapPool }: { mapPool: MapPool }) { const { t } = useTranslation(["game-misc", "common"]); const [mapList, setMapList] = React.useState(); diff --git a/app/routes/object-damage.tsx b/app/routes/object-damage.tsx new file mode 100644 index 000000000..4cdfe3aea --- /dev/null +++ b/app/routes/object-damage.tsx @@ -0,0 +1,34 @@ +import { WeaponCombobox } from "~/components/Combobox"; +import { Main } from "~/components/Main"; +import { useObjectDamage } from "~/modules/analyzer"; +import type { MainWeaponId } from "~/modules/in-game-lists"; + +export const handle = { + i18n: ["weapons"], +}; + +export default function ObjectDamagePage() { + const { mainWeaponId, handleChange, multipliers } = useObjectDamage(); + + if (process.env.NODE_ENV !== "development") { + return
    WIP :)
    ; + } + + return ( +
    + + opt && + handleChange({ + newMainWeaponId: Number(opt.value) as MainWeaponId, + }) + } + className="w-full-important" + clearsInputOnFocus + /> +
    {JSON.stringify(multipliers, null, 2)}
    +
    + ); +} diff --git a/app/routes/u.$identifier/results.tsx b/app/routes/u.$identifier/results.tsx index a38db68dc..2a6a431e2 100644 --- a/app/routes/u.$identifier/results.tsx +++ b/app/routes/u.$identifier/results.tsx @@ -2,9 +2,10 @@ import { Link, useMatches } from "@remix-run/react"; import { useTranslation } from "react-i18next"; import invariant from "tiny-invariant"; import { Avatar } from "~/components/Avatar"; +import { Placement } from "~/components/Placement"; import { Section } from "~/components/Section"; import { databaseTimestampToDate } from "~/utils/dates"; -import { discordFullName, placementString } from "~/utils/strings"; +import { discordFullName } from "~/utils/strings"; import { calendarEventPage, userPage } from "~/utils/urls"; import type { UserPageLoaderData } from "../u.$identifier"; @@ -15,7 +16,7 @@ export default function UserResultsPage() { const data = parentRoute.data as UserPageLoaderData; return ( -
    +
    @@ -23,6 +24,7 @@ export default function UserResultsPage() { + @@ -30,13 +32,16 @@ export default function UserResultsPage() { {data.results.map((result) => ( - + +
    {t("results.placing")} {t("results.team")} {t("results.tournament")}{t("results.participants")} {t("results.date")} {t("results.mates")}
    {placementString(result.placement)} + + {result.teamName} {result.eventName} {result.participantCount} {databaseTimestampToDate(result.startTime).toLocaleDateString( i18n.language, diff --git a/app/styles/plus.css b/app/styles/plus.css index efcbef581..29e6e402c 100644 --- a/app/styles/plus.css +++ b/app/styles/plus.css @@ -61,6 +61,8 @@ .plus__comment { white-space: pre-wrap; + min-width: auto; + overflow-wrap: break-word; } .plus__comment-time { diff --git a/app/styles/u.css b/app/styles/u.css index 9e4c9fffe..673c38771 100644 --- a/app/styles/u.css +++ b/app/styles/u.css @@ -147,11 +147,6 @@ font-weight: var(--bold); } -.u__results-main { - max-width: 52rem; - margin: 0 auto; -} - .u__results-section { overflow-x: auto; } diff --git a/app/utils/strings.ts b/app/utils/strings.ts index b120b99f7..7b3202a81 100644 --- a/app/utils/strings.ts +++ b/app/utils/strings.ts @@ -10,12 +10,18 @@ export function makeTitle(title: string | string[]) { return `${Array.isArray(title) ? title.join(" | ") : title} | sendou.ink`; } -export function placementString(placement: number) { - if (placement === 1) return "🥇"; - if (placement === 2) return "🥈"; - if (placement === 3) return "🥉"; +export function getEnglishOrdinalSuffix(num: number) { + const lastDigit = num % 10; + const last2Digits = num % 100; - return `${placement}th`; + if (lastDigit === 1 && last2Digits !== 11) { + return "st"; + } else if (lastDigit === 2 && last2Digits !== 12) { + return "nd"; + } else if (lastDigit === 3 && last2Digits !== 13) { + return "rd"; + } + return "th"; } export function semiRandomId() { diff --git a/package.json b/package.json index ae82fc4b1..0f27bcfd0 100644 --- a/package.json +++ b/package.json @@ -15,10 +15,12 @@ "rename-badge": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/rename-badge.ts", "create-weapon-json": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/create-weapon-json.ts", "create-gear-json": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/create-gear-json.ts", + "create-object-dmg-json": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/create-object-dmg-json.ts", "create-misc-json": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/create-misc-json.ts", "create-analyzer-json": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/create-analyzer-json.ts", "check-translation-jsons": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/check-translation-jsons.ts && npm run prettier:write", "replace-img-names": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/replace-img-names.ts", + "remove-bad-custom-urls": "node --experimental-specifier-resolution=node --loader ts-node/esm -r tsconfig-paths/register scripts/remove-bad-custom-urls.ts", "lint:ts": "eslint . --ext .ts,.tsx", "lint:styles": "stylelint \"app/styles/**/*.css\"", "prettier:check": "prettier --check . --loglevel warn", diff --git a/public/badges/20xx.avif b/public/badges/20xx.avif index 88ebf7c83..97f4c4459 100644 Binary files a/public/badges/20xx.avif and b/public/badges/20xx.avif differ diff --git a/public/badges/beta_top1.avif b/public/badges/beta_top1.avif index 4933e424a..781c7044e 100644 Binary files a/public/badges/beta_top1.avif and b/public/badges/beta_top1.avif differ diff --git a/public/badges/beta_top2.avif b/public/badges/beta_top2.avif index 6b4c39eee..2bc12971c 100644 Binary files a/public/badges/beta_top2.avif and b/public/badges/beta_top2.avif differ diff --git a/public/badges/beta_top3.avif b/public/badges/beta_top3.avif index 04ef26b22..5834dc1dc 100644 Binary files a/public/badges/beta_top3.avif and b/public/badges/beta_top3.avif differ diff --git a/public/badges/cake.avif b/public/badges/cake.avif index 599f805eb..6dc05e1ce 100644 Binary files a/public/badges/cake.avif and b/public/badges/cake.avif differ diff --git a/public/badges/ebtv.avif b/public/badges/ebtv.avif index dbfad189e..ad3685e4c 100644 Binary files a/public/badges/ebtv.avif and b/public/badges/ebtv.avif differ diff --git a/public/badges/girls.avif b/public/badges/girls.avif index 3031c68e7..61a44de80 100644 Binary files a/public/badges/girls.avif and b/public/badges/girls.avif differ diff --git a/public/badges/idtga.avif b/public/badges/idtga.avif index 8480cca38..ab5aa04df 100644 Binary files a/public/badges/idtga.avif and b/public/badges/idtga.avif differ diff --git a/public/badges/itz_blue.avif b/public/badges/itz_blue.avif index 3805f52e3..85a46e66d 100644 Binary files a/public/badges/itz_blue.avif and b/public/badges/itz_blue.avif differ diff --git a/public/badges/itz_orange.avif b/public/badges/itz_orange.avif index 2a4c675ec..3f8c7371e 100644 Binary files a/public/badges/itz_orange.avif and b/public/badges/itz_orange.avif differ diff --git a/public/badges/itz_pink.avif b/public/badges/itz_pink.avif index 719157055..2735a1698 100644 Binary files a/public/badges/itz_pink.avif and b/public/badges/itz_pink.avif differ diff --git a/public/badges/itz_red.avif b/public/badges/itz_red.avif index eb4fbde44..e2eb9a00f 100644 Binary files a/public/badges/itz_red.avif and b/public/badges/itz_red.avif differ diff --git a/public/badges/lobster.avif b/public/badges/lobster.avif index 1be48548e..39780de73 100644 Binary files a/public/badges/lobster.avif and b/public/badges/lobster.avif differ diff --git a/public/badges/lutiblue.avif b/public/badges/lutiblue.avif index 86022adef..ea26f02c6 100644 Binary files a/public/badges/lutiblue.avif and b/public/badges/lutiblue.avif differ diff --git a/public/badges/lutigreen.avif b/public/badges/lutigreen.avif index 3285415ca..a265e35a2 100644 Binary files a/public/badges/lutigreen.avif and b/public/badges/lutigreen.avif differ diff --git a/public/badges/lutilimegreen.avif b/public/badges/lutilimegreen.avif index 74b51ab38..93af0297c 100644 Binary files a/public/badges/lutilimegreen.avif and b/public/badges/lutilimegreen.avif differ diff --git a/public/badges/lutiorange.avif b/public/badges/lutiorange.avif index 1a90fb6a6..ce09a295c 100644 Binary files a/public/badges/lutiorange.avif and b/public/badges/lutiorange.avif differ diff --git a/public/badges/lutipink.avif b/public/badges/lutipink.avif index 3ea7537d5..7b057d82f 100644 Binary files a/public/badges/lutipink.avif and b/public/badges/lutipink.avif differ diff --git a/public/badges/lutipurple.avif b/public/badges/lutipurple.avif index 29db82b8b..62c817cda 100644 Binary files a/public/badges/lutipurple.avif and b/public/badges/lutipurple.avif differ diff --git a/public/badges/lutired.avif b/public/badges/lutired.avif index 5fe0d1fd0..dd7a60fc3 100644 Binary files a/public/badges/lutired.avif and b/public/badges/lutired.avif differ diff --git a/public/badges/lutitan.avif b/public/badges/lutitan.avif index 8242917b3..481da669e 100644 Binary files a/public/badges/lutitan.avif and b/public/badges/lutitan.avif differ diff --git a/public/badges/lutiyellow.avif b/public/badges/lutiyellow.avif index 21cff19ce..40d48f753 100644 Binary files a/public/badges/lutiyellow.avif and b/public/badges/lutiyellow.avif differ diff --git a/public/badges/monday.avif b/public/badges/monday.avif index 2c64b1b0d..dbab0c266 100644 Binary files a/public/badges/monday.avif and b/public/badges/monday.avif differ diff --git a/public/badges/pair.avif b/public/badges/pair.avif index a81ad62e3..bf65a3bbd 100644 Binary files a/public/badges/pair.avif and b/public/badges/pair.avif differ diff --git a/public/badges/patreon.avif b/public/badges/patreon.avif index 7430014ff..569b7202c 100644 Binary files a/public/badges/patreon.avif and b/public/badges/patreon.avif differ diff --git a/public/badges/patreon_plus.avif b/public/badges/patreon_plus.avif index f56eadbb8..7712b3f41 100644 Binary files a/public/badges/patreon_plus.avif and b/public/badges/patreon_plus.avif differ diff --git a/public/badges/pool1.avif b/public/badges/pool1.avif index 79cc489fa..40a1baa92 100644 Binary files a/public/badges/pool1.avif and b/public/badges/pool1.avif differ diff --git a/public/badges/pool2.avif b/public/badges/pool2.avif index b36a2c1de..75ca237a4 100644 Binary files a/public/badges/pool2.avif and b/public/badges/pool2.avif differ diff --git a/public/badges/quad.avif b/public/badges/quad.avif index 1eefef6ef..ffecd84fe 100644 Binary files a/public/badges/quad.avif and b/public/badges/quad.avif differ diff --git a/public/badges/snapshot_bronze.avif b/public/badges/snapshot_bronze.avif index 719a48c1e..5ec522c6b 100644 Binary files a/public/badges/snapshot_bronze.avif and b/public/badges/snapshot_bronze.avif differ diff --git a/public/badges/snapshot_gold.avif b/public/badges/snapshot_gold.avif index c3d661ebf..89bafdafd 100644 Binary files a/public/badges/snapshot_gold.avif and b/public/badges/snapshot_gold.avif differ diff --git a/public/badges/snapshot_silver.avif b/public/badges/snapshot_silver.avif index 4deeb6dba..cce46b832 100644 Binary files a/public/badges/snapshot_silver.avif and b/public/badges/snapshot_silver.avif differ diff --git a/public/badges/squid_junction.avif b/public/badges/squid_junction.avif index ecf76e887..e0b55a8e8 100644 Binary files a/public/badges/squid_junction.avif and b/public/badges/squid_junction.avif differ diff --git a/public/badges/sundae.avif b/public/badges/sundae.avif index 49b55e37c..cf7fa67b4 100644 Binary files a/public/badges/sundae.avif and b/public/badges/sundae.avif differ diff --git a/public/badges/superjump_alpha.avif b/public/badges/superjump_alpha.avif index 02f301a8e..9d914524c 100644 Binary files a/public/badges/superjump_alpha.avif and b/public/badges/superjump_alpha.avif differ diff --git a/public/badges/superjump_beta.avif b/public/badges/superjump_beta.avif index 515c867c8..d9905e917 100644 Binary files a/public/badges/superjump_beta.avif and b/public/badges/superjump_beta.avif differ diff --git a/public/badges/superjump_gamma.avif b/public/badges/superjump_gamma.avif index 58791698e..48f010a07 100644 Binary files a/public/badges/superjump_gamma.avif and b/public/badges/superjump_gamma.avif differ diff --git a/public/badges/tidal_tuesdays.avif b/public/badges/tidal_tuesdays.avif index 375a7c6b9..58c3b2905 100644 Binary files a/public/badges/tidal_tuesdays.avif and b/public/badges/tidal_tuesdays.avif differ diff --git a/public/badges/toni_kensa.avif b/public/badges/toni_kensa.avif index 42781e9a4..98305806f 100644 Binary files a/public/badges/toni_kensa.avif and b/public/badges/toni_kensa.avif differ diff --git a/public/badges/triton.avif b/public/badges/triton.avif index c66ccfb8c..b10011dcd 100644 Binary files a/public/badges/triton.avif and b/public/badges/triton.avif differ diff --git a/public/badges/xp26.avif b/public/badges/xp26.avif index e52106a11..41caa575a 100644 Binary files a/public/badges/xp26.avif and b/public/badges/xp26.avif differ diff --git a/public/badges/xp27.avif b/public/badges/xp27.avif index 87f0bc348..0d464662e 100644 Binary files a/public/badges/xp27.avif and b/public/badges/xp27.avif differ diff --git a/public/badges/xp28.avif b/public/badges/xp28.avif index 10f835586..b6aa324f5 100644 Binary files a/public/badges/xp28.avif and b/public/badges/xp28.avif differ diff --git a/public/badges/xp29.avif b/public/badges/xp29.avif index 5195c9ac9..df3426c14 100644 Binary files a/public/badges/xp29.avif and b/public/badges/xp29.avif differ diff --git a/public/badges/xp30.avif b/public/badges/xp30.avif index acaaa4e82..9b7fffe8a 100644 Binary files a/public/badges/xp30.avif and b/public/badges/xp30.avif differ diff --git a/public/badges/zones.avif b/public/badges/zones.avif index a351b8fd5..25491ea56 100644 Binary files a/public/badges/zones.avif and b/public/badges/zones.avif differ diff --git a/public/img/abilities/UNKNOWN.avif b/public/img/abilities/UNKNOWN.avif index 22a859c4c..c8f20faf6 100644 Binary files a/public/img/abilities/UNKNOWN.avif and b/public/img/abilities/UNKNOWN.avif differ diff --git a/public/img/gear/head/21011.avif b/public/img/gear/head/21011.avif index feff79df9..8def24c80 100644 Binary files a/public/img/gear/head/21011.avif and b/public/img/gear/head/21011.avif differ diff --git a/public/img/layout/admin.avif b/public/img/layout/admin.avif index f5c7cbe3f..51ff4447f 100644 Binary files a/public/img/layout/admin.avif and b/public/img/layout/admin.avif differ diff --git a/public/img/layout/analyzer.avif b/public/img/layout/analyzer.avif index 8b9f89954..b7788adde 100644 Binary files a/public/img/layout/analyzer.avif and b/public/img/layout/analyzer.avif differ diff --git a/public/img/layout/badges.avif b/public/img/layout/badges.avif index ccabd4494..1f65e0239 100644 Binary files a/public/img/layout/badges.avif and b/public/img/layout/badges.avif differ diff --git a/public/img/layout/builds.avif b/public/img/layout/builds.avif index f6c29166d..98052299c 100644 Binary files a/public/img/layout/builds.avif and b/public/img/layout/builds.avif differ diff --git a/public/img/layout/calendar.avif b/public/img/layout/calendar.avif index 995929ce7..d38724ea6 100644 Binary files a/public/img/layout/calendar.avif and b/public/img/layout/calendar.avif differ diff --git a/public/img/layout/error-girl.avif b/public/img/layout/error-girl.avif index 57930a123..66f7e9b78 100644 Binary files a/public/img/layout/error-girl.avif and b/public/img/layout/error-girl.avif differ diff --git a/public/img/layout/logo.avif b/public/img/layout/logo.avif index 761be81d3..2ed489f19 100644 Binary files a/public/img/layout/logo.avif and b/public/img/layout/logo.avif differ diff --git a/public/img/layout/maps.avif b/public/img/layout/maps.avif index 28e0f6fb2..8b4e96720 100644 Binary files a/public/img/layout/maps.avif and b/public/img/layout/maps.avif differ diff --git a/public/img/layout/plus.avif b/public/img/layout/plus.avif index 2b763af5d..b49c19b29 100644 Binary files a/public/img/layout/plus.avif and b/public/img/layout/plus.avif differ diff --git a/public/img/layout/sendou_love.avif b/public/img/layout/sendou_love.avif index 71036767f..7fe1edfd0 100644 Binary files a/public/img/layout/sendou_love.avif and b/public/img/layout/sendou_love.avif differ diff --git a/public/locales/de/user.json b/public/locales/de/user.json index b38e807fe..e34fa88cf 100644 --- a/public/locales/de/user.json +++ b/public/locales/de/user.json @@ -13,6 +13,7 @@ "results.placing": "Platzierung", "results.team": "Team", "results.tournament": "Turnier", + "results.participants": "Teilnehmer", "results.date": "Datum", "results.mates": "Mitspieler", diff --git a/public/locales/en/user.json b/public/locales/en/user.json index 51c5a48c6..760f2a9b5 100644 --- a/public/locales/en/user.json +++ b/public/locales/en/user.json @@ -13,6 +13,7 @@ "results.placing": "Placing", "results.team": "Team", "results.tournament": "Tournament", + "results.participants": "Participants", "results.date": "Date", "results.mates": "Mates", diff --git a/public/svg/placements/first.svg b/public/svg/placements/first.svg new file mode 100644 index 000000000..8411a9e3c --- /dev/null +++ b/public/svg/placements/first.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/svg/placements/second.svg b/public/svg/placements/second.svg new file mode 100644 index 000000000..99b3b81cd --- /dev/null +++ b/public/svg/placements/second.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/svg/placements/third.svg b/public/svg/placements/third.svg new file mode 100644 index 000000000..ee264e1fb --- /dev/null +++ b/public/svg/placements/third.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/scripts/create-object-dmg-json.ts b/scripts/create-object-dmg-json.ts new file mode 100644 index 000000000..3cf41f486 --- /dev/null +++ b/scripts/create-object-dmg-json.ts @@ -0,0 +1,55 @@ +/* eslint-disable */ +// @ts-nocheck + +// 1) WeaponInfoMain.json inside dicts +// 2) WeaponInfoSub.json inside dicts +// 3) WeaponInfoSpecial.json inside dicts +// 4) misc/spl__DamageRateInfoConfig.pp__CombinationDataTableData.json +import params from "./dicts/spl__DamageRateInfoConfig.pp__CombinationDataTableData.json"; +import weapons from "./dicts/WeaponInfoMain.json"; +import subWeapons from "./dicts/WeaponInfoSub.json"; +import specialWeapons from "./dicts/WeaponInfoSpecial.json"; +import fs from "node:fs"; +import path from "node:path"; + +const OUTPUT_DIR_PATH = path.join(__dirname, "output"); + +const weaponParamsToWeaponIds = ( + params: typeof weapons | typeof subWeapons | typeof specialWeapons, + key: string +) => { + return params + .filter((param) => { + return ( + param.DefaultDamageRateInfoRow === key || + param.ExtraDamageRateInfoRowSet?.some( + (row) => row.DamageRateInfoRow === key + ) + ); + }) + .map((weapon) => weapon.Id); +}; + +const result = {}; +for (const cell of Object.values(params.CellList)) { + if (!cell.DamageRate) continue; + + if (!result[cell.RowKey]) { + result[cell.RowKey] = { + mainWeaponIds: weaponParamsToWeaponIds(weapons, cell.RowKey), + subWeaponIds: weaponParamsToWeaponIds(subWeapons, cell.RowKey), + specialWeaponIds: weaponParamsToWeaponIds(specialWeapons, cell.RowKey), + rates: [], + }; + } + + result[cell.RowKey].rates.push({ + target: cell.ColumnKey, + rate: cell.DamageRate, + }); +} + +fs.writeFileSync( + path.join(OUTPUT_DIR_PATH, "object-dmg.json"), + JSON.stringify(result, null, 2) +); diff --git a/scripts/remove-bad-custom-urls.ts b/scripts/remove-bad-custom-urls.ts new file mode 100644 index 000000000..921572c71 --- /dev/null +++ b/scripts/remove-bad-custom-urls.ts @@ -0,0 +1,9 @@ +/* eslint-disable no-console */ +import "dotenv/config"; +import { sql } from "~/db/sql"; + +sql + .prepare(`update "User" set "customUrl" = NULL where "customUrl" like '%/%'`) + .run(); + +console.log("Done"); diff --git a/translation-progress.md b/translation-progress.md index eb4ddde43..f51cb0f58 100644 --- a/translation-progress.md +++ b/translation-progress.md @@ -78,7 +78,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -91,6 +91,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate @@ -178,7 +179,7 @@ ### 🟢 user.json -**19/19** +**20/20** --- @@ -270,7 +271,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -283,6 +284,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate @@ -392,7 +394,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -405,6 +407,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate @@ -465,7 +468,7 @@ ### 🔴 user.json -**0/19** +**0/20** --- @@ -647,7 +650,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -660,6 +663,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate @@ -770,7 +774,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -783,6 +787,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate @@ -869,9 +874,16 @@
    -### 🟢 user.json +### 🟡 user.json -**19/19** +**19/20** + +
    +Missing + +- results.participants + +
    --- @@ -976,7 +988,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -989,6 +1001,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate @@ -1099,7 +1112,7 @@ ### 🟡 user.json -**7/19** +**7/20**
    Missing @@ -1112,6 +1125,7 @@ - motion - stick - sens +- results.participants - forms.errors.invalidCustomUrl.numbers - forms.errors.invalidCustomUrl.strangeCharacter - forms.errors.invalidCustomUrl.duplicate