Complete Inverse implementation, fix type matchups

Issues occurred resulting from an incomplete implementation of Inverse Battles from Commit #e59cc2b3292f3da336e89ef23b15b234bf469368.

Attempts to fix have been made through completing the implementation, which also accounts for proto-Fairy.

Additionally, some semi-invulnerable glitches have attempts made to resolve them, involving a generic list and 16bitification of the compare commands.

Damage processing seems iffy but this needs more testing. Type matchups function correctly, though.
This commit is contained in:
Llinos Evans 2025-01-11 06:33:35 +00:00
parent 90fe97fcb1
commit a14e978b98
4 changed files with 425 additions and 181 deletions

View file

@ -96,6 +96,7 @@ DEF SPDSPCDV_SHINY EQU $AA
const BATTLETYPE_FORCEITEM
const BATTLETYPE_CELEBI
const BATTLETYPE_SUICUNE
const BATTLETYPE_INVERSE
; BattleVarPairs indexes (see home/battle_vars.asm)
const_def

View file

@ -1,132 +1,253 @@
TypeMatchups:
; attacker, defender, *=
db NORMAL, ROCK, NOT_VERY_EFFECTIVE
db NORMAL, STEEL, NOT_VERY_EFFECTIVE
db FIRE, FIRE, NOT_VERY_EFFECTIVE
db FIRE, WATER, NOT_VERY_EFFECTIVE
db FIRE, GRASS, SUPER_EFFECTIVE
db FIRE, ICE, SUPER_EFFECTIVE
db FIRE, BUG, SUPER_EFFECTIVE
db FIRE, ROCK, NOT_VERY_EFFECTIVE
db FIRE, DRAGON, NOT_VERY_EFFECTIVE
db FIRE, STEEL, SUPER_EFFECTIVE
db FIRE, FAIRY, SUPER_EFFECTIVE
db WATER, FIRE, SUPER_EFFECTIVE
db WATER, WATER, NOT_VERY_EFFECTIVE
db WATER, GRASS, NOT_VERY_EFFECTIVE
db WATER, GROUND, SUPER_EFFECTIVE
db WATER, ROCK, SUPER_EFFECTIVE
db WATER, DRAGON, NOT_VERY_EFFECTIVE
db ELECTRIC, WATER, SUPER_EFFECTIVE
db ELECTRIC, ELECTRIC, NOT_VERY_EFFECTIVE
db ELECTRIC, GRASS, NOT_VERY_EFFECTIVE
db ELECTRIC, GROUND, NO_EFFECT
db ELECTRIC, FLYING, SUPER_EFFECTIVE
db ELECTRIC, DRAGON, NOT_VERY_EFFECTIVE
db GRASS, FIRE, NOT_VERY_EFFECTIVE
db GRASS, WATER, SUPER_EFFECTIVE
db GRASS, GRASS, NOT_VERY_EFFECTIVE
db GRASS, POISON, NOT_VERY_EFFECTIVE
db GRASS, GROUND, SUPER_EFFECTIVE
db GRASS, FLYING, NOT_VERY_EFFECTIVE
db GRASS, BUG, NOT_VERY_EFFECTIVE
db GRASS, ROCK, SUPER_EFFECTIVE
db GRASS, DRAGON, NOT_VERY_EFFECTIVE
db GRASS, STEEL, NOT_VERY_EFFECTIVE
db ICE, WATER, NOT_VERY_EFFECTIVE
db ICE, GRASS, SUPER_EFFECTIVE
db ICE, ICE, NOT_VERY_EFFECTIVE
db ICE, GROUND, SUPER_EFFECTIVE
db ICE, FLYING, SUPER_EFFECTIVE
db ICE, DRAGON, SUPER_EFFECTIVE
db ICE, STEEL, NOT_VERY_EFFECTIVE
db ICE, FAIRY, SUPER_EFFECTIVE
db ICE, FIRE, NOT_VERY_EFFECTIVE
db FIGHTING, NORMAL, SUPER_EFFECTIVE
db FIGHTING, ICE, SUPER_EFFECTIVE
db FIGHTING, POISON, NOT_VERY_EFFECTIVE
db FIGHTING, FLYING, NOT_VERY_EFFECTIVE
db FIGHTING, PSYCHIC_TYPE, NOT_VERY_EFFECTIVE
db FIGHTING, BUG, NOT_VERY_EFFECTIVE
db FIGHTING, ROCK, SUPER_EFFECTIVE
db FIGHTING, DARK, SUPER_EFFECTIVE
db FIGHTING, STEEL, SUPER_EFFECTIVE
db FIGHTING, FAIRY, NOT_VERY_EFFECTIVE
db POISON, GRASS, SUPER_EFFECTIVE
db POISON, POISON, NOT_VERY_EFFECTIVE
db POISON, GROUND, NOT_VERY_EFFECTIVE
db POISON, ROCK, NOT_VERY_EFFECTIVE
db POISON, GHOST, NOT_VERY_EFFECTIVE
db POISON, STEEL, NO_EFFECT
db GROUND, FIRE, SUPER_EFFECTIVE
db GROUND, ELECTRIC, SUPER_EFFECTIVE
db GROUND, GRASS, NOT_VERY_EFFECTIVE
db GROUND, POISON, SUPER_EFFECTIVE
db GROUND, FLYING, NO_EFFECT
db GROUND, BUG, NOT_VERY_EFFECTIVE
db GROUND, ROCK, SUPER_EFFECTIVE
db GROUND, STEEL, SUPER_EFFECTIVE
db FLYING, ELECTRIC, NOT_VERY_EFFECTIVE
db FLYING, GRASS, SUPER_EFFECTIVE
db FLYING, FIGHTING, SUPER_EFFECTIVE
db FLYING, BUG, SUPER_EFFECTIVE
db FLYING, ROCK, NOT_VERY_EFFECTIVE
db FLYING, STEEL, NOT_VERY_EFFECTIVE
db PSYCHIC_TYPE, FIGHTING, SUPER_EFFECTIVE
db PSYCHIC_TYPE, POISON, SUPER_EFFECTIVE
; attacker, defender, *=
db NORMAL, ROCK, NOT_VERY_EFFECTIVE
db NORMAL, STEEL, NOT_VERY_EFFECTIVE
db FIRE, FIRE, NOT_VERY_EFFECTIVE
db FIRE, WATER, NOT_VERY_EFFECTIVE
db FIRE, GRASS, SUPER_EFFECTIVE
db FIRE, ICE, SUPER_EFFECTIVE
db FIRE, BUG, SUPER_EFFECTIVE
db FIRE, ROCK, NOT_VERY_EFFECTIVE
db FIRE, DRAGON, NOT_VERY_EFFECTIVE
db FIRE, STEEL, SUPER_EFFECTIVE
db FIRE, FAIRY, SUPER_EFFECTIVE
db WATER, FIRE, SUPER_EFFECTIVE
db WATER, WATER, NOT_VERY_EFFECTIVE
db WATER, GRASS, NOT_VERY_EFFECTIVE
db WATER, GROUND, SUPER_EFFECTIVE
db WATER, ROCK, SUPER_EFFECTIVE
db WATER, DRAGON, NOT_VERY_EFFECTIVE
db ELECTRIC, WATER, SUPER_EFFECTIVE
db ELECTRIC, ELECTRIC, NOT_VERY_EFFECTIVE
db ELECTRIC, GRASS, NOT_VERY_EFFECTIVE
db ELECTRIC, GROUND, NO_EFFECT
db ELECTRIC, FLYING, SUPER_EFFECTIVE
db ELECTRIC, DRAGON, NOT_VERY_EFFECTIVE
db GRASS, FIRE, NOT_VERY_EFFECTIVE
db GRASS, WATER, SUPER_EFFECTIVE
db GRASS, GRASS, NOT_VERY_EFFECTIVE
db GRASS, POISON, NOT_VERY_EFFECTIVE
db GRASS, GROUND, SUPER_EFFECTIVE
db GRASS, FLYING, NOT_VERY_EFFECTIVE
db GRASS, BUG, NOT_VERY_EFFECTIVE
db GRASS, ROCK, SUPER_EFFECTIVE
db GRASS, DRAGON, NOT_VERY_EFFECTIVE
db GRASS, STEEL, NOT_VERY_EFFECTIVE
db ICE, WATER, NOT_VERY_EFFECTIVE
db ICE, GRASS, SUPER_EFFECTIVE
db ICE, ICE, NOT_VERY_EFFECTIVE
db ICE, GROUND, SUPER_EFFECTIVE
db ICE, FLYING, SUPER_EFFECTIVE
db ICE, DRAGON, SUPER_EFFECTIVE
db ICE, STEEL, NOT_VERY_EFFECTIVE
db ICE, FAIRY, SUPER_EFFECTIVE
db ICE, FIRE, NOT_VERY_EFFECTIVE
db FIGHTING, NORMAL, SUPER_EFFECTIVE
db FIGHTING, ICE, SUPER_EFFECTIVE
db FIGHTING, POISON, NOT_VERY_EFFECTIVE
db FIGHTING, FLYING, NOT_VERY_EFFECTIVE
db FIGHTING, PSYCHIC_TYPE, NOT_VERY_EFFECTIVE
db FIGHTING, BUG, NOT_VERY_EFFECTIVE
db FIGHTING, ROCK, SUPER_EFFECTIVE
db FIGHTING, DARK, SUPER_EFFECTIVE
db FIGHTING, STEEL, SUPER_EFFECTIVE
db FIGHTING, FAIRY, NOT_VERY_EFFECTIVE
db POISON, GRASS, SUPER_EFFECTIVE
db POISON, POISON, NOT_VERY_EFFECTIVE
db POISON, GROUND, NOT_VERY_EFFECTIVE
db POISON, ROCK, NOT_VERY_EFFECTIVE
db POISON, GHOST, NOT_VERY_EFFECTIVE
db POISON, STEEL, NO_EFFECT
db GROUND, FIRE, SUPER_EFFECTIVE
db GROUND, ELECTRIC, SUPER_EFFECTIVE
db GROUND, GRASS, NOT_VERY_EFFECTIVE
db GROUND, POISON, SUPER_EFFECTIVE
db GROUND, FLYING, NO_EFFECT
db GROUND, BUG, NOT_VERY_EFFECTIVE
db GROUND, ROCK, SUPER_EFFECTIVE
db GROUND, STEEL, SUPER_EFFECTIVE
db FLYING, ELECTRIC, NOT_VERY_EFFECTIVE
db FLYING, GRASS, SUPER_EFFECTIVE
db FLYING, FIGHTING, SUPER_EFFECTIVE
db FLYING, BUG, SUPER_EFFECTIVE
db FLYING, ROCK, NOT_VERY_EFFECTIVE
db FLYING, STEEL, NOT_VERY_EFFECTIVE
db PSYCHIC_TYPE, FIGHTING, SUPER_EFFECTIVE
db PSYCHIC_TYPE, POISON, SUPER_EFFECTIVE
db PSYCHIC_TYPE, PSYCHIC_TYPE, NOT_VERY_EFFECTIVE
db PSYCHIC_TYPE, DARK, NO_EFFECT
db PSYCHIC_TYPE, STEEL, NOT_VERY_EFFECTIVE
db BUG, FIRE, NOT_VERY_EFFECTIVE
db BUG, GRASS, SUPER_EFFECTIVE
db BUG, FIGHTING, NOT_VERY_EFFECTIVE
db BUG, POISON, NOT_VERY_EFFECTIVE
db BUG, FLYING, NOT_VERY_EFFECTIVE
db BUG, PSYCHIC_TYPE, SUPER_EFFECTIVE
db BUG, GHOST, NOT_VERY_EFFECTIVE
db BUG, DARK, SUPER_EFFECTIVE
db BUG, STEEL, NOT_VERY_EFFECTIVE
db BUG, FAIRY, NOT_VERY_EFFECTIVE
db ROCK, FIRE, SUPER_EFFECTIVE
db ROCK, ICE, SUPER_EFFECTIVE
db ROCK, FIGHTING, NOT_VERY_EFFECTIVE
db ROCK, GROUND, NOT_VERY_EFFECTIVE
db ROCK, FLYING, SUPER_EFFECTIVE
db ROCK, BUG, SUPER_EFFECTIVE
db ROCK, STEEL, NOT_VERY_EFFECTIVE
db GHOST, NORMAL, NO_EFFECT
db GHOST, PSYCHIC_TYPE, SUPER_EFFECTIVE
db GHOST, DARK, NOT_VERY_EFFECTIVE
db GHOST, STEEL, NOT_VERY_EFFECTIVE
db GHOST, GHOST, SUPER_EFFECTIVE
db DRAGON, DRAGON, SUPER_EFFECTIVE
db DRAGON, STEEL, NOT_VERY_EFFECTIVE
db DRAGON, FAIRY, NO_EFFECT
db DARK, FIGHTING, NOT_VERY_EFFECTIVE
db DARK, PSYCHIC_TYPE, SUPER_EFFECTIVE
db DARK, GHOST, SUPER_EFFECTIVE
db DARK, DARK, NOT_VERY_EFFECTIVE
db DARK, STEEL, NOT_VERY_EFFECTIVE
db DARK, FAIRY, NOT_VERY_EFFECTIVE
db STEEL, FIRE, NOT_VERY_EFFECTIVE
db STEEL, WATER, NOT_VERY_EFFECTIVE
db STEEL, ELECTRIC, NOT_VERY_EFFECTIVE
db STEEL, ICE, SUPER_EFFECTIVE
db STEEL, ROCK, SUPER_EFFECTIVE
db STEEL, STEEL, NOT_VERY_EFFECTIVE
db STEEL, FAIRY, SUPER_EFFECTIVE
db FAIRY, FIRE, NOT_VERY_EFFECTIVE
db FAIRY, BUG, SUPER_EFFECTIVE
db FAIRY, FIGHTING, SUPER_EFFECTIVE
db FAIRY, ICE, NOT_VERY_EFFECTIVE
db FAIRY, DRAGON, SUPER_EFFECTIVE
db FAIRY, DARK, SUPER_EFFECTIVE
db FAIRY, STEEL, NOT_VERY_EFFECTIVE
db PSYCHIC_TYPE, DARK, NO_EFFECT
db PSYCHIC_TYPE, STEEL, NOT_VERY_EFFECTIVE
db BUG, FIRE, NOT_VERY_EFFECTIVE
db BUG, GRASS, SUPER_EFFECTIVE
db BUG, FIGHTING, NOT_VERY_EFFECTIVE
db BUG, POISON, NOT_VERY_EFFECTIVE
db BUG, FLYING, NOT_VERY_EFFECTIVE
db BUG, PSYCHIC_TYPE, SUPER_EFFECTIVE
db BUG, GHOST, NOT_VERY_EFFECTIVE
db BUG, DARK, SUPER_EFFECTIVE
db BUG, STEEL, NOT_VERY_EFFECTIVE
db BUG, FAIRY, NOT_VERY_EFFECTIVE
db ROCK, FIRE, SUPER_EFFECTIVE
db ROCK, ICE, SUPER_EFFECTIVE
db ROCK, FIGHTING, NOT_VERY_EFFECTIVE
db ROCK, GROUND, NOT_VERY_EFFECTIVE
db ROCK, FLYING, SUPER_EFFECTIVE
db ROCK, BUG, SUPER_EFFECTIVE
db ROCK, STEEL, NOT_VERY_EFFECTIVE
db GHOST, NORMAL, NO_EFFECT
db GHOST, PSYCHIC_TYPE, SUPER_EFFECTIVE
db GHOST, DARK, NOT_VERY_EFFECTIVE
db GHOST, STEEL, NOT_VERY_EFFECTIVE
db GHOST, GHOST, SUPER_EFFECTIVE
db DRAGON, DRAGON, SUPER_EFFECTIVE
db DRAGON, STEEL, NOT_VERY_EFFECTIVE
db DRAGON, FAIRY, NO_EFFECT
db DARK, FIGHTING, NOT_VERY_EFFECTIVE
db DARK, PSYCHIC_TYPE, SUPER_EFFECTIVE
db DARK, GHOST, SUPER_EFFECTIVE
db DARK, DARK, NOT_VERY_EFFECTIVE
db DARK, STEEL, NOT_VERY_EFFECTIVE
db DARK, FAIRY, NOT_VERY_EFFECTIVE
db STEEL, FIRE, NOT_VERY_EFFECTIVE
db STEEL, WATER, NOT_VERY_EFFECTIVE
db STEEL, ELECTRIC, NOT_VERY_EFFECTIVE
db STEEL, ICE, SUPER_EFFECTIVE
db STEEL, ROCK, SUPER_EFFECTIVE
db STEEL, STEEL, NOT_VERY_EFFECTIVE
db STEEL, FAIRY, SUPER_EFFECTIVE
db FAIRY, FIRE, NOT_VERY_EFFECTIVE
db FAIRY, BUG, SUPER_EFFECTIVE
db FAIRY, FIGHTING, SUPER_EFFECTIVE
db FAIRY, ICE, NOT_VERY_EFFECTIVE
db FAIRY, DRAGON, SUPER_EFFECTIVE
db FAIRY, DARK, SUPER_EFFECTIVE
db FAIRY, STEEL, NOT_VERY_EFFECTIVE
db -2 ; end (with Foresight)
; Foresight removes Ghost's immunities.
db NORMAL, GHOST, NO_EFFECT
db FIGHTING, GHOST, NO_EFFECT
db NORMAL, GHOST, NO_EFFECT
db FIGHTING, GHOST, NO_EFFECT
db -1 ; end
InverseTypeMatchups:
; attacker, defender, *=
db NORMAL, ROCK, SUPER_EFFECTIVE
db NORMAL, STEEL, SUPER_EFFECTIVE
db FIRE, FIRE, SUPER_EFFECTIVE
db FIRE, WATER, SUPER_EFFECTIVE
db FIRE, GRASS, NOT_VERY_EFFECTIVE
db FIRE, ICE, NOT_VERY_EFFECTIVE
db FIRE, BUG, NOT_VERY_EFFECTIVE
db FIRE, ROCK, SUPER_EFFECTIVE
db FIRE, DRAGON, SUPER_EFFECTIVE
db FIRE, STEEL, NOT_VERY_EFFECTIVE
db WATER, FIRE, NOT_VERY_EFFECTIVE
db WATER, WATER, SUPER_EFFECTIVE
db WATER, GRASS, SUPER_EFFECTIVE
db WATER, GROUND, NOT_VERY_EFFECTIVE
db WATER, ROCK, NOT_VERY_EFFECTIVE
db WATER, DRAGON, SUPER_EFFECTIVE
db ELECTRIC, WATER, NOT_VERY_EFFECTIVE
db ELECTRIC, ELECTRIC, SUPER_EFFECTIVE
db ELECTRIC, GRASS, SUPER_EFFECTIVE
db ELECTRIC, GROUND, SUPER_EFFECTIVE
db ELECTRIC, FLYING, NOT_VERY_EFFECTIVE
db ELECTRIC, DRAGON, SUPER_EFFECTIVE
db GRASS, FIRE, SUPER_EFFECTIVE
db GRASS, WATER, NOT_VERY_EFFECTIVE
db GRASS, GRASS, SUPER_EFFECTIVE
db GRASS, POISON, SUPER_EFFECTIVE
db GRASS, GROUND, NOT_VERY_EFFECTIVE
db GRASS, FLYING, SUPER_EFFECTIVE
db GRASS, BUG, SUPER_EFFECTIVE
db GRASS, ROCK, NOT_VERY_EFFECTIVE
db GRASS, DRAGON, SUPER_EFFECTIVE
db GRASS, STEEL, SUPER_EFFECTIVE
db ICE, WATER, SUPER_EFFECTIVE
db ICE, GRASS, NOT_VERY_EFFECTIVE
db ICE, ICE, SUPER_EFFECTIVE
db ICE, GROUND, NOT_VERY_EFFECTIVE
db ICE, FLYING, NOT_VERY_EFFECTIVE
db ICE, DRAGON, NOT_VERY_EFFECTIVE
db ICE, STEEL, SUPER_EFFECTIVE
db ICE, FIRE, SUPER_EFFECTIVE
db FIGHTING, NORMAL, NOT_VERY_EFFECTIVE
db FIGHTING, ICE, NOT_VERY_EFFECTIVE
db FIGHTING, POISON, SUPER_EFFECTIVE
db FIGHTING, FLYING, SUPER_EFFECTIVE
db FIGHTING, PSYCHIC_TYPE, SUPER_EFFECTIVE
db FIGHTING, BUG, SUPER_EFFECTIVE
db FIGHTING, ROCK, NOT_VERY_EFFECTIVE
db FIGHTING, DARK, NOT_VERY_EFFECTIVE
db FIGHTING, STEEL, NOT_VERY_EFFECTIVE
db POISON, GRASS, NOT_VERY_EFFECTIVE
db POISON, POISON, SUPER_EFFECTIVE
db POISON, GROUND, SUPER_EFFECTIVE
db POISON, ROCK, SUPER_EFFECTIVE
db POISON, GHOST, SUPER_EFFECTIVE
db POISON, STEEL, SUPER_EFFECTIVE
db GROUND, FIRE, NOT_VERY_EFFECTIVE
db GROUND, ELECTRIC, NOT_VERY_EFFECTIVE
db GROUND, GRASS, SUPER_EFFECTIVE
db GROUND, POISON, NOT_VERY_EFFECTIVE
db GROUND, FLYING, SUPER_EFFECTIVE
db GROUND, BUG, SUPER_EFFECTIVE
db GROUND, ROCK, NOT_VERY_EFFECTIVE
db GROUND, STEEL, NOT_VERY_EFFECTIVE
db FLYING, ELECTRIC, SUPER_EFFECTIVE
db FLYING, GRASS, NOT_VERY_EFFECTIVE
db FLYING, FIGHTING, NOT_VERY_EFFECTIVE
db FLYING, BUG, NOT_VERY_EFFECTIVE
db FLYING, ROCK, SUPER_EFFECTIVE
db FLYING, STEEL, SUPER_EFFECTIVE
db PSYCHIC_TYPE, FIGHTING, NOT_VERY_EFFECTIVE
db PSYCHIC_TYPE, POISON, NOT_VERY_EFFECTIVE
db PSYCHIC_TYPE, PSYCHIC_TYPE, SUPER_EFFECTIVE
db PSYCHIC_TYPE, DARK, SUPER_EFFECTIVE
db PSYCHIC_TYPE, STEEL, SUPER_EFFECTIVE
db BUG, FIRE, SUPER_EFFECTIVE
db BUG, GRASS, NOT_VERY_EFFECTIVE
db BUG, FIGHTING, SUPER_EFFECTIVE
db BUG, POISON, SUPER_EFFECTIVE
db BUG, FLYING, SUPER_EFFECTIVE
db BUG, PSYCHIC_TYPE, NOT_VERY_EFFECTIVE
db BUG, GHOST, SUPER_EFFECTIVE
db BUG, DARK, NOT_VERY_EFFECTIVE
db BUG, STEEL, SUPER_EFFECTIVE
db ROCK, FIRE, NOT_VERY_EFFECTIVE
db ROCK, ICE, NOT_VERY_EFFECTIVE
db ROCK, FIGHTING, SUPER_EFFECTIVE
db ROCK, GROUND, SUPER_EFFECTIVE
db ROCK, FLYING, NOT_VERY_EFFECTIVE
db ROCK, BUG, NOT_VERY_EFFECTIVE
db ROCK, STEEL, SUPER_EFFECTIVE
db GHOST, NORMAL, SUPER_EFFECTIVE
db GHOST, PSYCHIC_TYPE, NOT_VERY_EFFECTIVE
db GHOST, DARK, SUPER_EFFECTIVE
db GHOST, STEEL, SUPER_EFFECTIVE
db GHOST, GHOST, NOT_VERY_EFFECTIVE
db DRAGON, DRAGON, NOT_VERY_EFFECTIVE
db DRAGON, STEEL, SUPER_EFFECTIVE
db DARK, FIGHTING, SUPER_EFFECTIVE
db DARK, PSYCHIC_TYPE, NOT_VERY_EFFECTIVE
db DARK, GHOST, NOT_VERY_EFFECTIVE
db DARK, DARK, SUPER_EFFECTIVE
db DARK, STEEL, SUPER_EFFECTIVE
db STEEL, FIRE, SUPER_EFFECTIVE
db STEEL, WATER, SUPER_EFFECTIVE
db STEEL, ELECTRIC, SUPER_EFFECTIVE
db STEEL, ICE, NOT_VERY_EFFECTIVE
db STEEL, ROCK, NOT_VERY_EFFECTIVE
db STEEL, STEEL, SUPER_EFFECTIVE
db NORMAL, GHOST, SUPER_EFFECTIVE
db FIGHTING, GHOST, SUPER_EFFECTIVE
db FAIRY, FIRE, SUPER_EFFECTIVE
db FAIRY, BUG, NOT_VERY_EFFECTIVE
db FAIRY, FIGHTING, NOT_VERY_EFFECTIVE
db FAIRY, ICE, SUPER_EFFECTIVE
db FAIRY, DRAGON, NOT_VERY_EFFECTIVE
db FAIRY, DARK, NOT_VERY_EFFECTIVE
db FAIRY, STEEL, SUPER_EFFECTIVE
db -1 ; end

