Type effectiveness
A table scales a move's damage by ×2, ×½, or ×0 according to its type and each of the defender's types.
On this page
Every Pokémon move has a type, and every Pokémon has one or two. The type chart rates each attacking type against each defending type: ×2, ×½, ×0, or ×1 if unlisted1,2. A dual-type defender takes both matchups, multiplied3. The pret disassemblies and decompilation make the code of Pokémon Red and Blue, Pokémon Crystal, and Pokémon Emerald readable.
#How it works
The chart lists only non-neutral pairs, as (attacking type, defending type, multiplier) rows2. Red/Blue’s has 15 types, 82 rows2; Crystal’s and Emerald’s have 17 types, 108 + 2 rows4. Multipliers are integers scaled by 10: 20 · 10 · 05 · 00 (÷10)1.
In Generations 1–3, the chart runs after the base damage formula and before the random factor5,6,7. The same-type attack bonus (STAB) comes first: 8 in Red/Blue and Crystal9, 10 in Emerald. The two forms agree for every non-negative integer10. Each matching row then costs one multiply and one integer divide, per row3,11,12.
damage = base_damage(level, power, attack, defense) # see damage-formula
if move.type in attacker.types: # STAB, before the chart
damage = damage + floor(damage / 2) # Gen 3 writes floor(damage * 15 / 10)
for (atk, def, m) in TYPE_CHART, in table order:
if atk == move.type and def in defender.types:
damage = floor(damage * m / 10) # truncates after every row
Gen 1: if damage == 0: the move misses
Gen 2 / 3: if damage == 0 and m != 0: damage = 1
damage = random_factor(damage)
#Truncation makes row order matter
A net-neutral hit whose ½ row precedes its 2× row loses 1 point on odd damage13. Ice against Water/Flying goes 3 → 1 → 213,14,15. The probe lists every such attacker and type pair, per game.
#Implementations
#Red and Blue (Generation 1)
Red and Blue16 do it all in AdjustDamageForMoveType: STAB, then a walk of the full TypeEffects table3. Single-type Pokémon store their type twice, but each row applies once3.
- Zero means miss. A row that leaves 0 damage flags a miss, which is also how ×0 works3. Under two ½ rows (×¼), damage goes 2 or 3 → 0 (miss)17.
- The message follows the last row. Each matching row overwrites one effectiveness byte18. Ice against Water/Flying, net ×1, prints “It’s super effective!”19. Ground against Rock/Flying does no damage but prints the plain miss text, not “It doesn’t affect…”20.
- Fixed-damage moves skip the chart. Sonic Boom, Seismic Toss, Dragon Rage, Night Shade, Psywave, and Super Fang bypass the formula and the type routine21.
- The trainer AI reads one row, the first matching either defender type, so it ignores 4× weaknesses and canceling pairs22.
- Type picks the stats. Fire, Water, Grass, Electric, Psychic, Ice, and Dragon moves use Special on both sides; the rest use Attack against Defense23.
- An unused type. The constants define a BIRD type that no row mentions24.
#Crystal (Generation 2)
Crystal25 adds Steel and Dark26. The work moves into BattleCommand_Stab, which applies weather and badge boosts before STAB9. Struggle skips the routine27.
- Immunity is explicit. A ×0 row marks a miss28. Any other step that truncates to 0 gives 1, so ×¼ no longer misses: 2 → 1 → 129.
- The message uses the whole product30, so Ice against Water/Flying prints nothing31.
- Foresight. The Normal→Ghost and Fighting→Ghost immunities follow a marker row, where the loop stops once the target is identified32.
- Steel and Dark keep the type-based split: Steel is physical, and Dark is special33.
#Emerald (Generation 3)
Emerald34 keeps Crystal’s chart row for row35, as a flat byte array with the Foresight marker as its own row36,37. The arithmetic is unchanged12.
- Messages come from flags. A ½ row and a 2× row cancel, and a ×0 row sets “doesn’t affect”38.
- Abilities act as extra immunities. Levitate makes Ground moves miss, so the loop reads no row39. Wonder Guard lets only super-effective hits through40.
- Carried over. Struggle skips STAB and the chart41. Type decides physical or special42. The unused slot becomes
TYPE_MYSTERY, “???”43.
#What changed, Gen 1 → Gen 3
| Red/Blue | Crystal | Emerald | |
|---|---|---|---|
| Types | 152 | 17, adds Steel and Dark26 | 1736 |
| Matchups changed | — | 4, listed below44 | none35 |
| Step that reaches 0 | move misses3 | raised to 1; ×0 is a miss11 | raised to 1 unless ×012 |
| Effectiveness text | last matching row18 | combined value30 | flags, ½ and 2× cancel38 |
| Immunity removers | none | Foresight32 | Foresight37 |
| Random factor | ×217–255 / 25545 | ×217–255 / 25546 | ×85–100 / 10047 |
A cell-by-cell diff of the Red/Blue and Crystal tables gives +Steel, +Dark, 4 changed44. The four changes are Poison→Bug ×2 → ×1, Bug→Poison ×2 → ×½, Ghost→Psychic ×0 → ×2, and Ice→Fire ×1 → ×½44. Bulbapedia lists the same four44.
#Ghost and Psychic in Generation 1
Red and Blue’s table gives Ghost moves ×048 against Psychic types, but a Saffron Gym trainer says “Psychic #MON fear only ghosts and bugs!”49. Crystal’s table gives ×250. Bulbapedia reports that “an abundance of evidence suggests that this may have been an error”51.
#Variants and combinations
- STAB runs in the same routine, directly before the chart, in all three games8,9,10.
- Damage formula: in Gen 1–3, type also makes a move physical or special23,33,42.
#History
The games read here run from Red and Green (Japan, 1996) to Emerald (2004)16,34.
References
- ^ abMultipliers are integers scaled by 10 (
SUPER_EFFECTIVE20,NOT_VERY_EFFECTIVE05, andNO_EFFECT00); the table never usesEFFECTIVE(10) orMORE_EFFECTIVE(15). T3pret/pokered · constants/battle_constants.asm L60–65 - ^ abcdRed and Blue's type chart (
TypeEffects) has 82 non-neutral (attacker, defender, multiplier) rows over 15 types, ended by -1; unlisted pairs are neutral. T3pret/pokered · data/types/type_matchups.asm L1–85, constants/type_constants.asm L1–28 - ^ abcdefIn table order, each
TypeEffectsrow matching the move's type and either defender type sets damage to ; 0 marks a miss. T3pret/pokered · engine/battle/core.asm L5127–5185 - ^Crystal's type chart (
TypeMatchups) has 108 non-neutral rows over 17 types, then a -2 marker, Normal→Ghost and Fighting→Ghost ×0, and a -1 end. T3pret/pokecrystal · data/types/type_matchups.asm L1–118, constants/type_constants.asm L7–37 - ^In Red and Blue, a damaging move runs
CriticalHitTest,CalculateDamage(base formula),AdjustDamageForMoveType(STAB, then type rows),RandomizeDamage, and thenMoveHitTest(accuracy). T3pret/pokered · engine/battle/core.asm L3140–3150, L5531–5543 - ^A plain damaging move runs critical, damagestats, damagecalc (base formula, item boosts, and critical ×2), stab (weather, badges, STAB, and type rows), damagevariation, and then checkhit (accuracy). T3pret/pokecrystal · data/moves/effects.asm L5–14, engine/battle/effect_commands.asm L2983–3023
- ^A plain damaging move runs critcalc, damagecalc (base damage), typecalc (STAB, then type rows), and then adjustnormaldamage (random factor). T3pret/pokeemerald · data/battle_scripts_1.s L249–252
- ^ ab
AdjustDamageForMoveTypeapplies STAB before any type row: when the move's type matches either attacker type. T3pret/pokered · engine/battle/core.asm L5101–5125 - ^ abc
BattleCommand_Stabapplies weather and badge type boosts, then STAB ( if either attacker type matches), then the type chart. T3pret/pokecrystal · engine/battle/effect_commands.asm L1251–1288 - ^ abcBefore the type chart,
Cmd_typecalcapplies STAB as when either attacker type equals the move's type. T3pret/pokeemerald · src/battle_script_commands.c L1368–1373, include/battle.h L471 - ^ abEach matching row computes ; a nonzero product becomes , raised to 1 if that truncates to 0. T3pret/pokecrystal · engine/battle/effect_commands.asm L1312–1386
- ^ abcFor each row of the move's type,
ModulateDmgByTyperuns once per distinct target type it matches: , raised from 0 to 1 unless the multiplier is 0. T3pret/pokeemerald · src/battle_script_commands.c L1321–1325, L1386–1406 - ^ abTruncating after each row costs a net-neutral hit damage when its ½ row comes first: Ice against Water/Flying takes 3 to ⌊3 × 5 / 10⌋ = 1, then ⌊1 × 20 / 10⌋ = 2. T4pret/pokered · data/types/type_matchups.asm L33–36probe
probes/pokemon-types/type-charts.mjs - ^Row order still matters: an Ice move against Water/Flying takes 3 damage to 1, then 2 (½ row at L35, 2× at L39). T4pret/pokecrystal · data/types/type_matchups.asm L35–39probe
probes/pokemon-types/type-charts.mjs - ^Row order still matters: an Ice move against Water/Flying takes 3 damage to 1, then 2 (½ row at L369, 2× at L373). T4pret/pokeemerald · src/battle_main.c L369–373probe
probes/pokemon-types/type-charts.mjs - ^ abPokémon Red and Green came out in Japan on 27 February 1996; the English Red and Blue (developer Game Freak, publisher Nintendo, Game Boy, and Generation I core series) followed in North America on 28 September 1998. T1Bulbapedia, “Pokémon Red and Green Versions” · infobox, Release datesBulbapedia, “Pokémon Red and Blue Versions” · infobox, Basic info and Release dates
- ^Under two ½ rows (×¼), 2 or 3 damage truncates to 0 and the move misses; 4 damage gives 1. T4pret/pokered · engine/battle/core.asm L5171–5176, data/types/type_matchups.asm L14probe
probes/pokemon-types/type-charts.mjs - ^ abEach matching row overwrites the byte
wDamageMultipliers, so the text follows the last row: above 10 is “super effective”, below 10 “not very effective”, and a miss reads “doesn't affect” only at 0. T3pret/pokered · engine/battle/core.asm L5147–5153, engine/battle/display_effectiveness.asm L1–10, engine/battle/core.asm L3718–3733, L3218–3229 - ^Since the text follows the last row, an Ice move against Water/Flying, net ×1 (½ row at L33, then 2× at L36), prints “It's super effective!”. T4pret/pokered · data/types/type_matchups.asm L33–36probe
probes/pokemon-types/type-charts.mjs - ^A Ground move against Rock/Flying (×0 row at L9, then ×2 at L55) does 0 damage and prints the plain miss text, not “doesn't affect”: the byte holds the last row's 20. T4pret/pokered · data/types/type_matchups.asm L9, L55probe
probes/pokemon-types/type-charts.mjs - ^
SetDamageEffectsmoves (Sonic Boom, Seismic Toss, Dragon Rage, Night Shade, Psywave, and Super Fang) jump to the hit test, skippingCalculateDamageandAdjustDamageForMoveType, the only damage routine that readsTypeEffects. T3pret/pokered · engine/battle/core.asm L3134–3139, data/battle/set_damage_effects.asm L1–6, data/moves/moves.asm L62 - ^The trainer AI's
AIGetTypeEffectivenessstops at the first row matching either defender type, ignoring dual-type products. T3pret/pokered · engine/battle/core.asm L5187–5223, engine/battle/trainer_ai.asm L207–216 - ^ abType picks the stats: Fire, Water, Grass, Electric, Psychic, Ice, and Dragon (
SPECIALupward) use Special on both sides; the rest use Attack against Defense. T3pret/pokered · engine/battle/core.asm L4040–4042, constants/type_constants.asm L19–26 - ^The type constants still define
BIRD($06), with a name string, but noTypeEffectsrow names it. T3pret/pokered · constants/type_constants.asm L11, data/types/names.asm L40probeprobes/pokemon-types/type-charts.mjs - ^Pokémon Crystal (developer Game Freak, publisher Nintendo, Game Boy Color, and Generation II core series) came out in Japan on 14 December 2000 and North America on 30 July 2001. T1Bulbapedia, “Pokémon Crystal Version” · infobox, Basic info and Release dates
- ^ abCrystal's type constants add
STEEL(physical),DARK(special), and an unusedCURSE_TYPEnamed “???”;BIRDremains, still with no rows. T3pret/pokecrystal · constants/type_constants.asm L9–37, data/types/names.asm L37probeprobes/pokemon-types/type-charts.mjs - ^Struggle returns from
BattleCommand_Stabat once, so it skips weather, badge boosts, STAB, and the type chart. T3pret/pokecrystal · engine/battle/effect_commands.asm L1216–1219 - ^A ×0 row now marks the attack as missed outright, instead of relying on the damage reaching 0. T3pret/pokecrystal · engine/battle/effect_commands.asm L1329–1336
- ^A ×¼ hit no longer truncates to a miss: 2 damage through two ½ rows gives ⌊2 × 5 / 10⌋ = 1, then ⌊1 × 5 / 10⌋ = 0, raised to 1. T4pret/pokecrystal · engine/battle/effect_commands.asm L1361–1373probe
probes/pokemon-types/type-charts.mjs - ^ abAfter the loop,
CheckTypeMatchup's combined value ( from 10) replaces the effectiveness byte, so the text reflects every row: ×4 is 40, ×¼ is 2, and ½ with 2× is 10. T3pret/pokecrystal · engine/battle/effect_commands.asm L1388–1396, L1405–1471, L2324–2333, L2197–2202 - ^An Ice move against Water/Flying (½ at L35, 2× at L39) prints no effectiveness text: the combined value goes 10 → 5 → 10. T4pret/pokecrystal · data/types/type_matchups.asm L35–39probe
probes/pokemon-types/type-charts.mjs - ^ abAgainst an identified (Foresight) target, the loop stops at the -2 marker, skipping the Normal→Ghost and Fighting→Ghost immunities after it. T3pret/pokecrystal · engine/battle/effect_commands.asm L1302–1310, data/types/type_matchups.asm L112–116
- ^ abType still picks the stats: Steel is physical (below
SPECIAL); Dark is special, using Special Attack against Special Defense. T3pret/pokecrystal · engine/battle/effect_commands.asm L2543–2545, constants/type_constants.asm L9–35 - ^ abPokémon Emerald (developer Game Freak, publisher Nintendo, Game Boy Advance, and Generation III core series) came out in Japan on 16 September 2004 and North America on 1 May 2005. T1Bulbapedia, “Pokémon Emerald Version” · infobox, Basic info and Release dates
- ^ abEmerald's table holds the same 110 rows as Crystal's, in the same order: no new type and no changed matchup. T4pret/pokecrystal · data/types/type_matchups.asm L1–118pret/pokeemerald · src/battle_main.c L335–449Bulbapedia, “Type/Type chart” · Type charts: Generations II-Vprobe
probes/pokemon-types/type-charts.mjs - ^ abEmerald's type chart,
gTypeEffectiveness, is a flat u8 array of 108 non-neutral (attacker, defender, multiplier) rows over 17 types, then aTYPE_FORESIGHTmarker, two Ghost immunities, andTYPE_ENDTABLE. T3pret/pokeemerald · src/battle_main.c L329–449, include/constants/pokemon.h L5–23 - ^ abAgainst a Foresight target, the loop breaks at the
TYPE_FORESIGHTrow, skipping the Normal→Ghost and Fighting→Ghost immunities after it. T3pret/pokeemerald · src/battle_script_commands.c L1388–1394, src/battle_main.c L445–447 - ^ abThe text comes from flags
ModulateDmgByTypesets per row: a 2× row cancels an earlier not-very-effective flag, a ½ row an earlier super-effective one, and ×0 sets "doesn't affect", clearing both. T3pret/pokeemerald · src/battle_script_commands.c L1327–1352 - ^
Cmd_typecalcflags a Ground move against a Levitate target as missed and “doesn't affect”, and walks no type row. T3pret/pokeemerald · src/battle_script_commands.c L1375–1384 - ^After the rows, a Wonder Guard target makes a damaging move miss on the turn it attacks, unless the move carries the super-effective flag without the not-very-effective one. T3pret/pokeemerald · src/battle_script_commands.c L1409–1419
- ^Struggle skips
Cmd_typecalcentirely, so neither STAB nor the type chart touches it. T3pret/pokeemerald · src/battle_script_commands.c L1360–1364 - ^ abType still decides physical or special in Emerald, by its position relative to
TYPE_MYSTERY. T3pret/pokeemerald · include/battle.h L466–467 - ^
TYPE_MYSTERY(9), named "???", sits between the physical and special types and has no rows. T3pret/pokeemerald · include/constants/pokemon.h L15, src/battle_main.c L462probeprobes/pokemon-types/type-charts.mjs - ^ abcdCrystal's table adds Steel and Dark and changes four Red/Blue matchups: Poison→Bug ×2 → ×1, Bug→Poison ×2 → ×½, Ghost→Psychic ×0 → ×2, and Ice→Fire ×1 → ×½. T4pret/pokered · data/types/type_matchups.asm L1–85pret/pokecrystal · data/types/type_matchups.asm L1–118Bulbapedia, “Type/Type chart” · Changes: Between Generations I and IIprobe
probes/pokemon-types/type-charts.mjs - ^
RandomizeDamagemultiplies damage by a random byte, 217–255, and integer-divides by 255, leaving 0 or 1 damage untouched. T3pret/pokered · engine/battle/core.asm L5420–5454, macros/data.asm L3 - ^The random factor is unchanged from Red/Blue, a random byte from 217 to 255 over 255. T3pret/pokecrystal · engine/battle/effect_commands.asm L1496–1544
- ^The random factor changes form: damage × (100 − rand % 16) / 100, i.e. 85–100 %, raised to 1 if that gives 0. T3pret/pokeemerald · src/battle_script_commands.c L1639–1651
- ^The Red/Blue type chart gives Ghost-type moves no effect on Psychic types. T3pret/pokered · data/types/type_matchups.asm L78Bulbapedia, “Type/Type chart” · Changes: Between Generations I and II
- ^In Red and Blue, a Saffron Gym trainer's after-battle line contradicts the table: “Psychic #MON fear only ghosts and bugs!” T3pret/pokered · text/SaffronGym.asm L135–139
- ^Crystal's type chart makes Ghost-type moves super effective on Psychic types. T3pret/pokecrystal · data/types/type_matchups.asm L94
- ^Bulbapedia reports that the Gen 1 Ghost → Psychic ×0 “may have been an error”, citing Nintendo strategy guides, two anime episodes, and the Saffron Gym line. T1Bulbapedia, “Ghost (type)” · Trivia
Sources
Code
- pret contributors. 2026. “pokered: disassembly of Pokémon Red and Blue.” pret. Commit af51989. pret/pokered @ af51989 · licence, all uses
- pret contributors. 2026. “pokecrystal: disassembly of Pokémon Crystal.” pret. Commit 97187cd. pret/pokecrystal @ 97187cd · licence, all uses
- pret contributors. 2026. “pokeemerald: decompilation of Pokémon Emerald.” pret. Commit 731ad5b. pret/pokeemerald @ 731ad5b · licence, all uses
Secondary
- Bulbapedia contributors. 2026. “Pokémon Red and Green Versions.” Bulbapedia (Bulbagarden). revision 4548271. original · archived · licence, all uses
- Bulbapedia contributors. 2026. “Pokémon Red and Blue Versions.” Bulbapedia (Bulbagarden). revision 4625721. original · archived · licence, all uses
- Bulbapedia contributors. 2026. “Pokémon Crystal Version.” Bulbapedia (Bulbagarden). revision 4565703. original · archived · licence, all uses
- Bulbapedia contributors. 2026. “Pokémon Emerald Version.” Bulbapedia (Bulbagarden). revision 4629817. original · archived · licence, all uses
- Bulbapedia contributors. 2026. “Type/Type chart.” Bulbapedia (Bulbagarden). revision 4615556. original · archived · licence, all uses
- Bulbapedia contributors. 2026. “Ghost (type).” Bulbapedia (Bulbagarden). revision 4609115. original · archived · licence, all uses