On this page
  1. Related
  2. Games
  3. References
  4. Sources

The physical/special split picks which pair of stats a damaging move uses in the damage formula. In Pokémon Red and Blue, Crystal, and Emerald, the three earlier games the atlas has read for it, a move’s type decides it1,2,3. In Platinum each move carries its own class4.

  • By typePokémon Red and Blue (1996). Fire, Water, Grass, Electric, Psychic, Ice, and Dragon moves use Special on both sides; the other types use Attack against Defense.1Pokémon Crystal (2000). The type decides, with Dark special and Steel physical.2Pokémon Emerald (2004). The type decides, as in the earlier games.3
  • By movePokémon Platinum (2008). Each move's class, physical, special, or status, whatever its type.4

Games

GameYearHowNote
Pokémon Red and Blue1996By typeFire, Water, Grass, Electric, Psychic, Ice, and Dragon moves use Special on both sides; the other types use Attack against Defense
Pokémon Crystal2000By typethe type decides, with Dark special and Steel physical
Pokémon Emerald2004By typethe type decides, as in the earlier games
Pokémon Platinum2008By moveeach move's class, physical, special, or status, whatever its type
Every claim about this mechanic, by game (1)

References

  1. ^ abType picks the stats: Fire, Water, Grass, Electric, Psychic, Ice, and Dragon (SPECIAL upward) use Special on both sides; the rest use Attack against Defense.Codepret/pokered
    How we know
    4041	cp SPECIAL ; types >= SPECIAL are all special
    4042	jr nc, .specialAttack
    
    engine/battle/core.asm lines 4040–4042 at af51989 · upstream ↗
    constants/type_constants.asm#L19-L26 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-20.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  2. ^ abType still picks the stats: Steel is physical (below SPECIAL); Dark is special, using Special Attack against Special Defense.Codepret/pokecrystal
    How we know
    2544	cp SPECIAL
    2545	jr nc, .special
    
    engine/battle/effect_commands.asm lines 2543–2545 at 97187cd · upstream ↗
    constants/type_constants.asm#L9-L35 · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-20.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  3. ^ abType still decides physical or special in Emerald, by its position relative to TYPE_MYSTERY.Codepret/pokeemerald
    How we know
    466#define IS_TYPE_PHYSICAL(moveType) (moveType < TYPE_MYSTERY)
    467#define IS_TYPE_SPECIAL(moveType) (moveType > TYPE_MYSTERY)
    
    include/battle.h lines 466–467 at 731ad5b · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-20.

    Checked by a second AI model, 2026-10-21.

    In the claim ledger

  4. ^ abIn Platinum the damage formula reads each move's own class (MOVE_DATA(move).class: CLASS_PHYSICAL, CLASS_SPECIAL, or CLASS_STATUS) and uses Attack against Defense for a physical move, Special Attack against Special Defense for a special one, whatever the move's type. Emerald picks the pair by type, below or above TYPE_MYSTERY in the type list, so Thunder Punch (Electric) is special in Emerald and physical in Platinum, and Shadow Ball (Ghost) is physical in Emerald and special in Platinum.Codepret/pokeplatinum · pret/pokeemerald
    How we know
    12typedef struct MoveTable {
    13    u16 effect;
    14    u8 class;
    15    u8 power;
    
    include/move_table.h lines 12–15 at 49f78f3 · upstream ↗
    1CLASS_PHYSICAL
    2CLASS_SPECIAL
    3CLASS_STATUS
    
    generated/move_classes.txt lines 1–3 at 49f78f3 · upstream ↗
    6635    attackStat = BattleMon_Get(battleCtx, attacker, BATTLEMON_ATTACK, NULL);
    6636    defenseStat = BattleMon_Get(battleCtx, defender, BATTLEMON_DEFENSE, NULL);
    6637    spAttackStat = BattleMon_Get(battleCtx, attacker, BATTLEMON_SP_ATTACK, NULL);
    6638    spDefenseStat = BattleMon_Get(battleCtx, defender, BATTLEMON_SP_DEFENSE, NULL);
    
    src/battle/battle_lib.c lines 6635–6638 at 49f78f3 · upstream ↗
    6704    moveClass = MOVE_DATA(move).class;
    
    src/battle/battle_lib.c line 6704 at 49f78f3 · upstream ↗
    6947    if (moveClass == CLASS_PHYSICAL) {
    ⋮
    6950                damage = attackStat * sStatStageBoosts[attackStage].numerator;
    ⋮
    6956            damage = attackStat * sStatStageBoosts[attackStage].numerator;
    ⋮
    6965                stageDivisor = defenseStat * sStatStageBoosts[defenseStage].numerator;
    ⋮
    6971            stageDivisor = defenseStat * sStatStageBoosts[defenseStage].numerator;
    ⋮
    6992    } else if (moveClass == CLASS_SPECIAL) {
    
    src/battle/battle_lib.c lines 6947–6992 at 49f78f3 · upstream ↗
    10    "class": "CLASS_PHYSICAL",
    11    "type": "TYPE_ELECTRIC",
    
    res/moves/thunder_punch/data.json lines 10–11 at 49f78f3 · upstream ↗
    10    "class": "CLASS_SPECIAL",
    11    "type": "TYPE_GHOST",
    
    res/moves/shadow_ball/data.json lines 10–11 at 49f78f3 · upstream ↗
    466#define IS_TYPE_PHYSICAL(moveType) (moveType < TYPE_MYSTERY)
    467#define IS_TYPE_SPECIAL(moveType) (moveType > TYPE_MYSTERY)
    
    include/battle.h lines 466–467 at 731ad5b · upstream ↗
    13#define TYPE_GHOST            7
    ⋮
    15#define TYPE_MYSTERY          9
    ⋮
    19#define TYPE_ELECTRIC         13
    
    include/constants/pokemon.h lines 13–19 at 731ad5b · upstream ↗
    120    [MOVE_THUNDER_PUNCH] =
    ⋮
    124        .type = TYPE_ELECTRIC,
    
    src/data/battle_moves.h lines 120–124 at 731ad5b · upstream ↗
    3214    [MOVE_SHADOW_BALL] =
    ⋮
    3218        .type = TYPE_GHOST,
    
    src/data/battle_moves.h lines 3214–3218 at 731ad5b · upstream ↗
    3232    if (IS_TYPE_PHYSICAL(type))
    
    src/pokemon.c line 3232 at 731ad5b · upstream ↗
    3287    if (IS_TYPE_SPECIAL(type))
    
    src/pokemon.c line 3287 at 731ad5b · upstream ↗

    Checked against the evidence by its author, an AI model, 2026-10-22.

    Checked by a second AI model, 2026-10-22.

    In the claim ledger

Sources

Code