| Crystal'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 → ×½. | data/types/type_matchups.asm L1–85 | T4 |
Red and Blue's type chart (TypeEffects) has 82 non-neutral (attacker, defender, multiplier) rows over 15 types, ended by -1; unlisted pairs are neutral. | data/types/type_matchups.asm L1–85constants/type_constants.asm L1–28 | T3 |
Multipliers are integers scaled by 10 (SUPER_EFFECTIVE 20, NOT_VERY_EFFECTIVE 05, and NO_EFFECT 00); the table never uses EFFECTIVE (10) or MORE_EFFECTIVE (15). | constants/battle_constants.asm L60–65 | T3 |
AdjustDamageForMoveType applies STAB before any type row: when the move's type matches either attacker type. | engine/battle/core.asm L5101–5125 | T3 |
In table order, each TypeEffects row matching the move's type and either defender type sets damage to ; 0 marks a miss. | engine/battle/core.asm L5127–5185 | T3 |
| Under two ½ rows (×¼), 2 or 3 damage truncates to 0 and the move misses; 4 damage gives 1. | engine/battle/core.asm L5171–5176data/types/type_matchups.asm L14 | T4 |
| Truncating 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. | data/types/type_matchups.asm L33–36 | T4 |
| The Red/Blue type chart gives Ghost-type moves no effect on Psychic types. | data/types/type_matchups.asm L78 | T3 |
| In Red and Blue, a Saffron Gym trainer's after-battle line contradicts the table: “Psychic #MON fear only ghosts and bugs!” | text/SaffronGym.asm L135–139 | T3 |
Each 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. | engine/battle/core.asm L5147–5153engine/battle/display_effectiveness.asm L1–10engine/battle/core.asm L3718–3733engine/battle/core.asm L3218–3229 | T3 |
| 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!”. | data/types/type_matchups.asm L33–36 | T4 |
| 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. | data/types/type_matchups.asm L9data/types/type_matchups.asm L55 | T4 |
SetDamageEffects moves (Sonic Boom, Seismic Toss, Dragon Rage, Night Shade, Psywave, and Super Fang) jump to the hit test, skipping CalculateDamage and AdjustDamageForMoveType, the only damage routine that reads TypeEffects. | engine/battle/core.asm L3134–3139data/battle/set_damage_effects.asm L1–6data/moves/moves.asm L62 | T3 |
The trainer AI's AIGetTypeEffectiveness stops at the first row matching either defender type, ignoring dual-type products. | engine/battle/core.asm L5187–5223engine/battle/trainer_ai.asm L207–216 | T3 |
The type constants still define BIRD ($06), with a name string, but no TypeEffects row names it. | constants/type_constants.asm L11data/types/names.asm L40 | T3 |
Type picks the stats: Fire, Water, Grass, Electric, Psychic, Ice, and Dragon (SPECIAL upward) use Special on both sides; the rest use Attack against Defense. | engine/battle/core.asm L4040–4042constants/type_constants.asm L19–26 | T3 |
In Red and Blue, a damaging move runs CriticalHitTest, CalculateDamage (base formula), AdjustDamageForMoveType (STAB, then type rows), RandomizeDamage, and then MoveHitTest (accuracy). | engine/battle/core.asm L3140–3150engine/battle/core.asm L5531–5543 | T3 |
CalculateDamage computes , caps it at 997, and adds 2, so the type step receives 2–999. | engine/battle/core.asm L4343–4459 | T3 |
RandomizeDamage multiplies damage by a random byte, 217–255, and integer-divides by 255, leaving 0 or 1 damage untouched. | engine/battle/core.asm L5420–5454macros/data.asm L3 | T3 |