View file

@ -359,7 +359,7 @@ CantMove:
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
push hl
ld hl, .fly_dig_moves
ld hl, FlyDigMoves
call CheckMoveInList
pop hl
ret nc
@ -371,13 +371,6 @@ CantMove:
res SUBSTATUS_UNDERWATER, [hl]
jp AppearUserRaiseSub
.fly_dig_moves
dw FLY
dw DIG
dw BOUNCE
dw WATER_SPORT
dw -1
OpponentCantMove:
call BattleCommand_SwitchTurn
call CantMove
@ -1370,7 +1363,13 @@ BattleCommand_Stab:
ld a, BATTLE_VARS_MOVE_TYPE
call GetBattleVar
ld b, a
ld a, [wBattleType]
cp BATTLETYPE_INVERSE
jr z, .inverse
ld hl, TypeMatchups
jr .TypesLoop
.inverse
ld hl, InverseTypeMatchups
.TypesLoop:
; ld a, [hli]
@ -1497,7 +1496,13 @@ CheckTypeMatchup:
ld c, [hl]
ld a, EFFECTIVE
ld [wTypeMatchup], a
ld a, [wBattleType]
cp BATTLETYPE_INVERSE
jr z, .inverse
ld hl, TypeMatchups
jr .TypesLoop
.inverse
ld hl, InverseTypeMatchups
.TypesLoop:
; ld a, [hli]
call GetNextTypeMatchupsByte
@ -1511,7 +1516,6 @@ CheckTypeMatchup:
bit SUBSTATUS_IDENTIFIED, a
jr nz, .End
jr .TypesLoop
.Next:
cp d
jr nz, .Nope
@ -1788,6 +1792,7 @@ BattleCommand_CheckHit:
call GetBattleVar
and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND
jr nz, .flying_or_underground
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
and 1 << SUBSTATUS_UNDERWATER
@ -1795,12 +1800,34 @@ BattleCommand_CheckHit:
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
cp SURF
ld hl, SURF
call GetMoveIDFromIndex
ld a, h
if HIGH(SURF)
cp HIGH(SURF)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(SURF)
ret z
cp WHIRLPOOL
ld hl, WHIRLPOOL
call GetMoveIDFromIndex
ld a, h
if HIGH(WHIRLPOOL)
cp HIGH(WHIRLPOOL)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(WHIRLPOOL)
ret
.flying_or_underground
.flying_or_underground
bit SUBSTATUS_FLYING, a
ld hl, .FlyMoves
jr z, .check_move_in_list
@ -2071,18 +2098,11 @@ BattleCommand_MoveAnimNoSub:
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
ld hl, .fly_dig_moves
ld hl, FlyDigMoves
call CheckMoveInList
ret nc
jp AppearUserLowerSub
.fly_dig_moves
dw FLY
dw DIG
dw BOUNCE
dw WATER_SPORT
dw -1
.alternate_anim
ld a, [wBattleAnimParam]
and 1
@ -2167,7 +2187,7 @@ BattleCommand_FailureText:
call GetBattleVarAddr
push hl
ld hl, .fly_dig_moves
ld hl, FlyDigMoves
call CheckMoveInList
pop hl
jr c, .fly_dig
@ -2200,13 +2220,6 @@ BattleCommand_FailureText:
call AppearUserRaiseSub
jp EndMoveEffect
.fly_dig_moves
dw FLY
dw DIG
dw WATER_SPORT
dw BOUNCE
dw -1
BattleCommand_ApplyDamage:
ld a, BATTLE_VARS_SUBSTATUS1_OPP
call GetBattleVar
@ -5645,26 +5658,134 @@ BattleCommand_Charge:
call LoadMoveAnim
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
ld hl, .fly_dig_moves ; attempt to resolve 16-bit issue with bounce and water sport - this can probably be made more efficient with a farcallable list
call CheckMoveInList
ld hl, WATER_SPORT
call GetMoveIDFromIndex
ld a, h
if HIGH(WATER_SPORT)
cp HIGH(WATER_SPORT)
else
and a
endc
ld a, l
pop hl
jr c, .got_move_type
ret nz
cp LOW(WATER_SPORT)
jp z, .set_diving
ld hl, FLY
call GetMoveIDFromIndex
ld a, h
if HIGH(FLY)
cp HIGH(FLY)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(FLY)
jr z, .set_flying
ld hl, BOUNCE
call GetMoveIDFromIndex
ld a, h
if HIGH(BOUNCE)
cp HIGH(BOUNCE)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(BOUNCE)
jr z, .set_flying
ld hl, DIG
call GetMoveIDFromIndex
ld a, h
if HIGH(DIG)
cp HIGH(DIG)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(DIG)
jr z, .set_flying
call BattleCommand_RaiseSub
xor a
jr .not_flying
.got_move_type
; a will contain the substatus 3 bit to set (1 << bit), or 0 if none (not flying/digging underground)
and a
ld l, a
push hl
call nz, DisappearUser
.flying
call DisappearUser
.not_flying
ld a, BATTLE_VARS_SUBSTATUS3
call GetBattleVarAddr
pop bc
ld a, c
or [hl]
ld [hl], a
ld a, BATTLE_VARS_MOVE_ANIM
call GetBattleVar
ld b, a
ld hl, WATER_SPORT
call GetMoveIDFromIndex
ld a, h
if HIGH(WATER_SPORT)
cp HIGH(WATER_SPORT)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(WATER_SPORT)
jr z, .set_diving
ld hl, FLY
call GetMoveIDFromIndex
ld a, h
if HIGH(FLY)
cp HIGH(FLY)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(FLY)
jr z, .set_flying
ld hl, BOUNCE
call GetMoveIDFromIndex
ld a, h
if HIGH(BOUNCE)
cp HIGH(BOUNCE)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(BOUNCE)
jr z, .set_flying
ld hl, DIG
call GetMoveIDFromIndex
ld a, h
if HIGH(DIG)
cp HIGH(DIG)
else
and a
endc
ld a, l
pop hl
ret nz
cp LOW(DIG)
jr z, .set_flying
jr nz, .dont_set_digging
set SUBSTATUS_UNDERGROUND, [hl]
jr .dont_set_digging
.set_diving
ld a, BATTLE_VARS_SUBSTATUS4
call GetBattleVarAddr
set SUBSTATUS_UNDERWATER, [hl]
jr .dont_set_digging
.set_flying
set SUBSTATUS_FLYING, [hl]
.dont_set_digging
call CheckUserIsCharging
jr nz, .mimic
ld a, BATTLE_VARS_LAST_COUNTER_MOVE
@ -5750,13 +5871,6 @@ BattleCommand_Charge:
text_jump HidUnderwaterText
db "@"
.fly_dig_moves
dw FLY
dw DIG
dw BOUNCE
dw WATER_SPORT
dw -1
BattleCommand_TrapTarget:
ld a, [wAttackMissed]
and a
@ -6132,6 +6246,7 @@ BattleCommand_DoubleUnderwaterDamage:
ld a, BATTLE_VARS_SUBSTATUS4_OPP
call GetBattleVar
bit SUBSTATUS_UNDERWATER, a
ret z
; fallthrough
DoubleDamage:
@ -6952,3 +7067,10 @@ CheckMoveInList:
pop de
pop bc
ret
FlyDigMoves:
dw FLY
dw DIG
dw BOUNCE
dw WATER_SPORT
dw -1

