diff options
Diffstat (limited to 'battle/core.asm')
-rw-r--r-- | battle/core.asm | 9511 |
1 files changed, 0 insertions, 9511 deletions
diff --git a/battle/core.asm b/battle/core.asm deleted file mode 100644 index 3a6d7ac9e..000000000 --- a/battle/core.asm +++ /dev/null @@ -1,9511 +0,0 @@ -; Core components of the battle engine. -BattleCore: -DoBattle: ; 3c000 - xor a - ld [wBattleParticipantsNotFainted], a - ld [wBattleParticipantsIncludingFainted], a - ld [wPlayerAction], a - ld [BattleEnded], a - inc a - ld [wBattleHasJustStarted], a - ld hl, OTPartyMon1HP - ld bc, PARTYMON_STRUCT_LENGTH - 1 - ld d, BATTLEACTION_SWITCH1 - 1 -.loop - inc d - ld a, [hli] - or [hl] - jr nz, .alive - add hl, bc - jr .loop - -.alive - ld a, d - ld [wBattleAction], a - ld a, [wLinkMode] - and a - jr z, .not_linked - - ld a, [hLinkPlayerNumber] - cp $2 - jr z, .player_2 - -.not_linked - ld a, [wBattleMode] - dec a - jr z, .wild - xor a - ld [wEnemySwitchMonIndex], a - call NewEnemyMonStatus - call ResetEnemyStatLevels - call BreakAttraction - call EnemySwitch - -.wild - ld c, 40 - call DelayFrames - -.player_2 - call LoadTileMapToTempTileMap - call CheckPlayerPartyForFitPkmn - ld a, d - and a - jp z, LostBattle - call Call_LoadTempTileMapToTileMap - ld a, [BattleType] - cp BATTLETYPE_DEBUG - jp z, .tutorial_debug - cp BATTLETYPE_TUTORIAL - jp z, .tutorial_debug - xor a - ld [CurPartyMon], a -.loop2 - call CheckIfCurPartyMonIsFitToFight - jr nz, .alive2 - ld hl, CurPartyMon - inc [hl] - jr .loop2 - -.alive2 - ld a, [CurBattleMon] - ld [LastPlayerMon], a - ld a, [CurPartyMon] - ld [CurBattleMon], a - inc a - ld hl, PartySpecies - 1 - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [CurPartySpecies], a - ld [TempBattleMonSpecies], a - hlcoord 1, 5 - ld a, 9 - call SlideBattlePicOut - call LoadTileMapToTempTileMap - call ResetBattleParticipants - call InitBattleMon - call ResetPlayerStatLevels - call SendOutPkmnText - call NewBattleMonStatus - call BreakAttraction - call SendOutPlayerMon - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - call SetPlayerTurn - call SpikesDamage - ld a, [wLinkMode] - and a - jr z, .not_linked_2 - ld a, [hLinkPlayerNumber] - cp $2 - jr nz, .not_linked_2 - xor a - ld [wEnemySwitchMonIndex], a - call NewEnemyMonStatus - call ResetEnemyStatLevels - call BreakAttraction - call EnemySwitch - call SetEnemyTurn - call SpikesDamage - -.not_linked_2 - jp BattleTurn - -.tutorial_debug - jp BattleMenu -; 3c0e5 - -WildFled_EnemyFled_LinkBattleCanceled: ; 3c0e5 - call Call_LoadTempTileMapToTileMap - ld a, [wBattleResult] - and $c0 - add $2 - ld [wBattleResult], a - ld a, [wLinkMode] - and a - ld hl, BattleText_WildFled - jr z, .print_text - - ld a, [wBattleResult] - and $c0 - ld [wBattleResult], a - ld hl, BattleText_EnemyFled - call CheckMobileBattleError - jr nc, .print_text - - ld hl, wcd2a - bit 4, [hl] - jr nz, .skip_text - - ld hl, BattleText_LinkErrorBattleCanceled - -.print_text - call StdBattleTextBox - -.skip_text - call StopDangerSound - call CheckMobileBattleError - jr c, .skip_sfx - - ld de, SFX_RUN - call PlaySFX - -.skip_sfx - call SetPlayerTurn - ld a, 1 - ld [BattleEnded], a - ret -; 3c12f - -BattleTurn: ; 3c12f -.loop - call MobileFn_3c1bf - call CheckContestBattleOver - jp c, .quit - - xor a - ld [wPlayerIsSwitching], a - ld [wEnemyIsSwitching], a - ld [wBattleHasJustStarted], a - ld [wPlayerJustGotFrozen], a - ld [wEnemyJustGotFrozen], a - ld [CurDamage], a - ld [CurDamage + 1], a - - call HandleBerserkGene - call UpdateBattleMonInParty - farcall AIChooseMove - - call IsMobileBattle - jr nz, .not_disconnected - farcall Function100da5 - farcall StartMobileInactivityTimer - farcall Function100dd8 - jp c, .quit -.not_disconnected - - call CheckPlayerLockedIn - jr c, .skip_iteration -.loop1 - call BattleMenu - jr c, .quit - ld a, [BattleEnded] - and a - jr nz, .quit - ld a, [wForcedSwitch] ; roared/whirlwinded/teleported - and a - jr nz, .quit -.skip_iteration - call ParsePlayerAction - jr nz, .loop1 - - call EnemyTriesToFlee - jr c, .quit - - call DetermineMoveOrder - jr c, .false - call Battle_EnemyFirst - jr .proceed -.false - call Battle_PlayerFirst -.proceed - call CheckMobileBattleError - jr c, .quit - - ld a, [wForcedSwitch] - and a - jr nz, .quit - - ld a, [BattleEnded] - and a - jr nz, .quit - - call HandleBetweenTurnEffects - ld a, [BattleEnded] - and a - jr nz, .quit - jp .loop - -.quit - ret -; 3c1bf - -MobileFn_3c1bf: mobile - ld a, $5 - call GetSRAMBank - ld hl, $a89b ; s5_a89b - inc [hl] - jr nz, .finish - dec hl - inc [hl] - jr nz, .finish - dec [hl] - inc hl - dec [hl] - -.finish - call CloseSRAM - ret -; 3c1d6 - -HandleBetweenTurnEffects: ; 3c1d6 - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .CheckEnemyFirst - call CheckFaint_PlayerThenEnemy - ret c - call HandleFutureSight - call CheckFaint_PlayerThenEnemy - ret c - call HandleWeather - call CheckFaint_PlayerThenEnemy - ret c - call HandleWrap - call CheckFaint_PlayerThenEnemy - ret c - call HandlePerishSong - call CheckFaint_PlayerThenEnemy - ret c - jr .NoMoreFaintingConditions - -.CheckEnemyFirst: - call CheckFaint_EnemyThenPlayer - ret c - call HandleFutureSight - call CheckFaint_EnemyThenPlayer - ret c - call HandleWeather - call CheckFaint_EnemyThenPlayer - ret c - call HandleWrap - call CheckFaint_EnemyThenPlayer - ret c - call HandlePerishSong - call CheckFaint_EnemyThenPlayer - ret c - -.NoMoreFaintingConditions: - call HandleLeftovers - call HandleMysteryberry - call HanleDefrost - call HandleSafeguard - call HandleScreens - call HandleStatBoostingHeldItems - call HandleHealingItems - call UpdateBattleMonInParty - call LoadTileMapToTempTileMap - jp HandleEncore -; 3c23c - -CheckFaint_PlayerThenEnemy: ; 3c23c - call HasPlayerFainted - jr nz, .PlayerNotFainted - call HandlePlayerMonFaint - ld a, [BattleEnded] - and a - jr nz, .BattleIsOver - -.PlayerNotFainted: - call HasEnemyFainted - jr nz, .BattleContinues - call HandleEnemyMonFaint - ld a, [BattleEnded] - and a - jr nz, .BattleIsOver - -.BattleContinues: - and a - ret - -.BattleIsOver: - scf - ret -; 3c25c - -CheckFaint_EnemyThenPlayer: ; 3c25c - call HasEnemyFainted - jr nz, .EnemyNotFainted - call HandleEnemyMonFaint - ld a, [BattleEnded] - and a - jr nz, .BattleIsOver - -.EnemyNotFainted: - call HasPlayerFainted - jr nz, .BattleContinues - call HandlePlayerMonFaint - ld a, [BattleEnded] - and a - jr nz, .BattleIsOver - -.BattleContinues: - and a - ret - -.BattleIsOver: - scf - ret -; 3c27c - -HandleBerserkGene: ; 3c27c - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .reverse - - call .player - jr .enemy - -.reverse - call .enemy -; jr .player - -.player - call SetPlayerTurn - ld de, PartyMon1Item - ld a, [CurBattleMon] - ld b, a - jr .go - -.enemy - call SetEnemyTurn - ld de, OTPartyMon1Item - ld a, [CurOTMon] - ld b, a -; jr .go - -.go - push de - push bc - callfar GetUserItem - ld a, [hl] - ld [wd265], a - sub BERSERK_GENE - pop bc - pop de - ret nz - - ld [hl], a - - ld h, d - ld l, e - ld a, b - call GetPartyLocation - xor a - ld [hl], a - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVarAddr - push af - set SUBSTATUS_CONFUSED, [hl] - ld a, BATTLE_VARS_MOVE_ANIM - call GetBattleVarAddr - push hl - push af - xor a - ld [hl], a - ld [AttackMissed], a - ld [EffectFailed], a - farcall BattleCommand_AttackUp2 - pop af - pop hl - ld [hl], a - call GetItemName - ld hl, BattleText_UsersStringBuffer1Activated - call StdBattleTextBox - callfar BattleCommand_StatUpMessage - pop af - bit SUBSTATUS_CONFUSED, a - ret nz - xor a - ld [wNumHits], a - ld de, ANIM_CONFUSED - call Call_PlayBattleAnim_OnlyIfVisible - call SwitchTurnCore - ld hl, BecameConfusedText - jp StdBattleTextBox -; 3c300 - -EnemyTriesToFlee: ; 3c300 - ld a, [wLinkMode] - and a - jr z, .not_linked - ld a, [wBattleAction] - cp BATTLEACTION_FORFEIT - jr z, .forfeit - -.not_linked - and a - ret - -.forfeit - call WildFled_EnemyFled_LinkBattleCanceled - scf - ret -; 3c314 - -DetermineMoveOrder: ; 3c314 - ld a, [wLinkMode] - and a - jr z, .use_move - ld a, [wBattleAction] - cp BATTLEACTION_E - jr z, .use_move - cp BATTLEACTION_D - jr z, .use_move - sub BATTLEACTION_SWITCH1 - jr c, .use_move - ld a, [wPlayerAction] - cp $2 - jr nz, .switch - ld a, [hLinkPlayerNumber] - cp $2 - jr z, .player_2 - - call BattleRandom - cp 1 + (50 percent) - jp c, .player_first - jp .enemy_first - -.player_2 - call BattleRandom - cp 1 + (50 percent) - jp c, .enemy_first - jp .player_first - -.switch - callfar AI_Switch - call SetEnemyTurn - call SpikesDamage - jp .enemy_first - -.use_move - ld a, [wPlayerAction] - and a - jp nz, .player_first - call CompareMovePriority - jr z, .equal_priority - jp c, .player_first ; player goes first - jp .enemy_first - -.equal_priority - call SetPlayerTurn - callfar GetUserItem - push bc - callfar GetOpponentItem - pop de - ld a, d - cp HELD_QUICK_CLAW - jr nz, .player_no_quick_claw - ld a, b - cp HELD_QUICK_CLAW - jr z, .both_have_quick_claw - call BattleRandom - cp e - jr nc, .speed_check - jp .player_first - -.player_no_quick_claw - ld a, b - cp HELD_QUICK_CLAW - jr nz, .speed_check - call BattleRandom - cp c - jr nc, .speed_check - jp .enemy_first - -.both_have_quick_claw - ld a, [hLinkPlayerNumber] - cp $2 - jr z, .player_2b - call BattleRandom - cp c - jp c, .enemy_first - call BattleRandom - cp e - jp c, .player_first - jr .speed_check - -.player_2b - call BattleRandom - cp e - jp c, .player_first - call BattleRandom - cp c - jp c, .enemy_first - jr .speed_check - -.speed_check - ld de, BattleMonSpeed - ld hl, EnemyMonSpeed - ld c, 2 - call StringCmp - jr z, .speed_tie - jp nc, .player_first - jp .enemy_first - -.speed_tie - ld a, [hLinkPlayerNumber] - cp $2 - jr z, .player_2c - call BattleRandom - cp 1 + (50 percent) - jp c, .player_first - jp .enemy_first - -.player_2c - call BattleRandom - cp 1 + (50 percent) - jp c, .enemy_first -.player_first - scf - ret -; 3c3f3 - -.enemy_first ; 3c3f3 - and a - ret -; 3c3f5 - -CheckContestBattleOver: ; 3c3f5 - ld a, [BattleType] - cp BATTLETYPE_CONTEST - jr nz, .contest_not_over - ld a, [wParkBallsRemaining] - and a - jr nz, .contest_not_over - ld a, [wBattleResult] - and $c0 - add $2 - ld [wBattleResult], a - scf - ret - -.contest_not_over - and a - ret -; 3c410 - -CheckPlayerLockedIn: ; 3c410 - ld a, [PlayerSubStatus4] - and 1 << SUBSTATUS_RECHARGE - jp nz, .quit - - ld hl, EnemySubStatus3 - res SUBSTATUS_FLINCHED, [hl] - ld hl, PlayerSubStatus3 - res SUBSTATUS_FLINCHED, [hl] - - ld a, [hl] - and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE - jp nz, .quit - - ld hl, PlayerSubStatus1 - bit SUBSTATUS_ROLLOUT, [hl] - jp nz, .quit - - and a - ret - -.quit - scf - ret -; 3c434 - -ParsePlayerAction: ; 3c434 - call CheckPlayerLockedIn - jp c, .locked_in - ld hl, PlayerSubStatus5 - bit SUBSTATUS_ENCORED, [hl] - jr z, .not_encored - ld a, [LastPlayerMove] - ld [CurPlayerMove], a - jr .encored - -.not_encored - ld a, [wPlayerAction] - cp $2 - jr z, .reset_rage - and a - jr nz, .reset_bide - ld a, [PlayerSubStatus3] - and 1 << SUBSTATUS_BIDE - jr nz, .locked_in - xor a - ld [wMoveSelectionMenuType], a - inc a ; POUND - ld [FXAnimID], a - call MoveSelectionScreen - push af - call Call_LoadTempTileMapToTileMap - call UpdateBattleHuds - ld a, [CurPlayerMove] - cp STRUGGLE - jr z, .struggle - call PlayClickSFX - -.struggle - ld a, $1 - ld [hBGMapMode], a - pop af - ret nz - -.encored - call SetPlayerTurn - callfar UpdateMoveData - xor a - ld [wPlayerCharging], a - ld a, [wPlayerMoveStruct + MOVE_EFFECT] - cp EFFECT_FURY_CUTTER - jr z, .continue_fury_cutter - xor a - ld [PlayerFuryCutterCount], a - -.continue_fury_cutter - ld a, [wPlayerMoveStruct + MOVE_EFFECT] - cp EFFECT_RAGE - jr z, .continue_rage - ld hl, PlayerSubStatus4 - res SUBSTATUS_RAGE, [hl] - xor a - ld [wPlayerRageCounter], a - -.continue_rage - ld a, [wPlayerMoveStruct + MOVE_EFFECT] - cp EFFECT_PROTECT - jr z, .continue_protect - cp EFFECT_ENDURE - jr z, .continue_protect - xor a - ld [PlayerProtectCount], a - jr .continue_protect - -.reset_bide - ld hl, PlayerSubStatus3 - res SUBSTATUS_BIDE, [hl] - -.locked_in - xor a - ld [PlayerFuryCutterCount], a - ld [PlayerProtectCount], a - ld [wPlayerRageCounter], a - ld hl, PlayerSubStatus4 - res SUBSTATUS_RAGE, [hl] - -.continue_protect - call ParseEnemyAction - xor a - ret - -.reset_rage - xor a - ld [PlayerFuryCutterCount], a - ld [PlayerProtectCount], a - ld [wPlayerRageCounter], a - ld hl, PlayerSubStatus4 - res SUBSTATUS_RAGE, [hl] - xor a - ret -; 3c4df - -HandleEncore: ; 3c4df - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .player_1 - call .do_player - jr .do_enemy - -.player_1 - call .do_enemy -.do_player - ld hl, PlayerSubStatus5 - bit SUBSTATUS_ENCORED, [hl] - ret z - ld a, [PlayerEncoreCount] - dec a - ld [PlayerEncoreCount], a - jr z, .end_player_encore - ld hl, BattleMonPP - ld a, [CurMoveNum] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - and $3f - ret nz - -.end_player_encore - ld hl, PlayerSubStatus5 - res SUBSTATUS_ENCORED, [hl] - call SetEnemyTurn - ld hl, BattleText_TargetsEncoreEnded - jp StdBattleTextBox - -.do_enemy - ld hl, EnemySubStatus5 - bit SUBSTATUS_ENCORED, [hl] - ret z - ld a, [EnemyEncoreCount] - dec a - ld [EnemyEncoreCount], a - jr z, .end_enemy_encore - ld hl, EnemyMonPP - ld a, [CurEnemyMoveNum] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - and $3f - ret nz - -.end_enemy_encore - ld hl, EnemySubStatus5 - res SUBSTATUS_ENCORED, [hl] - call SetPlayerTurn - ld hl, BattleText_TargetsEncoreEnded - jp StdBattleTextBox -; 3c543 - -TryEnemyFlee: ; 3c543 - ld a, [wBattleMode] - dec a - jr nz, .Stay - - ld a, [PlayerSubStatus5] - bit SUBSTATUS_CANT_RUN, a - jr nz, .Stay - - ld a, [wEnemyWrapCount] - and a - jr nz, .Stay - - ld a, [EnemyMonStatus] - and 1 << FRZ | SLP - jr nz, .Stay - - ld a, [TempEnemyMonSpecies] - ld de, 1 - ld hl, AlwaysFleeMons - call IsInArray - jr c, .Flee - - call BattleRandom - ld b, a - cp 1 + (50 percent) - jr nc, .Stay - - push bc - ld a, [TempEnemyMonSpecies] - ld de, 1 - ld hl, OftenFleeMons - call IsInArray - pop bc - jr c, .Flee - - ld a, b - cp 1 + (10 percent) - jr nc, .Stay - - ld a, [TempEnemyMonSpecies] - ld de, 1 - ld hl, SometimesFleeMons - call IsInArray - jr c, .Flee - -.Stay: - and a - ret - -.Flee: - scf - ret -; 3c59a - -INCLUDE "data/battle/flee_mons.asm" - -CompareMovePriority: ; 3c5b4 -; Compare the priority of the player and enemy's moves. -; Return carry if the player goes first, or z if they match. - - ld a, [CurPlayerMove] - call GetMovePriority - ld b, a - push bc - ld a, [CurEnemyMove] - call GetMovePriority - pop bc - cp b - ret -; 3c5c5 - -GetMovePriority: ; 3c5c5 -; Return the priority (0-3) of move a. - - ld b, a - - ; Vital Throw goes last. - cp VITAL_THROW - ld a, 0 - ret z - - call GetMoveEffect - ld hl, MoveEffectPriorities -.loop - ld a, [hli] - cp b - jr z, .done - inc hl - cp -1 - jr nz, .loop - - ld a, 1 - ret - -.done - ld a, [hl] - ret -; 3c5df - -MoveEffectPriorities: ; 3c5df - db EFFECT_PROTECT, 3 - db EFFECT_ENDURE, 3 - db EFFECT_PRIORITY_HIT, 2 - db EFFECT_FORCE_SWITCH, 0 - db EFFECT_COUNTER, 0 - db EFFECT_MIRROR_COAT, 0 - db -1 -; 3c5ec - -GetMoveEffect: ; 3c5ec - ld a, b - dec a - ld hl, Moves + MOVE_EFFECT - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - ld b, a - ret -; 3c5fe - -Battle_EnemyFirst: ; 3c5fe - call LoadTileMapToTempTileMap - call TryEnemyFlee - jp c, WildFled_EnemyFled_LinkBattleCanceled - call SetEnemyTurn - ld a, $1 - ld [wEnemyGoesFirst], a - callfar AI_SwitchOrTryItem - jr c, .switch_item - call EnemyTurn_EndOpponentProtectEndureDestinyBond - call CheckMobileBattleError - ret c - ld a, [wForcedSwitch] - and a - ret nz - call HasPlayerFainted - jp z, HandlePlayerMonFaint - call HasEnemyFainted - jp z, HandleEnemyMonFaint - -.switch_item - call SetEnemyTurn - call ResidualDamage - jp z, HandleEnemyMonFaint - call RefreshBattleHuds - call PlayerTurn_EndOpponentProtectEndureDestinyBond - call CheckMobileBattleError - ret c - ld a, [wForcedSwitch] - and a - ret nz - call HasEnemyFainted - jp z, HandleEnemyMonFaint - call HasPlayerFainted - jp z, HandlePlayerMonFaint - call SetPlayerTurn - call ResidualDamage - jp z, HandlePlayerMonFaint - call RefreshBattleHuds - xor a - ld [wPlayerAction], a - ret -; 3c664 - -Battle_PlayerFirst: ; 3c664 - xor a - ld [wEnemyGoesFirst], a - call SetEnemyTurn - callfar AI_SwitchOrTryItem - push af - call PlayerTurn_EndOpponentProtectEndureDestinyBond - pop bc - ld a, [wForcedSwitch] - and a - ret nz - call CheckMobileBattleError - ret c - call HasEnemyFainted - jp z, HandleEnemyMonFaint - call HasPlayerFainted - jp z, HandlePlayerMonFaint - push bc - call SetPlayerTurn - call ResidualDamage - pop bc - jp z, HandlePlayerMonFaint - push bc - call RefreshBattleHuds - pop af - jr c, .switched_or_used_item - call LoadTileMapToTempTileMap - call TryEnemyFlee - jp c, WildFled_EnemyFled_LinkBattleCanceled - call EnemyTurn_EndOpponentProtectEndureDestinyBond - call CheckMobileBattleError - ret c - ld a, [wForcedSwitch] - and a - ret nz - call HasPlayerFainted - jp z, HandlePlayerMonFaint - call HasEnemyFainted - jp z, HandleEnemyMonFaint - -.switched_or_used_item - call SetEnemyTurn - call ResidualDamage - jp z, HandleEnemyMonFaint - call RefreshBattleHuds - xor a - ld [wPlayerAction], a - ret -; 3c6cf - -PlayerTurn_EndOpponentProtectEndureDestinyBond: ; 3c6cf - call SetPlayerTurn - call EndUserDestinyBond - callfar DoPlayerTurn - jp EndOpponentProtectEndureDestinyBond -; 3c6de - -EnemyTurn_EndOpponentProtectEndureDestinyBond: ; 3c6de - call SetEnemyTurn - call EndUserDestinyBond - callfar DoEnemyTurn - jp EndOpponentProtectEndureDestinyBond -; 3c6ed - -EndOpponentProtectEndureDestinyBond: ; 3c6ed - ld a, BATTLE_VARS_SUBSTATUS1_OPP - call GetBattleVarAddr - res SUBSTATUS_PROTECT, [hl] - res SUBSTATUS_ENDURE, [hl] - ld a, BATTLE_VARS_SUBSTATUS5_OPP - call GetBattleVarAddr - res SUBSTATUS_DESTINY_BOND, [hl] - ret -; 3c6fe - -EndUserDestinyBond: ; 3c6fe - ld a, BATTLE_VARS_SUBSTATUS5 - call GetBattleVarAddr - res SUBSTATUS_DESTINY_BOND, [hl] - ret -; 3c706 - -HasUserFainted: ; 3c706 - ld a, [hBattleTurn] - and a - jr z, HasPlayerFainted -HasEnemyFainted: ; 3c70b - ld hl, EnemyMonHP - jr CheckIfHPIsZero - -HasPlayerFainted: ; 3c710 - ld hl, BattleMonHP - -CheckIfHPIsZero: ; 3c713 - ld a, [hli] - or [hl] - ret -; 3c716 - -ResidualDamage: ; 3c716 -; Return z if the user fainted before -; or as a result of residual damage. -; For Sandstorm damage, see HandleWeather. - - call HasUserFainted - ret z - - ld a, BATTLE_VARS_STATUS - call GetBattleVar - and 1 << PSN | 1 << BRN - jr z, .did_psn_brn - - ld hl, HurtByPoisonText - ld de, ANIM_PSN - and 1 << BRN - jr z, .got_anim - ld hl, HurtByBurnText - ld de, ANIM_BRN -.got_anim - - push de - call StdBattleTextBox - pop de - - xor a - ld [wNumHits], a - call Call_PlayBattleAnim_OnlyIfVisible - call GetEighthMaxHP - ld de, PlayerToxicCount - ld a, [hBattleTurn] - and a - jr z, .check_toxic - ld de, EnemyToxicCount -.check_toxic - - ld a, BATTLE_VARS_SUBSTATUS5 - call GetBattleVar - bit SUBSTATUS_TOXIC, a - jr z, .did_toxic - call GetSixteenthMaxHP - ld a, [de] - inc a - ld [de], a - ld hl, 0 -.add - add hl, bc - dec a - jr nz, .add - ld b, h - ld c, l -.did_toxic - - call SubtractHPFromUser -.did_psn_brn - - call HasUserFainted - jp z, .fainted - - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVarAddr - bit SUBSTATUS_LEECH_SEED, [hl] - jr z, .not_seeded - - call SwitchTurnCore - xor a - ld [wNumHits], a - ld de, ANIM_SAP - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVar - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - call z, Call_PlayBattleAnim_OnlyIfVisible - call SwitchTurnCore - - call GetEighthMaxHP - call SubtractHPFromUser - ld a, $1 - ld [hBGMapMode], a - call RestoreHP - ld hl, LeechSeedSapsText - call StdBattleTextBox -.not_seeded - - call HasUserFainted - jr z, .fainted - - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarAddr - bit SUBSTATUS_NIGHTMARE, [hl] - jr z, .not_nightmare - xor a - ld [wNumHits], a - ld de, ANIM_IN_NIGHTMARE - call Call_PlayBattleAnim_OnlyIfVisible - call GetQuarterMaxHP - call SubtractHPFromUser - ld hl, HasANightmareText - call StdBattleTextBox -.not_nightmare - - call HasUserFainted - jr z, .fainted - - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarAddr - bit SUBSTATUS_CURSE, [hl] - jr z, .not_cursed - - xor a - ld [wNumHits], a - ld de, ANIM_IN_NIGHTMARE - call Call_PlayBattleAnim_OnlyIfVisible - call GetQuarterMaxHP - call SubtractHPFromUser - ld hl, HurtByCurseText - call StdBattleTextBox - -.not_cursed - ld hl, BattleMonHP - ld a, [hBattleTurn] - and a - jr z, .check_fainted - ld hl, EnemyMonHP - -.check_fainted - ld a, [hli] - or [hl] - ret nz - -.fainted - call RefreshBattleHuds - ld c, 20 - call DelayFrames - xor a - ret -; 3c801 - -HandlePerishSong: ; 3c801 - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .EnemyFirst - call SetPlayerTurn - call .do_it - call SetEnemyTurn - jp .do_it - -.EnemyFirst: - call SetEnemyTurn - call .do_it - call SetPlayerTurn - -.do_it - ld hl, PlayerPerishCount - ld a, [hBattleTurn] - and a - jr z, .got_count - ld hl, EnemyPerishCount - -.got_count - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVar - bit SUBSTATUS_PERISH, a - ret z - dec [hl] - ld a, [hl] - ld [wd265], a - push af - ld hl, PerishCountText - call StdBattleTextBox - pop af - ret nz - ld a, BATTLE_VARS_SUBSTATUS1 - call GetBattleVarAddr - res SUBSTATUS_PERISH, [hl] - ld a, [hBattleTurn] - and a - jr nz, .kill_enemy - ld hl, BattleMonHP - xor a - ld [hli], a - ld [hl], a - ld hl, PartyMon1HP - ld a, [CurBattleMon] - call GetPartyLocation - xor a - ld [hli], a - ld [hl], a - ret - -.kill_enemy - ld hl, EnemyMonHP - xor a - ld [hli], a - ld [hl], a - ld a, [wBattleMode] - dec a - ret z - ld hl, OTPartyMon1HP - ld a, [CurOTMon] - call GetPartyLocation - xor a - ld [hli], a - ld [hl], a - ret -; 3c874 - -HandleWrap: ; 3c874 - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .EnemyFirst - call SetPlayerTurn - call .do_it - call SetEnemyTurn - jp .do_it - -.EnemyFirst: - call SetEnemyTurn - call .do_it - call SetPlayerTurn - -.do_it - ld hl, wPlayerWrapCount - ld de, wPlayerTrappingMove - ld a, [hBattleTurn] - and a - jr z, .got_addrs - ld hl, wEnemyWrapCount - ld de, wEnemyTrappingMove - -.got_addrs - ld a, [hl] - and a - ret z - - ld a, BATTLE_VARS_SUBSTATUS4 - call GetBattleVar - bit SUBSTATUS_SUBSTITUTE, a - ret nz - - ld a, [de] - ld [wd265], a - ld [FXAnimID], a - call GetMoveName - dec [hl] - jr z, .release_from_bounds - - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVar - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - jr nz, .skip_anim - - call SwitchTurnCore - xor a - ld [wNumHits], a - ld [FXAnimID + 1], a - predef PlayBattleAnim - call SwitchTurnCore - -.skip_anim - call GetSixteenthMaxHP - call SubtractHPFromUser - ld hl, BattleText_UsersHurtByStringBuffer1 - jr .print_text - -.release_from_bounds - ld hl, BattleText_UserWasReleasedFromStringBuffer1 - -.print_text - jp StdBattleTextBox -; 3c8e4 - -SwitchTurnCore: ; 3c8e4 - ld a, [hBattleTurn] - xor 1 - ld [hBattleTurn], a - ret -; 3c8eb - -HandleLeftovers: ; 3c8eb - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .DoEnemyFirst - call SetPlayerTurn - call .do_it - call SetEnemyTurn - jp .do_it - -.DoEnemyFirst: - call SetEnemyTurn - call .do_it - call SetPlayerTurn -.do_it - - callfar GetUserItem - ld a, [hl] - ld [wd265], a - call GetItemName - ld a, b - cp HELD_LEFTOVERS - ret nz - - ld hl, BattleMonHP - ld a, [hBattleTurn] - and a - jr z, .got_hp - ld hl, EnemyMonHP - -.got_hp -; Don't restore if we're already at max HP - ld a, [hli] - ld b, a - ld a, [hli] - ld c, a - ld a, [hli] - cp b - jr nz, .restore - ld a, [hl] - cp c - ret z - -.restore - call GetSixteenthMaxHP - call SwitchTurnCore - call RestoreHP - ld hl, BattleText_TargetRecoveredWithItem - jp StdBattleTextBox -; 3c93c - -HandleMysteryberry: ; 3c93c - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .DoEnemyFirst - call SetPlayerTurn - call .do_it - call SetEnemyTurn - jp .do_it - -.DoEnemyFirst: - call SetEnemyTurn - call .do_it - call SetPlayerTurn - -.do_it - callfar GetUserItem - ld a, b - cp HELD_RESTORE_PP - jr nz, .quit - ld hl, PartyMon1PP - ld a, [CurBattleMon] - call GetPartyLocation - ld d, h - ld e, l - ld hl, PartyMon1Moves - ld a, [CurBattleMon] - call GetPartyLocation - ld a, [hBattleTurn] - and a - jr z, .wild - ld de, wWildMonPP - ld hl, wWildMonMoves - ld a, [wBattleMode] - dec a - jr z, .wild - ld hl, OTPartyMon1PP - ld a, [CurOTMon] - call GetPartyLocation - ld d, h - ld e, l - ld hl, OTPartyMon1Moves - ld a, [CurOTMon] - call GetPartyLocation - -.wild - ld c, $0 -.loop - ld a, [hl] - and a - jr z, .quit - ld a, [de] - and $3f - jr z, .restore - inc hl - inc de - inc c - ld a, c - cp NUM_MOVES - jr nz, .loop - -.quit - ret - -.restore - ; lousy hack - ld a, [hl] - cp SKETCH - ld b, 1 - jr z, .sketch - ld b, 5 -.sketch - ld a, [de] - add b - ld [de], a - push bc - push bc - ld a, [hl] - ld [wd265], a - ld de, BattleMonMoves - 1 - ld hl, BattleMonPP - ld a, [hBattleTurn] - and a - jr z, .player_pp - ld de, EnemyMonMoves - 1 - ld hl, EnemyMonPP -.player_pp - inc de - pop bc - ld b, 0 - add hl, bc - push hl - ld h, d - ld l, e - add hl, bc - pop de - pop bc - - ld a, [wd265] - cp [hl] - jr nz, .skip_checks - ld a, [hBattleTurn] - and a - ld a, [PlayerSubStatus5] - jr z, .check_transform - ld a, [EnemySubStatus5] -.check_transform - bit SUBSTATUS_TRANSFORMED, a - jr nz, .skip_checks - ld a, [de] - add b - ld [de], a -.skip_checks - callfar GetUserItem - ld a, [hl] - ld [wd265], a - xor a - ld [hl], a - call GetPartymonItem - ld a, [hBattleTurn] - and a - jr z, .consume_item - ld a, [wBattleMode] - dec a - jr z, .skip_consumption - call GetOTPartymonItem - -.consume_item - xor a - ld [hl], a - -.skip_consumption - call GetItemName - call SwitchTurnCore - call ItemRecoveryAnim - call SwitchTurnCore - ld hl, BattleText_UserRecoveredPPUsing - jp StdBattleTextBox -; 3ca26 - -HandleFutureSight: ; 3ca26 - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .enemy_first - call SetPlayerTurn - call .do_it - call SetEnemyTurn - jp .do_it - -.enemy_first - call SetEnemyTurn - call .do_it - call SetPlayerTurn - -.do_it - ld hl, wPlayerFutureSightCount - ld a, [hBattleTurn] - and a - jr z, .okay - ld hl, wEnemyFutureSightCount - -.okay - ld a, [hl] - and a - ret z - dec a - ld [hl], a - cp $1 - ret nz - - ld hl, BattleText_TargetWasHitByFutureSight - call StdBattleTextBox - - ld a, BATTLE_VARS_MOVE - call GetBattleVarAddr - push af - ld a, FUTURE_SIGHT - ld [hl], a - - callfar UpdateMoveData - xor a - ld [AttackMissed], a - ld [AlreadyDisobeyed], a - ld a, 10 - ld [TypeModifier], a - callfar DoMove - xor a - ld [CurDamage], a - ld [CurDamage + 1], a - - ld a, BATTLE_VARS_MOVE - call GetBattleVarAddr - pop af - ld [hl], a - - call UpdateBattleMonInParty - jp UpdateEnemyMonInParty -; 3ca8f - -HanleDefrost: ; 3ca8f - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .enemy_first - call .do_player_turn - jr .do_enemy_turn - -.enemy_first - call .do_enemy_turn -.do_player_turn - ld a, [BattleMonStatus] - bit FRZ, a - ret z - - ld a, [wPlayerJustGotFrozen] - and a - ret nz - - call BattleRandom - cp 10 percent - ret nc - xor a - ld [BattleMonStatus], a - ld a, [CurBattleMon] - ld hl, PartyMon1Status - call GetPartyLocation - ld [hl], 0 - call UpdateBattleHuds - call SetEnemyTurn - ld hl, DefrostedOpponentText - jp StdBattleTextBox - -.do_enemy_turn - ld a, [EnemyMonStatus] - bit FRZ, a - ret z - ld a, [wEnemyJustGotFrozen] - and a - ret nz - call BattleRandom - cp 10 percent - ret nc - xor a - ld [EnemyMonStatus], a - - ld a, [wBattleMode] - dec a - jr z, .wild - ld a, [CurOTMon] - ld hl, OTPartyMon1Status - call GetPartyLocation - ld [hl], 0 -.wild - - call UpdateBattleHuds - call SetPlayerTurn - ld hl, DefrostedOpponentText - jp StdBattleTextBox -; 3cafb - -HandleSafeguard: ; 3cafb - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .player1 - call .CheckPlayer - jr .CheckEnemy - -.player1 - call .CheckEnemy -.CheckPlayer: - ld a, [PlayerScreens] - bit SCREENS_SAFEGUARD, a - ret z - ld hl, PlayerSafeguardCount - dec [hl] - ret nz - res SCREENS_SAFEGUARD, a - ld [PlayerScreens], a - xor a - jr .print - -.CheckEnemy: - ld a, [EnemyScreens] - bit SCREENS_SAFEGUARD, a - ret z - ld hl, EnemySafeguardCount - dec [hl] - ret nz - res SCREENS_SAFEGUARD, a - ld [EnemyScreens], a - ld a, $1 - -.print - ld [hBattleTurn], a - ld hl, BattleText_SafeguardFaded - jp StdBattleTextBox - -HandleScreens: ; 3cb36 - ld a, [hLinkPlayerNumber] - cp 1 - jr z, .Both - call .CheckPlayer - jr .CheckEnemy - -.Both: - call .CheckEnemy - -.CheckPlayer: - call SetPlayerTurn - ld de, .Your - call .Copy - ld hl, PlayerScreens - ld de, PlayerLightScreenCount - jr .TickScreens - -.CheckEnemy: - call SetEnemyTurn - ld de, .Enemy - call .Copy - ld hl, EnemyScreens - ld de, EnemyLightScreenCount - -.TickScreens: - bit SCREENS_LIGHT_SCREEN, [hl] - call nz, .LightScreenTick - bit SCREENS_REFLECT, [hl] - call nz, .ReflectTick - ret - -.Copy: - ld hl, StringBuffer1 - jp CopyName2 -; 3cb75 - -.Your: - db "Your@" -.Enemy: - db "Enemy@" -; 3cb80 - -.LightScreenTick: ; 3cb80 - ld a, [de] - dec a - ld [de], a - ret nz - res SCREENS_LIGHT_SCREEN, [hl] - push hl - push de - ld hl, BattleText_PkmnLightScreenFell - call StdBattleTextBox - pop de - pop hl - ret -; 3cb91 - -.ReflectTick: ; 3cb91 - inc de - ld a, [de] - dec a - ld [de], a - ret nz - res SCREENS_REFLECT, [hl] - ld hl, BattleText_PkmnReflectFaded - jp StdBattleTextBox -; 3cb9e - -HandleWeather: ; 3cb9e - ld a, [Weather] - cp WEATHER_NONE - ret z - - ld hl, WeatherCount - dec [hl] - jr z, .ended - - ld hl, .WeatherMessages - call .PrintWeatherMessage - - ld a, [Weather] - cp WEATHER_SANDSTORM - ret nz - - ld a, [hLinkPlayerNumber] - cp 1 - jr z, .enemy_first - -.player_first - call SetPlayerTurn - call .SandstormDamage - call SetEnemyTurn - jr .SandstormDamage - -.enemy_first - call SetEnemyTurn - call .SandstormDamage - call SetPlayerTurn - -.SandstormDamage: - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVar - bit SUBSTATUS_UNDERGROUND, a - ret nz - - ld hl, BattleMonType1 - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyMonType1 -.ok - ld a, [hli] - cp ROCK - ret z - cp GROUND - ret z - cp STEEL - ret z - - ld a, [hl] - cp ROCK - ret z - cp GROUND - ret z - cp STEEL - ret z - - call SwitchTurnCore - xor a - ld [wNumHits], a - ld de, ANIM_IN_SANDSTORM - call Call_PlayBattleAnim - call SwitchTurnCore - call GetEighthMaxHP - call SubtractHPFromUser - - ld hl, SandstormHitsText - jp StdBattleTextBox - -.ended - ld hl, .WeatherEndedMessages - call .PrintWeatherMessage - xor a - ld [Weather], a - ret - -.PrintWeatherMessage: - ld a, [Weather] - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - jp StdBattleTextBox -; 3cc2d - -.WeatherMessages: - dw BattleText_RainContinuesToFall - dw BattleText_TheSunlightIsStrong - dw BattleText_TheSandstormRages -.WeatherEndedMessages: - dw BattleText_TheRainStopped - dw BattleText_TheSunlightFaded - dw BattleText_TheSandstormSubsided -; 3cc39 - -SubtractHPFromTarget: ; 3cc39 - call SubtractHP - jp UpdateHPBar -; 3cc3f - -SubtractHPFromUser: ; 3cc3f -; Subtract HP from Pkmn - call SubtractHP - jp UpdateHPBarBattleHuds -; 3cc45 - -SubtractHP: ; 3cc45 - ld hl, BattleMonHP - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyMonHP -.ok - inc hl - ld a, [hl] - ld [Buffer3], a - sub c - ld [hld], a - ld [Buffer5], a - ld a, [hl] - ld [Buffer4], a - sbc b - ld [hl], a - ld [Buffer6], a - ret nc - - ld a, [Buffer3] - ld c, a - ld a, [Buffer4] - ld b, a - xor a - ld [hli], a - ld [hl], a - ld [Buffer5], a - ld [Buffer6], a - ret -; 3cc76 - -GetSixteenthMaxHP: ; 3cc76 - call GetQuarterMaxHP - ; quarter result - srl c - srl c - ; round up - ld a, c - and a - jr nz, .ok - inc c -.ok - ret -; 3cc83 - -GetEighthMaxHP: ; 3cc83 -; output: bc - call GetQuarterMaxHP -; assumes nothing can have 1024 or more hp -; halve result - srl c -; round up - ld a, c - and a - jr nz, .end - inc c -.end - ret -; 3cc8e - -GetQuarterMaxHP: ; 3cc8e -; output: bc - call GetMaxHP - -; quarter result - srl b - rr c - srl b - rr c - -; assumes nothing can have 1024 or more hp -; round up - ld a, c - and a - jr nz, .end - inc c -.end - ret -; 3cc9f - -GetHalfMaxHP: ; 3cc9f -; output: bc - call GetMaxHP - -; halve result - srl b - rr c - -; floor = 1 - ld a, c - or b - jr nz, .end - inc c -.end - ret -; 3ccac - -GetMaxHP: ; 3ccac -; output: bc, Buffer1-2 - - ld hl, BattleMonMaxHP - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyMonMaxHP -.ok - ld a, [hli] - ld [Buffer2], a - ld b, a - - ld a, [hl] - ld [Buffer1], a - ld c, a - ret -; 3ccc2 - -GetHalfHP: ; 3ccc2 -; unreferenced - ld hl, BattleMonHP - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyMonHP -.ok - ld a, [hli] - ld b, a - ld a, [hli] - ld c, a - srl b - rr c - ld a, [hli] - ld [Buffer2], a - ld a, [hl] - ld [Buffer1], a - ret -; 3ccde - -CheckUserHasEnoughHP: ; 3ccde - ld hl, BattleMonHP + 1 - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyMonHP + 1 -.ok - ld a, c - sub [hl] - dec hl - ld a, b - sbc [hl] - ret -; 3ccef - -RestoreHP ; 3ccef - ld hl, EnemyMonMaxHP - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, BattleMonMaxHP -.ok - ld a, [hli] - ld [Buffer2], a - ld a, [hld] - ld [Buffer1], a - dec hl - ld a, [hl] - ld [Buffer3], a - add c - ld [hld], a - ld [Buffer5], a - ld a, [hl] - ld [Buffer4], a - adc b - ld [hli], a - ld [Buffer6], a - - ld a, [Buffer1] - ld c, a - ld a, [hld] - sub c - ld a, [Buffer2] - ld b, a - ld a, [hl] - sbc b - jr c, .asm_3cd2d - ld a, b - ld [hli], a - ld [Buffer6], a - ld a, c - ld [hl], a - ld [Buffer5], a -.asm_3cd2d - - call SwitchTurnCore - call UpdateHPBarBattleHuds - jp SwitchTurnCore -; 3cd36 - -UpdateHPBarBattleHuds: ; 3cd36 - call UpdateHPBar - jp UpdateBattleHuds -; 3cd3c - -UpdateHPBar: ; 3cd3c - hlcoord 10, 9 - ld a, [hBattleTurn] - and a - ld a, 1 - jr z, .ok - hlcoord 2, 2 - xor a -.ok - push bc - ld [wWhichHPBar], a - predef AnimateHPBar - pop bc - ret -; 3cd55 - -HandleEnemyMonFaint: ; 3cd55 - call FaintEnemyPokemon - ld hl, BattleMonHP - ld a, [hli] - or [hl] - call z, FaintYourPokemon - xor a - ld [wWhichMonFaintedFirst], a - call UpdateBattleStateAndExperienceAfterEnemyFaint - call CheckPlayerPartyForFitPkmn - ld a, d - and a - jp z, LostBattle - - ld hl, BattleMonHP - ld a, [hli] - or [hl] - call nz, UpdatePlayerHUD - - ld a, $1 - ld [hBGMapMode], a - ld c, 60 - call DelayFrames - - ld a, [wBattleMode] - dec a - jr nz, .trainer - - ld a, 1 - ld [BattleEnded], a - ret - -.trainer - call CheckEnemyTrainerDefeated - jp z, WinTrainerBattle - - ld hl, BattleMonHP - ld a, [hli] - or [hl] - jr nz, .player_mon_not_fainted - - call AskUseNextPokemon - jr nc, .dont_flee - - ld a, 1 - ld [BattleEnded], a - ret - -.dont_flee - call ForcePlayerMonChoice - call CheckMobileBattleError - jp c, WildFled_EnemyFled_LinkBattleCanceled - - ld a, $1 - ld [wPlayerAction], a - call HandleEnemySwitch - jp z, WildFled_EnemyFled_LinkBattleCanceled - jr DoubleSwitch - -.player_mon_not_fainted - ld a, $1 - ld [wPlayerAction], a - call HandleEnemySwitch - jp z, WildFled_EnemyFled_LinkBattleCanceled - xor a - ld [wPlayerAction], a - ret -; 3cdca - -DoubleSwitch: ; 3cdca - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .player_1 - call ClearSprites - hlcoord 1, 0 - lb bc, 4, 10 - call ClearBox - call PlayerPartyMonEntrance - ld a, $1 - call EnemyPartyMonEntrance - jr .done - -.player_1 - ld a, [CurPartyMon] - push af - ld a, $1 - call EnemyPartyMonEntrance - call ClearSprites - call LoadTileMapToTempTileMap - pop af - ld [CurPartyMon], a - call PlayerPartyMonEntrance - -.done - xor a - ld [wPlayerAction], a - ret -; 3ce01 - -UpdateBattleStateAndExperienceAfterEnemyFaint: ; 3ce01 - call UpdateBattleMonInParty - ld a, [wBattleMode] - dec a - jr z, .wild - ld a, [CurOTMon] - ld hl, OTPartyMon1HP - call GetPartyLocation - xor a - ld [hli], a - ld [hl], a - -.wild - ld hl, PlayerSubStatus3 - res SUBSTATUS_IN_LOOP, [hl] - xor a - ld hl, EnemyDamageTaken - ld [hli], a - ld [hl], a - call NewEnemyMonStatus - call BreakAttraction - ld a, [wBattleMode] - dec a - jr z, .wild2 - jr .trainer - -.wild2 - call StopDangerSound - ld a, $1 - ld [wDanger], a - -.trainer - ld hl, BattleMonHP - ld a, [hli] - or [hl] - jr nz, .player_mon_did_not_faint - ld a, [wWhichMonFaintedFirst] - and a - jr nz, .player_mon_did_not_faint - call PlayerMonFaintHappinessMod - -.player_mon_did_not_faint - call CheckPlayerPartyForFitPkmn - ld a, d - and a - ret z - ld a, [wBattleMode] - dec a - call z, PlayVictoryMusic - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - ld a, [wBattleResult] - and $c0 - ld [wBattleResult], a - call IsAnyMonHoldingExpShare - jr z, .skip_exp - ld hl, EnemyMonBaseStats - ld b, EnemyMonEnd - EnemyMonBaseStats -.loop - srl [hl] - inc hl - dec b - jr nz, .loop - -.skip_exp - ld hl, EnemyMonBaseStats - ld de, wBackupEnemyMonBaseStats - ld bc, EnemyMonEnd - EnemyMonBaseStats - call CopyBytes - xor a - ld [wGivingExperienceToExpShareHolders], a - call GiveExperiencePoints - call IsAnyMonHoldingExpShare - ret z - - ld a, [wBattleParticipantsNotFainted] - push af - ld a, d - ld [wBattleParticipantsNotFainted], a - ld hl, wBackupEnemyMonBaseStats - ld de, EnemyMonBaseStats - ld bc, EnemyMonEnd - EnemyMonBaseStats - call CopyBytes - ld a, $1 - ld [wGivingExperienceToExpShareHolders], a - call GiveExperiencePoints - pop af - ld [wBattleParticipantsNotFainted], a - ret -; 3ceaa - -IsAnyMonHoldingExpShare: ; 3ceaa - ld a, [PartyCount] - ld b, a - ld hl, PartyMon1 - ld c, 1 - ld d, 0 -.loop - push hl - push bc - ld bc, MON_HP - add hl, bc - ld a, [hli] - or [hl] - pop bc - pop hl - jr z, .next - - push hl - push bc - ld bc, MON_ITEM - add hl, bc - pop bc - ld a, [hl] - pop hl - - cp EXP_SHARE - jr nz, .next - ld a, d - or c - ld d, a - -.next - sla c - push de - ld de, PARTYMON_STRUCT_LENGTH - add hl, de - pop de - dec b - jr nz, .loop - - ld a, d - ld e, 0 - ld b, PARTY_LENGTH -.loop2 - srl a - jr nc, .okay - inc e - -.okay - dec b - jr nz, .loop2 - ld a, e - and a - ret -; 3ceec - -StopDangerSound: ; 3ceec - xor a - ld [Danger], a - ret -; 3cef1 - -FaintYourPokemon: ; 3cef1 - call StopDangerSound - call WaitSFX - ld a, $f0 - ld [CryTracks], a - ld a, [BattleMonSpecies] - call PlayStereoCry - call PlayerMonFaintedAnimation - hlcoord 9, 7 - lb bc, 5, 11 - call ClearBox - ld hl, BattleText_PkmnFainted - jp StdBattleTextBox -; 3cf14 - -FaintEnemyPokemon: ; 3cf14 - call WaitSFX - ld de, SFX_KINESIS - call PlaySFX - call EnemyMonFaintedAnimation - ld de, SFX_FAINT - call PlaySFX - hlcoord 1, 0 - lb bc, 4, 10 - call ClearBox - ld hl, BattleText_EnemyPkmnFainted - jp StdBattleTextBox -; 3cf35 - -CheckEnemyTrainerDefeated: ; 3cf35 - ld a, [OTPartyCount] - ld b, a - xor a - ld hl, OTPartyMon1HP - ld de, PARTYMON_STRUCT_LENGTH - -.loop - or [hl] - inc hl - or [hl] - dec hl - add hl, de - dec b - jr nz, .loop - - and a - ret -; 3cf4a - -HandleEnemySwitch: ; 3cf4a - ld hl, EnemyHPPal - ld e, HP_BAR_LENGTH_PX - call UpdateHPPal - call WaitBGMap - farcall EnemySwitch_TrainerHud - ld a, [wLinkMode] - and a - jr z, .not_linked - - call LinkBattleSendReceiveAction - ld a, [wBattleAction] - cp BATTLEACTION_FORFEIT - ret z - - call Call_LoadTempTileMapToTileMap - -.not_linked - ld hl, BattleMonHP - ld a, [hli] - or [hl] - ld a, $0 - jr nz, EnemyPartyMonEntrance - inc a - ret -; 3cf78 - -EnemyPartyMonEntrance: ; 3cf78 - push af - xor a - ld [wEnemySwitchMonIndex], a - call NewEnemyMonStatus - call ResetEnemyStatLevels - call BreakAttraction - pop af - and a - jr nz, .set - call EnemySwitch - jr .done_switch - -.set - call EnemySwitch_SetMode -.done_switch - call ResetBattleParticipants - call SetEnemyTurn - call SpikesDamage - xor a - ld [wEnemyMoveStruct + MOVE_ANIM], a - ld [wPlayerAction], a - inc a - ret -; 3cfa4 - -WinTrainerBattle: ; 3cfa4 -; Player won the battle - call StopDangerSound - ld a, $1 - ld [wDanger], a - ld [BattleEnded], a - ld a, [wLinkMode] - and a - ld a, b - call z, PlayVictoryMusic - callfar Battle_GetTrainerName - ld hl, BattleText_EnemyWasDefeated - call StdBattleTextBox - - call IsMobileBattle - jr z, .mobile - ld a, [wLinkMode] - and a - ret nz - - ld a, [InBattleTowerBattle] - bit 0, a - jr nz, .battle_tower - - call BattleWinSlideInEnemyTrainerFrontpic - ld c, 40 - call DelayFrames - ld a, [BattleType] - cp BATTLETYPE_CANLOSE - jr nz, .skip_heal - predef HealParty -.skip_heal - ld a, [wMonStatusFlags] - bit 0, a - jr nz, .skip_win_loss_text - call PrintWinLossText - -.skip_win_loss_text - jp .GiveMoney - -.mobile - call BattleWinSlideInEnemyTrainerFrontpic - ld c, 40 - call DelayFrames - ld c, $4 ; win - farcall Mobile_PrintOpponentBattleMessage - ret - -.battle_tower - call BattleWinSlideInEnemyTrainerFrontpic - ld c, 40 - call DelayFrames - call EmptyBattleTextBox - ld c, $3 - farcall BattleTowerText - call WaitPressAorB_BlinkCursor - ld hl, wPayDayMoney - ld a, [hli] - or [hl] - inc hl - or [hl] - ret nz - call ClearTileMap - call ClearBGPalettes - ret - -.GiveMoney: - ld a, [wAmuletCoin] - and a - call nz, .DoubleReward - call .CheckMaxedOutMomMoney - push af - ld a, $0 - jr nc, .okay - ld a, [wMomSavingMoney] - and $7 - cp $3 - jr nz, .okay - inc a - -.okay - ld b, a - ld c, $4 -.loop - ld a, b - and a - jr z, .loop2 - call .SendMoneyToMom - dec c - dec b - jr .loop - -.loop2 - ld a, c - and a - jr z, .done - call .AddMoneyToWallet - dec c - jr .loop2 - -.done - call .DoubleReward - call .DoubleReward - pop af - jr nc, .KeepItAll - ld a, [wMomSavingMoney] - and $7 - jr z, .KeepItAll - ld hl, .SentToMomTexts - dec a - ld c, a - ld b, 0 - add hl, bc - add hl, bc - ld a, [hli] - ld h, [hl] - ld l, a - jp StdBattleTextBox - -.KeepItAll: - ld hl, GotMoneyForWinningText - jp StdBattleTextBox -; 3d081 - -.SendMoneyToMom: ; 3d081 - push bc - ld hl, wBattleReward + 2 - ld de, wMomsMoney + 2 - call AddBattleMoneyToAccount - pop bc - ret -; 3d08d - -.AddMoneyToWallet: ; 3d08d - push bc - ld hl, wBattleReward + 2 - ld de, Money + 2 - call AddBattleMoneyToAccount - pop bc - ret -; 3d099 - -.DoubleReward: ; 3d099 - ld hl, wBattleReward + 2 - sla [hl] - dec hl - rl [hl] - dec hl - rl [hl] - ret nc - ld a, $ff - ld [hli], a - ld [hli], a - ld [hl], a - ret -; 3d0ab - -.SentToMomTexts: ; 3d0ab - dw SentSomeToMomText - dw SentHalfToMomText - dw SentAllToMomText -; 3d0b1 - -.CheckMaxedOutMomMoney: ; 3d0b1 - ld hl, wMomsMoney + 2 - ld a, [hld] - cp LOW(MAX_MONEY) - ld a, [hld] - sbc HIGH(MAX_MONEY) ; mid - ld a, [hl] - sbc HIGH(MAX_MONEY >> 8) - ret -; 3d0be - -AddBattleMoneyToAccount: ; 3d0be - ld c, $3 - and a - push de - push hl - push bc - ld b, h - ld c, l - farcall TrainerRankings_AddToBattlePayouts - pop bc - pop hl -.loop - ld a, [de] - adc [hl] - ld [de], a - dec de - dec hl - dec c - jr nz, .loop - pop hl - ld a, [hld] - cp LOW(MAX_MONEY) - ld a, [hld] - sbc HIGH(MAX_MONEY) ; mid - ld a, [hl] - sbc HIGH(MAX_MONEY >> 8) - ret c - ld [hl], HIGH(MAX_MONEY >> 8) - inc hl - ld [hl], HIGH(MAX_MONEY) ; mid - inc hl - ld [hl], LOW(MAX_MONEY) - ret -; 3d0ea - -PlayVictoryMusic: ; 3d0ea - push de - ld de, MUSIC_NONE - call PlayMusic - call DelayFrame - ld de, MUSIC_WILD_VICTORY - ld a, [wBattleMode] - dec a - jr nz, .trainer_victory - push de - call IsAnyMonHoldingExpShare - pop de - jr nz, .play_music - ld hl, wPayDayMoney - ld a, [hli] - or [hl] - jr nz, .play_music - ld a, [wBattleParticipantsNotFainted] - and a - jr z, .lost - jr .play_music - -.trainer_victory - ld de, MUSIC_GYM_VICTORY - call IsJohtoGymLeader - jr c, .play_music - ld de, MUSIC_TRAINER_VICTORY - -.play_music - call PlayMusic - -.lost - pop de - ret -; 3d123 - -; These functions check if the current opponent is a gym leader or one of a -; few other special trainers. - -; Note: KantoGymLeaders is a subset of JohtoGymLeaders. If you wish to -; differentiate between the two, call IsKantoGymLeader first. - -; The Lance and Red entries are unused for music checks; those trainers are -; accounted for elsewhere. - -IsKantoGymLeader: ; 0x3d123 - ld hl, KantoGymLeaders - jr IsGymLeaderCommon - -IsJohtoGymLeader: ; 0x3d128 - ld hl, JohtoGymLeaders -IsGymLeaderCommon: - push de - ld a, [OtherTrainerClass] - ld de, $0001 - call IsInArray - pop de - ret -; 0x3d137 - -JohtoGymLeaders: - db FALKNER - db WHITNEY - db BUGSY - db MORTY - db PRYCE - db JASMINE - db CHUCK - db CLAIR - db WILL - db BRUNO - db KAREN - db KOGA -; fallthrough -; these two entries are unused - db CHAMPION - db RED -; fallthrough -KantoGymLeaders: - db BROCK - db MISTY - db LT_SURGE - db ERIKA - db JANINE - db SABRINA - db BLAINE - db BLUE - db -1 - -HandlePlayerMonFaint: ; 3d14e - call FaintYourPokemon - ld hl, EnemyMonHP - ld a, [hli] - or [hl] - call z, FaintEnemyPokemon - ld a, $1 - ld [wWhichMonFaintedFirst], a - call PlayerMonFaintHappinessMod - call CheckPlayerPartyForFitPkmn - ld a, d - and a - jp z, LostBattle - ld hl, EnemyMonHP - ld a, [hli] - or [hl] - jr nz, .notfainted - call UpdateBattleStateAndExperienceAfterEnemyFaint - ld a, [wBattleMode] - dec a - jr nz, .trainer - ld a, $1 - ld [BattleEnded], a - ret - -.trainer - call CheckEnemyTrainerDefeated - jp z, WinTrainerBattle - -.notfainted - call AskUseNextPokemon - jr nc, .switch - ld a, $1 - ld [BattleEnded], a - ret - -.switch - call ForcePlayerMonChoice - call CheckMobileBattleError - jp c, WildFled_EnemyFled_LinkBattleCanceled - ld a, c - and a - ret nz - ld a, $1 - ld [wPlayerAction], a - call HandleEnemySwitch - jp z, WildFled_EnemyFled_LinkBattleCanceled - jp DoubleSwitch -; 3d1aa - -PlayerMonFaintHappinessMod: ; 3d1aa - ld a, [CurBattleMon] - ld c, a - ld hl, wBattleParticipantsNotFainted - ld b, RESET_FLAG - predef FlagPredef - ld hl, EnemySubStatus3 - res SUBSTATUS_IN_LOOP, [hl] - xor a - ld [Danger], a - ld hl, PlayerDamageTaken - ld [hli], a - ld [hl], a - ld [BattleMonStatus], a - call UpdateBattleMonInParty - ld c, HAPPINESS_FAINTED - ; If TheirLevel > (YourLevel + 30), use a different parameter - ld a, [BattleMonLevel] - add 30 - ld b, a - ld a, [EnemyMonLevel] - cp b - jr c, .got_param - ld c, HAPPINESS_BEATENBYSTRONGFOE - -.got_param - ld a, [CurBattleMon] - ld [CurPartyMon], a - callfar ChangeHappiness - ld a, [wBattleResult] - and %11000000 - add $1 - ld [wBattleResult], a - ld a, [wWhichMonFaintedFirst] - and a - ret z - ret ; ?????????? -; 3d1f8 - -AskUseNextPokemon: ; 3d1f8 - call EmptyBattleTextBox - call LoadTileMapToTempTileMap -; We don't need to be here if we're in a Trainer battle, -; as that decision is made for us. - ld a, [wBattleMode] - and a - dec a - ret nz - - ld hl, BattleText_UseNextMon - call StdBattleTextBox -.loop - lb bc, 1, 7 - call PlaceYesNoBox - ld a, [wMenuCursorY] - jr c, .pressed_b - and a - ret - -.pressed_b - ld a, [wMenuCursorY] - cp $1 ; YES - jr z, .loop - ld hl, PartyMon1Speed - ld de, EnemyMonSpeed - jp TryToRunAwayFromBattle -; 3d227 - -ForcePlayerMonChoice: ; 3d227 - call EmptyBattleTextBox - call LoadStandardMenuDataHeader - call SetUpBattlePartyMenu_NoLoop - call ForcePickPartyMonInBattle - ld a, [wLinkMode] - and a - jr z, .skip_link - ld a, $1 - ld [wPlayerAction], a - call LinkBattleSendReceiveAction - -.skip_link - xor a - ld [wPlayerAction], a - call CheckMobileBattleError - jr c, .enemy_fainted_mobile_error - ld hl, EnemyMonHP - ld a, [hli] - or [hl] - jr nz, .send_out_pokemon - -.enemy_fainted_mobile_error - call ClearSprites - call ClearBGPalettes - call _LoadHPBar - call ExitMenu - call LoadTileMapToTempTileMap - call WaitBGMap - call GetMemSGBLayout - call SetPalettes - xor a - ld c, a - ret - -.send_out_pokemon - call ClearSprites - ld a, [CurBattleMon] - ld [LastPlayerMon], a - ld a, [CurPartyMon] - ld [CurBattleMon], a - call AddBattleParticipant - call InitBattleMon - call ResetPlayerStatLevels - call ClearPalettes - call DelayFrame - call _LoadHPBar - call CloseWindow - call GetMemSGBLayout - call SetPalettes - call SendOutPkmnText - call NewBattleMonStatus - call BreakAttraction - call SendOutPlayerMon - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - call SetPlayerTurn - call SpikesDamage - ld a, $1 - and a - ld c, a - ret -; 3d2b3 - -PlayerPartyMonEntrance: ; 3d2b3 - ld a, [CurBattleMon] - ld [LastPlayerMon], a - ld a, [CurPartyMon] - ld [CurBattleMon], a - call AddBattleParticipant - call InitBattleMon - call ResetPlayerStatLevels - call SendOutPkmnText - call NewBattleMonStatus - call BreakAttraction - call SendOutPlayerMon - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - call SetPlayerTurn - jp SpikesDamage -; 3d2e0 - -CheckMobileBattleError: ; 3d2e0 - ld a, [wLinkMode] - cp LINK_MOBILE - jr nz, .not_mobile ; It's not a mobile battle - - ld a, [wcd2b] - and a - jr z, .not_mobile - -; We have a mobile battle and something else happened - scf - ret - -.not_mobile - xor a - ret -; 3d2f1 - -IsMobileBattle: ; 3d2f1 - ld a, [wLinkMode] - cp LINK_MOBILE - ret -; 3d2f7 - -SetUpBattlePartyMenu_NoLoop: ; 3d2f7 - call ClearBGPalettes -SetUpBattlePartyMenu: ; switch to fullscreen menu? - farcall LoadPartyMenuGFX - farcall InitPartyMenuWithCancel - farcall InitPartyMenuBGPal7 - farcall InitPartyMenuGFX - ret -; 3d313 - -JumpToPartyMenuAndPrintText: ; 3d313 - farcall WritePartyMenuTilemap - farcall PrintPartyMenuText - call WaitBGMap - call SetPalettes - call DelayFrame - ret -; 3d329 - -SelectBattleMon: ; 3d329 - call IsMobileBattle - jr z, .mobile - farcall PartyMenuSelect - ret - -.mobile - farcall Mobile_PartyMenuSelect - ret -; 3d33c - -PickPartyMonInBattle: ; 3d33c -.loop - ld a, PARTYMENUACTION_SWITCH ; Which PKMN? - ld [PartyMenuActionText], a - call JumpToPartyMenuAndPrintText - call SelectBattleMon - ret c - call CheckIfCurPartyMonIsFitToFight - jr z, .loop - xor a - ret -; 3d34f - -SwitchMonAlreadyOut: ; 3d34f - ld hl, CurBattleMon - ld a, [CurPartyMon] - cp [hl] - jr nz, .notout - - ld hl, BattleText_PkmnIsAlreadyOut - call StdBattleTextBox - scf - ret - -.notout - xor a - ret -; 3d362 - -ForcePickPartyMonInBattle: ; 3d362 -; Can't back out. - -.pick - call PickPartyMonInBattle - ret nc - call CheckMobileBattleError - ret c - - ld de, SFX_WRONG - call PlaySFX - call WaitSFX - jr .pick -; 3d375 - -PickSwitchMonInBattle: ; 3d375 -.pick - call PickPartyMonInBattle - ret c - call SwitchMonAlreadyOut - jr c, .pick - xor a - ret -; 3d380 - -ForcePickSwitchMonInBattle: ; 3d380 -; Can't back out. - -.pick - call ForcePickPartyMonInBattle - call CheckMobileBattleError - ret c - call SwitchMonAlreadyOut - jr c, .pick - - xor a - ret -; 3d38e - -LostBattle: ; 3d38e - ld a, 1 - ld [BattleEnded], a - - ld a, [InBattleTowerBattle] - bit 0, a - jr nz, .battle_tower - - ld a, [BattleType] - cp BATTLETYPE_CANLOSE - jr nz, .not_canlose - -; Remove the enemy from the screen. - hlcoord 0, 0 - lb bc, 8, 21 - call ClearBox - call BattleWinSlideInEnemyTrainerFrontpic - - ld c, 40 - call DelayFrames - - ld a, [wMonStatusFlags] - bit 0, a - jr nz, .skip_win_loss_text - call PrintWinLossText -.skip_win_loss_text - ret - -.battle_tower -; Remove the enemy from the screen. - hlcoord 0, 0 - lb bc, 8, 21 - call ClearBox - call BattleWinSlideInEnemyTrainerFrontpic - - ld c, 40 - call DelayFrames - - call EmptyBattleTextBox - ld c, 2 - farcall BattleTowerText - call WaitPressAorB_BlinkCursor - call ClearTileMap - call ClearBGPalettes - ret - -.not_canlose - ld a, [wLinkMode] - and a - jr nz, .LostLinkBattle - -; Greyscale - ld b, SCGB_BATTLE_GRAYSCALE - call GetSGBLayout - call SetPalettes - jr .end - -.LostLinkBattle: - call UpdateEnemyMonInParty - call CheckEnemyTrainerDefeated - jr nz, .not_tied - ld hl, TiedAgainstText - ld a, [wBattleResult] - and $c0 - add 2 - ld [wBattleResult], a - jr .text - -.not_tied - ld hl, LostAgainstText - call IsMobileBattle - jr z, .mobile - -.text - call StdBattleTextBox - -.end - scf - ret - -.mobile -; Remove the enemy from the screen. - hlcoord 0, 0 - lb bc, 8, 21 - call ClearBox - call BattleWinSlideInEnemyTrainerFrontpic - - ld c, 40 - call DelayFrames - - ld c, $3 ; lost - farcall Mobile_PrintOpponentBattleMessage - scf - ret -; 3d432 - -EnemyMonFaintedAnimation: ; 3d432 - hlcoord 12, 5 - decoord 12, 6 - jp MonFaintedAnimation -; 3d43b - -PlayerMonFaintedAnimation: ; 3d43b - hlcoord 1, 10 - decoord 1, 11 - jp MonFaintedAnimation -; 3d444 - -MonFaintedAnimation: ; 3d444 - ld a, [wcfbe] - push af - set 6, a - ld [wcfbe], a - ld b, 7 - -.OuterLoop: - push bc - push de - push hl - ld b, 6 - -.InnerLoop: - push bc - push hl - push de - ld bc, 7 - call CopyBytes - pop de - pop hl - ld bc, -SCREEN_WIDTH - add hl, bc - push hl - ld h, d - ld l, e - add hl, bc - ld d, h - ld e, l - pop hl - pop bc - dec b - jr nz, .InnerLoop - - ld bc, 20 - add hl, bc - ld de, .Spaces - call PlaceString - ld c, 2 - call DelayFrames - pop hl - pop de - pop bc - dec b - jr nz, .OuterLoop - - pop af - ld [wcfbe], a - ret -; 3d488 - -.Spaces: - db " @" -; 3d490 - -SlideBattlePicOut: ; 3d490 - ld [hMapObjectIndexBuffer], a - ld c, a -.loop - push bc - push hl - ld b, $7 -.loop2 - push hl - call .DoFrame - pop hl - ld de, SCREEN_WIDTH - add hl, de - dec b - jr nz, .loop2 - ld c, 2 - call DelayFrames - pop hl - pop bc - dec c - jr nz, .loop - ret -; 3d4ae - -.DoFrame: ; 3d4ae - ld a, [hMapObjectIndexBuffer] - ld c, a - cp $8 - jr nz, .back -.forward - ld a, [hli] - ld [hld], a - dec hl - dec c - jr nz, .forward - ret - -.back - ld a, [hld] - ld [hli], a - inc hl - dec c - jr nz, .back - ret -; 3d4c3 - -ForceEnemySwitch: ; 3d4c3 - call ResetEnemyBattleVars - ld a, [wEnemySwitchMonIndex] - dec a - ld b, a - call LoadEnemyPkmnToSwitchTo - call ClearEnemyMonBox - call NewEnemyMonStatus - call ResetEnemyStatLevels - call Function_SetEnemyPkmnAndSendOutAnimation - call BreakAttraction - call ResetBattleParticipants - ret -; 3d4e1 - -EnemySwitch: ; 3d4e1 - call CheckWhetherToAskSwitch - jr nc, EnemySwitch_SetMode - ; Shift Mode - call ResetEnemyBattleVars - call CheckWhetherSwitchmonIsPredetermined - jr c, .skip - call FindPkmnInOTPartyToSwitchIntoBattle -.skip - ; 'b' contains the PartyNr of the Pkmn the AI will switch to - call LoadEnemyPkmnToSwitchTo - call OfferSwitch - push af - call ClearEnemyMonBox - call Function_BattleTextEnemySentOut - call Function_SetEnemyPkmnAndSendOutAnimation - pop af - ret c - ; If we're here, then we're switching too - xor a - ld [wBattleParticipantsNotFainted], a - ld [wBattleParticipantsIncludingFainted], a - ld [wPlayerAction], a - inc a - ld [wEnemyIsSwitching], a - call LoadTileMapToTempTileMap - jp PlayerSwitch -; 3d517 - -EnemySwitch_SetMode: ; 3d517 - call ResetEnemyBattleVars - call CheckWhetherSwitchmonIsPredetermined - jr c, .skip - call FindPkmnInOTPartyToSwitchIntoBattle -.skip - ; 'b' contains the PartyNr of the Pkmn the AI will switch to - call LoadEnemyPkmnToSwitchTo - ld a, 1 - ld [wEnemyIsSwitching], a - call ClearEnemyMonBox - call Function_BattleTextEnemySentOut - jp Function_SetEnemyPkmnAndSendOutAnimation -; 3d533 - -CheckWhetherSwitchmonIsPredetermined: ; 3d533 -; returns carry if: ??? - ld a, [wLinkMode] - and a - jr z, .not_linked - - ld a, [wBattleAction] - sub BATTLEACTION_SWITCH1 - ld b, a - jr .return_carry - -.not_linked - ld a, [wEnemySwitchMonIndex] - and a - jr z, .check_wBattleHasJustStarted - - dec a - ld b, a - jr .return_carry - -.check_wBattleHasJustStarted - ld a, [wBattleHasJustStarted] - and a - ld b, $0 - jr nz, .return_carry - - and a - ret - -.return_carry - scf - ret -; 3d557 - -ResetEnemyBattleVars: ; 3d557 -; and draw empty TextBox - xor a - ld [LastPlayerCounterMove], a - ld [LastEnemyCounterMove], a - ld [LastEnemyMove], a - ld [CurEnemyMove], a - dec a - ld [wEnemyItemState], a - xor a - ld [wPlayerWrapCount], a - hlcoord 18, 0 - ld a, 8 - call SlideBattlePicOut - call EmptyBattleTextBox - jp LoadStandardMenuDataHeader -; 3d57a - -ResetBattleParticipants: ; 3d57a - xor a - ld [wBattleParticipantsNotFainted], a - ld [wBattleParticipantsIncludingFainted], a -AddBattleParticipant: ; 3d581 - ld a, [CurBattleMon] - ld c, a - ld hl, wBattleParticipantsNotFainted - ld b, SET_FLAG - push bc - predef FlagPredef - pop bc - ld hl, wBattleParticipantsIncludingFainted - predef_jump FlagPredef -; 3d599 - -FindPkmnInOTPartyToSwitchIntoBattle: ; 3d599 - ld b, $ff - ld a, $1 - ld [Buffer1], a - ld [Buffer2], a -.loop - ld hl, Buffer1 - sla [hl] - inc hl - sla [hl] - inc b - ld a, [OTPartyCount] - cp b - jp z, ScoreMonTypeMatchups - ld a, [CurOTMon] - cp b - jr z, .discourage - ld hl, OTPartyMon1HP - push bc - ld a, b - call GetPartyLocation - ld a, [hli] - ld c, a - ld a, [hl] - or c - pop bc - jr z, .discourage - call LookUpTheEffectivenessOfEveryMove - call IsThePlayerPkmnTypesEffectiveAgainstOTPkmn - jr .loop - -.discourage - ld hl, Buffer2 - set 0, [hl] - jr .loop -; 3d5d7 - -LookUpTheEffectivenessOfEveryMove: ; 3d5d7 - push bc - ld hl, OTPartyMon1Moves - ld a, b - call GetPartyLocation - pop bc - ld e, NUM_MOVES + 1 -.loop - dec e - jr z, .done - ld a, [hli] - and a - jr z, .done - push hl - push de - push bc - dec a - ld hl, Moves - ld bc, MOVE_LENGTH - call AddNTimes - ld de, wEnemyMoveStruct - ld a, BANK(Moves) - call FarCopyBytes - call SetEnemyTurn - callfar BattleCheckTypeMatchup - pop bc - pop de - pop hl - ld a, [wd265] ; Get The Effectiveness Modifier - cp 10 + 1 ; 1.0 + 0.1 - jr c, .loop - ld hl, Buffer1 - set 0, [hl] - ret -.done - ret -; 3d618 - -IsThePlayerPkmnTypesEffectiveAgainstOTPkmn: ; 3d618 -; Calculates the effectiveness of the types of the PlayerPkmn -; against the OTPkmn - push bc - ld hl, OTPartyCount - ld a, b - inc a - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - dec a - ld hl, BaseData + BASE_TYPES - ld bc, BASE_DATA_SIZE - call AddNTimes - ld de, EnemyMonType - ld bc, BASE_CATCH_RATE - BASE_TYPES - ld a, BANK(BaseData) - call FarCopyBytes - ld a, [BattleMonType1] - ld [wPlayerMoveStruct + MOVE_TYPE], a - call SetPlayerTurn - callfar BattleCheckTypeMatchup - ld a, [wd265] - cp 10 + 1 ; 1.0 + 0.1 - jr nc, .super_effective - ld a, [BattleMonType2] - ld [wPlayerMoveStruct + MOVE_TYPE], a - callfar BattleCheckTypeMatchup - ld a, [wd265] - cp 10 + 1 ; 1.0 + 0.1 - jr nc, .super_effective - pop bc - ret - -.super_effective - pop bc - ld hl, Buffer1 - bit 0, [hl] - jr nz, .reset - inc hl - set 0, [hl] - ret - -.reset - res 0, [hl] - ret -; 3d672 - -ScoreMonTypeMatchups: ; 3d672 -.loop1 - ld hl, Buffer1 - sla [hl] - inc hl - sla [hl] - jr nc, .loop1 - ld a, [OTPartyCount] - ld b, a - ld c, [hl] -.loop2 - sla c - jr nc, .okay - dec b - jr z, .loop5 - jr .loop2 - -.okay - ld a, [Buffer1] - and a - jr z, .okay2 - ld b, $ff - ld c, a -.loop3 - inc b - sla c - jr nc, .loop3 - jr .quit - -.okay2 - ld b, $ff - ld a, [Buffer2] - ld c, a -.loop4 - inc b - sla c - jr c, .loop4 - jr .quit - -.loop5 - ld a, [OTPartyCount] - ld b, a - call BattleRandom - and $7 - cp b - jr nc, .loop5 - ld b, a - ld a, [CurOTMon] - cp b - jr z, .loop5 - ld hl, OTPartyMon1HP - push bc - ld a, b - call GetPartyLocation - pop bc - ld a, [hli] - ld c, a - ld a, [hl] - or c - jr z, .loop5 - -.quit - ret -; 3d6ca - -LoadEnemyPkmnToSwitchTo: ; 3d6ca - ; 'b' contains the PartyNr of the Pkmn the AI will switch to - ld a, b - ld [CurPartyMon], a - ld hl, OTPartyMon1Level - call GetPartyLocation - ld a, [hl] - ld [CurPartyLevel], a - ld a, [CurPartyMon] - inc a - ld hl, OTPartyCount - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [TempEnemyMonSpecies], a - ld [CurPartySpecies], a - call LoadEnemyMon - - ld a, [CurPartySpecies] - cp UNOWN - jr nz, .skip_unown - ld a, [wFirstUnownSeen] - and a - jr nz, .skip_unown - ld hl, EnemyMonDVs - predef GetUnownLetter - ld a, [UnownLetter] - ld [wFirstUnownSeen], a -.skip_unown - - ld hl, EnemyMonHP - ld a, [hli] - ld [wEnemyHPAtTimeOfPlayerSwitch], a - ld a, [hl] - ld [wEnemyHPAtTimeOfPlayerSwitch + 1], a - ret -; 3d714 - -CheckWhetherToAskSwitch: ; 3d714 - ld a, [wBattleHasJustStarted] - dec a - jp z, .return_nc - ld a, [PartyCount] - dec a - jp z, .return_nc - ld a, [wLinkMode] - and a - jp nz, .return_nc - ld a, [Options] - bit BATTLE_SHIFT, a - jr nz, .return_nc - ld a, [CurPartyMon] - push af - ld a, [CurBattleMon] - ld [CurPartyMon], a - farcall CheckCurPartyMonFainted - pop bc - ld a, b - ld [CurPartyMon], a - jr c, .return_nc - scf - ret - -.return_nc - and a - ret -; 3d74b - -OfferSwitch: ; 3d74b - ld a, [CurPartyMon] - push af - callfar Battle_GetTrainerName - ld hl, BattleText_EnemyIsAboutToUseWillPlayerChangePkmn - call StdBattleTextBox - lb bc, 1, 7 - call PlaceYesNoBox - ld a, [wMenuCursorY] - dec a - jr nz, .said_no - call SetUpBattlePartyMenu_NoLoop - call PickSwitchMonInBattle - jr c, .canceled_switch - ld a, [CurBattleMon] - ld [LastPlayerMon], a - ld a, [CurPartyMon] - ld [CurBattleMon], a - call ClearPalettes - call DelayFrame - call _LoadHPBar - pop af - ld [CurPartyMon], a - xor a - ld [CurEnemyMove], a - ld [CurPlayerMove], a - and a - ret - -.canceled_switch - call ClearPalettes - call DelayFrame - call _LoadHPBar - -.said_no - pop af - ld [CurPartyMon], a - scf - ret -; 3d7a0 - -ClearEnemyMonBox: ; 3d7a0 - xor a - ld [hBGMapMode], a - call ExitMenu - call ClearSprites - hlcoord 1, 0 - lb bc, 4, 10 - call ClearBox - call WaitBGMap - jp FinishBattleAnim -; 3d7b8 - -Function_BattleTextEnemySentOut: ; 3d7b8 - callfar Battle_GetTrainerName - ld hl, BattleText_EnemySentOut - call StdBattleTextBox - jp WaitBGMap -; 3d7c7 - -Function_SetEnemyPkmnAndSendOutAnimation: ; 3d7c7 - ld a, [TempEnemyMonSpecies] - ld [CurPartySpecies], a - ld [CurSpecies], a - call GetBaseData - ld a, OTPARTYMON - ld [MonType], a - predef CopyPkmnToTempMon - call GetEnemyMonFrontpic - - xor a - ld [wNumHits], a - ld [wBattleAnimParam], a - call SetEnemyTurn - ld de, ANIM_SEND_OUT_MON - call Call_PlayBattleAnim - - call BattleCheckEnemyShininess - jr nc, .not_shiny - ld a, 1 ; shiny anim - ld [wBattleAnimParam], a - ld de, ANIM_SEND_OUT_MON - call Call_PlayBattleAnim -.not_shiny - - ld bc, TempMonSpecies - farcall CheckFaintedFrzSlp - jr c, .skip_cry - farcall CheckBattleScene - jr c, .cry_no_anim - hlcoord 12, 0 - ld d, $0 - ld e, ANIM_MON_SLOW - predef AnimateFrontpic - jr .skip_cry - -.cry_no_anim - ld a, $f - ld [CryTracks], a - ld a, [TempEnemyMonSpecies] - call PlayStereoCry - -.skip_cry - call UpdateEnemyHUD - ld a, $1 - ld [hBGMapMode], a - ret -; 3d834 - -NewEnemyMonStatus: ; 3d834 - xor a - ld [LastPlayerCounterMove], a - ld [LastEnemyCounterMove], a - ld [LastEnemyMove], a - ld hl, EnemySubStatus1 -rept 4 - ld [hli], a -endr - ld [hl], a - ld [EnemyDisableCount], a - ld [EnemyFuryCutterCount], a - ld [EnemyProtectCount], a - ld [wEnemyRageCounter], a - ld [EnemyDisabledMove], a - ld [wEnemyMinimized], a - ld [wPlayerWrapCount], a - ld [wEnemyWrapCount], a - ld [EnemyTurnsTaken], a - ld hl, PlayerSubStatus5 - res SUBSTATUS_CANT_RUN, [hl] - ret -; 3d867 - -ResetEnemyStatLevels: ; 3d867 - ld a, BASE_STAT_LEVEL - ld b, NUM_LEVEL_STATS - ld hl, EnemyStatLevels -.loop - ld [hli], a - dec b - jr nz, .loop - ret -; 3d873 - -CheckPlayerPartyForFitPkmn: ; 3d873 -; Has the player any Pkmn in his Party that can fight? - ld a, [PartyCount] - ld e, a - xor a - ld hl, PartyMon1HP - ld bc, PartyMon2 - (PartyMon1 + 1) -.loop - or [hl] - inc hl - or [hl] - add hl, bc - dec e - jr nz, .loop - ld d, a - ret -; 3d887 - -CheckIfCurPartyMonIsFitToFight: ; 3d887 - ld a, [CurPartyMon] - ld hl, PartyMon1HP - call GetPartyLocation - ld a, [hli] - or [hl] - ret nz - - ld a, [wBattleHasJustStarted] - and a - jr nz, .finish_fail - ld hl, PartySpecies - ld a, [CurPartyMon] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - cp EGG - ld hl, BattleText_AnEGGCantBattle - jr z, .print_textbox - - ld hl, BattleText_TheresNoWillToBattle - -.print_textbox - call StdBattleTextBox - -.finish_fail - xor a - ret -; 3d8b3 - -TryToRunAwayFromBattle: ; 3d8b3 -; Run away from battle, with or without item - ld a, [BattleType] - cp BATTLETYPE_DEBUG - jp z, .can_escape - cp BATTLETYPE_CONTEST - jp z, .can_escape - cp BATTLETYPE_TRAP - jp z, .cant_escape - cp BATTLETYPE_CELEBI - jp z, .cant_escape - cp BATTLETYPE_SHINY - jp z, .cant_escape - cp BATTLETYPE_SUICUNE - jp z, .cant_escape - - ld a, [wLinkMode] - and a - jp nz, .can_escape - - ld a, [wBattleMode] - dec a - jp nz, .cant_run_from_trainer - - ld a, [EnemySubStatus5] - bit SUBSTATUS_CANT_RUN, a - jp nz, .cant_escape - - ld a, [wPlayerWrapCount] - and a - jp nz, .cant_escape - - push hl - push de - ld a, [BattleMonItem] - ld [wd265], a - ld b, a - callfar GetItemHeldEffect - ld a, b - cp HELD_ESCAPE - pop de - pop hl - jr nz, .no_flee_item - - call SetPlayerTurn - call GetItemName - ld hl, BattleText_UserFledUsingAStringBuffer1 - call StdBattleTextBox - jp .can_escape - -.no_flee_item - ld a, [wNumFleeAttempts] - inc a - ld [wNumFleeAttempts], a - ld a, [hli] - ld [hStringCmpString2 + 0], a - ld a, [hl] - ld [hStringCmpString2 + 1], a - ld a, [de] - inc de - ld [hStringCmpString1 + 0], a - ld a, [de] - ld [hStringCmpString1 + 1], a - call Call_LoadTempTileMapToTileMap - ld de, hStringCmpString2 - ld hl, hStringCmpString1 - ld c, $2 - call StringCmp - jr nc, .can_escape - - xor a - ld [hMultiplicand], a - ld a, $20 - ld [hMultiplier], a - call Multiply - ld a, [hProduct + 2] - ld [hDividend + 0], a - ld a, [hProduct + 3] - ld [hDividend + 1], a - ld a, [hStringCmpString1 + 0] - ld b, a - ld a, [hStringCmpString1 + 1] - srl b - rr a - srl b - rr a - and a - jr z, .can_escape - ld [hDivisor], a - ld b, 2 - call Divide - ld a, [hQuotient + 1] - and a - jr nz, .can_escape - ld a, [wNumFleeAttempts] - ld c, a -.loop - dec c - jr z, .cant_escape_2 - ld b, 30 - ld a, [hQuotient + 2] - add b - ld [hQuotient + 2], a - jr c, .can_escape - jr .loop - -.cant_escape_2 - call BattleRandom - ld b, a - ld a, [hQuotient + 2] - cp b - jr nc, .can_escape - ld a, $1 - ld [wPlayerAction], a - ld hl, BattleText_CantEscape2 - jr .print_inescapable_text - -.cant_escape - ld hl, BattleText_CantEscape - jr .print_inescapable_text - -.cant_run_from_trainer - ld hl, BattleText_TheresNoEscapeFromTrainerBattle - -.print_inescapable_text - call StdBattleTextBox - ld a, $1 - ld [wFailedToFlee], a - call LoadTileMapToTempTileMap - and a - ret - -.can_escape - ld a, [wLinkMode] - and a - ld a, DRAW - jr z, .fled - call LoadTileMapToTempTileMap - xor a - ld [wPlayerAction], a - ld a, $f - ld [CurMoveNum], a - xor a - ld [CurPlayerMove], a - call LinkBattleSendReceiveAction - call Call_LoadTempTileMapToTileMap - call CheckMobileBattleError - jr c, .mobile - - ; Got away safely - ld a, [wBattleAction] - cp BATTLEACTION_FORFEIT - ld a, DRAW - jr z, .fled - dec a -.fled - ld b, a - ld a, [wBattleResult] - and $c0 - add b - ld [wBattleResult], a - call StopDangerSound - push de - ld de, SFX_RUN - call WaitPlaySFX - pop de - call WaitSFX - ld hl, BattleText_GotAwaySafely - call StdBattleTextBox - call WaitSFX - call LoadTileMapToTempTileMap - scf - ret - -.mobile - call StopDangerSound - ld hl, wcd2a - bit 4, [hl] - jr nz, .skip_link_error - ld hl, BattleText_LinkErrorBattleCanceled - call StdBattleTextBox - -.skip_link_error - call WaitSFX - call LoadTileMapToTempTileMap - scf - ret -; 3da0d - -InitBattleMon: ; 3da0d - ld a, MON_SPECIES - call GetPartyParamLocation - ld de, BattleMonSpecies - ld bc, MON_ID - call CopyBytes - ld bc, MON_DVS - MON_ID - add hl, bc - ld de, BattleMonDVs - ld bc, MON_PKRUS - MON_DVS - call CopyBytes - inc hl - inc hl - inc hl - ld de, BattleMonLevel - ld bc, PARTYMON_STRUCT_LENGTH - MON_LEVEL - call CopyBytes - ld a, [BattleMonSpecies] - ld [TempBattleMonSpecies], a - ld [CurPartySpecies], a - ld [CurSpecies], a - call GetBaseData - ld a, [BaseType1] - ld [BattleMonType1], a - ld a, [BaseType2] - ld [BattleMonType2], a - ld hl, PartyMonNicknames - ld a, [CurBattleMon] - call SkipNames - ld de, BattleMonNick - ld bc, PKMN_NAME_LENGTH - call CopyBytes - ld hl, BattleMonAttack - ld de, PlayerStats - ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK - call CopyBytes - call ApplyStatusEffectOnPlayerStats - call BadgeStatBoosts - ret -; 3da74 - -BattleCheckPlayerShininess: ; 3da74 - call GetPartyMonDVs - jr BattleCheckShininess - -BattleCheckEnemyShininess: ; 3da79 - call GetEnemyMonDVs - -BattleCheckShininess: ; 3da7c - ld b, h - ld c, l - callfar CheckShininess - ret -; 3da85 - -GetPartyMonDVs: ; 3da85 - ld hl, BattleMonDVs - ld a, [PlayerSubStatus5] - bit SUBSTATUS_TRANSFORMED, a - ret z - ld hl, PartyMon1DVs - ld a, [CurBattleMon] - jp GetPartyLocation -; 3da97 - -GetEnemyMonDVs: ; 3da97 - ld hl, EnemyMonDVs - ld a, [EnemySubStatus5] - bit SUBSTATUS_TRANSFORMED, a - ret z - ld hl, wEnemyBackupDVs - ld a, [wBattleMode] - dec a - ret z - ld hl, OTPartyMon1DVs - ld a, [CurOTMon] - jp GetPartyLocation -; 3dab1 - -ResetPlayerStatLevels: ; 3dab1 - ld a, BASE_STAT_LEVEL - ld b, NUM_LEVEL_STATS - ld hl, PlayerStatLevels -.loop - ld [hli], a - dec b - jr nz, .loop - ret -; 3dabd - -InitEnemyMon: ; 3dabd - ld a, [CurPartyMon] - ld hl, OTPartyMon1Species - call GetPartyLocation - ld de, EnemyMonSpecies - ld bc, MON_ID - call CopyBytes - ld bc, MON_DVS - MON_ID - add hl, bc - ld de, EnemyMonDVs - ld bc, MON_PKRUS - MON_DVS - call CopyBytes - inc hl - inc hl - inc hl - ld de, EnemyMonLevel - ld bc, PARTYMON_STRUCT_LENGTH - MON_LEVEL - call CopyBytes - ld a, [EnemyMonSpecies] - ld [CurSpecies], a - call GetBaseData - ld hl, OTPartyMonNicknames - ld a, [CurPartyMon] - call SkipNames - ld de, EnemyMonNick - ld bc, PKMN_NAME_LENGTH - call CopyBytes - ld hl, EnemyMonAttack - ld de, EnemyStats - ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK - call CopyBytes - call ApplyStatusEffectOnEnemyStats - ld hl, BaseType1 - ld de, EnemyMonType1 - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ld hl, BaseStats - ld de, EnemyMonBaseStats - ld b, 5 -.loop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .loop - ld a, [CurPartyMon] - ld [CurOTMon], a - ret -; 3db32 - -SwitchPlayerMon: ; 3db32 - call ClearSprites - ld a, [CurBattleMon] - ld [LastPlayerMon], a - ld a, [CurPartyMon] - ld [CurBattleMon], a - call AddBattleParticipant - call InitBattleMon - call ResetPlayerStatLevels - call NewBattleMonStatus - call BreakAttraction - call SendOutPlayerMon - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - ld hl, EnemyMonHP - ld a, [hli] - or [hl] - ret -; 3db5f - -SendOutPlayerMon: ; 3db5f - ld hl, BattleMonDVs - predef GetUnownLetter - hlcoord 1, 5 - ld b, 7 - ld c, 8 - call ClearBox - call WaitBGMap - xor a - ld [hBGMapMode], a - call GetBattleMonBackpic - xor a - ld [hGraphicStartTile], a - ld [wBattleMenuCursorBuffer], a - ld [CurMoveNum], a - ld [TypeModifier], a - ld [wPlayerMoveStruct + MOVE_ANIM], a - ld [LastPlayerCounterMove], a - ld [LastEnemyCounterMove], a - ld [LastPlayerMove], a - call CheckAmuletCoin - call FinishBattleAnim - xor a - ld [wEnemyWrapCount], a - call SetPlayerTurn - xor a - ld [wNumHits], a - ld [wBattleAnimParam], a - ld de, ANIM_SEND_OUT_MON - call Call_PlayBattleAnim - call BattleCheckPlayerShininess - jr nc, .not_shiny - ld a, 1 - ld [wBattleAnimParam], a - ld de, ANIM_SEND_OUT_MON - call Call_PlayBattleAnim - -.not_shiny - ld a, MON_SPECIES - call GetPartyParamLocation - ld b, h - ld c, l - farcall CheckFaintedFrzSlp - jr c, .statused - ld a, $f0 - ld [CryTracks], a - ld a, [CurPartySpecies] - call PlayStereoCry - -.statused - call UpdatePlayerHUD - ld a, $1 - ld [hBGMapMode], a - ret -; 3dbde - -NewBattleMonStatus: ; 3dbde - xor a - ld [LastPlayerCounterMove], a - ld [LastEnemyCounterMove], a - ld [LastPlayerMove], a - ld hl, PlayerSubStatus1 -rept 4 - ld [hli], a -endr - ld [hl], a - ld hl, PlayerUsedMoves - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a - ld [PlayerDisableCount], a - ld [PlayerFuryCutterCount], a - ld [PlayerProtectCount], a - ld [wPlayerRageCounter], a - ld [DisabledMove], a - ld [wPlayerMinimized], a - ld [wEnemyWrapCount], a - ld [wPlayerWrapCount], a - ld [PlayerTurnsTaken], a - ld hl, EnemySubStatus5 - res SUBSTATUS_CANT_RUN, [hl] - ret -; 3dc18 - -BreakAttraction: ; 3dc18 - ld hl, PlayerSubStatus1 - res SUBSTATUS_IN_LOVE, [hl] - ld hl, EnemySubStatus1 - res SUBSTATUS_IN_LOVE, [hl] - ret -; 3dc23 - -SpikesDamage: ; 3dc23 - ld hl, PlayerScreens - ld de, BattleMonType - ld bc, UpdatePlayerHUD - ld a, [hBattleTurn] - and a - jr z, .ok - ld hl, EnemyScreens - ld de, EnemyMonType - ld bc, UpdateEnemyHUD -.ok - - bit SCREENS_SPIKES, [hl] - ret z - - ; Flying-types aren't affected by Spikes. - ld a, [de] - cp FLYING - ret z - inc de - ld a, [de] - cp FLYING - ret z - - push bc - - ld hl, BattleText_UserHurtBySpikes ; "hurt by SPIKES!" - call StdBattleTextBox - - call GetEighthMaxHP - call SubtractHPFromTarget - - pop hl - call .hl - - jp WaitBGMap - -.hl - jp hl -; 3dc5b - -PursuitSwitch: ; 3dc5b - ld a, BATTLE_VARS_MOVE - call GetBattleVar - ld b, a - call GetMoveEffect - ld a, b - cp EFFECT_PURSUIT - jr nz, .done - - ld a, [CurBattleMon] - push af - - ld hl, DoPlayerTurn - ld a, [hBattleTurn] - and a - jr z, .do_turn - ld hl, DoEnemyTurn - ld a, [LastPlayerMon] - ld [CurBattleMon], a -.do_turn - ld a, BANK(DoPlayerTurn) - rst FarCall - - ld a, BATTLE_VARS_MOVE - call GetBattleVarAddr - ld a, $ff - ld [hl], a - - pop af - ld [CurBattleMon], a - - ld a, [hBattleTurn] - and a - jr z, .check_enemy_fainted - - ld a, [LastPlayerMon] - call UpdateBattleMon - ld hl, BattleMonHP - ld a, [hli] - or [hl] - jr nz, .done - - ld a, $f0 - ld [CryTracks], a - ld a, [BattleMonSpecies] - call PlayStereoCry - ld a, [LastPlayerMon] - ld c, a - ld hl, wBattleParticipantsNotFainted - ld b, RESET_FLAG - predef FlagPredef - call PlayerMonFaintedAnimation - ld hl, BattleText_PkmnFainted - jr .done_fainted - -.check_enemy_fainted - ld hl, EnemyMonHP - ld a, [hli] - or [hl] - jr nz, .done - - ld de, SFX_KINESIS - call PlaySFX - call WaitSFX - ld de, SFX_FAINT - call PlaySFX - call WaitSFX - call EnemyMonFaintedAnimation - ld hl, BattleText_EnemyPkmnFainted - -.done_fainted - call StdBattleTextBox - scf - ret - -.done - and a - ret -; 3dce6 - -RecallPlayerMon: ; 3dce6 - ld a, [hBattleTurn] - push af - xor a - ld [hBattleTurn], a - ld [wNumHits], a - ld de, ANIM_RETURN_MON - call Call_PlayBattleAnim - pop af - ld [hBattleTurn], a - ret -; 3dcf9 - -HandleHealingItems: ; 3dcf9 - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .player_1 - call SetPlayerTurn - call HandleHPHealingItem - call UseHeldStatusHealingItem - call UseConfusionHealingItem - call SetEnemyTurn - call HandleHPHealingItem - call UseHeldStatusHealingItem - jp UseConfusionHealingItem - -.player_1 - call SetEnemyTurn - call HandleHPHealingItem - call UseHeldStatusHealingItem - call UseConfusionHealingItem - call SetPlayerTurn - call HandleHPHealingItem - call UseHeldStatusHealingItem - jp UseConfusionHealingItem -; 3dd2f - -HandleHPHealingItem: ; 3dd2f - callfar GetOpponentItem - ld a, b - cp HELD_BERRY - ret nz - ld de, EnemyMonHP + 1 - ld hl, EnemyMonMaxHP - ld a, [hBattleTurn] - and a - jr z, .go - ld de, BattleMonHP + 1 - ld hl, BattleMonMaxHP - -.go -; If, and only if, Pokemon's HP is less than half max, use the item. -; Store current HP in Buffer 3/4 - push bc - ld a, [de] - ld [Buffer3], a - add a - ld c, a - dec de - ld a, [de] - inc de - ld [Buffer4], a - adc a - ld b, a - ld a, b - cp [hl] - ld a, c - pop bc - jr z, .equal - jr c, .less - ret - -.equal - inc hl - cp [hl] - dec hl - ret nc - -.less - call ItemRecoveryAnim - ; store max HP in Buffer1/2 - ld a, [hli] - ld [Buffer2], a - ld a, [hl] - ld [Buffer1], a - ld a, [de] - add c - ld [Buffer5], a - ld c, a - dec de - ld a, [de] - adc $0 - ld [Buffer6], a - ld b, a - ld a, [hld] - cp c - ld a, [hl] - sbc b - jr nc, .okay - ld a, [hli] - ld [Buffer6], a - ld a, [hl] - ld [Buffer5], a - -.okay - ld a, [Buffer6] - ld [de], a - inc de - ld a, [Buffer5] - ld [de], a - ld a, [hBattleTurn] - ld [wWhichHPBar], a - and a - hlcoord 2, 2 - jr z, .got_hp_bar_coords - hlcoord 10, 9 - -.got_hp_bar_coords - ld [wWhichHPBar], a - predef AnimateHPBar -UseOpponentItem: - call RefreshBattleHuds - callfar GetOpponentItem - ld a, [hl] - ld [wNamedObjectIndexBuffer], a - call GetItemName - callfar ConsumeHeldItem - ld hl, RecoveredUsingText - jp StdBattleTextBox -; 3ddc8 - -ItemRecoveryAnim: ; 3ddc8 - push hl - push de - push bc - call EmptyBattleTextBox - ld a, RECOVER - ld [FXAnimID], a - call SwitchTurnCore - xor a - ld [wNumHits], a - ld [FXAnimID + 1], a - predef PlayBattleAnim - call SwitchTurnCore - pop bc - pop de - pop hl - ret -; 3dde9 - -UseHeldStatusHealingItem: ; 3dde9 - callfar GetOpponentItem - ld hl, .Statuses -.loop - ld a, [hli] - cp $ff - ret z - inc hl - cp b - jr nz, .loop - dec hl - ld b, [hl] - ld a, BATTLE_VARS_STATUS_OPP - call GetBattleVarAddr - and b - ret z - xor a - ld [hl], a - push bc - call UpdateOpponentInParty - pop bc - ld a, BATTLE_VARS_SUBSTATUS5_OPP - call GetBattleVarAddr - and [hl] - res SUBSTATUS_TOXIC, [hl] - ld a, BATTLE_VARS_SUBSTATUS1_OPP - call GetBattleVarAddr - and [hl] - res SUBSTATUS_NIGHTMARE, [hl] - ld a, b - cp ALL_STATUS - jr nz, .skip_confuse - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVarAddr - res SUBSTATUS_CONFUSED, [hl] - -.skip_confuse - ld hl, CalcEnemyStats - ld a, [hBattleTurn] - and a - jr z, .got_pointer - ld hl, CalcPlayerStats - -.got_pointer - call SwitchTurnCore - ld a, BANK(CalcEnemyStats) - rst FarCall - call SwitchTurnCore - call ItemRecoveryAnim - call UseOpponentItem - ld a, $1 - and a - ret -; 3de44 - -.Statuses: ; 3de44 - db HELD_HEAL_POISON, 1 << PSN - db HELD_HEAL_FREEZE, 1 << FRZ - db HELD_HEAL_BURN, 1 << BRN - db HELD_HEAL_SLEEP, SLP - db HELD_HEAL_PARALYZE, 1 << PAR - db HELD_HEAL_STATUS, ALL_STATUS - db $ff -; 3de51 - -UseConfusionHealingItem: ; 3de51 - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVar - bit SUBSTATUS_CONFUSED, a - ret z - callfar GetOpponentItem - ld a, b - cp HELD_HEAL_CONFUSION - jr z, .heal_status - cp HELD_HEAL_STATUS - ret nz - -.heal_status - ld a, [hl] - ld [wd265], a - ld a, BATTLE_VARS_SUBSTATUS3_OPP - call GetBattleVarAddr - res SUBSTATUS_CONFUSED, [hl] - call GetItemName - call ItemRecoveryAnim - ld hl, BattleText_ItemHealedConfusion - call StdBattleTextBox - ld a, [hBattleTurn] - and a - jr nz, .do_partymon - call GetOTPartymonItem - xor a - ld [bc], a - ld a, [wBattleMode] - dec a - ret z - ld [hl], $0 - ret - -.do_partymon - call GetPartymonItem - xor a - ld [bc], a - ld [hl], a - ret -; 3de97 - -HandleStatBoostingHeldItems: ; 3de97 -; The effects handled here are not used in-game. - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .player_1 - call .DoPlayer - jp .DoEnemy - -.player_1 - call .DoEnemy - jp .DoPlayer -; 3dea9 - -.DoPlayer: ; 3dea9 - call GetPartymonItem - ld a, $0 - jp .HandleItem -; 3deb1 - -.DoEnemy: ; 3deb1 - call GetOTPartymonItem - ld a, $1 -.HandleItem: ; 3deb6 - ld [hBattleTurn], a - ld d, h - ld e, l - push de - push bc - ld a, [bc] - ld b, a - callfar GetItemHeldEffect - ld hl, .StatUpItems -.loop - ld a, [hli] - cp $ff - jr z, .finish - inc hl - inc hl - cp b - jr nz, .loop - pop bc - ld a, [bc] - ld [wd265], a - push bc - dec hl - dec hl - ld a, [hli] - ld h, [hl] - ld l, a - ld a, BANK(BattleCommand_AttackUp) - rst FarCall - pop bc - pop de - ld a, [FailedMessage] - and a - ret nz - xor a - ld [bc], a - ld [de], a - call GetItemName - ld hl, BattleText_UsersStringBuffer1Activated - call StdBattleTextBox - callfar BattleCommand_StatUpMessage - ret - -.finish - pop bc - pop de - ret -; 3defc - -.StatUpItems: - dbw HELD_ATTACK_UP, BattleCommand_AttackUp - dbw HELD_DEFENSE_UP, BattleCommand_DefenseUp - dbw HELD_SPEED_UP, BattleCommand_SpeedUp - dbw HELD_SP_ATTACK_UP, BattleCommand_SpecialAttackUp - dbw HELD_SP_DEFENSE_UP, BattleCommand_SpecialDefenseUp - dbw HELD_ACCURACY_UP, BattleCommand_AccuracyUp - dbw HELD_EVASION_UP, BattleCommand_EvasionUp - db $ff -; 3df12 - -GetPartymonItem: ; 3df12 - ld hl, PartyMon1Item - ld a, [CurBattleMon] - call GetPartyLocation - ld bc, BattleMonItem - ret -; 3df1f - -GetOTPartymonItem: ; 3df1f - ld hl, OTPartyMon1Item - ld a, [CurOTMon] - call GetPartyLocation - ld bc, EnemyMonItem - ret -; 3df2c - -UpdateBattleHUDs: ; 3df2c - push hl - push de - push bc - call DrawPlayerHUD - ld hl, PlayerHPPal - call SetHPPal - call CheckDanger - call DrawEnemyHUD - ld hl, EnemyHPPal - call SetHPPal - pop bc - pop de - pop hl - ret -; 3df48 - -UpdatePlayerHUD:: ; 3df48 - push hl - push de - push bc - call DrawPlayerHUD - call UpdatePlayerHPPal - call CheckDanger - pop bc - pop de - pop hl - ret -; 3df58 - -DrawPlayerHUD: ; 3df58 - xor a - ld [hBGMapMode], a - - ; Clear the area - hlcoord 9, 7 - lb bc, 5, 11 - call ClearBox - - farcall DrawPlayerHUDBorder - - hlcoord 18, 9 - ld [hl], $73 ; vertical bar - call PrintPlayerHUD - - ; HP bar - hlcoord 10, 9 - ld b, 1 - xor a ; PARTYMON - ld [MonType], a - predef DrawPlayerHP - - ; Exp bar - push de - ld a, [CurBattleMon] - ld hl, PartyMon1Exp + 2 - call GetPartyLocation - ld d, h - ld e, l - - hlcoord 10, 11 - ld a, [TempMonLevel] - ld b, a - call FillInExpBar - pop de - ret -; 3df98 - -UpdatePlayerHPPal: ; 3df98 - ld hl, PlayerHPPal - jp UpdateHPPal -; 3df9e - -CheckDanger: ; 3df9e - ld hl, BattleMonHP - ld a, [hli] - or [hl] - jr z, .no_danger - ld a, [wDanger] - and a - jr nz, .done - ld a, [PlayerHPPal] - cp HP_RED - jr z, .danger - -.no_danger - ld hl, Danger - res DANGER_ON_F, [hl] - jr .done - -.danger - ld hl, Danger - set DANGER_ON_F, [hl] - -.done - ret -; 3dfbf - -PrintPlayerHUD: ; 3dfbf - ld de, BattleMonNick - hlcoord 10, 7 - call ret_3e138 - call PlaceString - - push bc - - ld a, [CurBattleMon] - ld hl, PartyMon1DVs - call GetPartyLocation - ld de, TempMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - ld hl, BattleMonLevel - ld de, TempMonLevel - ld bc, $0011 - call CopyBytes - ld a, [CurBattleMon] - ld hl, PartyMon1Species - call GetPartyLocation - ld a, [hl] - ld [CurPartySpecies], a - ld [CurSpecies], a - call GetBaseData - - pop hl - dec hl - - ld a, TEMPMON - ld [MonType], a - callfar GetGender - ld a, " " - jr c, .got_gender_char - ld a, "♂" - jr nz, .got_gender_char - ld a, "♀" - -.got_gender_char - hlcoord 17, 8 - ld [hl], a - hlcoord 14, 8 - push af ; back up gender - push hl - ld de, BattleMonStatus - predef PlaceNonFaintStatus - pop hl - pop bc - ret nz - ld a, b - cp " " - jr nz, .copy_level ; male or female - dec hl ; genderless - -.copy_level - ld a, [BattleMonLevel] - ld [TempMonLevel], a - jp PrintLevel -; 3e036 - -UpdateEnemyHUD:: ; 3e036 - push hl - push de - push bc - call DrawEnemyHUD - call UpdateEnemyHPPal - pop bc - pop de - pop hl - ret -; 3e043 - -DrawEnemyHUD: ; 3e043 - xor a - ld [hBGMapMode], a - - hlcoord 1, 0 - lb bc, 4, 11 - call ClearBox - - farcall DrawEnemyHUDBorder - - ld a, [TempEnemyMonSpecies] - ld [CurSpecies], a - ld [CurPartySpecies], a - call GetBaseData - ld de, EnemyMonNick - hlcoord 1, 0 - call ret_3e138 - call PlaceString - ld h, b - ld l, c - dec hl - - ld hl, EnemyMonDVs - ld de, TempMonDVs - ld a, [EnemySubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jr z, .ok - ld hl, wEnemyBackupDVs -.ok - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - - ld a, TEMPMON - ld [MonType], a - callfar GetGender - ld a, " " - jr c, .got_gender - ld a, "♂" - jr nz, .got_gender - ld a, "♀" - -.got_gender - hlcoord 9, 1 - ld [hl], a - - hlcoord 6, 1 - push af - push hl - ld de, EnemyMonStatus - predef PlaceNonFaintStatus - pop hl - pop bc - jr nz, .skip_level - ld a, b - cp " " - jr nz, .print_level - dec hl -.print_level - ld a, [EnemyMonLevel] - ld [TempMonLevel], a - call PrintLevel -.skip_level - - ld hl, EnemyMonHP - ld a, [hli] - ld [hMultiplicand + 1], a - ld a, [hld] - ld [hMultiplicand + 2], a - or [hl] - jr nz, .not_fainted - - ld c, a - ld e, a - ld d, HP_BAR_LENGTH - jp .draw_bar - -.not_fainted - xor a - ld [hMultiplicand], a - ld a, HP_BAR_LENGTH_PX - ld [hMultiplier], a - call Multiply - ld hl, EnemyMonMaxHP - ld a, [hli] - ld b, a - ld a, [hl] - ld [hMultiplier], a - ld a, b - and a - jr z, .less_than_256_max - ld a, [hMultiplier] - srl b - rr a - srl b - rr a - ld [hDivisor], a - ld a, [hProduct + 2] - ld b, a - srl b - ld a, [hProduct + 3] - rr a - srl b - rr a - ld [hProduct + 3], a - ld a, b - ld [hProduct + 2], a - -.less_than_256_max - ld a, [hProduct + 2] - ld [hDividend + 0], a - ld a, [hProduct + 3] - ld [hDividend + 1], a - ld a, 2 - ld b, a - call Divide - ld a, [hQuotient + 2] - ld e, a - ld a, HP_BAR_LENGTH - ld d, a - ld c, a - -.draw_bar - xor a - ld [wWhichHPBar], a - hlcoord 2, 2 - ld b, 0 - call DrawBattleHPBar - ret -; 3e127 - -UpdateEnemyHPPal: ; 3e127 - ld hl, EnemyHPPal - call UpdateHPPal - ret -; 3e12e - -UpdateHPPal: ; 3e12e - ld b, [hl] - call SetHPPal - ld a, [hl] - cp b - ret z - jp FinishBattleAnim -; 3e138 - -ret_3e138: ; 3e138 - ret -; 3e139 - -BattleMenu: ; 3e139 - xor a - ld [hBGMapMode], a - call LoadTempTileMapToTileMap - - ld a, [BattleType] - cp BATTLETYPE_DEBUG - jr z, .ok - cp BATTLETYPE_TUTORIAL - jr z, .ok - call EmptyBattleTextBox - call UpdateBattleHuds - call EmptyBattleTextBox - call LoadTileMapToTempTileMap -.ok - -.loop - ld a, [BattleType] - cp BATTLETYPE_CONTEST - jr nz, .not_contest - farcall ContestBattleMenu - jr .next -.not_contest - - ; Auto input: choose "ITEM" - ld a, [InputType] - or a - jr z, .skip_dude_pack_select - farcall _DudeAutoInput_DownA -.skip_dude_pack_select - call LoadBattleMenu2 - ret c - -.next - ld a, $1 - ld [hBGMapMode], a - ld a, [wBattleMenuCursorBuffer] - cp $1 - jp z, BattleMenu_Fight - cp $3 - jp z, BattleMenu_Pack - cp $2 - jp z, BattleMenu_PKMN - cp $4 - jp z, BattleMenu_Run - jr .loop -; 3e192 - -BattleMenu_Fight: ; 3e192 - xor a - ld [wNumFleeAttempts], a - call Call_LoadTempTileMapToTileMap - and a - ret -; 3e19b - -LoadBattleMenu2: ; 3e19b - call IsMobileBattle - jr z, .mobile - - farcall LoadBattleMenu - and a - ret - -.mobile - farcall Function100b12 - ld a, [wcd2b] - and a - ret z - - ld hl, wcd2a - bit 4, [hl] - jr nz, .error - ld hl, BattleText_LinkErrorBattleCanceled - call StdBattleTextBox - ld c, 60 - call DelayFrames -.error - scf - ret -; 3e1c7 - -BattleMenu_Pack: ; 3e1c7 - ld a, [wLinkMode] - and a - jp nz, .ItemsCantBeUsed - - ld a, [InBattleTowerBattle] - and a - jp nz, .ItemsCantBeUsed - - call LoadStandardMenuDataHeader - - ld a, [BattleType] - cp BATTLETYPE_TUTORIAL - jr z, .tutorial - cp BATTLETYPE_CONTEST - jr z, .contest - - farcall BattlePack - ld a, [wPlayerAction] - and a - jr z, .didnt_use_item - jr .got_item - -.tutorial - farcall TutorialPack - ld a, POKE_BALL - ld [CurItem], a - call DoItemEffect - jr .got_item - -.contest - ld a, PARK_BALL - ld [CurItem], a - call DoItemEffect - -.got_item - call .UseItem - ret - -.didnt_use_item - call ClearPalettes - call DelayFrame - call _LoadBattleFontsHPBar - call GetBattleMonBackpic - call GetEnemyMonFrontpic - call ExitMenu - call WaitBGMap - call FinishBattleAnim - call LoadTileMapToTempTileMap - jp BattleMenu -; 3e22b - -.ItemsCantBeUsed: ; 3e22b - ld hl, BattleText_ItemsCantBeUsedHere - call StdBattleTextBox - jp BattleMenu -; 3e234 - -.UseItem: ; 3e234 - ld a, [wWildMon] - and a - jr nz, .run - callfar CheckItemPocket - ld a, [wItemAttributeParamBuffer] - cp BALL - jr z, .ball - call ClearBGPalettes - -.ball - xor a - ld [hBGMapMode], a - call _LoadBattleFontsHPBar - call ClearSprites - ld a, [BattleType] - cp BATTLETYPE_TUTORIAL - jr z, .tutorial2 - call GetBattleMonBackpic - -.tutorial2 - call GetEnemyMonFrontpic - ld a, $1 - ld [wMenuCursorY], a - call ExitMenu - call UpdateBattleHUDs - call WaitBGMap - call LoadTileMapToTempTileMap - call ClearWindowData - call FinishBattleAnim - and a - ret - -.run - xor a - ld [wWildMon], a - ld a, [wBattleResult] - and $c0 - ld [wBattleResult], a - call ClearWindowData - call SetPalettes - scf - ret -; 3e28d - -BattleMenu_PKMN: ; 3e28d - call LoadStandardMenuDataHeader -BattleMenuPKMN_ReturnFromStats: - call ExitMenu - call LoadStandardMenuDataHeader - call ClearBGPalettes -BattleMenuPKMN_Loop: - call SetUpBattlePartyMenu - xor a - ld [PartyMenuActionText], a - call JumpToPartyMenuAndPrintText - call SelectBattleMon - jr c, .Cancel -.loop - farcall FreezeMonIcons - call .GetMenu - jr c, .PressedB - call PlaceHollowCursor - ld a, [wMenuCursorY] - cp $1 ; SWITCH - jp z, TryPlayerSwitch - cp $2 ; STATS - jr z, .Stats - cp $3 ; CANCEL - jr z, .Cancel - jr .loop - -.PressedB: - call CheckMobileBattleError - jr c, .Cancel - jr BattleMenuPKMN_Loop - -.Stats: - call Battle_StatsScreen - call CheckMobileBattleError - jr c, .Cancel - jp BattleMenuPKMN_ReturnFromStats - -.Cancel: - call ClearSprites - call ClearPalettes - call DelayFrame - call _LoadHPBar - call CloseWindow - call LoadTileMapToTempTileMap - call GetMemSGBLayout - call SetPalettes - jp BattleMenu -; 3e2f5 - -.GetMenu: ; 3e2f5 - call IsMobileBattle - jr z, .mobile - farcall BattleMonMenu - ret - -.mobile - farcall MobileBattleMonMenu - ret -; 3e308 - -Battle_StatsScreen: ; 3e308 - call DisableLCD - - ld hl, VTiles2 tile $31 - ld de, VTiles0 - ld bc, $11 tiles - call CopyBytes - - ld hl, VTiles2 - ld de, VTiles0 tile $11 - ld bc, $31 tiles - call CopyBytes - - call EnableLCD - - call ClearSprites - call LowVolume - xor a ; PARTYMON - ld [MonType], a - farcall BattleStatsScreenInit - call MaxVolume - - call DisableLCD - - ld hl, VTiles0 - ld de, VTiles2 tile $31 - ld bc, $11 tiles - call CopyBytes - - ld hl, VTiles0 tile $11 - ld de, VTiles2 - ld bc, $31 tiles - call CopyBytes - - call EnableLCD - ret -; 3e358 - -TryPlayerSwitch: ; 3e358 - ld a, [CurBattleMon] - ld d, a - ld a, [CurPartyMon] - cp d - jr nz, .check_trapped - ld hl, BattleText_PkmnIsAlreadyOut - call StdBattleTextBox - jp BattleMenuPKMN_Loop - -.check_trapped - ld a, [wPlayerWrapCount] - and a - jr nz, .trapped - ld a, [EnemySubStatus5] - bit SUBSTATUS_CANT_RUN, a - jr z, .try_switch - -.trapped - ld hl, BattleText_PkmnCantBeRecalled - call StdBattleTextBox - jp BattleMenuPKMN_Loop - -.try_switch - call CheckIfCurPartyMonIsFitToFight - jp z, BattleMenuPKMN_Loop - ld a, [CurBattleMon] - ld [LastPlayerMon], a - ld a, $2 - ld [wPlayerAction], a - call ClearPalettes - call DelayFrame - call ClearSprites - call _LoadHPBar - call CloseWindow - call GetMemSGBLayout - call SetPalettes - ld a, [CurPartyMon] - ld [CurBattleMon], a -PlayerSwitch: ; 3e3ad - ld a, 1 - ld [wPlayerIsSwitching], a - ld a, [wLinkMode] - and a - jr z, .not_linked - call LoadStandardMenuDataHeader - call LinkBattleSendReceiveAction - call CloseWindow - -.not_linked - call ParseEnemyAction - ld a, [wLinkMode] - and a - jr nz, .linked - -.switch - call BattleMonEntrance - and a - ret - -.linked - ld a, [wBattleAction] - cp BATTLEACTION_E - jp z, .switch - cp BATTLEACTION_D - jp z, .switch - cp BATTLEACTION_SWITCH1 - jp c, .switch - cp BATTLEACTION_FORFEIT - jr nz, .dont_run - call WildFled_EnemyFled_LinkBattleCanceled - ret - -.dont_run - ld a, [hLinkPlayerNumber] - cp $1 - jr z, .player_1 - call BattleMonEntrance - call EnemyMonEntrance - and a - ret - -.player_1 - call EnemyMonEntrance - call BattleMonEntrance - and a - ret -; 3e3ff - -EnemyMonEntrance: ; 3e3ff - callfar AI_Switch - call SetEnemyTurn - jp SpikesDamage -; 3e40b - -BattleMonEntrance: ; 3e40b - call WithdrawPkmnText - - ld c, 50 - call DelayFrames - - ld hl, PlayerSubStatus4 - res SUBSTATUS_RAGE, [hl] - - call SetEnemyTurn - call PursuitSwitch - jr c, .ok - call RecallPlayerMon -.ok - - hlcoord 9, 7 - lb bc, 5, 11 - call ClearBox - - ld a, [CurBattleMon] - ld [CurPartyMon], a - call AddBattleParticipant - call InitBattleMon - call ResetPlayerStatLevels - call SendOutPkmnText - call NewBattleMonStatus - call BreakAttraction - call SendOutPlayerMon - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - call SetPlayerTurn - call SpikesDamage - ld a, $2 - ld [wMenuCursorY], a - ret -; 3e459 - -PassedBattleMonEntrance: ; 3e459 - ld c, 50 - call DelayFrames - - hlcoord 9, 7 - lb bc, 5, 11 - call ClearBox - - ld a, [CurPartyMon] - ld [CurBattleMon], a - call AddBattleParticipant - call InitBattleMon - xor a - ld [wd265], a - call ApplyStatLevelMultiplierOnAllStats - call SendOutPlayerMon - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - call SetPlayerTurn - jp SpikesDamage -; 3e489 - -BattleMenu_Run: ; 3e489 - call Call_LoadTempTileMapToTileMap - ld a, $3 - ld [wMenuCursorY], a - ld hl, BattleMonSpeed - ld de, EnemyMonSpeed - call TryToRunAwayFromBattle - ld a, $0 - ld [wFailedToFlee], a - ret c - ld a, [wPlayerAction] - and a - ret nz - jp BattleMenu -; 3e4a8 - -CheckAmuletCoin: ; 3e4a8 - ld a, [BattleMonItem] - ld b, a - callfar GetItemHeldEffect - ld a, b - cp HELD_AMULET_COIN - ret nz - ld a, 1 - ld [wAmuletCoin], a - ret -; 3e4bc - -MoveSelectionScreen: ; 3e4bc - call IsMobileBattle - jr nz, .not_mobile - farcall MobileMoveSelectionScreen - ret - -.not_mobile - ld hl, EnemyMonMoves - ld a, [wMoveSelectionMenuType] - dec a - jr z, .got_menu_type - dec a - jr z, .ether_elixer_menu - call CheckPlayerHasUsableMoves - ret z ; use Struggle - ld hl, BattleMonMoves - jr .got_menu_type - -.ether_elixer_menu - ld a, MON_MOVES - call GetPartyParamLocation - -.got_menu_type - ld de, wListMoves_MoveIndicesBuffer - ld bc, NUM_MOVES - call CopyBytes - xor a - ld [hBGMapMode], a - - hlcoord 4, 17 - NUM_MOVES - 1 - ld b, 4 - ld c, 14 - ld a, [wMoveSelectionMenuType] - cp $2 - jr nz, .got_dims - hlcoord 4, 17 - NUM_MOVES - 1 - 4 - ld b, 4 - ld c, 14 -.got_dims - call TextBox - - hlcoord 6, 17 - NUM_MOVES - ld a, [wMoveSelectionMenuType] - cp $2 - jr nz, .got_start_coord - hlcoord 6, 17 - NUM_MOVES - 4 -.got_start_coord - ld a, SCREEN_WIDTH - ld [Buffer1], a - predef ListMoves - - ld b, 5 - ld a, [wMoveSelectionMenuType] - cp $2 - ld a, 17 - NUM_MOVES - jr nz, .got_default_coord - ld b, 5 - ld a, 17 - NUM_MOVES - 4 - -.got_default_coord - ld [w2DMenuCursorInitY], a - ld a, b - ld [w2DMenuCursorInitX], a - ld a, [wMoveSelectionMenuType] - cp $1 - jr z, .skip_inc - ld a, [CurMoveNum] - inc a - -.skip_inc - ld [wMenuCursorY], a - ld a, $1 - ld [wMenuCursorX], a - ld a, [wNumMoves] - inc a - ld [w2DMenuNumRows], a - ld a, $1 - ld [w2DMenuNumCols], a - ld c, $2c - ld a, [wMoveSelectionMenuType] - dec a - ld b, D_DOWN | D_UP | A_BUTTON - jr z, .okay - dec a - ld b, D_DOWN | D_UP | A_BUTTON | B_BUTTON - jr z, .okay - ld a, [wLinkMode] - and a - jr nz, .okay - ld b, D_DOWN | D_UP | A_BUTTON | B_BUTTON | SELECT - -.okay - ld a, b - ld [wMenuJoypadFilter], a - ld a, c - ld [w2DMenuFlags1], a - xor a - ld [w2DMenuFlags2], a - ld a, $10 - ld [w2DMenuCursorOffsets], a -.menu_loop - ld a, [wMoveSelectionMenuType] - and a - jr z, .battle_player_moves - dec a - jr nz, .interpret_joypad - hlcoord 11, 14 - ld de, .string_3e61c - call PlaceString - jr .interpret_joypad - -.battle_player_moves - call MoveInfoBox - ld a, [wMoveSwapBuffer] - and a - jr z, .interpret_joypad - hlcoord 5, 13 - ld bc, SCREEN_WIDTH - dec a - call AddNTimes - ld [hl], "▷" - -.interpret_joypad - ld a, $1 - ld [hBGMapMode], a - call ScrollingMenuJoypad - bit D_UP_F, a - jp nz, .pressed_up - bit D_DOWN_F, a - jp nz, .pressed_down - bit SELECT_F, a - jp nz, .pressed_select - bit B_BUTTON_F, a - ; A button - push af - - xor a - ld [wMoveSwapBuffer], a - ld a, [wMenuCursorY] - dec a - ld [wMenuCursorY], a - ld b, a - ld a, [wMoveSelectionMenuType] - dec a - jr nz, .not_enemy_moves_process_b - - pop af - ret - -.not_enemy_moves_process_b - dec a - ld a, b - ld [CurMoveNum], a - jr nz, .use_move - - pop af - ret - -.use_move - pop af - ret nz - - ld hl, BattleMonPP - ld a, [wMenuCursorY] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - and $3f - jr z, .no_pp_left - ld a, [PlayerDisableCount] - swap a - and $f - dec a - cp c - jr z, .move_disabled - ld a, [wUnusedPlayerLockedMove] - and a - jr nz, .skip2 - ld a, [wMenuCursorY] - ld hl, BattleMonMoves - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - -.skip2 - ld [CurPlayerMove], a - xor a - ret - -.move_disabled - ld hl, BattleText_TheMoveIsDisabled - jr .place_textbox_start_over - -.no_pp_left - ld hl, BattleText_TheresNoPPLeftForThisMove - -.place_textbox_start_over - call StdBattleTextBox - call Call_LoadTempTileMapToTileMap - jp MoveSelectionScreen -; 3e61c - -.string_3e61c ; 3e61c - db "@" -; 3e61d - -.pressed_up - ld a, [wMenuCursorY] - and a - jp nz, .menu_loop - ld a, [wNumMoves] - inc a - ld [wMenuCursorY], a - jp .menu_loop -; 3e62e - -.pressed_down ; 3e62e - ld a, [wMenuCursorY] - ld b, a - ld a, [wNumMoves] - inc a - inc a - cp b - jp nz, .menu_loop - ld a, $1 - ld [wMenuCursorY], a - jp .menu_loop -; 3e643 - -.pressed_select ; 3e643 - ld a, [wMoveSwapBuffer] - and a - jr z, .start_swap - ld hl, BattleMonMoves - call .swap_bytes - ld hl, BattleMonPP - call .swap_bytes - ld hl, PlayerDisableCount - ld a, [hl] - swap a - and $f - ld b, a - ld a, [wMenuCursorY] - cp b - jr nz, .not_swapping_disabled_move - ld a, [hl] - and $f - ld b, a - ld a, [wMoveSwapBuffer] - swap a - add b - ld [hl], a - jr .swap_moves_in_party_struct - -.not_swapping_disabled_move - ld a, [wMoveSwapBuffer] - cp b - jr nz, .swap_moves_in_party_struct - ld a, [hl] - and $f - ld b, a - ld a, [wMenuCursorY] - swap a - add b - ld [hl], a - -.swap_moves_in_party_struct -; Fixes the COOLTRAINER glitch - ld a, [PlayerSubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jr nz, .transformed - ld hl, PartyMon1Moves - ld a, [CurBattleMon] - call GetPartyLocation - push hl - call .swap_bytes - pop hl - ld bc, MON_PP - MON_MOVES - add hl, bc - call .swap_bytes - -.transformed - xor a - ld [wMoveSwapBuffer], a - jp MoveSelectionScreen - -.swap_bytes - push hl - ld a, [wMoveSwapBuffer] - dec a - ld c, a - ld b, 0 - add hl, bc - ld d, h - ld e, l - pop hl - ld a, [wMenuCursorY] - dec a - ld c, a - ld b, 0 - add hl, bc - ld a, [de] - ld b, [hl] - ld [hl], a - ld a, b - ld [de], a - ret - -.start_swap - ld a, [wMenuCursorY] - ld [wMoveSwapBuffer], a - jp MoveSelectionScreen -; 3e6c8 - -MoveInfoBox: ; 3e6c8 - xor a - ld [hBGMapMode], a - - hlcoord 0, 8 - ld b, 3 - ld c, 9 - call TextBox - call MobileTextBorder - - ld a, [PlayerDisableCount] - and a - jr z, .not_disabled - - swap a - and $f - ld b, a - ld a, [wMenuCursorY] - cp b - jr nz, .not_disabled - - hlcoord 1, 10 - ld de, .Disabled - call PlaceString - jr .done - -.not_disabled - ld hl, wMenuCursorY - dec [hl] - call SetPlayerTurn - ld hl, BattleMonMoves - ld a, [wMenuCursorY] - ld c, a - ld b, 0 - add hl, bc - ld a, [hl] - ld [CurPlayerMove], a - - ld a, [CurBattleMon] - ld [CurPartyMon], a - ld a, WILDMON - ld [MonType], a - callfar GetMaxPPOfMove - - ld hl, wMenuCursorY - ld c, [hl] - inc [hl] - ld b, 0 - ld hl, BattleMonPP - add hl, bc - ld a, [hl] - and $3f - ld [StringBuffer1], a - call .PrintPP - - hlcoord 1, 9 - ld de, .Type - call PlaceString - - hlcoord 7, 11 - ld [hl], "/" - - callfar UpdateMoveData - ld a, [wPlayerMoveStruct + MOVE_ANIM] - ld b, a - hlcoord 2, 10 - predef PrintMoveType - -.done - ret -; 3e74f - -.Disabled: - db "Disabled!@" -.Type: - db "TYPE/@" -; 3e75f - -.PrintPP: ; 3e75f - hlcoord 5, 11 - ld a, [wLinkMode] ; What's the point of this check? - cp LINK_MOBILE - jr c, .ok - hlcoord 5, 11 -.ok - push hl - ld de, StringBuffer1 - lb bc, 1, 2 - call PrintNum - pop hl - inc hl - inc hl - ld [hl], "/" - inc hl - ld de, wNamedObjectIndexBuffer - lb bc, 1, 2 - call PrintNum - ret -; 3e786 - -CheckPlayerHasUsableMoves: ; 3e786 - ld a, STRUGGLE - ld [CurPlayerMove], a - ld a, [PlayerDisableCount] - and a - ld hl, BattleMonPP - jr nz, .disabled - - ld a, [hli] - or [hl] - inc hl - or [hl] - inc hl - or [hl] - and $3f - ret nz - jr .force_struggle - -.disabled - swap a - and $f - ld b, a - ld d, NUM_MOVES + 1 - xor a -.loop - dec d - jr z, .done - ld c, [hl] - inc hl - dec b - jr z, .loop - or c - jr .loop - -.done - ; Bug: this will result in a move with PP Up confusing the game. - ; Replace with "and $3f" to fix. - and a - ret nz - -.force_struggle - ld hl, BattleText_PkmnHasNoMovesLeft - call StdBattleTextBox - ld c, 60 - call DelayFrames - xor a - ret -; 3e7c1 - -ParseEnemyAction: ; 3e7c1 - ld a, [wEnemyIsSwitching] - and a - ret nz - ld a, [wLinkMode] - and a - jr z, .not_linked - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - ld a, [wPlayerAction] - and a - call z, LinkBattleSendReceiveAction - call Call_LoadTempTileMapToTileMap - ld a, [wBattleAction] - cp BATTLEACTION_E - jp z, .struggle - cp BATTLEACTION_D - jp z, .battle_action_d - cp BATTLEACTION_SWITCH1 - jp nc, ResetVarsForSubstatusRage - ld [CurEnemyMoveNum], a - ld c, a - ld a, [EnemySubStatus1] - bit SUBSTATUS_ROLLOUT, a - jp nz, .skip_load - ld a, [EnemySubStatus3] - and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE - jp nz, .skip_load - - ld hl, EnemySubStatus5 - bit SUBSTATUS_ENCORED, [hl] - ld a, [LastEnemyMove] - jp nz, .finish - ld hl, EnemyMonMoves - ld b, 0 - add hl, bc - ld a, [hl] - jp .finish - -.not_linked - ld hl, EnemySubStatus5 - bit SUBSTATUS_ENCORED, [hl] - jr z, .skip_encore - ld a, [LastEnemyMove] - jp .finish - -.skip_encore - call CheckEnemyLockedIn - jp nz, ResetVarsForSubstatusRage - jr .continue - -.battle_action_d - ld a, $ff - jr .finish - -.continue - ld hl, EnemyMonMoves - ld de, EnemyMonPP - ld b, NUM_MOVES -.loop - ld a, [hl] - and a - jp z, .struggle - ld a, [EnemyDisabledMove] - cp [hl] - jr z, .disabled - ld a, [de] - and $3f - jr nz, .enough_pp - -.disabled - inc hl - inc de - dec b - jr nz, .loop - jr .struggle - -.enough_pp - ld a, [wBattleMode] - dec a - jr nz, .skip_load -; wild -.loop2 - ld hl, EnemyMonMoves - call BattleRandom - and 3 ; TODO factor in NUM_MOVES - ld c, a - ld b, 0 - add hl, bc - ld a, [EnemyDisableCount] - swap a - and $f - dec a - cp c - jr z, .loop2 - ld a, [hl] - and a - jr z, .loop2 - ld hl, EnemyMonPP - add hl, bc - ld b, a - ld a, [hl] - and $3f - jr z, .loop2 - ld a, c - ld [CurEnemyMoveNum], a - ld a, b - -.finish - ld [CurEnemyMove], a - -.skip_load - call SetEnemyTurn - callfar UpdateMoveData - call CheckEnemyLockedIn - jr nz, .raging - xor a - ld [wEnemyCharging], a - -.raging - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - cp EFFECT_FURY_CUTTER - jr z, .fury_cutter - xor a - ld [EnemyFuryCutterCount], a - -.fury_cutter - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - cp EFFECT_RAGE - jr z, .no_rage - ld hl, EnemySubStatus4 - res SUBSTATUS_RAGE, [hl] - xor a - ld [wEnemyRageCounter], a - -.no_rage - ld a, [wEnemyMoveStruct + MOVE_EFFECT] - cp EFFECT_PROTECT - ret z - cp EFFECT_ENDURE - ret z - xor a - ld [EnemyProtectCount], a - ret - -.struggle - ld a, STRUGGLE - jr .finish -; 3e8c1 - -ResetVarsForSubstatusRage: ; 3e8c1 - xor a - ld [EnemyFuryCutterCount], a - ld [EnemyProtectCount], a - ld [wEnemyRageCounter], a - ld hl, EnemySubStatus4 - res SUBSTATUS_RAGE, [hl] - ret -; 3e8d1 - -CheckEnemyLockedIn: ; 3e8d1 - ld a, [EnemySubStatus4] - and 1 << SUBSTATUS_RECHARGE - ret nz - - ld hl, EnemySubStatus3 - ld a, [hl] - and 1 << SUBSTATUS_CHARGED | 1 << SUBSTATUS_RAMPAGE | 1 << SUBSTATUS_BIDE - ret nz - - ld hl, EnemySubStatus1 - bit SUBSTATUS_ROLLOUT, [hl] - ret -; 3e8e4 - -LinkBattleSendReceiveAction: ; 3e8e4 - farcall _LinkBattleSendReceiveAction - ret -; 3e8eb - -LoadEnemyMon: ; 3e8eb -; Initialize enemy monster parameters -; To do this we pull the species from TempEnemyMonSpecies - -; Notes: -; BattleRandom is used to ensure sync between Game Boys - -; Clear the whole EnemyMon struct - xor a - ld hl, EnemyMonSpecies - ld bc, EnemyMonEnd - EnemyMon - call ByteFill - -; We don't need to be here if we're in a link battle - ld a, [wLinkMode] - and a - jp nz, InitEnemyMon - -; and also not in a BattleTower-Battle - ld a, [InBattleTowerBattle] ; ???? - bit 0, a - jp nz, InitEnemyMon - -; Make sure everything knows what species we're working with - ld a, [TempEnemyMonSpecies] - ld [EnemyMonSpecies], a - ld [CurSpecies], a - ld [CurPartySpecies], a - -; Grab the BaseData for this species - call GetBaseData - -; Let's get the item: - -; Is the item predetermined? - ld a, [wBattleMode] - dec a - jr z, .WildItem - -; If we're in a trainer battle, the item is in the party struct - ld a, [CurPartyMon] - ld hl, OTPartyMon1Item - call GetPartyLocation ; bc = PartyMon[CurPartyMon] - PartyMons - ld a, [hl] - jr .UpdateItem - -.WildItem: -; In a wild battle, we pull from the item slots in BaseData - -; Force Item1 -; Used for Ho-Oh, Lugia and Snorlax encounters - ld a, [BattleType] - cp BATTLETYPE_FORCEITEM - ld a, [BaseItems] - jr z, .UpdateItem - -; Failing that, it's all up to chance -; Effective chances: -; 75% None -; 23% Item1 -; 2% Item2 - -; 25% chance of getting an item - call BattleRandom - cp 1 + (75 percent) - ld a, NO_ITEM - jr c, .UpdateItem - -; From there, an 8% chance for Item2 - call BattleRandom - cp 8 percent ; 8% of 25% = 2% Item2 - ld a, [BaseItems] - jr nc, .UpdateItem - ld a, [BaseItems+1] - -.UpdateItem: - ld [EnemyMonItem], a - -; Initialize DVs - -; If we're in a trainer battle, DVs are predetermined - ld a, [wBattleMode] - and a - jr z, .InitDVs - - ld a, [EnemySubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jr z, .InitDVs - -; Unknown - ld hl, wEnemyBackupDVs - ld de, EnemyMonDVs - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - jp .Happiness - -.InitDVs: - -; Trainer DVs - -; All trainers have preset DVs, determined by class -; See GetTrainerDVs for more on that - farcall GetTrainerDVs -; These are the DVs we'll use if we're actually in a trainer battle - ld a, [wBattleMode] - dec a - jr nz, .UpdateDVs - -; Wild DVs -; Here's where the fun starts - -; Roaming monsters (Entei, Raikou) work differently -; They have their own structs, which are shorter than normal - ld a, [BattleType] - cp BATTLETYPE_ROAMING - jr nz, .NotRoaming - -; Grab HP - call GetRoamMonHP - ld a, [hl] -; Check if the HP has been initialized - and a -; We'll do something with the result in a minute - push af - -; Grab DVs - call GetRoamMonDVs - inc hl - ld a, [hld] - ld c, a - ld b, [hl] - -; Get back the result of our check - pop af -; If the RoamMon struct has already been initialized, we're done - jr nz, .UpdateDVs - -; If it hasn't, we need to initialize the DVs -; (HP is initialized at the end of the battle) - call GetRoamMonDVs - inc hl - call BattleRandom - ld [hld], a - ld c, a - call BattleRandom - ld [hl], a - ld b, a -; We're done with DVs - jr .UpdateDVs - -.NotRoaming: -; Register a contains BattleType - -; Forced shiny battle type -; Used by Red Gyarados at Lake of Rage - cp BATTLETYPE_SHINY - jr nz, .GenerateDVs - - ld b, ATKDEFDV_SHINY ; $ea - ld c, SPDSPCDV_SHINY ; $aa - jr .UpdateDVs - -.GenerateDVs: -; Generate new random DVs - call BattleRandom - ld b, a - call BattleRandom - ld c, a - -.UpdateDVs: -; Input DVs in register bc - ld hl, EnemyMonDVs - ld a, b - ld [hli], a - ld [hl], c - -; We've still got more to do if we're dealing with a wild monster - ld a, [wBattleMode] - dec a - jr nz, .Happiness - -; Species-specfic: - -; Unown - ld a, [TempEnemyMonSpecies] - cp UNOWN - jr nz, .Magikarp - -; Get letter based on DVs - ld hl, EnemyMonDVs - predef GetUnownLetter -; Can't use any letters that haven't been unlocked -; If combined with forced shiny battletype, causes an infinite loop - call CheckUnownLetter - jr c, .GenerateDVs ; try again - -.Magikarp: -; Skimming this part recommended - - ld a, [TempEnemyMonSpecies] - cp MAGIKARP - jr nz, .Happiness - -; Get Magikarp's length - ld de, EnemyMonDVs - ld bc, PlayerID - callfar CalcMagikarpLength - -; We're clear if the length is < 1536 - ld a, [wMagikarpLength] - cp HIGH(1536) - jr nz, .CheckMagikarpArea - -; 5% chance of skipping both size checks - call Random - cp 5 percent - jr c, .CheckMagikarpArea -; Try again if > 1614 - ld a, [wMagikarpLength + 1] - cp LOW(1614) + 2 - jr nc, .GenerateDVs - -; 20% chance of skipping this check - call Random - cp 20 percent - 1 - jr c, .CheckMagikarpArea -; Try again if > 1598 - ld a, [wMagikarpLength + 1] - cp LOW(1598) + 2 - jr nc, .GenerateDVs - -.CheckMagikarpArea: -; The z checks are supposed to be nz -; Instead, all maps in GROUP_LAKE_OF_RAGE (mahogany area) -; and routes 20 and 44 are treated as Lake of Rage - -; This also means Lake of Rage Magikarp can be smaller than ones -; caught elsewhere rather than the other way around - -; Intended behavior enforces a minimum size at Lake of Rage -; The real behavior prevents size flooring in the Lake of Rage area - ld a, [MapGroup] - cp GROUP_LAKE_OF_RAGE - jr z, .Happiness - ld a, [MapNumber] - cp MAP_LAKE_OF_RAGE - jr z, .Happiness -; 40% chance of not flooring - call Random - cp 40 percent - 2 - jr c, .Happiness -; Floor at length 1024 - ld a, [wMagikarpLength] - cp HIGH(1024) - jr c, .GenerateDVs ; try again - -; Finally done with DVs - -.Happiness: -; Set happiness - ld a, BASE_HAPPINESS - ld [EnemyMonHappiness], a -; Set level - ld a, [CurPartyLevel] - ld [EnemyMonLevel], a -; Fill stats - ld de, EnemyMonMaxHP - ld b, FALSE - ld hl, EnemyMonDVs - (MON_DVS - MON_STAT_EXP + 1) ; LinkBattleRNs + 7 ; ? - predef CalcPkmnStats - -; If we're in a trainer battle, -; get the rest of the parameters from the party struct - ld a, [wBattleMode] - cp TRAINER_BATTLE - jr z, .OpponentParty - -; If we're in a wild battle, check wild-specific stuff - and a - jr z, .TreeMon - - ld a, [EnemySubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jp nz, .Moves - -.TreeMon: -; If we're headbutting trees, some monsters enter battle asleep - call CheckSleepingTreeMon - ld a, TREEMON_SLEEP_TURNS - jr c, .UpdateStatus -; Otherwise, no status - xor a - -.UpdateStatus: - ld hl, EnemyMonStatus - ld [hli], a - -; Unused byte - xor a - ld [hli], a - -; Full HP.. - ld a, [EnemyMonMaxHP] - ld [hli], a - ld a, [EnemyMonMaxHP + 1] - ld [hl], a - -; ..unless it's a RoamMon - ld a, [BattleType] - cp BATTLETYPE_ROAMING - jr nz, .Moves - -; Grab HP - call GetRoamMonHP - ld a, [hl] -; Check if it's been initialized again - and a - jr z, .InitRoamHP -; Update from the struct if it has - ld a, [hl] - ld [EnemyMonHP + 1], a - jr .Moves - -.InitRoamHP: -; HP only uses the lo byte in the RoamMon struct since -; Raikou/Entei/Suicune will have < 256 hp at level 40 - ld a, [EnemyMonHP + 1] - ld [hl], a - jr .Moves - -.OpponentParty: -; Get HP from the party struct - ld hl, (OTPartyMon1HP + 1) - ld a, [CurPartyMon] - call GetPartyLocation - ld a, [hld] - ld [EnemyMonHP + 1], a - ld a, [hld] - ld [EnemyMonHP], a - -; Make sure everything knows which monster the opponent is using - ld a, [CurPartyMon] - ld [CurOTMon], a - -; Get status from the party struct - dec hl - ld a, [hl] ; OTPartyMonStatus - ld [EnemyMonStatus], a - -.Moves: - ld hl, BaseType1 - ld de, EnemyMonType1 - ld a, [hli] - ld [de], a - inc de - ld a, [hl] - ld [de], a - -; Get moves - ld de, EnemyMonMoves -; Are we in a trainer battle? - ld a, [wBattleMode] - cp TRAINER_BATTLE - jr nz, .WildMoves -; Then copy moves from the party struct - ld hl, OTPartyMon1Moves - ld a, [CurPartyMon] - call GetPartyLocation - ld bc, NUM_MOVES - call CopyBytes - jr .PP - -.WildMoves: -; Clear EnemyMonMoves - xor a - ld h, d - ld l, e - ld [hli], a - ld [hli], a - ld [hli], a - ld [hl], a -; Make sure the predef knows this isn't a partymon - ld [wEvolutionOldSpecies], a -; Fill moves based on level - predef FillMoves - -.PP: -; Trainer battle? - ld a, [wBattleMode] - cp TRAINER_BATTLE - jr z, .TrainerPP - -; Fill wild PP - ld hl, EnemyMonMoves - ld de, EnemyMonPP - predef FillPP - jr .Finish - -.TrainerPP: -; Copy PP from the party struct - ld hl, OTPartyMon1PP - ld a, [CurPartyMon] - call GetPartyLocation - ld de, EnemyMonPP - ld bc, NUM_MOVES - call CopyBytes - -.Finish: -; Only the first five base stats are copied.. - ld hl, BaseStats - ld de, EnemyMonBaseStats - ld b, BaseSpecialDefense - BaseStats -.loop - ld a, [hli] - ld [de], a - inc de - dec b - jr nz, .loop - - ld a, [BaseCatchRate] - ld [de], a - inc de - - ld a, [BaseExp] - ld [de], a - - ld a, [TempEnemyMonSpecies] - ld [wd265], a - - call GetPokemonName - -; Did we catch it? - ld a, [wBattleMode] - and a - ret z - -; Update enemy nick - ld hl, StringBuffer1 - ld de, EnemyMonNick - ld bc, PKMN_NAME_LENGTH - call CopyBytes - -; Saw this mon - ld a, [TempEnemyMonSpecies] - dec a - ld c, a - ld b, SET_FLAG - ld hl, PokedexSeen - predef FlagPredef - - ld hl, EnemyMonStats - ld de, EnemyStats - ld bc, EnemyMonStatsEnd - EnemyMonStats - call CopyBytes - - ret -; 3eb38 - -CheckSleepingTreeMon: ; 3eb38 -; Return carry if species is in the list -; for the current time of day - -; Don't do anything if this isn't a tree encounter - ld a, [BattleType] - cp BATTLETYPE_TREE - jr nz, .NotSleeping - -; Get list for the time of day - ld hl, .Morn - ld a, [TimeOfDay] - cp DAY_F - jr c, .Check - ld hl, .Day - jr z, .Check - ld hl, .Nite - -.Check: - ld a, [TempEnemyMonSpecies] - ld de, 1 ; length of species id - call IsInArray -; If it's a match, the opponent is asleep - ret c - -.NotSleeping: - and a - ret - -.Nite: - db CATERPIE - db METAPOD - db BUTTERFREE - db WEEDLE - db KAKUNA - db BEEDRILL - db SPEAROW - db EKANS - db EXEGGCUTE - db LEDYBA - db AIPOM - db -1 ; end - -.Day: - db VENONAT - db HOOTHOOT - db NOCTOWL - db SPINARAK - db HERACROSS - db -1 ; end - -.Morn: - db VENONAT - db HOOTHOOT - db NOCTOWL - db SPINARAK - db HERACROSS - db -1 ; end -; 3eb75 - -CheckUnownLetter: ; 3eb75 -; Return carry if the Unown letter hasn't been unlocked yet - - ld a, [UnlockedUnowns] - ld c, a - ld de, 0 - -.loop - -; Don't check this set unless it's been unlocked - srl c - jr nc, .next - -; Is our letter in the set? - ld hl, .LetterSets - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - - push de - ld a, [UnownLetter] - ld de, 1 - push bc - call IsInArray - pop bc - pop de - - jr c, .match - -.next -; Make sure we haven't gone past the end of the table - inc e - inc e - ld a, e - cp .Set1 - .LetterSets - jr c, .loop - -; Hasn't been unlocked, or the letter is invalid - scf - ret - -.match -; Valid letter - and a - ret - -.LetterSets: - dw .Set1 - dw .Set2 - dw .Set3 - dw .Set4 - -.Set1: - ; A B C D E F G H I J K - db 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, $ff -.Set2: - ; L M N O P Q R - db 12, 13, 14, 15, 16, 17, 18, $ff -.Set3: - ; S T U V W - db 19, 20, 21, 22, 23, $ff -.Set4: - ; X Y Z - db 24, 25, 26, $ff - -; 3ebc7 - -SwapBattlerLevels: ; 3ebc7 -; unreferenced - push bc - ld a, [BattleMonLevel] - ld b, a - ld a, [EnemyMonLevel] - ld [BattleMonLevel], a - ld a, b - ld [EnemyMonLevel], a - pop bc - ret -; 3ebd8 - -BattleWinSlideInEnemyTrainerFrontpic: ; 3ebd8 - xor a - ld [TempEnemyMonSpecies], a - call FinishBattleAnim - ld a, [OtherTrainerClass] - ld [TrainerClass], a - ld de, VTiles2 - callfar GetTrainerPic - hlcoord 19, 0 - ld c, 0 - -.outer_loop - inc c - ld a, c - cp 7 - ret z - xor a - ld [hBGMapMode], a - ld [hBGMapThird], a - ld d, $0 - push bc - push hl - -.inner_loop - call .CopyColumn - inc hl - ld a, 7 - add d - ld d, a - dec c - jr nz, .inner_loop - - ld a, $1 - ld [hBGMapMode], a - ld c, 4 - call DelayFrames - pop hl - pop bc - dec hl - jr .outer_loop -; 3ec1a - -.CopyColumn: ; 3ec1a - push hl - push de - push bc - ld e, 7 - -.loop - ld [hl], d - ld bc, SCREEN_WIDTH - add hl, bc - inc d - dec e - jr nz, .loop - - pop bc - pop de - pop hl - ret -; 3ec2c - -ApplyStatusEffectOnPlayerStats: ; 3ec2c - ld a, 1 - jr ApplyStatusEffectOnStats -; 3ec30 - -ApplyStatusEffectOnEnemyStats: ; 3ec30 - xor a -; 3ec31 - -ApplyStatusEffectOnStats: ; 3ec31 - ld [hBattleTurn], a - call ApplyPrzEffectOnSpeed - jp ApplyBrnEffectOnAttack -; 3ec39 - -ApplyPrzEffectOnSpeed: ; 3ec39 - ld a, [hBattleTurn] - and a - jr z, .enemy - ld a, [BattleMonStatus] - and 1 << PAR - ret z - ld hl, BattleMonSpeed + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - srl a - rr b - ld [hli], a - or b - jr nz, .player_ok - ld b, $1 ; min speed - -.player_ok - ld [hl], b - ret - -.enemy - ld a, [EnemyMonStatus] - and 1 << PAR - ret z - ld hl, EnemyMonSpeed + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - srl a - rr b - ld [hli], a - or b - jr nz, .enemy_ok - ld b, $1 ; min speed - -.enemy_ok - ld [hl], b - ret -; 3ec76 - -ApplyBrnEffectOnAttack: ; 3ec76 - ld a, [hBattleTurn] - and a - jr z, .enemy - ld a, [BattleMonStatus] - and 1 << BRN - ret z - ld hl, BattleMonAttack + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - ld [hli], a - or b - jr nz, .player_ok - ld b, $1 ; min attack - -.player_ok - ld [hl], b - ret - -.enemy - ld a, [EnemyMonStatus] - and 1 << BRN - ret z - ld hl, EnemyMonAttack + 1 - ld a, [hld] - ld b, a - ld a, [hl] - srl a - rr b - ld [hli], a - or b - jr nz, .enemy_ok - ld b, $1 ; min attack - -.enemy_ok - ld [hl], b - ret -; 3ecab - -ApplyStatLevelMultiplierOnAllStats: ; 3ecab -; Apply StatLevelMultipliers on all 5 Stats - ld c, 0 -.stat_loop - call ApplyStatLevelMultiplier - inc c - ld a, c - cp 5 - jr nz, .stat_loop - ret -; 3ecb7 - -ApplyStatLevelMultiplier: ; 3ecb7 - push bc - push bc - ld a, [wd265] - and a - ld a, c - ld hl, BattleMonAttack - ld de, PlayerStats - ld bc, PlayerAtkLevel - jr z, .got_pointers - ld hl, EnemyMonAttack - ld de, EnemyStats - ld bc, EnemyAtkLevel - -.got_pointers - add c - ld c, a - jr nc, .okay - inc b -.okay - ld a, [bc] - pop bc - ld b, a - push bc - sla c - ld b, 0 - add hl, bc - ld a, c - add e - ld e, a - jr nc, .okay2 - inc d -.okay2 - pop bc - push hl - ld hl, .StatLevelMultipliers - dec b - sla b - ld c, b - ld b, 0 - add hl, bc - xor a - ld [hMultiplicand + 0], a - ld a, [de] - ld [hMultiplicand + 1], a - inc de - ld a, [de] - ld [hMultiplicand + 2], a - ld a, [hli] - ld [hMultiplier], a - call Multiply - ld a, [hl] - ld [hDivisor], a - ld b, $4 - call Divide - pop hl - -; Cap at 999. - ld a, [hQuotient + 2] - sub LOW(MAX_STAT_VALUE) - ld a, [hQuotient + 1] - sbc HIGH(MAX_STAT_VALUE) - jp c, .okay3 - - ld a, HIGH(MAX_STAT_VALUE) - ld [hQuotient + 1], a - ld a, LOW(MAX_STAT_VALUE) - ld [hQuotient + 2], a - -.okay3 - ld a, [hQuotient + 1] - ld [hli], a - ld b, a - ld a, [hQuotient + 2] - ld [hl], a - or b - jr nz, .okay4 - inc [hl] - -.okay4 - pop bc - ret -; 3ed2b - -.StatLevelMultipliers: -; / - db 25, 100 ; 25% - db 28, 100 ; 28% - db 33, 100 ; 33% - db 40, 100 ; 40% - db 50, 100 ; 50% - db 66, 100 ; 66% - - db 1, 1 ; 100% - - db 15, 10 ; 150% - db 2, 1 ; 200% - db 25, 10 ; 250% - db 3, 1 ; 300% - db 35, 10 ; 350% - db 4, 1 ; 400% -; 3ed45 - -BadgeStatBoosts: ; 3ed45 -; Raise BattleMon stats depending on which badges have been obtained. - -; Every other badge boosts a stat, starting from the first. - -; ZephyrBadge: Attack -; PlainBadge: Speed -; MineralBadge: Defense -; GlacierBadge: Special Attack -; RisingBadge: Special Defense - -; The boosted stats are in order, except PlainBadge and MineralBadge's boosts are swapped. - - ld a, [wLinkMode] - and a - ret nz - - ld a, [InBattleTowerBattle] - and a - ret nz - - ld a, [JohtoBadges] - -; Swap badges 3 (PlainBadge) and 5 (MineralBadge). - ld d, a - and (1 << PLAINBADGE) - add a - add a - ld b, a - ld a, d - and (1 << MINERALBADGE) - rrca - rrca - ld c, a - ld a, d - and ((1 << ZEPHYRBADGE) | (1 << HIVEBADGE) | (1 << FOGBADGE) | (1 << STORMBADGE) | (1 << GLACIERBADGE) | (1 << RISINGBADGE)) - or b - or c - ld b, a - - ld hl, BattleMonAttack - ld c, 4 -.CheckBadge: - ld a, b - srl b - call c, BoostStat - inc hl - inc hl -; Check every other badge. - srl b - dec c - jr nz, .CheckBadge -; And the last one (RisingBadge) too. - srl a - call c, BoostStat - ret -; 3ed7c - -BoostStat: ; 3ed7c -; Raise stat at hl by 1/8. - - ld a, [hli] - ld d, a - ld e, [hl] - srl d - rr e - srl d - rr e - srl d - rr e - ld a, [hl] - add e - ld [hld], a - ld a, [hl] - adc d - ld [hli], a - -; Cap at 999. - ld a, [hld] - sub LOW(MAX_STAT_VALUE) - ld a, [hl] - sbc HIGH(MAX_STAT_VALUE) - ret c - ld a, HIGH(MAX_STAT_VALUE) - ld [hli], a - ld a, LOW(MAX_STAT_VALUE) - ld [hld], a - ret -; 3ed9f - -_LoadBattleFontsHPBar: ; 3ed9f - callfar LoadBattleFontsHPBar - ret -; 3eda6 - -_LoadHPBar: ; 3eda6 - callfar LoadHPBar - ret -; 3edad - -LoadHPExpBarGFX: ; unreferenced - ld de, EnemyHPBarBorderGFX - ld hl, VTiles2 tile $6c - lb bc, BANK(EnemyHPBarBorderGFX), 4 - call Get1bpp - ld de, HPExpBarBorderGFX - ld hl, VTiles2 tile $73 - lb bc, BANK(HPExpBarBorderGFX), 6 - call Get1bpp - ld de, ExpBarGFX - ld hl, VTiles2 tile $55 - lb bc, BANK(ExpBarGFX), 8 - jp Get2bpp -; 3edd1 - -EmptyBattleTextBox: ; 3edd1 - ld hl, .empty - jp BattleTextBox -.empty - db "@" -; 3edd8 - -_BattleRandom:: ; 3edd8 -; If the normal RNG is used in a link battle it'll desync. -; To circumvent this a shared PRNG is used instead. - -; But if we're in a non-link battle we're safe to use it - ld a, [wLinkMode] - and a - jp z, Random - -; The PRNG operates in streams of 10 values. - -; Which value are we trying to pull? - push hl - push bc - ld a, [LinkBattleRNCount] - ld c, a - ld b, 0 - ld hl, LinkBattleRNs - add hl, bc - inc a - ld [LinkBattleRNCount], a - -; If we haven't hit the end yet, we're good - cp 10 - 1 ; Exclude last value. See the closing comment - ld a, [hl] - pop bc - pop hl - ret c - -; If we have, we have to generate new pseudorandom data -; Instead of having multiple PRNGs, ten seeds are used - push hl - push bc - push af - -; Reset count to 0 - xor a - ld [LinkBattleRNCount], a - ld hl, LinkBattleRNs - ld b, 10 ; number of seeds - -; Generate next number in the sequence for each seed -; a[n+1] = (a[n] * 5 + 1) % 256 -.loop - ; get last # - ld a, [hl] - - ; a * 5 + 1 - ld c, a - add a - add a - add c - inc a - - ; update # - ld [hli], a - dec b - jr nz, .loop - -; This has the side effect of pulling the last value first, -; then wrapping around. As a result, when we check to see if -; we've reached the end, we check the one before it. - - pop af - pop bc - pop hl - ret -; 3ee0f - -Call_PlayBattleAnim_OnlyIfVisible: ; 3ee0f - ld a, BATTLE_VARS_SUBSTATUS3 - call GetBattleVar - and 1 << SUBSTATUS_FLYING | 1 << SUBSTATUS_UNDERGROUND - ret nz -; 3ee17 - -Call_PlayBattleAnim: ; 3ee17 - ld a, e - ld [FXAnimID], a - ld a, d - ld [FXAnimID + 1], a - call WaitBGMap - predef_jump PlayBattleAnim -; 3ee27 - -FinishBattleAnim: ; 3ee27 - push af - push bc - push de - push hl - ld b, SCGB_BATTLE_COLORS - call GetSGBLayout - call SetPalettes - call DelayFrame - pop hl - pop de - pop bc - pop af - ret -; 3ee3b - -GiveExperiencePoints: ; 3ee3b -; Give experience. -; Don't give experience if linked or in the Battle Tower. - ld a, [wLinkMode] - and a - ret nz - - ld a, [InBattleTowerBattle] - bit 0, a - ret nz - - call .EvenlyDivideExpAmongParticipants - xor a - ld [CurPartyMon], a - ld bc, PartyMon1Species - -.loop - ld hl, MON_HP - add hl, bc - ld a, [hli] - or [hl] - jp z, .skip_stats ; fainted - - push bc - ld hl, wBattleParticipantsNotFainted - ld a, [CurPartyMon] - ld c, a - ld b, CHECK_FLAG - ld d, $0 - predef FlagPredef - ld a, c - and a - pop bc - jp z, .skip_stats - -; give stat exp - ld hl, MON_STAT_EXP + 1 - add hl, bc - ld d, h - ld e, l - ld hl, EnemyMonBaseStats - 1 - push bc - ld c, $5 -.loop1 - inc hl - ld a, [de] - add [hl] - ld [de], a - jr nc, .okay1 - dec de - ld a, [de] - inc a - jr z, .next - ld [de], a - inc de - -.okay1 - push hl - push bc - ld a, MON_PKRUS - call GetPartyParamLocation - ld a, [hl] - and a - pop bc - pop hl - jr z, .skip - ld a, [de] - add [hl] - ld [de], a - jr nc, .skip - dec de - ld a, [de] - inc a - jr z, .next - ld [de], a - inc de - jr .skip - -.next - ld a, $ff - ld [de], a - inc de - ld [de], a - -.skip - inc de - inc de - dec c - jr nz, .loop1 - xor a - ld [hMultiplicand + 0], a - ld [hMultiplicand + 1], a - ld a, [EnemyMonBaseExp] - ld [hMultiplicand + 2], a - ld a, [EnemyMonLevel] - ld [hMultiplier], a - call Multiply - ld a, 7 - ld [hDivisor], a - ld b, 4 - call Divide -; Boost Experience for traded Pokemon - pop bc - ld hl, MON_ID - add hl, bc - ld a, [PlayerID] - cp [hl] - jr nz, .boosted - inc hl - ld a, [PlayerID + 1] - cp [hl] - ld a, $0 - jr z, .no_boost - -.boosted - call BoostExp - ld a, $1 - -.no_boost -; Boost experience for a Trainer Battle - ld [StringBuffer2 + 2], a - ld a, [wBattleMode] - dec a - call nz, BoostExp -; Boost experience for Lucky Egg - push bc - ld a, MON_ITEM - call GetPartyParamLocation - ld a, [hl] - cp LUCKY_EGG - call z, BoostExp - ld a, [hQuotient + 2] - ld [StringBuffer2 + 1], a - ld a, [hQuotient + 1] - ld [StringBuffer2], a - ld a, [CurPartyMon] - ld hl, PartyMonNicknames - call GetNick - ld hl, Text_PkmnGainedExpPoint - call BattleTextBox - ld a, [StringBuffer2 + 1] - ld [hQuotient + 2], a - ld a, [StringBuffer2] - ld [hQuotient + 1], a - pop bc - call AnimateExpBar - push bc - call LoadTileMapToTempTileMap - pop bc - ld hl, MON_STAT_EXP - 1 - add hl, bc - ld d, [hl] - ld a, [hQuotient + 2] - add d - ld [hld], a - ld d, [hl] - ld a, [hQuotient + 1] - adc d - ld [hl], a - jr nc, .skip2 - dec hl - inc [hl] - jr nz, .skip2 - ld a, $ff - ld [hli], a - ld [hli], a - ld [hl], a - -.skip2 - ld a, [CurPartyMon] - ld e, a - ld d, $0 - ld hl, PartySpecies - add hl, de - ld a, [hl] - ld [CurSpecies], a - call GetBaseData - push bc - ld d, MAX_LEVEL - callfar CalcExpAtLevel - pop bc - ld hl, MON_STAT_EXP - 1 - add hl, bc - push bc - ld a, [hQuotient] - ld b, a - ld a, [hQuotient + 1] - ld c, a - ld a, [hQuotient + 2] - ld d, a - ld a, [hld] - sub d - ld a, [hld] - sbc c - ld a, [hl] - sbc b - jr c, .not_max_exp - ld a, b - ld [hli], a - ld a, c - ld [hli], a - ld a, d - ld [hld], a - -.not_max_exp - xor a ; PARTYMON - ld [MonType], a - predef CopyPkmnToTempMon - callfar CalcLevel - pop bc - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - cp MAX_LEVEL - jp nc, .skip_stats - cp d - jp z, .skip_stats -; <NICKNAME> grew to level ##! - ld [wTempLevel], a - ld a, [CurPartyLevel] - push af - ld a, d - ld [CurPartyLevel], a - ld [hl], a - ld hl, MON_SPECIES - add hl, bc - ld a, [hl] - ld [CurSpecies], a - ld [wd265], a - call GetBaseData - ld hl, MON_MAXHP + 1 - add hl, bc - ld a, [hld] - ld e, a - ld d, [hl] - push de - ld hl, MON_MAXHP - add hl, bc - ld d, h - ld e, l - ld hl, MON_STAT_EXP - 1 - add hl, bc - push bc - ld b, TRUE - predef CalcPkmnStats - pop bc - pop de - ld hl, MON_MAXHP + 1 - add hl, bc - ld a, [hld] - sub e - ld e, a - ld a, [hl] - sbc d - ld d, a - dec hl - ld a, [hl] - add e - ld [hld], a - ld a, [hl] - adc d - ld [hl], a - ld a, [CurBattleMon] - ld d, a - ld a, [CurPartyMon] - cp d - jr nz, .skip_animation - ld de, BattleMonHP - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ld de, BattleMonMaxHP - push bc - ld bc, PARTYMON_STRUCT_LENGTH - MON_MAXHP - call CopyBytes - pop bc - ld hl, MON_LEVEL - add hl, bc - ld a, [hl] - ld [BattleMonLevel], a - ld a, [PlayerSubStatus5] - bit SUBSTATUS_TRANSFORMED, a - jr nz, .transformed - ld hl, MON_ATK - add hl, bc - ld de, PlayerStats - ld bc, PARTYMON_STRUCT_LENGTH - MON_ATK - call CopyBytes - -.transformed - xor a - ld [wd265], a - call ApplyStatLevelMultiplierOnAllStats - callfar ApplyStatusEffectOnPlayerStats - callfar BadgeStatBoosts - callfar UpdatePlayerHUD - call EmptyBattleTextBox - call LoadTileMapToTempTileMap - ld a, $1 - ld [hBGMapMode], a - -.skip_animation - farcall LevelUpHappinessMod - ld a, [CurBattleMon] - ld b, a - ld a, [CurPartyMon] - cp b - jr z, .skip_animation2 - ld de, SFX_HIT_END_OF_EXP_BAR - call PlaySFX - call WaitSFX - ld hl, BattleText_StringBuffer1GrewToLevel - call StdBattleTextBox - call LoadTileMapToTempTileMap - -.skip_animation2 - xor a ; PARTYMON - ld [MonType], a - predef CopyPkmnToTempMon - hlcoord 9, 0 - ld b, $a - ld c, $9 - call TextBox - hlcoord 11, 1 - ld bc, 4 - predef PrintTempMonStats - ld c, $1e - call DelayFrames - call WaitPressAorB_BlinkCursor - call Call_LoadTempTileMapToTileMap - xor a ; PARTYMON - ld [MonType], a - ld a, [CurSpecies] - ld [wd265], a - ld a, [CurPartyLevel] - push af - ld c, a - ld a, [wTempLevel] - ld b, a - -.level_loop - inc b - ld a, b - ld [CurPartyLevel], a - push bc - predef LearnLevelMoves - pop bc - ld a, b - cp c - jr nz, .level_loop - pop af - ld [CurPartyLevel], a - ld hl, EvolvableFlags - ld a, [CurPartyMon] - ld c, a - ld b, SET_FLAG - predef FlagPredef - pop af - ld [CurPartyLevel], a - -.skip_stats - ld a, [PartyCount] - ld b, a - ld a, [CurPartyMon] - inc a - cp b - jr z, .done - ld [CurPartyMon], a - ld a, MON_SPECIES - call GetPartyParamLocation - ld b, h - ld c, l - jp .loop - -.done - jp ResetBattleParticipants -; 3f0d4 - -.EvenlyDivideExpAmongParticipants: -; count number of battle participants - ld a, [wBattleParticipantsNotFainted] - ld b, a - ld c, PARTY_LENGTH - ld d, 0 -.count_loop - xor a - srl b - adc d - ld d, a - dec c - jr nz, .count_loop - cp 2 - ret c - - ld [wd265], a - ld hl, EnemyMonBaseStats - ld c, EnemyMonEnd - EnemyMonBaseStats -.count_loop2 - xor a - ld [hDividend + 0], a - ld a, [hl] - ld [hDividend + 1], a - ld a, [wd265] - ld [hDivisor], a - ld b, 2 - call Divide - ld a, [hQuotient + 2] - ld [hli], a - dec c - jr nz, .count_loop2 - ret -; 3f106 - -BoostExp: ; 3f106 -; Multiply experience by 1.5x - push bc -; load experience value - ld a, [hProduct + 2] - ld b, a - ld a, [hProduct + 3] - ld c, a -; halve it - srl b - rr c -; add it back to the whole exp value - add c - ld [hProduct + 3], a - ld a, [hProduct + 2] - adc b - ld [hProduct + 2], a - pop bc - ret -; 3f11b - -Text_PkmnGainedExpPoint: ; 3f11b - text_jump Text_Gained - start_asm - ld hl, TextJump_StringBuffer2ExpPoints - ld a, [StringBuffer2 + 2] ; IsTradedMon - and a - ret z - - ld hl, TextJump_ABoostedStringBuffer2ExpPoints - ret -; 3f12c - -TextJump_ABoostedStringBuffer2ExpPoints: ; 3f12c - text_jump Text_ABoostedStringBuffer2ExpPoints - db "@" -; 3f131 - -TextJump_StringBuffer2ExpPoints: ; 3f131 - text_jump Text_StringBuffer2ExpPoints - db "@" -; 3f136 - -AnimateExpBar: ; 3f136 - push bc - - ld hl, CurPartyMon - ld a, [CurBattleMon] - cp [hl] - jp nz, .finish - - ld a, [BattleMonLevel] - cp MAX_LEVEL - jp nc, .finish - - ld a, [hProduct + 3] - ld [wd004], a - push af - ld a, [hProduct + 2] - ld [wd003], a - push af - xor a - ld [wd002], a - xor a ; PARTYMON - ld [MonType], a - predef CopyPkmnToTempMon - ld a, [TempMonLevel] - ld b, a - ld e, a - push de - ld de, TempMonExp + 2 - call CalcExpBar - push bc - ld hl, TempMonExp + 2 - ld a, [wd004] - add [hl] - ld [hld], a - ld a, [wd003] - adc [hl] - ld [hld], a - jr nc, .NoOverflow - inc [hl] - jr nz, .NoOverflow - ld a, $ff - ld [hli], a - ld [hli], a - ld [hl], a - -.NoOverflow: - ld d, MAX_LEVEL - callfar CalcExpAtLevel - ld a, [hProduct + 1] - ld b, a - ld a, [hProduct + 2] - ld c, a - ld a, [hProduct + 3] - ld d, a - ld hl, TempMonExp + 2 - ld a, [hld] - sub d - ld a, [hld] - sbc c - ld a, [hl] - sbc b - jr c, .AlreadyAtMaxExp - ld a, b - ld [hli], a - ld a, c - ld [hli], a - ld a, d - ld [hld], a - -.AlreadyAtMaxExp: - callfar CalcLevel - ld a, d - pop bc - pop de - ld d, a - cp e - jr nc, .LoopLevels - ld a, e - ld d, a - -.LoopLevels: - ld a, e - cp MAX_LEVEL - jr nc, .FinishExpBar - cp d - jr z, .FinishExpBar - inc a - ld [TempMonLevel], a - ld [CurPartyLevel], a - ld [BattleMonLevel], a - push de - call .PlayExpBarSound - ld c, $40 - call .LoopBarAnimation - call PrintPlayerHUD - ld hl, BattleMonNick - ld de, StringBuffer1 - ld bc, PKMN_NAME_LENGTH - call CopyBytes - call TerminateExpBarSound - ld de, SFX_HIT_END_OF_EXP_BAR - call PlaySFX - farcall AnimateEndOfExpBar - call WaitSFX - ld hl, BattleText_StringBuffer1GrewToLevel - call StdBattleTextBox - pop de - inc e - ld b, $0 - jr .LoopLevels - -.FinishExpBar: - push bc - ld b, d - ld de, TempMonExp + 2 - call CalcExpBar - ld a, b - pop bc - ld c, a - call .PlayExpBarSound - call .LoopBarAnimation - call TerminateExpBarSound - pop af - ld [hProduct + 2], a - pop af - ld [hProduct + 3], a - -.finish - pop bc - ret - -.PlayExpBarSound: - push bc - call WaitSFX - ld de, SFX_EXP_BAR - call PlaySFX - ld c, 10 - call DelayFrames - pop bc - ret - -.LoopBarAnimation: - ld d, 3 - dec b -.anim_loop - inc b - push bc - push de - hlcoord 17, 11 - call PlaceExpBar - pop de - ld a, $1 - ld [hBGMapMode], a - ld c, d - call DelayFrames - xor a - ld [hBGMapMode], a - pop bc - ld a, c - cp b - jr z, .end_animation - inc b - push bc - push de - hlcoord 17, 11 - call PlaceExpBar - pop de - ld a, $1 - ld [hBGMapMode], a - ld c, d - call DelayFrames - xor a - ld [hBGMapMode], a - dec d - jr nz, .min_number_of_frames - ld d, 1 -.min_number_of_frames - pop bc - ld a, c - cp b - jr nz, .anim_loop -.end_animation - ld a, $1 - ld [hBGMapMode], a - ret - -SendOutPkmnText: ; 3f26d - ld a, [wLinkMode] - and a - jr z, .not_linked - - ld hl, JumpText_GoPkmn ; If we're in a LinkBattle print just "Go <PlayerMon>" - - ld a, [wBattleHasJustStarted] ; unless this (unidentified) variable is set - and a - jr nz, .skip_to_textbox - -.not_linked -; Depending on the HP of the enemy Pkmn, the game prints a different text - ld hl, EnemyMonHP - ld a, [hli] - or [hl] - ld hl, JumpText_GoPkmn - jr z, .skip_to_textbox - - ; compute enemy helth remaining as a percentage - xor a - ld [hMultiplicand + 0], a - ld hl, EnemyMonHP - ld a, [hli] - ld [wEnemyHPAtTimeOfPlayerSwitch], a - ld [hMultiplicand + 1], a - ld a, [hl] - ld [wEnemyHPAtTimeOfPlayerSwitch + 1], a - ld [hMultiplicand + 2], a - ld a, 25 - ld [hMultiplier], a - call Multiply - ld hl, EnemyMonMaxHP - ld a, [hli] - ld b, [hl] - srl a - rr b - srl a - rr b - ld a, b - ld b, 4 - ld [hDivisor], a - call Divide - - ld a, [hQuotient + 2] - ld hl, JumpText_GoPkmn - cp 70 - jr nc, .skip_to_textbox - - ld hl, JumpText_DoItPkmn - cp 40 - jr nc, .skip_to_textbox - - ld hl, JumpText_GoForItPkmn - cp 10 - jr nc, .skip_to_textbox - - ld hl, JumpText_YourFoesWeakGetmPkmn -.skip_to_textbox - jp BattleTextBox -; 3f2d1 - -JumpText_GoPkmn: ; 3f2d1 - text_jump Text_GoPkmn - start_asm - jr Function_TextJump_BattleMonNick01 -; 3f2d6 - -JumpText_DoItPkmn: ; 3f2d8 - text_jump Text_DoItPkmn - start_asm - jr Function_TextJump_BattleMonNick01 -; 3f2dd - -JumpText_GoForItPkmn: ; 3f2df - text_jump Text_GoForItPkmn - start_asm - jr Function_TextJump_BattleMonNick01 -; 3f2e4 - -JumpText_YourFoesWeakGetmPkmn: ; 3f2e6 - text_jump Text_YourFoesWeakGetmPkmn - start_asm -Function_TextJump_BattleMonNick01: ; 3f2eb - ld hl, TextJump_BattleMonNick01 - ret -; 3f2ef - -TextJump_BattleMonNick01: ; 3f2ef - text_jump Text_BattleMonNick01 - db "@" -; 3f2f4 - -WithdrawPkmnText: ; 3f2f4 - ld hl, .WithdrawPkmnText - jp BattleTextBox - -.WithdrawPkmnText: - text_jump Text_BattleMonNickComma - start_asm -; Print text to withdraw Pkmn -; depending on HP the message is different - push de - push bc - ld hl, EnemyMonHP + 1 - ld de, wEnemyHPAtTimeOfPlayerSwitch + 1 - ld b, [hl] - dec hl - ld a, [de] - sub b - ld [hMultiplicand + 2], a - dec de - ld b, [hl] - ld a, [de] - sbc b - ld [hMultiplicand + 1], a - ld a, 25 - ld [hMultiplier], a - call Multiply - ld hl, EnemyMonMaxHP - ld a, [hli] - ld b, [hl] - srl a - rr b - srl a - rr b - ld a, b - ld b, 4 - ld [hDivisor], a - call Divide - pop bc - pop de - ld a, [hQuotient + 2] - ld hl, TextJump_ThatsEnoughComeBack - and a - ret z - - ld hl, TextJump_ComeBack - cp 30 - ret c - - ld hl, TextJump_OKComeBack - cp 70 - ret c - - ld hl, TextJump_GoodComeBack - ret -; 3f348 - -TextJump_ThatsEnoughComeBack: ; 3f348 - text_jump Text_ThatsEnoughComeBack - db "@" -; 3f34d - -TextJump_OKComeBack: ; 3f34d - text_jump Text_OKComeBack - db "@" -; 3f352 - -TextJump_GoodComeBack: ; 3f352 - text_jump Text_GoodComeBack - db "@" -; 3f357 - -UnusedFunction_TextJump_ComeBack: ; 3f357 -; this function doesn't seem to be used - ld hl, TextJump_ComeBack - ret -; 3f35b - -TextJump_ComeBack: ; 3f35b - text_jump Text_ComeBack - db "@" -; 3f360 - -HandleSafariAngerEatingStatus: ; unreferenced - ld hl, wSafariMonEating - ld a, [hl] - and a - jr z, .angry - dec [hl] - ld hl, BattleText_WildPkmnIsEating - jr .finish - -.angry - dec hl ; wSafariMonAngerCount - ld a, [hl] - and a - ret z - dec [hl] - ld hl, BattleText_WildPkmnIsAngry - jr nz, .finish - push hl - ld a, [EnemyMonSpecies] - ld [CurSpecies], a - call GetBaseData - ld a, [BaseCatchRate] - ld [EnemyMonCatchRate], a - pop hl - -.finish - push hl - call Call_LoadTempTileMapToTileMap - pop hl - jp StdBattleTextBox -; 3f390 - -FillInExpBar: ; 3f390 - push hl - call CalcExpBar - pop hl - ld de, 7 - add hl, de - jp PlaceExpBar -; 3f39c - -CalcExpBar: ; 3f39c -; Calculate the percent exp between this level and the next -; Level in b - push de - ld d, b - push de - callfar CalcExpAtLevel - pop de -; exp at current level gets pushed to the stack - ld hl, hMultiplicand - ld a, [hli] - push af - ld a, [hli] - push af - ld a, [hl] - push af -; next level - inc d - callfar CalcExpAtLevel -; back up the next level exp, and subtract the two levels - ld hl, hMultiplicand + 2 - ld a, [hl] - ld [hMathBuffer + 2], a - pop bc - sub b - ld [hld], a - ld a, [hl] - ld [hMathBuffer + 1], a - pop bc - sbc b - ld [hld], a - ld a, [hl] - ld [hMathBuffer], a - pop bc - sbc b - ld [hl], a - pop de - - ld hl, hMultiplicand + 1 - ld a, [hli] - push af - ld a, [hl] - push af - -; get the amount of exp remaining to the next level - ld a, [de] - dec de - ld c, a - ld a, [hMathBuffer + 2] - sub c - ld [hld], a - ld a, [de] - dec de - ld b, a - ld a, [hMathBuffer + 1] - sbc b - ld [hld], a - ld a, [de] - ld c, a - ld a, [hMathBuffer] - sbc c - ld [hld], a - xor a - ld [hl], a -; multiply by 64 - ld a, $40 - ld [hMultiplier], a - call Multiply - pop af - ld c, a - pop af - ld b, a -.loop - ld a, b - and a - jr z, .done - srl b - rr c - ld hl, hProduct - srl [hl] - inc hl - rr [hl] - inc hl - rr [hl] - inc hl - rr [hl] - jr .loop - -.done - ld a, c - ld [hDivisor], a - ld b, 4 - call Divide - ld a, [hQuotient + 2] - ld b, a - ld a, $40 - sub b - ld b, a - ret -; 3f41c - -PlaceExpBar: ; 3f41c - ld c, $8 ; number of tiles -.loop1 - ld a, b - sub $8 - jr c, .next - ld b, a - ld a, $6a ; full bar - ld [hld], a - dec c - jr z, .finish - jr .loop1 - -.next - add $8 - jr z, .loop2 - add $54 ; tile to the left of small exp bar tile - jr .skip - -.loop2 - ld a, $62 ; empty bar - -.skip - ld [hld], a - ld a, $62 ; empty bar - dec c - jr nz, .loop2 - -.finish - ret -; 3f43d - -GetBattleMonBackpic: ; 3f43d - ld a, [PlayerSubStatus4] - bit SUBSTATUS_SUBSTITUTE, a - ld hl, BattleAnimCmd_RaiseSub - jr nz, GetBattleMonBackpic_DoAnim ; substitute - -DropPlayerSub: ; 3f447 - ld a, [wPlayerMinimized] - and a - ld hl, BattleAnimCmd_MinimizeOpp - jr nz, GetBattleMonBackpic_DoAnim - ld a, [CurPartySpecies] - push af - ld a, [BattleMonSpecies] - ld [CurPartySpecies], a - ld hl, BattleMonDVs - predef GetUnownLetter - ld de, VTiles2 tile $31 - predef GetMonBackpic - pop af - ld [CurPartySpecies], a - ret -; 3f46f - -GetBattleMonBackpic_DoAnim: ; 3f46f - ld a, [hBattleTurn] - push af - xor a - ld [hBattleTurn], a - ld a, BANK(BattleAnimCommands) - rst FarCall - pop af - ld [hBattleTurn], a - ret -; 3f47c - -GetEnemyMonFrontpic: ; 3f47c - ld a, [EnemySubStatus4] - bit SUBSTATUS_SUBSTITUTE, a - ld hl, BattleAnimCmd_RaiseSub - jr nz, GetEnemyMonFrontpic_DoAnim - -DropEnemySub: ; 3f486 - ld a, [wEnemyMinimized] - and a - ld hl, BattleAnimCmd_MinimizeOpp - jr nz, GetEnemyMonFrontpic_DoAnim - - ld a, [CurPartySpecies] - push af - ld a, [EnemyMonSpecies] - ld [CurSpecies], a - ld [CurPartySpecies], a - call GetBaseData - ld hl, EnemyMonDVs - predef GetUnownLetter - ld de, VTiles2 - predef GetAnimatedFrontpicPredef - pop af - ld [CurPartySpecies], a - ret -; 3f4b4 - -GetEnemyMonFrontpic_DoAnim: ; 3f4b4 - ld a, [hBattleTurn] - push af - call SetEnemyTurn - ld a, BANK(BattleAnimCommands) - rst FarCall - pop af - ld [hBattleTurn], a - ret -; 3f4c1 - -StartBattle: ; 3f4c1 -; This check prevents you from entering a battle without any Pokemon. -; Those using walk-through-walls to bypass getting a Pokemon experience -; the effects of this check. - ld a, [PartyCount] - and a - ret z - - ld a, [TimeOfDayPal] - push af - call BattleIntro - call DoBattle - call ExitBattle - pop af - ld [TimeOfDayPal], a - scf - ret -; 3f4d9 - -_DoBattle: ; 3f4d9 -; unreferenced - call DoBattle - ret -; 3f4dd - -BattleIntro: ; 3f4dd - farcall TrainerRankings_Battles ; mobile - call LoadTrainerOrWildMonPic - xor a - ld [TempBattleMonSpecies], a - ld [wBattleMenuCursorBuffer], a - xor a - ld [hMapAnims], a - farcall PlayBattleMusic - farcall ShowLinkBattleParticipants - farcall FindFirstAliveMonAndStartBattle - call DisableSpriteUpdates - farcall ClearBattleRAM - call InitEnemy - call BackUpVBGMap2 - ld b, SCGB_BATTLE_GRAYSCALE - call GetSGBLayout - ld hl, rLCDC - res 6, [hl] - call InitBattleDisplay - call BattleStartMessage - ld hl, rLCDC - set 6, [hl] - xor a - ld [hBGMapMode], a - call EmptyBattleTextBox - hlcoord 9, 7 - lb bc, 5, 11 - call ClearBox - hlcoord 1, 0 - lb bc, 4, 10 - call ClearBox - call ClearSprites - ld a, [wBattleMode] - cp WILD_BATTLE - call z, UpdateEnemyHUD - ld a, $1 - ld [hBGMapMode], a - ret -; 3f54e - -LoadTrainerOrWildMonPic: ; 3f54e - ld a, [OtherTrainerClass] - and a - jr nz, .Trainer - ld a, [TempWildMonSpecies] - ld [CurPartySpecies], a - -.Trainer: - ld [TempEnemyMonSpecies], a - ret -; 3f55e - -InitEnemy: ; 3f55e - ld a, [OtherTrainerClass] - and a - jp nz, InitEnemyTrainer ; trainer - jp InitEnemyWildmon ; wild -; 3f568 - -BackUpVBGMap2: ; 3f568 - ld a, [rSVBK] - push af - ld a, $6 ; BANK(wDecompressScratch) - ld [rSVBK], a - ld hl, wDecompressScratch - ld bc, $40 tiles ; VBGMap3 - VBGMap2 - ld a, $2 - call ByteFill - ld a, [rVBK] - push af - ld a, $1 - ld [rVBK], a - ld de, wDecompressScratch - hlbgcoord 0, 0 ; VBGMap2 - lb bc, BANK(BackUpVBGMap2), $40 - call Request2bpp - pop af - ld [rVBK], a - pop af - ld [rSVBK], a - ret -; 3f594 - -InitEnemyTrainer: ; 3f594 - ld [TrainerClass], a - farcall TrainerRankings_TrainerBattles - xor a - ld [TempEnemyMonSpecies], a - callfar GetTrainerAttributes - callfar ReadTrainerParty - - ld a, [TrainerClass] - cp RIVAL1 - jr nz, .ok - xor a - ld [OTPartyMon1Item], a -.ok - - ld de, VTiles2 - callfar GetTrainerPic - xor a - ld [hGraphicStartTile], a - dec a - ld [wEnemyItemState], a - hlcoord 12, 0 - lb bc, 7, 7 - predef PlaceGraphic - ld a, -1 - ld [CurOTMon], a - ld a, TRAINER_BATTLE - ld [wBattleMode], a - - call IsJohtoGymLeader - jr nc, .done - xor a - ld [CurPartyMon], a - ld a, [PartyCount] - ld b, a -.partyloop - push bc - ld a, MON_HP - call GetPartyParamLocation - ld a, [hli] - or [hl] - jr z, .skipfaintedmon - ld c, HAPPINESS_GYMBATTLE - callfar ChangeHappiness -.skipfaintedmon - pop bc - dec b - jr z, .done - ld hl, CurPartyMon - inc [hl] - jr .partyloop -.done - ret -; 3f607 - -InitEnemyWildmon: ; 3f607 - ld a, WILD_BATTLE - ld [wBattleMode], a - farcall TrainerRankings_WildBattles - call LoadEnemyMon - ld hl, EnemyMonMoves - ld de, wWildMonMoves - ld bc, NUM_MOVES - call CopyBytes - ld hl, EnemyMonPP - ld de, wWildMonPP - ld bc, NUM_MOVES - call CopyBytes - ld hl, EnemyMonDVs - predef GetUnownLetter - ld a, [CurPartySpecies] - cp UNOWN - jr nz, .skip_unown - ld a, [wFirstUnownSeen] - and a - jr nz, .skip_unown - ld a, [UnownLetter] - ld [wFirstUnownSeen], a -.skip_unown - ld de, VTiles2 - predef GetAnimatedFrontpicPredef - xor a - ld [TrainerClass], a - ld [hGraphicStartTile], a - hlcoord 12, 0 - lb bc, 7, 7 - predef PlaceGraphic - ret -; 3f662 - -Function3f662: ; 3f662 -; XXX - ld hl, EnemyMonMoves - ld de, wListMoves_MoveIndicesBuffer - ld b, NUM_MOVES -.loop - ld a, [de] - inc de - ld [hli], a - and a - jr z, .clearpp - - push bc - push hl - - push hl - dec a - ld hl, Moves + MOVE_PP - ld bc, MOVE_LENGTH - call AddNTimes - ld a, BANK(Moves) - call GetFarByte - pop hl - - ld bc, EnemyMonPP - (EnemyMonMoves + 1) - add hl, bc - ld [hl], a - - pop hl - pop bc - - dec b - jr nz, .loop - ret - -.clear - xor a - ld [hli], a - -.clearpp - push bc - push hl - ld bc, EnemyMonPP - (EnemyMonMoves + 1) - add hl, bc - xor a - ld [hl], a - pop hl - pop bc - dec b - jr nz, .clear - ret -; 3f69e - -ExitBattle: ; 3f69e - call .HandleEndOfBattle - call CleanUpBattleRAM - ret -; 3f6a5 - -.HandleEndOfBattle: ; 3f6a5 - ld a, [wLinkMode] - and a - jr z, .not_linked - call ShowLinkBattleParticipantsAfterEnd - ld c, 150 - call DelayFrames - call DisplayLinkBattleResult - ret - -.not_linked - ld a, [wBattleResult] - and $f - ret nz - call CheckPayDay - xor a - ld [wForceEvolution], a - predef EvolveAfterBattle - farcall GivePokerusAndConvertBerries - ret -; 3f6d0 - -CleanUpBattleRAM: ; 3f6d0 - call BattleEnd_HandleRoamMons - xor a - ld [Danger], a - ld [wBattleMode], a - ld [BattleType], a - ld [AttackMissed], a - ld [TempWildMonSpecies], a - ld [OtherTrainerClass], a - ld [wFailedToFlee], a - ld [wNumFleeAttempts], a - ld [wForcedSwitch], a - ld [wPartyMenuCursor], a - ld [wKeyItemsPocketCursor], a - ld [wItemsPocketCursor], a - ld [wBattleMenuCursorBuffer], a - ld [CurMoveNum], a - ld [wBallsPocketCursor], a - ld [wLastPocket], a - ld [wMenuScrollPosition], a - ld [wKeyItemsPocketScrollPosition], a - ld [wItemsPocketScrollPosition], a - ld [wBallsPocketScrollPosition], a - ld hl, PlayerSubStatus1 - ld b, EnemyFuryCutterCount - PlayerSubStatus1 -.loop - ld [hli], a - dec b - jr nz, .loop - call WaitSFX - ret -; 3f71d - -CheckPayDay: ; 3f71d - ld hl, wPayDayMoney - ld a, [hli] - or [hl] - inc hl - or [hl] - ret z - ld a, [wAmuletCoin] - and a - jr z, .okay - ld hl, wPayDayMoney + 2 - sla [hl] - dec hl - rl [hl] - dec hl - rl [hl] - jr nc, .okay - ld a, $ff - ld [hli], a - ld [hli], a - ld [hl], a - -.okay - ld hl, wPayDayMoney + 2 - ld de, Money + 2 - call AddBattleMoneyToAccount - ld hl, BattleText_PlayerPickedUpPayDayMoney - call StdBattleTextBox - ld a, [InBattleTowerBattle] - bit 0, a - ret z - call ClearTileMap - call ClearBGPalettes - ret -; 3f759 - -ShowLinkBattleParticipantsAfterEnd: ; 3f759 - farcall TrainerRankings_LinkBattles - farcall BackupMobileEventIndex - ld a, [CurOTMon] - ld hl, OTPartyMon1Status - call GetPartyLocation - ld a, [EnemyMonStatus] - ld [hl], a - call ClearTileMap - farcall _ShowLinkBattleParticipants - ret -; 3f77c - -DisplayLinkBattleResult: ; 3f77c - farcall CheckMobileBattleError - jp c, .Mobile_InvalidBattle - call IsMobileBattle2 - jr nz, .proceed - - ld hl, wcd2a - bit 4, [hl] - jr z, .proceed - - farcall DetermineLinkBattleResult - -.proceed - ld a, [wBattleResult] - and $f - cp $1 - jr c, .victory - jr z, .loss - farcall TrainerRankings_ColosseumDraws - ld de, .Draw - jr .store_result - -.victory - farcall TrainerRankings_ColosseumWins - ld de, .Win - jr .store_result - -.loss - farcall TrainerRankings_ColosseumLosses - ld de, .Lose - jr .store_result - -.store_result - hlcoord 6, 8 - call PlaceString - farcall BackupMobileEventIndex - ld c, 200 - call DelayFrames - - ld a, BANK(sLinkBattleStats) - call GetSRAMBank - - call AddLastMobileBattleToLinkRecord - call ReadAndPrintLinkBattleRecord - - call CloseSRAM - - call IsMobileBattle2 - jr z, .mobile - call WaitPressAorB_BlinkCursor - call ClearTileMap - ret - -.mobile - ld c, 200 - call DelayFrames - call ClearTileMap - ret -; 3f7f7 - -.Win: - db "YOU WIN@" -.Lose: - db "YOU LOSE@" -.Draw: - db " DRAW@" -; 3f80f - -.Mobile_InvalidBattle: ; 3f80f - hlcoord 6, 8 - ld de, .Invalid - call PlaceString - ld c, 200 - call DelayFrames - call ClearTileMap - ret -; 3f821 - -.Invalid: - db "INVALID BATTLE@" -; 3f830 - -IsMobileBattle2: ; 3f830 - ld a, [wLinkMode] - cp LINK_MOBILE - ret -; 3f836 - -DisplayLinkRecord: ; 3f836 - ld a, BANK(sLinkBattleStats) - call GetSRAMBank - - call ReadAndPrintLinkBattleRecord - - call CloseSRAM - hlcoord 0, 0, AttrMap - xor a - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT - call ByteFill - call WaitBGMap2 - ld b, SCGB_DIPLOMA - call GetSGBLayout - call SetPalettes - ld c, 8 - call DelayFrames - call WaitPressAorB_BlinkCursor - ret -; 3f85f - -ReadAndPrintLinkBattleRecord: ; 3f85f - call ClearTileMap - call ClearSprites - call .PrintBattleRecord - hlcoord 0, 8 - ld b, 5 - ld de, sLinkBattleRecord + 2 -.loop - push bc - push hl - push de - ld a, [de] - and a - jr z, .PrintFormatString - ld a, [wSavedAtLeastOnce] - and a - jr z, .PrintFormatString - push hl - push hl - ld h, d - ld l, e - ld de, wd002 - ld bc, 10 - call CopyBytes - ld a, "@" - ld [de], a - inc de - ld bc, 6 - call CopyBytes - ld de, wd002 - pop hl - call PlaceString - pop hl - ld de, 26 - add hl, de - push hl - ld de, wd00d - lb bc, 2, 4 - call PrintNum - pop hl - ld de, 5 - add hl, de - push hl - ld de, wd00f - lb bc, 2, 4 - call PrintNum - pop hl - ld de, 5 - add hl, de - ld de, wd011 - lb bc, 2, 4 - call PrintNum - jr .next - -.PrintFormatString: - ld de, .Format - call PlaceString -.next - pop hl - ld bc, 18 - add hl, bc - ld d, h - ld e, l - pop hl - ld bc, 2 * SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .loop - ret - -.PrintBattleRecord: - hlcoord 1, 0 - ld de, .Record - call PlaceString - - hlcoord 0, 6 - ld de, .Result - call PlaceString - - hlcoord 0, 2 - ld de, .Total - call PlaceString - - hlcoord 6, 4 - ld de, sLinkBattleWins - call .PrintZerosIfNoSaveFileExists - jr c, .quit - - lb bc, 2, 4 - call PrintNum - - hlcoord 11, 4 - ld de, sLinkBattleLosses - call .PrintZerosIfNoSaveFileExists - - lb bc, 2, 4 - call PrintNum - - hlcoord 16, 4 - ld de, sLinkBattleDraws - call .PrintZerosIfNoSaveFileExists - - lb bc, 2, 4 - call PrintNum - -.quit - ret - -.PrintZerosIfNoSaveFileExists: - ld a, [wSavedAtLeastOnce] - and a - ret nz - ld de, .Scores - call PlaceString - scf - ret -; 3f938 - -.Scores: - db " 0 0 0@" -; 3f947 - -.Format: ; 3f947 - db " --- <LNBRK>" - db " - - -@" -.Record: ; 3f964 - db "<PLAYER>'s RECORD@" -.Result: ; 3f96e - db "RESULT WIN LOSE DRAW@" -.Total: ; 3f983 - db "TOTAL WIN LOSE DRAW@" -; 3f998 - -BattleEnd_HandleRoamMons: ; 3f998 - ld a, [BattleType] - cp BATTLETYPE_ROAMING - jr nz, .not_roaming - ld a, [wBattleResult] - and $f - jr z, .caught_or_defeated_roam_mon - call GetRoamMonHP - ld a, [EnemyMonHP + 1] - ld [hl], a - jr .update_roam_mons - -.caught_or_defeated_roam_mon - call GetRoamMonHP - ld [hl], $0 - call GetRoamMonMapGroup - ld [hl], $ff - call GetRoamMonMapNumber - ld [hl], $ff - call GetRoamMonSpecies - ld [hl], $0 - ret - -.not_roaming - call BattleRandom - and $f - ret nz - -.update_roam_mons - callfar UpdateRoamMons - ret -; 3f9d1 - -GetRoamMonMapGroup: ; 3f9d1 - ld a, [TempEnemyMonSpecies] - ld b, a - ld a, [wRoamMon1Species] - cp b - ld hl, wRoamMon1MapGroup - ret z - ld a, [wRoamMon2Species] - cp b - ld hl, wRoamMon2MapGroup - ret z - ld hl, wRoamMon3MapGroup - ret -; 3f9e9 - -GetRoamMonMapNumber: ; 3f9e9 - ld a, [TempEnemyMonSpecies] - ld b, a - ld a, [wRoamMon1Species] - cp b - ld hl, wRoamMon1MapNumber - ret z - ld a, [wRoamMon2Species] - cp b - ld hl, wRoamMon2MapNumber - ret z - ld hl, wRoamMon3MapNumber - ret -; 3fa01 - -GetRoamMonHP: ; 3fa01 -; output: hl = wRoamMonHP - ld a, [TempEnemyMonSpecies] - ld b, a - ld a, [wRoamMon1Species] - cp b - ld hl, wRoamMon1HP - ret z - ld a, [wRoamMon2Species] - cp b - ld hl, wRoamMon2HP - ret z - ld hl, wRoamMon3HP - ret -; 3fa19 - -GetRoamMonDVs: ; 3fa19 -; output: hl = wRoamMonDVs - ld a, [TempEnemyMonSpecies] - ld b, a - ld a, [wRoamMon1Species] - cp b - ld hl, wRoamMon1DVs - ret z - ld a, [wRoamMon2Species] - cp b - ld hl, wRoamMon2DVs - ret z - ld hl, wRoamMon3DVs - ret -; 3fa31 - -GetRoamMonSpecies: ; 3fa31 - ld a, [TempEnemyMonSpecies] - ld hl, wRoamMon1Species - cp [hl] - ret z - ld hl, wRoamMon2Species - cp [hl] - ret z - ld hl, wRoamMon3Species - ret -; 3fa42 - -AddLastMobileBattleToLinkRecord: ; 3fa42 - ld hl, OTPlayerID - ld de, StringBuffer1 - ld bc, 2 - call CopyBytes - ld hl, OTPlayerName - ld bc, NAME_LENGTH - 1 - call CopyBytes - ld hl, sLinkBattleResults - call .StoreResult - ld hl, sLinkBattleRecord - ld d, 5 -.loop - push hl - inc hl - inc hl - ld a, [hl] - dec hl - dec hl - and a - jr z, .copy - push de - ld bc, 12 - ld de, StringBuffer1 - call CompareLong - pop de - pop hl - jr c, .done - ld bc, 18 - add hl, bc - dec d - jr nz, .loop - ld bc, -18 - add hl, bc - push hl - -.copy - ld d, h - ld e, l - ld hl, StringBuffer1 - ld bc, 12 - call CopyBytes - ld b, 6 - xor a -.loop2 - ld [de], a - inc de - dec b - jr nz, .loop2 - pop hl - -.done - call .StoreResult - call .FindOpponentAndAppendRecord - ret -; 3faa0 -.StoreResult: ; 3faa0 - ld a, [wBattleResult] - and $f - cp $1 - ld bc, sLinkBattleWins + 1 - sLinkBattleResults - jr c, .okay - ld bc, sLinkBattleLosses + 1 - sLinkBattleResults - jr z, .okay - ld bc, sLinkBattleDraws + 1 - sLinkBattleResults -.okay - add hl, bc - call .CheckOverflow - ret nc - inc [hl] - ret nz - dec hl - inc [hl] - ret -; 3fabe - -.CheckOverflow: ; 3fabe - dec hl - ld a, [hl] - inc hl - cp HIGH(MAX_LINK_RECORD) - ret c - ld a, [hl] - cp LOW(MAX_LINK_RECORD) - ret -; 3fac8 - -.FindOpponentAndAppendRecord: ; 3fac8 - ld b, 5 - ld hl, sLinkBattleRecord + 17 - ld de, wd002 -.loop3 - push bc - push de - push hl - call .LoadPointer - pop hl - ld a, e - pop de - ld [de], a - inc de - ld a, b - ld [de], a - inc de - ld a, c - ld [de], a - inc de - ld bc, 18 - add hl, bc - pop bc - dec b - jr nz, .loop3 - ld b, $0 - ld c, $1 -.loop4 - ld a, b - add b - add b - ld e, a - ld d, $0 - ld hl, wd002 - add hl, de - push hl - ld a, c - add c - add c - ld e, a - ld d, $0 - ld hl, wd002 - add hl, de - ld d, h - ld e, l - pop hl - push bc - ld c, 3 - call StringCmp - pop bc - jr z, .equal - jr nc, .done2 - -.equal - inc c - ld a, c - cp $5 - jr nz, .loop4 - inc b - ld c, b - inc c - ld a, b - cp $4 - jr nz, .loop4 - ret - -.done2 - push bc - ld a, b - ld bc, 18 - ld hl, sLinkBattleRecord - call AddNTimes - push hl - ld de, wd002 - ld bc, 18 - call CopyBytes - pop hl - pop bc - push hl - ld a, c - ld bc, 18 - ld hl, sLinkBattleRecord - call AddNTimes - pop de - push hl - ld bc, 18 - call CopyBytes - ld hl, wd002 - ld bc, 18 - pop de - call CopyBytes - ret -; 3fb54 - -.LoadPointer: ; 3fb54 - ld e, $0 - ld a, [hld] - ld c, a - ld a, [hld] - ld b, a - ld a, [hld] - add c - ld c, a - ld a, [hld] - adc b - ld b, a - jr nc, .okay2 - inc e - -.okay2 - ld a, [hld] - add c - ld c, a - ld a, [hl] - adc b - ld b, a - ret nc - inc e - ret -; 3fb6c - -InitBattleDisplay: ; 3fb6c - call .InitBackPic - hlcoord 0, 12 - ld b, 4 - ld c, 18 - call TextBox - farcall MobileTextBorder - hlcoord 1, 5 - lb bc, 3, 7 - call ClearBox - call LoadStandardFont - call _LoadBattleFontsHPBar - call .BlankBGMap - xor a - ld [hMapAnims], a - ld [hSCY], a - ld a, $90 - ld [hWY], a - ld [rWY], a - call WaitBGMap - xor a - ld [hBGMapMode], a - farcall BattleIntroSlidingPics - ld a, $1 - ld [hBGMapMode], a - ld a, $31 - ld [hGraphicStartTile], a - hlcoord 2, 6 - lb bc, 6, 6 - predef PlaceGraphic - xor a - ld [hWY], a - ld [rWY], a - call WaitBGMap - call HideSprites - ld b, SCGB_BATTLE_COLORS - call GetSGBLayout - call SetPalettes - ld a, $90 - ld [hWY], a - xor a - ld [hSCX], a - ret -; 3fbd6 - -.BlankBGMap: ; 3fbd6 - ld a, [rSVBK] - push af - ld a, $6 - ld [rSVBK], a - - ld hl, wDecompressScratch - ld bc, wScratchAttrMap - wDecompressScratch - ld a, " " - call ByteFill - - ld de, wDecompressScratch - hlbgcoord 0, 0 - lb bc, BANK(.BlankBGMap), $40 - call Request2bpp - - pop af - ld [rSVBK], a - ret -; 3fbf8 - -.InitBackPic: ; 3fbf8 - call GetTrainerBackpic - call CopyBackpic - ret -; 3fbff - -GetTrainerBackpic: ; 3fbff -; Load the player character's backpic (6x6) into VRAM starting from VTiles2 tile $31. - -; Special exception for Dude. - ld b, BANK(DudeBackpic) - ld hl, DudeBackpic - ld a, [BattleType] - cp BATTLETYPE_TUTORIAL - jr z, .Decompress - -; What gender are we? - ld a, [wPlayerSpriteSetupFlags] - bit 2, a ; transformed to male - jr nz, .Chris - ld a, [PlayerGender] - bit 0, a - jr z, .Chris - -; It's a girl. - farcall GetKrisBackpic - ret - -.Chris: -; It's a boy. - ld b, BANK(ChrisBackpic) - ld hl, ChrisBackpic - -.Decompress: - ld de, VTiles2 tile $31 - ld c, $31 - predef DecompressPredef - ret -; 3fc30 - -CopyBackpic: ; 3fc30 - ld a, [rSVBK] - push af - ld a, $6 - ld [rSVBK], a - ld hl, VTiles0 - ld de, VTiles2 tile $31 - ld a, [hROMBank] - ld b, a - ld c, $31 - call Get2bpp - pop af - ld [rSVBK], a - call .LoadTrainerBackpicAsOAM - ld a, $31 - ld [hGraphicStartTile], a - hlcoord 2, 6 - lb bc, 6, 6 - predef PlaceGraphic - ret -; 3fc5b - -.LoadTrainerBackpicAsOAM: ; 3fc5b - ld hl, Sprites - xor a - ld [hMapObjectIndexBuffer], a - ld b, $6 - ld e, 21 * 8 -.outer_loop - ld c, $3 - ld d, 8 * 8 -.inner_loop - ld [hl], d - inc hl - ld [hl], e - inc hl - ld a, [hMapObjectIndexBuffer] - ld [hli], a - inc a - ld [hMapObjectIndexBuffer], a - ld a, $1 - ld [hli], a - ld a, d - add $8 - ld d, a - dec c - jr nz, .inner_loop - ld a, [hMapObjectIndexBuffer] - add $3 - ld [hMapObjectIndexBuffer], a - ld a, e - add $8 - ld e, a - dec b - jr nz, .outer_loop - ret -; 3fc8b - -BattleStartMessage: ; 3fc8b - ld a, [wBattleMode] - dec a - jr z, .wild - - ld de, SFX_SHINE - call PlaySFX - call WaitSFX - - ld c, 20 - call DelayFrames - - farcall Battle_GetTrainerName - - ld hl, WantsToBattleText - jr .PlaceBattleStartText - -.wild - call BattleCheckEnemyShininess - jr nc, .not_shiny - - xor a - ld [wNumHits], a - ld a, 1 - ld [hBattleTurn], a - ld a, 1 - ld [wBattleAnimParam], a - ld de, ANIM_SEND_OUT_MON - call Call_PlayBattleAnim - -.not_shiny - farcall CheckSleepingTreeMon - jr c, .skip_cry - - farcall CheckBattleScene - jr c, .cry_no_anim - - hlcoord 12, 0 - ld d, $0 - ld e, ANIM_MON_NORMAL - predef AnimateFrontpic - jr .skip_cry ; cry is played during the animation - -.cry_no_anim - ld a, $0f - ld [CryTracks], a - ld a, [TempEnemyMonSpecies] - call PlayStereoCry - -.skip_cry - ld a, [BattleType] - cp BATTLETYPE_FISH - jr nz, .NotFishing - - farcall TrainerRankings_HookedEncounters - - ld hl, HookedPokemonAttackedText - jr .PlaceBattleStartText - -.NotFishing: - ld hl, PokemonFellFromTreeText - cp BATTLETYPE_TREE - jr z, .PlaceBattleStartText - ld hl, WildCelebiAppearedText - cp BATTLETYPE_CELEBI - jr z, .PlaceBattleStartText - ld hl, WildPokemonAppearedText - -.PlaceBattleStartText: - push hl - farcall BattleStart_TrainerHuds - pop hl - call StdBattleTextBox - - call IsMobileBattle2 - ret nz - - ld c, $2 ; start - farcall Mobile_PrintOpponentBattleMessage - - ret -; 3fd26 |