pokerogue/src/data/type.ts
Bertie690 c0da686ba0
[Dev] Migrated to Biome 2.2.3, added more rules (#6259)
* Added more biome rules

* Fixes

* Added a few more rules

* Added global phaser to biome

* Fix tpyo

* Updated biome to 2.1.4; improved docs on linting/localization; added vcs support

Also added `.build` to gitignore cuz reasons

* Fixed tpyo

* dd

* Applied linter fixes

* Partially fixed some private property issues

* Upgraded to Biome 2.2.0; added `operatorLinebreak` and a few new rules

* Moved operator linebreaks before lines

* Applied kev's suggestions

* Update biome.jsonc

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>

* added like all the rules and then some

* modify biome.jsonc

* apply biome formatting

* Reverted changes to balance folder

* fixed stuff

* Fixed biome stripping trailing globstars from everything

* made `noInvertedElse` an error rule

* Add & apply fixes for `useExplicitLengthCheck`, `useAtIndex` and `noNonNullAssertedOptionalChain`

* Bumped biome to 2.2.3

* Fixed a few syntax errors

* Removed trailing globstars since biome actually fixed their shit

* Final clean up

* foobarbaz

* Fixed remaining issues

* Fixed a few errors in SSUI

* fixed rounding issue

* Fixed test to not round funky

* Fixed biome false positive for vitest hooks

* Apply biome:all

---------

Co-authored-by: NightKev <34855794+DayKev@users.noreply.github.com>
Co-authored-by: Sirz Benjie <142067137+SirzBenjie@users.noreply.github.com>
2025-09-08 10:35:18 -05:00

364 lines
9.1 KiB
TypeScript

import { PokemonType } from "#enums/pokemon-type";
export type TypeDamageMultiplier = 0 | 0.125 | 0.25 | 0.5 | 1 | 2 | 4 | 8;
export function getTypeDamageMultiplier(attackType: PokemonType, defType: PokemonType): TypeDamageMultiplier {
if (attackType === PokemonType.UNKNOWN || defType === PokemonType.UNKNOWN) {
return 1;
}
switch (defType) {
case PokemonType.NORMAL:
switch (attackType) {
case PokemonType.FIGHTING:
return 2;
case PokemonType.GHOST:
return 0;
default:
return 1;
}
case PokemonType.FIGHTING:
switch (attackType) {
case PokemonType.FLYING:
case PokemonType.PSYCHIC:
case PokemonType.FAIRY:
return 2;
case PokemonType.ROCK:
case PokemonType.BUG:
case PokemonType.DARK:
return 0.5;
default:
return 1;
}
case PokemonType.FLYING:
switch (attackType) {
case PokemonType.ROCK:
case PokemonType.ELECTRIC:
case PokemonType.ICE:
return 2;
case PokemonType.FIGHTING:
case PokemonType.BUG:
case PokemonType.GRASS:
return 0.5;
case PokemonType.GROUND:
return 0;
default:
return 1;
}
case PokemonType.POISON:
switch (attackType) {
case PokemonType.GROUND:
case PokemonType.PSYCHIC:
return 2;
case PokemonType.FIGHTING:
case PokemonType.POISON:
case PokemonType.BUG:
case PokemonType.GRASS:
case PokemonType.FAIRY:
return 0.5;
default:
return 1;
}
case PokemonType.GROUND:
switch (attackType) {
case PokemonType.WATER:
case PokemonType.GRASS:
case PokemonType.ICE:
return 2;
case PokemonType.POISON:
case PokemonType.ROCK:
return 0.5;
case PokemonType.ELECTRIC:
return 0;
default:
return 1;
}
case PokemonType.ROCK:
switch (attackType) {
case PokemonType.FIGHTING:
case PokemonType.GROUND:
case PokemonType.STEEL:
case PokemonType.WATER:
case PokemonType.GRASS:
return 2;
case PokemonType.NORMAL:
case PokemonType.FLYING:
case PokemonType.POISON:
case PokemonType.FIRE:
return 0.5;
default:
return 1;
}
case PokemonType.BUG:
switch (attackType) {
case PokemonType.FLYING:
case PokemonType.ROCK:
case PokemonType.FIRE:
return 2;
case PokemonType.FIGHTING:
case PokemonType.GROUND:
case PokemonType.GRASS:
return 0.5;
default:
return 1;
}
case PokemonType.GHOST:
switch (attackType) {
case PokemonType.GHOST:
case PokemonType.DARK:
return 2;
case PokemonType.POISON:
case PokemonType.BUG:
return 0.5;
case PokemonType.NORMAL:
case PokemonType.FIGHTING:
return 0;
default:
return 1;
}
case PokemonType.STEEL:
switch (attackType) {
case PokemonType.FIGHTING:
case PokemonType.GROUND:
case PokemonType.FIRE:
return 2;
case PokemonType.NORMAL:
case PokemonType.FLYING:
case PokemonType.ROCK:
case PokemonType.BUG:
case PokemonType.STEEL:
case PokemonType.GRASS:
case PokemonType.PSYCHIC:
case PokemonType.ICE:
case PokemonType.DRAGON:
case PokemonType.FAIRY:
return 0.5;
case PokemonType.POISON:
return 0;
default:
return 1;
}
case PokemonType.FIRE:
switch (attackType) {
case PokemonType.GROUND:
case PokemonType.ROCK:
case PokemonType.WATER:
return 2;
case PokemonType.BUG:
case PokemonType.STEEL:
case PokemonType.FIRE:
case PokemonType.GRASS:
case PokemonType.ICE:
case PokemonType.FAIRY:
return 0.5;
default:
return 1;
}
case PokemonType.WATER:
switch (attackType) {
case PokemonType.GRASS:
case PokemonType.ELECTRIC:
return 2;
case PokemonType.STEEL:
case PokemonType.FIRE:
case PokemonType.WATER:
case PokemonType.ICE:
return 0.5;
default:
return 1;
}
case PokemonType.GRASS:
switch (attackType) {
case PokemonType.FLYING:
case PokemonType.POISON:
case PokemonType.BUG:
case PokemonType.FIRE:
case PokemonType.ICE:
return 2;
case PokemonType.GROUND:
case PokemonType.WATER:
case PokemonType.GRASS:
case PokemonType.ELECTRIC:
return 0.5;
default:
return 1;
}
case PokemonType.ELECTRIC:
switch (attackType) {
case PokemonType.GROUND:
return 2;
case PokemonType.FLYING:
case PokemonType.STEEL:
case PokemonType.ELECTRIC:
return 0.5;
default:
return 1;
}
case PokemonType.PSYCHIC:
switch (attackType) {
case PokemonType.BUG:
case PokemonType.GHOST:
case PokemonType.DARK:
return 2;
case PokemonType.FIGHTING:
case PokemonType.PSYCHIC:
return 0.5;
default:
return 1;
}
case PokemonType.ICE:
switch (attackType) {
case PokemonType.FIGHTING:
case PokemonType.ROCK:
case PokemonType.STEEL:
case PokemonType.FIRE:
return 2;
case PokemonType.ICE:
return 0.5;
default:
return 1;
}
case PokemonType.DRAGON:
switch (attackType) {
case PokemonType.ICE:
case PokemonType.DRAGON:
case PokemonType.FAIRY:
return 2;
case PokemonType.FIRE:
case PokemonType.WATER:
case PokemonType.GRASS:
case PokemonType.ELECTRIC:
return 0.5;
default:
return 1;
}
case PokemonType.DARK:
switch (attackType) {
case PokemonType.FIGHTING:
case PokemonType.BUG:
case PokemonType.FAIRY:
return 2;
case PokemonType.GHOST:
case PokemonType.DARK:
return 0.5;
case PokemonType.PSYCHIC:
return 0;
default:
return 1;
}
case PokemonType.FAIRY:
switch (attackType) {
case PokemonType.POISON:
case PokemonType.STEEL:
return 2;
case PokemonType.FIGHTING:
case PokemonType.BUG:
case PokemonType.DARK:
return 0.5;
case PokemonType.DRAGON:
return 0;
default:
return 1;
}
case PokemonType.STELLAR:
return 1;
}
return 1;
}
/**
* Retrieve the color corresponding to a specific damage multiplier
* @returns A color or undefined if the default color should be used
*/
export function getTypeDamageMultiplierColor(
multiplier: TypeDamageMultiplier,
side: "defense" | "offense",
): string | undefined {
if (side === "offense") {
switch (multiplier) {
case 0:
return "#929292";
case 0.125:
return "#FF5500";
case 0.25:
return "#FF7400";
case 0.5:
return "#FE8E00";
case 1:
return;
case 2:
return "#4AA500";
case 4:
return "#4BB400";
case 8:
return "#52C200";
}
}
if (side === "defense") {
switch (multiplier) {
case 0:
return "#B1B100";
case 0.125:
return "#2DB4FF";
case 0.25:
return "#00A4FF";
case 0.5:
return "#0093FF";
case 1:
return;
case 2:
return "#FE8E00";
case 4:
return "#FF7400";
case 8:
return "#FF5500";
}
}
}
export function getTypeRgb(type: PokemonType): [number, number, number] {
switch (type) {
case PokemonType.NORMAL:
return [168, 168, 120];
case PokemonType.FIGHTING:
return [192, 48, 40];
case PokemonType.FLYING:
return [168, 144, 240];
case PokemonType.POISON:
return [160, 64, 160];
case PokemonType.GROUND:
return [224, 192, 104];
case PokemonType.ROCK:
return [184, 160, 56];
case PokemonType.BUG:
return [168, 184, 32];
case PokemonType.GHOST:
return [112, 88, 152];
case PokemonType.STEEL:
return [184, 184, 208];
case PokemonType.FIRE:
return [240, 128, 48];
case PokemonType.WATER:
return [104, 144, 240];
case PokemonType.GRASS:
return [120, 200, 80];
case PokemonType.ELECTRIC:
return [248, 208, 48];
case PokemonType.PSYCHIC:
return [248, 88, 136];
case PokemonType.ICE:
return [152, 216, 216];
case PokemonType.DRAGON:
return [112, 56, 248];
case PokemonType.DARK:
return [112, 88, 72];
case PokemonType.FAIRY:
return [232, 136, 200];
case PokemonType.STELLAR:
return [255, 255, 255];
default:
return [0, 0, 0];
}
}