View file

@ -8,12 +8,12 @@ DebugRoom_MapScripts:
DebugPokemon1Script:
opentext
getmonname STRING_BUFFER_3, AZUMARILL
getmonname STRING_BUFFER_3, BIPULLA
writetext ReceivedDebugPokemonText
playsound SFX_CAUGHT_MON
waitsfx
promptbutton
givepoke AZUMARILL, 4, HM_WATER_SPORT
givepoke BIPULLA, 15, HM_WATER_SPORT
closetext
end
@ -39,11 +39,11 @@ DebugPokemon3Script:
faceplayer
opentext
writetext DebugTextA
cry STROMEN
cry BELLSPROUT
pause 15
closetext
loadvar VAR_BATTLETYPE, BATTLETYPE_SHINY
loadwildmon COATL, 75
loadvar VAR_BATTLETYPE, BATTLETYPE_INVERSE
loadwildmon BELLSPROUT, 10
startbattle
reloadmapafterbattle
end
@ -56,11 +56,11 @@ DebugPokemon4Script:
faceplayer
opentext
writetext DebugTextB
cry STROMEN
cry BELLSPROUT
pause 15
closetext
loadvar VAR_BATTLETYPE, BATTLETYPE_SUICUNE
loadwildmon COATL, 75
loadwildmon BELLSPROUT, 10
startbattle
reloadmapafterbattle
end