ref: 0221c1831e681dda80b96454e1718f18d640da8b
dir: /engine/battle/core.asm/
BattleCore: ; These are move effects (second value from the Moves table in bank $E). EffectsArray1: ; 3c000 (f:4000) db CONVERSION_EFFECT db HAZE_EFFECT db SWITCH_AND_TELEPORT_EFFECT db MIST_EFFECT db FOCUS_ENERGY_EFFECT db CONFUSION_EFFECT db HEAL_EFFECT db TRANSFORM_EFFECT db LIGHT_SCREEN_EFFECT db REFLECT_EFFECT db POISON_EFFECT db PARALYZE_EFFECT db SUBSTITUTE_EFFECT db MIMIC_EFFECT db LEECH_SEED_EFFECT db SPLASH_EFFECT db -1 EffectsArray2: ; 3c011 (f:4011) ; moves that do damage but not through normal calculations ; e.g., Super Fang, Psywave db SUPER_FANG_EFFECT db SPECIAL_DAMAGE_EFFECT db -1 EffectsArray3: ; 3c014 (f:4014) ; non-damaging, stat‐affecting or status‐causing moves? ; e.g., Meditate, Bide, Hypnosis db $01 db ATTACK_UP1_EFFECT db DEFENSE_UP1_EFFECT db SPEED_UP1_EFFECT db SPECIAL_UP1_EFFECT db ACCURACY_UP1_EFFECT db EVASION_UP1_EFFECT db ATTACK_DOWN1_EFFECT db DEFENSE_DOWN1_EFFECT db SPEED_DOWN1_EFFECT db SPECIAL_DOWN1_EFFECT db ACCURACY_DOWN1_EFFECT db EVASION_DOWN1_EFFECT db BIDE_EFFECT db SLEEP_EFFECT db ATTACK_UP2_EFFECT db DEFENSE_UP2_EFFECT db SPEED_UP2_EFFECT db SPECIAL_UP2_EFFECT db ACCURACY_UP2_EFFECT db EVASION_UP2_EFFECT db ATTACK_DOWN2_EFFECT db DEFENSE_DOWN2_EFFECT db SPEED_DOWN2_EFFECT db SPECIAL_DOWN2_EFFECT db ACCURACY_DOWN2_EFFECT db EVASION_DOWN2_EFFECT db -1 EffectsArray4: ; 3c030 (f:4030) ; Attacks that aren't finished after they faint the opponent. db DRAIN_HP_EFFECT db EXPLODE_EFFECT db DREAM_EATER_EFFECT db PAY_DAY_EFFECT db TWO_TO_FIVE_ATTACKS_EFFECT db $1E db ATTACK_TWICE_EFFECT db RECOIL_EFFECT db TWINEEDLE_EFFECT db RAGE_EFFECT db -1 EffectsArray5: ; 3c03b (f:403b) db DRAIN_HP_EFFECT db EXPLODE_EFFECT db DREAM_EATER_EFFECT db PAY_DAY_EFFECT db SWIFT_EFFECT db TWO_TO_FIVE_ATTACKS_EFFECT db $1E db CHARGE_EFFECT db SUPER_FANG_EFFECT db SPECIAL_DAMAGE_EFFECT db FLY_EFFECT db ATTACK_TWICE_EFFECT db JUMP_KICK_EFFECT db RECOIL_EFFECT ; fallthrough to Next EffectsArray EffectsArray5B: ; 3c049 (f:4049) ; moves that prevent the player from switching moves? db THRASH_PETAL_DANCE_EFFECT db TRAPPING_EFFECT db -1 Func_3c04c: ; 3c04c (f:404c) call Func_3ec92 ld a, $1 ld [wd125], a call DisplayTextBoxID FuncCoord 1, 5 ld hl, Coord ld bc, $307 call ClearScreenArea call DisableLCD call LoadFontTilePatterns call Func_3ee58 ld hl, $9800 ld bc, $400 .asm_3c06f ld a, $7f ld [hli], a dec bc ld a, b or c jr nz, .asm_3c06f ld hl, wTileMap ld de, $9800 ld b, $12 .asm_3c07f ld c, $14 .asm_3c081 ld a, [hli] ld [de], a inc e dec c jr nz, .asm_3c081 ld a, $c add e ld e, a jr nc, .asm_3c08e inc d .asm_3c08e dec b jr nz, .asm_3c07f call EnableLCD ld a, $90 ld [$ffb0], a ld [rWY], a ; $ff4a xor a ld [$ffd7], a ld [$ffaf], a dec a ld [wcfcb], a call Delay3 xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld b, $70 ld c, $90 ld a, c ld [$ffae], a call DelayFrame ld a, $e4 ld [rBGP], a ; $ff47 ld [rOBP0], a ; $ff48 ld [rOBP1], a ; $ff49 .asm_3c0bb ld h, b ld l, $40 call Func_3c110 inc b inc b ld h, $0 ld l, $60 call Func_3c110 call Func_3c0ff ld a, c ld [$ffae], a dec c dec c jr nz, .asm_3c0bb ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld a, $31 ld [$ffe1], a FuncCoord 1, 5 ld hl, Coord ld a, $1 call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6)) xor a ld [$ffb0], a ld [rWY], a ; $ff4a inc a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba call Delay3 ld b, $1 call GoPAL_SET call HideSprites ld hl, PrintBeginningBattleText ld b, BANK(PrintBeginningBattleText) jp Bankswitch Func_3c0ff: ; 3c0ff (f:40ff) push bc ld hl, wOAMBuffer + $01 ld c, $15 ld de, $4 .asm_3c108 dec [hl] dec [hl] add hl, de dec c jr nz, .asm_3c108 pop bc ret Func_3c110: ; 3c110 (f:4110) ld a, [$ff44] cp l jr nz, Func_3c110 ld a, h ld [rSCX], a ; $ff43 .asm_3c118 ld a, [$ff44] cp h jr z, .asm_3c118 ret Func_3c11e: ; 3c11e (f:411e) xor a ld [W_PLAYERMONSALIVEFLAGS], a ld [wccf5], a ld [wcd6a], a inc a ld [wd11d], a ld hl, W_ENEMYMON1HP ; wd8a5 ld bc, $2b ld d, $3 .asm_3c134 inc d ld a, [hli] or [hl] jr nz, .asm_3c13c add hl, bc jr .asm_3c134 .asm_3c13c ld a, d ld [wcc3e], a ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a call nz, Func_3c92a ld c, $28 call DelayFrames call SaveScreenTilesToBuffer1 .asm_3c14f call AnyPlayerPokemonAliveCheck ld a, d and a jp z, HandlePlayerBlackOut call LoadScreenTilesFromBuffer1 ld a, [W_BATTLETYPE] ; wd05a and a jp z, Func_3c1ad .asm_3c161 call InitBattleMenu ret c ld a, [wcd6a] and a jr z, .asm_3c161 ld a, [W_NUMSAFARIBALLS] ; W_NUMSAFARIBALLS and a jr nz, .asm_3c17a call LoadScreenTilesFromBuffer1 ld hl, OutOfSafariBallsText jp PrintText .asm_3c17a callab PrintSafariZoneBattleText ld a, [W_ENEMYMONSPEED + 1] add a ld b, a jp c, asm_3c202 ld a, [wcce9] and a jr z, .asm_3c194 srl b srl b .asm_3c194 ld a, [wcce8] and a jr z, .asm_3c1a0 sla b jr nc, .asm_3c1a0 ld b, $ff .asm_3c1a0 call Random cp b jr nc, .asm_3c14f jr asm_3c202 OutOfSafariBallsText: ; 3c1a8 (f:41a8) TX_FAR _OutOfSafariBallsText db "@" Func_3c1ad: ; 3c1ad (f:41ad) xor a ld [wWhichPokemon], a ; wWhichPokemon .asm_3c1b1 call Func_3ca97 jr nz, .asm_3c1bc ld hl, wWhichPokemon ; wWhichPokemon inc [hl] jr .asm_3c1b1 .asm_3c1bc ld a, [wWhichPokemon] ; wWhichPokemon ld [wPlayerMonNumber], a ; wPlayerMonNumber inc a ld hl, W_NUMINPARTY ; W_NUMINPARTY ld c, a ld b, $0 add hl, bc ld a, [hl] ld [wcf91], a ld [wcfd9], a call LoadScreenTilesFromBuffer1 FuncCoord 1, 5 ld hl, Coord ld a, $9 call Func_3c8df call SaveScreenTilesToBuffer1 ld a, [wWhichPokemon] ; wWhichPokemon ld c, a ld b, $1 push bc ld hl, W_PLAYERMONSALIVEFLAGS ld a, $10 ; FlagActionPredef call Predef ld hl, wccf5 pop bc ld a, $10 ; FlagActionPredef call Predef call Func_3cba6 call LoadScreenTilesFromBuffer1 call Func_3cc91 jr MainInBattleLoop asm_3c202: ; 3c202 (f:4202) call LoadScreenTilesFromBuffer1 ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 ld hl, WildRanText jr nz, .asm_3c216 xor a ld [wcf0b], a ld hl, EnemyRanText .asm_3c216 call PrintText ld a, (SFX_08_44 - SFX_Headers_08) / 3 call PlaySoundWaitForCurrent xor a ld [H_WHOSETURN], a ; $fff3 ld hl, AnimationSlideEnemyMonOut ld b, BANK(AnimationSlideEnemyMonOut) jp Bankswitch WildRanText: ; 3c229 (f:4229) TX_FAR _WildRanText db "@" EnemyRanText: ; 3c22e (f:422e) TX_FAR _EnemyRanText db "@" MainInBattleLoop: ; 3c233 (f:4233) call ReadPlayerMonCurHPAndStatus ld hl, W_PLAYERMONCURHP ld a, [hli] or [hl] jp z, HandlePlayerMonFainted ; test if current player mon is fainted ld hl, W_ENEMYMONCURHP ld a, [hli] or [hl] jp z, HandleEnemyMonFainted call SaveScreenTilesToBuffer1 xor a ld [wd11d], a ld a, [W_PLAYERBATTSTATUS2] and $60 jr nz, .asm_3c2a6 ; 0x3c252 $52 ld hl, W_ENEMYBATTSTATUS1 res 3, [hl] ld hl, W_PLAYERBATTSTATUS1 res 3, [hl] ld a, [hl] and $12 jr nz, .asm_3c2a6 ; 0x3c261 $43 call InitBattleMenu ; show battle menu ret c ld a, [wd078] and a ret nz ld a, [W_PLAYERMONSTATUS] and $27 jr nz, .asm_3c2a6 ; 0x3c271 $33 ld a, [W_PLAYERBATTSTATUS1] and $21 jr nz, .asm_3c2a6 ; 0x3c278 $2c ld a, [W_ENEMYBATTSTATUS1] bit 5, a jr z, .asm_3c288 ; 0x3c27f $7 ld a, $ff ld [wPlayerSelectedMove], a jr .asm_3c2a6 ; 0x3c286 $1e .asm_3c288 ld a, [wcd6a] and a jr nz, .asm_3c2a6 ; 0x3c28c $18 ld [wMoveMenuType], a inc a ld [W_ANIMATIONID], a xor a ld [wcc35], a call MoveSelectionMenu push af call LoadScreenTilesFromBuffer1 call Func_3cd5a pop af jr nz, MainInBattleLoop .asm_3c2a6 call SelectEnemyMove ld a, [W_ISLINKBATTLE] cp $4 jr nz, .noLinkBattle ld a, [wcc3e] cp $f jp z, asm_3c202 cp $e jr z, .noLinkBattle cp $d jr z, .noLinkBattle sub $4 jr c, .noLinkBattle ld a, [W_PLAYERBATTSTATUS1] bit 5, a jr z, .asm_3c2dd ; 0x3c2c9 $12 ld a, [wPlayerMoveListIndex] ld hl, W_PLAYERMONMOVES ld c, a ld b, $0 add hl, bc ld a, [hl] cp $76 jr nz, .asm_3c2dd ; 0x3c2d8 $3 ld [wPlayerSelectedMove], a .asm_3c2dd callab Func_3a74b .noLinkBattle ld a, [wPlayerSelectedMove] cp QUICK_ATTACK jr nz, .playerDidNotUseQuickAttack ld a, [wEnemySelectedMove] cp QUICK_ATTACK jr z, .compareSpeed ; both used Quick Attack jp .playerMovesFirst ; player used Quick Attack .playerDidNotUseQuickAttack ld a, [wEnemySelectedMove] cp QUICK_ATTACK jr z, .enemyMovesFirst ld a, [wPlayerSelectedMove] cp COUNTER jr nz, .playerDidNotUseCounter ld a, [wEnemySelectedMove] cp COUNTER jr z, .compareSpeed ; both used Counter jr .enemyMovesFirst ; player used Counter .playerDidNotUseCounter ld a, [wEnemySelectedMove] cp COUNTER jr z, .playerMovesFirst .compareSpeed ld de, W_PLAYERMONSPEED ; player speed value ld hl, W_ENEMYMONSPEED ; enemy speed value ld c, $2 call StringCmp ; compare speed values jr z, .speedEqual jr nc, .playerMovesFirst jr .enemyMovesFirst .speedEqual ld a, [$ffaa] cp $2 jr z, .invertOutcome call BattleRandom cp $80 jr c, .playerMovesFirst jr .enemyMovesFirst .invertOutcome call BattleRandom cp $80 jr c, .enemyMovesFirst jr .playerMovesFirst .enemyMovesFirst ld a, $1 ld [H_WHOSETURN], a callab TrainerAI jr c, .AIActionUsedEnemyFirst call Func_3e6bc ; execute enemy move ld a, [wd078] and a ret nz ld a, b and a jp z, HandlePlayerMonFainted .AIActionUsedEnemyFirst call HandlePoisonBurnLeechSeed jp z, HandleEnemyMonFainted call Func_3cd5a call Func_3d65e ; execute player move ld a, [wd078] and a ret nz ld a, b and a jp z, HandleEnemyMonFainted call HandlePoisonBurnLeechSeed jp z, HandlePlayerMonFainted call Func_3cd5a call Func_3c50f jp MainInBattleLoop .playerMovesFirst call Func_3d65e ; execute player move ld a, [wd078] and a ret nz ld a, b and a jp z, HandleEnemyMonFainted call HandlePoisonBurnLeechSeed jp z, HandlePlayerMonFainted call Func_3cd5a ld a, $1 ld [H_WHOSETURN], a callab TrainerAI jr c, .AIActionUsedPlayerFirst call Func_3e6bc ; execute enemy move ld a, [wd078] and a ret nz ld a, b and a jp z, HandlePlayerMonFainted .AIActionUsedPlayerFirst call HandlePoisonBurnLeechSeed jp z, HandleEnemyMonFainted call Func_3cd5a call Func_3c50f jp MainInBattleLoop HandlePoisonBurnLeechSeed: ; 3c3bd (f:43bd) ld hl, W_PLAYERMONCURHP ; wd015 ld de, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS ld a, [H_WHOSETURN] ; $fff3 and a jr z, .playersTurn ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP ld de, W_ENEMYMONSTATUS ; wcfe9 .playersTurn ld a, [de] and (1 << BRN) | (1 << PSN) jr z, .notBurnedOrPoisoned push hl ld hl, HurtByPoisonText ld a, [de] and 1 << BRN jr z, .poisoned ld hl, HurtByBurnText .poisoned call PrintText xor a ld [wcc5b], a ld a,BURN_PSN_ANIM call PlayMoveAnimation ; play burn/poison animation pop hl call HandlePoisonBurnLeechSeed_DecreaseOwnHP .notBurnedOrPoisoned ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .playersTurn2 ld de, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 .playersTurn2 ld a, [de] add a jr nc, .notLeechSeeded push hl ld a, [H_WHOSETURN] ; $fff3 push af xor $1 ld [H_WHOSETURN], a ; $fff3 xor a ld [wcc5b], a ld a,ABSORB call PlayMoveAnimation ; play leech seed animation (from opposing mon) pop af ld [H_WHOSETURN], a ; $fff3 pop hl call HandlePoisonBurnLeechSeed_DecreaseOwnHP call HandlePoisonBurnLeechSeed_IncreaseEnemyHP push hl ld hl, HurtByLeechSeedText call PrintText pop hl .notLeechSeeded ld a, [hli] or [hl] ret nz ; test if fainted call Func_3cd5a ld c, $14 call DelayFrames xor a ret HurtByPoisonText: ; 3c42e (f:442e) TX_FAR _HurtByPoisonText db "@" HurtByBurnText: ; 3c433 (f:4433) TX_FAR _HurtByBurnText db "@" HurtByLeechSeedText: ; 3c438 (f:4438) TX_FAR _HurtByLeechSeedText db "@" ; decreases the mon's current HP by 1/16 of the Max HP (multiplied by number of toxic ticks if active) ; note that the toxic ticks are considered even if the damage is not poison (hence the Leech Seed glitch) ; hl: HP pointer ; bc (out): total damage HandlePoisonBurnLeechSeed_DecreaseOwnHP: ; 3c43d (f:443d) push hl push hl ld bc, $e ; skip to max HP add hl, bc ld a, [hli] ; load max HP ld [wHPBarMaxHP+1], a ld b, a ld a, [hl] ld [wHPBarMaxHP], a ld c, a srl b rr c srl b rr c srl c srl c ; c = max HP/16 (assumption: HP < 1024) ld a, c and a jr nz, .nonZeroDamage inc c ; damage is at least 1 .nonZeroDamage ld hl, W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3 ld de, W_PLAYERTOXICCOUNTER ; wd06c ld a, [H_WHOSETURN] ; $fff3 and a jr z, .playersTurn ld hl, W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3 ld de, W_ENEMYTOXICCOUNTER ; wd071 .playersTurn bit 0, [hl] jr z, .noToxic ld a, [de] ; increment toxic counter inc a ld [de], a ld hl, $0000 .toxicTicksLoop add hl, bc dec a jr nz, .toxicTicksLoop ld b, h ; bc = damage * toxic counter ld c, l .noToxic pop hl inc hl ld a, [hl] ; subtract total damage from current HP ld [wHPBarOldHP], a sub c ld [hld], a ld [wHPBarNewHP], a ld a, [hl] ld [wHPBarOldHP+1], a sbc b ld [hl], a ld [wHPBarNewHP+1], a jr nc, .noOverkill xor a ; overkill: zero HP ld [hli], a ld [hl], a ld [wHPBarNewHP], a ld [wHPBarNewHP+1], a .noOverkill call UpdateCurMonHPBar pop hl ret ; adds bc to enemy HP HandlePoisonBurnLeechSeed_IncreaseEnemyHP: ; 3c4a3 (f:44a3) push hl ld hl, W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP ld a, [H_WHOSETURN] ; $fff3 and a jr z, .playersTurn ld hl, W_PLAYERMONMAXHP ; wd023 .playersTurn ld a, [hli] ld [wHPBarMaxHP+1], a ld a, [hl] ld [wHPBarMaxHP], a ld de, $fff2 add hl, de ; skip back fomr max hp to current hp ld a, [hl] ld [wHPBarOldHP], a ; add bc to current HP add c ld [hld], a ld [wHPBarNewHP], a ld a, [hl] ld [wHPBarOldHP+1], a adc b ld [hli], a ld [wHPBarNewHP+1], a ld a, [wHPBarMaxHP] ld c, a ld a, [hld] sub c ld a, [wHPBarMaxHP+1] ld b, a ld a, [hl] sbc b jr c, .noOverfullHeal ld a, b ; overfull heal, set HP to max HP ld [hli], a ld [wHPBarNewHP+1], a ld a, c ld [hl], a ld [wHPBarNewHP], a .noOverfullHeal ld a, [H_WHOSETURN] ; $fff3 xor $1 ld [H_WHOSETURN], a ; $fff3 call UpdateCurMonHPBar ld a, [H_WHOSETURN] ; $fff3 xor $1 ld [H_WHOSETURN], a ; $fff3 pop hl ret UpdateCurMonHPBar: ; 3c4f6 (f:44f6) FuncCoord 10, 9 ld hl, Coord ; tile pointer to player HP bar ld a, [H_WHOSETURN] ; $fff3 and a ld a, $1 jr z, .playersTurn FuncCoord 2, 2 ld hl, Coord ; tile pointer to enemy HP bar xor a .playersTurn push bc ld [wListMenuID], a ; wListMenuID ld a, $48 call Predef ; indirect jump to UpdateHPBar (fa1d (3:7a1d)) pop bc ret Func_3c50f: ; 3c50f (f:450f) ld a, [wd06a] and a jr nz, .asm_3c51a ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 res 5, [hl] .asm_3c51a ld a, [wd06f] and a ret nz ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 5, [hl] ret HandleEnemyMonFainted: ; 3c525 (f:4525) xor a ld [wccf0], a call FaintEnemyPokemon call AnyPlayerPokemonAliveCheck ld a, d and a jp z, HandlePlayerBlackOut ld hl, W_PLAYERMONCURHP ; wd015 ld a, [hli] or [hl] call nz, Func_3cd60 ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a ret z call AnyEnemyPokemonAliveCheck jp z, TrainerBattleVictory ld hl, W_PLAYERMONCURHP ; wd015 ld a, [hli] or [hl] jr nz, .asm_3c555 call Func_3c79b ret c call Func_3c7d8 .asm_3c555 ld a, $1 ld [wcd6a], a call Func_3c664 jp z, asm_3c202 xor a ld [wcd6a], a jp MainInBattleLoop FaintEnemyPokemon ; 0x3c567 call ReadPlayerMonCurHPAndStatus ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a jr z, .wild ld a, [W_ENEMYMONNUMBER] ; W_ENEMYMONNUMBER ld hl, W_ENEMYMON1HP ld bc, $2c ; mon struct len call AddNTimes xor a ld [hli], a ld [hl], a .wild ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 res 2, [hl] xor a ld [W_NUMHITS], a ; wd074 ld hl, wd065 ; enemy statuses ld [hli], a ld [hli], a ld [hli], a ld [hli], a ld [hl], a ld [W_ENEMYDISABLEDMOVE], a ; W_ENEMYDISABLEDMOVE ld [wccef], a ld [wccf3], a ld hl, wccf1 ld [hli], a ld [hl], a FuncCoord 12, 5 ld hl, Coord FuncCoord 12, 6 ld de, Coord call Func_3c893 ld hl, wTileMap ld bc, $40b call ClearScreenArea ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a jr z, .wild_win xor a ld [wc0f1], a ld [wc0f2], a ld a, (SFX_08_48 - SFX_Headers_08) / 3 ; SFX_FALL? call PlaySoundWaitForCurrent .sfxwait ld a, [wc02a] cp (SFX_08_48 - SFX_Headers_08) / 3 jr z, .sfxwait ld a, (SFX_08_43 - SFX_Headers_08) / 3 ; SFX_DROP call PlaySound call WaitForSoundToFinish jr .sfxplayed .wild_win call Func_3c643 ld a, MUSIC_DEFEATED_WILD_MON call PlayBattleVictoryMusic .sfxplayed ld hl, W_PLAYERMONCURHP ; wd015 ld a, [hli] or [hl] jr nz, .playermonnotfaint ld a, [wccf0] and a jr nz, .playermonnotfaint call Func_3c741 .playermonnotfaint call AnyPlayerPokemonAliveCheck ld a, d and a ret z ld hl, EnemyMonFaintedText call PrintText call Func_3ee94 call SaveScreenTilesToBuffer1 xor a ld [wcf0b], a ld b, EXP__ALL call IsItemInBag push af jr z, .no_exp_all ld hl, wd002 ld b, $7 .exp_all_loop srl [hl] inc hl dec b jr nz, .exp_all_loop .no_exp_all xor a ld [wcc5b], a callab GainExperience pop af ret z ld a, $1 ld [wcc5b], a ld a, [W_NUMINPARTY] ; W_NUMINPARTY ld b, $0 .asm_3c62c scf rl b dec a jr nz, .asm_3c62c ld a, b ld [W_PLAYERMONSALIVEFLAGS], a ld hl, GainExperience ld b, BANK(GainExperience) jp Bankswitch EnemyMonFaintedText: ; 0x3c63e TX_FAR _EnemyMonFaintedText db "@" Func_3c643: ; 3c643 (f:4643) xor a ld [wd083], a ld [wc02a], a inc a ld [wccf6], a ret AnyEnemyPokemonAliveCheck: ; 3c64f (f:464f) ld a, [wEnemyPartyCount] ; wEnemyPartyCount ld b, a xor a ld hl, W_ENEMYMON1HP ; wd8a5 ld de, $2c .asm_3c65a or [hl] inc hl or [hl] dec hl add hl, de dec b jr nz, .asm_3c65a and a ret Func_3c664: ; 3c664 (f:4664) ld hl, wcf1e ld e, $30 call GetBattleHealthBarColor callab DrawEnemyPokeballs ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3c687 call Func_3d605 ld a, [wcc3e] cp $f ret z call LoadScreenTilesFromBuffer1 .asm_3c687 call EnemySendOut xor a ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM ld [wcd6a], a ld [wccd5], a inc a ret TrainerBattleVictory: ; 3c696 (f:4696) call Func_3c643 ld b, MUSIC_DEFEATED_GYM_LEADER ld a, [W_GYMLEADERNO] ; W_GYMLEADERNO and a jr nz, .gymleader ld b, MUSIC_DEFEATED_TRAINER .gymleader ld a, [W_TRAINERCLASS] ; wd031 cp SONY3 ; final battle against rival jr nz, .notrival ld b, MUSIC_DEFEATED_GYM_LEADER ld hl, W_FLAGS_D733 set 1, [hl] .notrival ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 ld a, b call nz, PlayBattleVictoryMusic ld hl, TrainerDefeatedText call PrintText ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 ret z call ScrollTrainerPicAfterBattle ld c, $28 call DelayFrames call Func_3381 ld hl, MoneyForWinningText call PrintText ld de, wPlayerMoney + 2 ; wd349 ld hl, wd07b ld c, $3 ld a, $b ; AddBCDPredef jp Predef MoneyForWinningText: ; 3c6e4 (f:46e4) TX_FAR _MoneyForWinningText db "@" TrainerDefeatedText: ; 3c6e9 (f:46e9) TX_FAR _TrainerDefeatedText db "@" PlayBattleVictoryMusic: ; 3c6ee (f:46ee) push af ld a, $ff ld [wc0ee], a call PlaySoundWaitForCurrent ld c, BANK(Music_DefeatedTrainer) pop af call PlayMusic jp Delay3 HandlePlayerMonFainted: ; 3c700 (f:4700) ld a, $1 ld [wccf0], a call Func_3c741 call AnyPlayerPokemonAliveCheck ; test if any more mons are alive ld a, d and a jp z, HandlePlayerBlackOut ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP ld a, [hli] or [hl] jr nz, .enemyMonNotFainted call FaintEnemyPokemon ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a ret z ; if wild encounter, battle is over call AnyEnemyPokemonAliveCheck jp z, TrainerBattleVictory .enemyMonNotFainted call Func_3c79b ret c call Func_3c7d8 jp nz, MainInBattleLoop ld a, $1 ld [wcd6a], a call Func_3c664 jp z, asm_3c202 xor a ld [wcd6a], a jp MainInBattleLoop Func_3c741: ; 3c741 (f:4741) ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld c, a ld hl, W_PLAYERMONSALIVEFLAGS ; clear fainted mon's alive flag ld b, $0 ld a, $10 ; FlagActionPredef call Predef ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 2, [hl] ; reset "attacking multiple times" flag ld a, [wd083] bit 7, a ; skip sound flag (red bar (?)) jr z, .skipWaitForSound ld a, $ff ld [wd083], a call WaitForSoundToFinish .skipWaitForSound ld hl, wcd05 ld [hli], a ld [hl], a ld [W_PLAYERMONSTATUS], a ; W_PLAYERMONSTATUS call ReadPlayerMonCurHPAndStatus FuncCoord 9, 7 ld hl, Coord ld bc, $50b call ClearScreenArea FuncCoord 1, 10 ld hl, Coord FuncCoord 1, 11 ld de, Coord call Func_3c893 ld a, $1 ld [wcf0b], a ld a, [wccf0] and a ret z ld a, [W_PLAYERMONID] call PlayCry ld hl, PlayerMonFaintedText jp PrintText PlayerMonFaintedText: ; 3c796 (f:4796) TX_FAR _PlayerMonFaintedText db "@" Func_3c79b: ; 3c79b (f:479b) call Func_3ee94 call SaveScreenTilesToBuffer1 ld a, [W_ISINBATTLE] ; W_ISINBATTLE and a dec a ret nz ld hl, UseNextMonText call PrintText .asm_3c7ad FuncCoord 13, 9 ld hl, Coord ld bc, $a0e ld a, $14 ld [wd125], a call DisplayTextBoxID ld a, [wd12e] cp $2 jr z, .asm_3c7c4 and a ret .asm_3c7c4 ld a, [wCurrentMenuItem] ; wCurrentMenuItem and a jr z, .asm_3c7ad ld hl, W_PARTYMON1_SPEED ; wd193 ld de, W_ENEMYMONSPEED jp Func_3cab9 UseNextMonText: ; 3c7d3 (f:47d3) TX_FAR _UseNextMonText db "@" Func_3c7d8: ; 3c7d8 (f:47d8) ld a, $2 ld [wd07d], a call DisplayPartyMenu .asm_3c7e0 jr nc, .asm_3c7e7 .asm_3c7e2 call GoBackToPartyMenu jr .asm_3c7e0 .asm_3c7e7 call Func_3ca97 jr z, .asm_3c7e2 ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3c7fa inc a ld [wcd6a], a call Func_3d605 .asm_3c7fa xor a ld [wcd6a], a call ClearSprites ld a, [wWhichPokemon] ; wWhichPokemon ld [wPlayerMonNumber], a ; wPlayerMonNumber ld c, a ld hl, W_PLAYERMONSALIVEFLAGS ld b, $1 push bc ld a, $10 ; FlagActionPredef call Predef pop bc ld hl, wccf5 ld a, $10 ; FlagActionPredef call Predef call Func_3cba6 call GBPalWhiteOut call Func_3ee5b call LoadScreenTilesFromBuffer1 call GoPAL_SET_CF1C call GBPalNormal call Func_3cc91 ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP ld a, [hli] or [hl] ret ; called when player is out of usable mons. ; prints approriate lose message, sets carry flag if player blacked out (special case for initial rival fight) HandlePlayerBlackOut: ; 3c837 (f:4837) ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr z, .notSony1Battle ld a, [W_CUROPPONENT] ; wd059 cp $c8 + SONY1 jr nz, .notSony1Battle ld hl, wTileMap ; sony 1 battle ld bc, $815 call ClearScreenArea call ScrollTrainerPicAfterBattle ld c, $28 call DelayFrames ld hl, Sony1WinText call PrintText ld a, [W_CURMAP] cp OAKS_LAB ret z ; starter battle in oak's lab: don't black out .notSony1Battle ld b, $0 call GoPAL_SET ld hl, PlayerBlackedOutText2 ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .noLinkBattle ld hl, LinkBattleLostText .noLinkBattle call PrintText ld a, [wd732] res 5, a ld [wd732], a call ClearScreen scf ret Sony1WinText: ; 3c884 (f:4884) TX_FAR _Sony1WinText db "@" PlayerBlackedOutText2: ; 3c889 (f:4889) TX_FAR _PlayerBlackedOutText2 db "@" LinkBattleLostText: ; 3c88e (f:488e) TX_FAR _LinkBattleLostText db "@" Func_3c893: ; 3c893 (f:4893) ld a, [wd730] push af set 6, a ld [wd730], a ld b, $7 .asm_3c89e push bc push de push hl ld b, $6 .asm_3c8a3 push bc push hl push de ld bc, $7 call CopyData pop de pop hl ld bc, $ffec 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, .asm_3c8a3 ld bc, $14 add hl, bc ld de, SevenSpacesText call PlaceString ld c, $2 call DelayFrames pop hl pop de pop bc dec b jr nz, .asm_3c89e pop af ld [wd730], a ret SevenSpacesText: ; 3c8d7 (f:48d7) db " @" Func_3c8df: ; 3c8df (f:48df) ld [H_DOWNARROWBLINKCNT1], a ; $ff8b ld c, a .asm_3c8e2 push bc push hl ld b, $7 .asm_3c8e6 push hl ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b ld c, a .asm_3c8ea ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b cp $8 jr z, .asm_3c8f5 ld a, [hld] ld [hli], a inc hl jr .asm_3c8f8 .asm_3c8f5 ld a, [hli] ld [hld], a dec hl .asm_3c8f8 dec c jr nz, .asm_3c8ea pop hl ld de, $14 add hl, de dec b jr nz, .asm_3c8e6 ld c, $2 call DelayFrames pop hl pop bc dec c jr nz, .asm_3c8e2 ret ; XXX this needs cleaning up. it's what runs when a juggler switches pokemon EnemySendOut: ; 3c90e (f:490e) ld hl,W_PLAYERMONSALIVEFLAGS xor a ld [hl],a ld a,[wPlayerMonNumber] ld c,a ld b,1 push bc ld a,$10 call Predef ld hl,wccf5 xor a ld [hl],a pop bc ld a,$10 call Predef Func_3c92a: ; 3c92a (f:492a) xor a ld hl,wd065 ld [hli],a ld [hli],a ld [hli],a ld [hli],a ld [hl],a ld [W_ENEMYDISABLEDMOVE],a ld [wccef],a ld [wccf3],a ld hl,wccf1 ld [hli],a ld [hl],a dec a ld [wAICount],a ld hl,W_PLAYERBATTSTATUS1 res 5,[hl] FuncCoord 18, 0 ld hl,Coord ld a,8 call Func_3c8df call Func_3ee94 call SaveScreenTilesToBuffer1 ld a,[W_ISLINKBATTLE] cp 4 jr nz,.next ld a,[wcc3e] sub 4 ld [wWhichPokemon],a jr .next3 .next ld b,$FF .next2 inc b ld a,[W_ENEMYMONNUMBER] cp b jr z,.next2 ld hl,wEnemyMon1Species ld a,b ld [wWhichPokemon],a push bc ld bc,$2C call AddNTimes pop bc inc hl ld a,[hli] ld c,a ld a,[hl] or c jr z,.next2 .next3 ld a,[wWhichPokemon] ld hl,wd8c5 ld bc,$2C call AddNTimes ld a,[hl] ld [W_CURENEMYLVL],a ld a,[wWhichPokemon] inc a ld hl,wEnemyPartyCount ld c,a ld b,0 add hl,bc ld a,[hl] ld [W_ENEMYMONID],a ld [wcf91],a call Func_3eb01 ld hl,W_ENEMYMONCURHP ld a,[hli] ld [wcce3],a ld a,[hl] ld [wcce4],a ld a,1 ld [wCurrentMenuItem],a ld a,[wd11d] dec a jr z,.next4 ld a,[W_NUMINPARTY] dec a jr z,.next4 ld a,[W_ISLINKBATTLE] cp 4 jr z,.next4 ld a,[W_OPTIONS] bit 6,a jr nz,.next4 ld hl, TrainerAboutToUseText call PrintText FuncCoord 0, 7 ld hl,Coord ld bc,$0801 ld a,$14 ld [wd125],a call DisplayTextBoxID ld a,[wCurrentMenuItem] and a jr nz,.next4 ld a,2 ld [wd07d],a call DisplayPartyMenu .next9 ld a,1 ld [wCurrentMenuItem],a jr c,.next7 ld hl,wPlayerMonNumber ld a,[wWhichPokemon] cp [hl] jr nz,.next6 ld hl,AlreadyOutText call PrintText .next8 call GoBackToPartyMenu jr .next9 .next6 call Func_3ca97 jr z,.next8 xor a ld [wCurrentMenuItem],a .next7 call GBPalWhiteOut call Func_3ee5b call LoadScreenTilesFromBuffer1 .next4 call ClearSprites ld hl,wTileMap ld bc,$040B call ClearScreenArea ld b,1 call GoPAL_SET call GBPalNormal ld hl,TrainerSentOutText call PrintText ld a,[W_ENEMYMONID] ld [wcf91],a ld [wd0b5],a call GetMonHeader ld de,$9000 call LoadMonFrontSprite ld a,$CF ld [$FFE1],a FuncCoord 15, 6 ld hl,Coord ld a,2 call Predef ld a,[W_ENEMYMONID] call PlayCry call Func_3cdec ld a,[wCurrentMenuItem] and a ret nz xor a ld [W_PLAYERMONSALIVEFLAGS],a ld [wccf5],a call SaveScreenTilesToBuffer1 jp Func_3d1ba TrainerAboutToUseText: ; 3ca79 (f:4a79) TX_FAR _TrainerAboutToUseText db "@" TrainerSentOutText: ; 3ca7e (f:4a7e) TX_FAR _TrainerSentOutText db "@" ; tests if the player has any pokemon that are not fainted ; sets d = 0 if all fainted, d != 0 if some mons are still alive AnyPlayerPokemonAliveCheck: ; 3ca83 (f:4a83) ld a, [W_NUMINPARTY] ; W_NUMINPARTY ld e, a xor a ld hl, W_PARTYMON1_HP ; wd16c ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA - 1 .partyMonsLoop or [hl] inc hl or [hl] add hl, bc dec e jr nz, .partyMonsLoop ld d, a ret Func_3ca97: ; 3ca97 (f:4a97) ld a, [wWhichPokemon] ; wWhichPokemon ld hl, W_PARTYMON1_HP ; wd16c ld bc, $2c call AddNTimes ld a, [hli] or [hl] ret nz ld a, [wd11d] and a jr nz, .asm_3cab2 ld hl, NoWillText call PrintText .asm_3cab2 xor a ret NoWillText: ; 3cab4 (f:4ab4) TX_FAR _NoWillText db "@" Func_3cab9: ; 3cab9 (f:4ab9) call IsGhostBattle jp z, .asm_3cb5c ld a, [W_BATTLETYPE] ; wd05a cp $2 jp z, .asm_3cb5c ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jp z, .asm_3cb5c ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a jr nz, .asm_3cb4c ld a, [wd120] inc a ld [wd120], a ld a, [hli] ld [$ff97], a ld a, [hl] ld [$ff98], a ld a, [de] ld [$ff8d], a inc de ld a, [de] ld [$ff8e], a call LoadScreenTilesFromBuffer1 ld de, $ff97 ld hl, $ff8d ld c, $2 call StringCmp jr nc, .asm_3cb5c xor a ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, $20 ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) call Multiply ld a, [$ff97] ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT) ld a, [$ff98] ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, [$ff8d] ld b, a ld a, [$ff8e] srl b rr a srl b rr a and a jr z, .asm_3cb5c ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld b, $2 call Divide ld a, [$ff97] and a jr nz, .asm_3cb5c ld a, [wd120] ld c, a .asm_3cb2b dec c jr z, .asm_3cb39 ld b, $1e ld a, [$ff98] add b ld [$ff98], a jr c, .asm_3cb5c jr .asm_3cb2b .asm_3cb39 call BattleRandom ld b, a ld a, [$ff98] cp b jr nc, .asm_3cb5c ld a, $1 ld [wcd6a], a ld hl, CantEscapeText jr .asm_3cb4f .asm_3cb4c ld hl, NoRunningText .asm_3cb4f call PrintText ld a, $1 ld [wd11f], a call SaveScreenTilesToBuffer1 and a ret .asm_3cb5c ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 ld a, $2 jr nz, .asm_3cb81 call SaveScreenTilesToBuffer1 xor a ld [wcd6a], a ld a, $f ld [wPlayerMoveListIndex], a ; wPlayerMoveListIndex call Func_3d605 call LoadScreenTilesFromBuffer1 ld a, [wcc3e] cp $f ld a, $2 jr z, .asm_3cb81 dec a .asm_3cb81 ld [wcf0b], a ld a, (SFX_08_44 - SFX_Headers_08) / 3 call PlaySoundWaitForCurrent ld hl, GotAwayText call PrintText call WaitForSoundToFinish call SaveScreenTilesToBuffer1 scf ret CantEscapeText: ; 3cb97 (f:4b97) TX_FAR _CantEscapeText db "@" NoRunningText: ; 3cb9c (f:4b9c) TX_FAR _NoRunningText db "@" GotAwayText: ; 3cba1 (f:4ba1) TX_FAR _GotAwayText db "@" Func_3cba6: ; 3cba6 (f:4ba6) ld a, [wWhichPokemon] ; wWhichPokemon ld bc, $2c ld hl, W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA) call AddNTimes ld de, W_PLAYERMONID ld bc, $c call CopyData ld bc, $f add hl, bc ld de, W_PLAYERMONIVS ld bc, $2 call CopyData ld de, W_PLAYERMONPP ; W_PLAYERMONPP ld bc, $4 call CopyData ld de, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL ld bc, $b call CopyData ld a, [wcfd9] ld [wd0b5], a call GetMonHeader ld hl, W_PARTYMON1NAME ; W_PARTYMON1NAME ld a, [wPlayerMonNumber] ; wPlayerMonNumber call SkipFixedLengthTextEntries ld de, W_PLAYERMONNAME ld bc, $b call CopyData ld hl, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL ld de, wcd0f ld bc, $b call CopyData call Func_3ed1a call Func_3ee19 ld a, $7 ld b, $8 ld hl, wPlayerMonAttackMod ; wcd1a .asm_3cc0e ld [hli], a dec b jr nz, .asm_3cc0e ret Func_3cc13: ; 3cc13 (f:4c13) ld a, [wWhichPokemon] ; wWhichPokemon ld bc, $2c ld hl, wEnemyMons ; wEnemyMon1Species call AddNTimes ld de, wcfe5 ld bc, $c call CopyData ld bc, $f add hl, bc ld de, W_ENEMYMONATKDEFIV ld bc, $2 call CopyData ld de, W_ENEMYMONPP ; wcffe ld bc, $4 call CopyData ld de, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL ld bc, $b call CopyData ld a, [wcfe5] ld [wd0b5], a call GetMonHeader ld hl, W_ENEMYMON1NAME ld a, [wWhichPokemon] ; wWhichPokemon call SkipFixedLengthTextEntries ld de, W_ENEMYMONNAME ld bc, $b call CopyData ld hl, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL ld de, wcd23 ld bc, $b call CopyData call Func_3ed1e ld hl, W_MONHBASESTATS ld de, wd002 ld b, $5 .asm_3cc79 ld a, [hli] ld [de], a inc de dec b jr nz, .asm_3cc79 ld a, $7 ld b, $8 ld hl, wEnemyMonStatMods ; wcd2e .asm_3cc86 ld [hli], a dec b jr nz, .asm_3cc86 ld a, [wWhichPokemon] ; wWhichPokemon ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER ret Func_3cc91: ; 3cc91 (f:4c91) callab SendOutMon ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP ld a, [hli] or [hl] jp z, Func_3cca4 call Func_3cdec Func_3cca4: ; 3cca4 (f:4ca4) call Func_3cd60 ld a, $4 call Predef ; indirect jump to LoadMonBackSprite (3f103 (f:7103)) xor a ld [$ffe1], a ld hl, wcc2d ld [hli], a ld [hl], a ld [wcc5b], a ld [wd05b], a ld [W_PLAYERMOVENUM], a ; wcfd2 ld hl, wccf1 ld [hli], a ld [hl], a ld hl, wd060 ld [hli], a ld [hli], a ld [hli], a ld [hli], a ld [hl], a ld [W_PLAYERDISABLEDMOVE], a ; W_PLAYERDISABLEDMOVE ld [wccee], a ld [wccf7], a ld b, $1 call GoPAL_SET ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 5, [hl] ld a, $1 ld [H_WHOSETURN], a ; $fff3 ld a, POOF_ANIM call PlayMoveAnimation FuncCoord 4, 11 ld hl, Coord ld a, $2 call Predef ; indirect jump to Func_3f073 (3f073 (f:7073)) ld a, [wcf91] call PlayCry call Func_3ee94 jp SaveScreenTilesToBuffer1 Func_3ccfa: ; 3ccfa (f:4cfa) FuncCoord 1, 5 ld hl, Coord ld bc, $707 call ClearScreenArea FuncCoord 3, 7 ld hl, Coord ld bc, $505 xor a ld [wcd6c], a ld [H_DOWNARROWBLINKCNT1], a ; $ff8b ld a, $5 call Predef ; indirect jump to Func_79aba (79aba (1e:5aba)) ld c, $4 call DelayFrames call Func_3cd3a FuncCoord 4, 9 ld hl, Coord ld bc, $303 ld a, $1 ld [wcd6c], a xor a ld [H_DOWNARROWBLINKCNT1], a ; $ff8b ld a, $5 call Predef ; indirect jump to Func_79aba (79aba (1e:5aba)) call Delay3 call Func_3cd3a ld a, $4c FuncCoord 5, 11 ld [Coord], a Func_3cd3a: ; 3cd3a (f:4d3a) FuncCoord 1, 5 ld hl, Coord ld bc, $707 jp ClearScreenArea ; reads player's current mon's HP into W_PLAYERMONCURHP ReadPlayerMonCurHPAndStatus: ; 3cd43 (f:4d43) ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld hl, W_PARTYMON1_HP ; wd16c ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA call AddNTimes ld d, h ld e, l ld hl, W_PLAYERMONCURHP ; wd015 ld bc, $4 ; 2 bytes HP, 1 byte unknown (unused?), 1 byte status jp CopyData Func_3cd5a: ; 3cd5a (f:4d5a) call Func_3cd60 jp Func_3cdec Func_3cd60: ; 3cd60 (f:4d60) xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba FuncCoord 9, 7 ld hl, Coord ld bc, $50b call ClearScreenArea callab PlacePlayerHUDTiles FuncCoord 18, 9 ld hl, Coord ld [hl], $73 ld de, W_PLAYERMONNAME FuncCoord 10, 7 ld hl, Coord call Func_3ce9c call PlaceString ld hl, W_PLAYERMONID ld de, wcf98 ld bc, $c call CopyData ld hl, W_PLAYERMONLEVEL ; W_PLAYERMONLEVEL ld de, wcfb9 ld bc, $b call CopyData FuncCoord 14, 8 ld hl, Coord push hl inc hl ld de, wcf9c call PrintStatusConditionNotFainted pop hl jr nz, .asm_3cdae call PrintLevel .asm_3cdae ld a, [wcf98] ld [wcf91], a FuncCoord 10, 9 ld hl, Coord ld a, $5f call Predef ; indirect jump to Func_128ef (128ef (4:68ef)) ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld hl, wcf1d call GetBattleHealthBarColor ld hl, W_PLAYERMONCURHP ; wd015 ld a, [hli] or [hl] jr z, .asm_3cdd9 ld a, [wccf6] and a ret nz ld a, [wcf1d] cp $2 jr z, .asm_3cde6 .asm_3cdd9 ld hl, wd083 bit 7, [hl] ld [hl], $0 ret z xor a ld [wc02a], a ret .asm_3cde6 ld hl, wd083 set 7, [hl] ret Func_3cdec: ; 3cdec (f:4dec) xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld hl, wTileMap ld bc, $40c call ClearScreenArea callab PlaceEnemyHUDTiles ld de, W_ENEMYMONNAME FuncCoord 1, 0 ld hl, Coord call Func_3ce9c call PlaceString FuncCoord 4, 1 ld hl, Coord push hl inc hl ld de, W_ENEMYMONSTATUS ; wcfe9 call PrintStatusConditionNotFainted pop hl jr nz, .asm_3ce23 ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL ld [wcfb9], a call PrintLevel .asm_3ce23 ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP ld a, [hli] ld [$ff97], a ld a, [hld] ld [$ff98], a or [hl] jr nz, .asm_3ce36 ld c, a ld e, a ld d, $6 jp Func_3ce7f .asm_3ce36 xor a ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, $30 ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) call Multiply ld hl, W_ENEMYMONMAXHP ; W_ENEMYMONMAXHP ld a, [hli] ld b, a ld a, [hl] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld a, b and a jr z, .asm_3ce6a ld a, [H_REMAINDER] ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) srl b rr a srl b rr a ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld a, [$ff97] ld b, a srl b ld a, [$ff98] rr a srl b rr a ld [$ff98], a ld a, b ld [$ff97], a .asm_3ce6a ld a, [$ff97] ld [H_DIVIDEND], a ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT) ld a, [$ff98] ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, $2 ld b, a call Divide ld a, [$ff98] ld e, a ld a, $6 ld d, a ld c, a Func_3ce7f: ; 3ce7f (f:4e7f) xor a ld [wListMenuID], a ; wListMenuID FuncCoord 2, 2 ld hl, Coord call DrawHPBar ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld hl, wcf1e GetBattleHealthBarColor: ; 3ce90 (f:4e90) ld b, [hl] call GetHealthBarColor ld a, [hl] cp b ret z ld b, $1 jp GoPAL_SET Func_3ce9c: ; 3ce9c (f:4e9c) push de inc hl inc hl ld b, $2 .asm_3cea1 inc de ld a, [de] cp $50 jr z, .asm_3ceb1 inc de ld a, [de] cp $50 jr z, .asm_3ceb1 dec hl dec b jr nz, .asm_3cea1 .asm_3ceb1 pop de ret InitBattleMenu: ; 3ceb3 (f:4eb3) call LoadScreenTilesFromBuffer1 ; restore saved screen ld a, [W_BATTLETYPE] ; wd05a and a jr nz, .nonstandardbattle call Func_3cd5a ; redraw names and HP bars? call Func_3ee94 call SaveScreenTilesToBuffer1 .nonstandardbattle ld a, [W_BATTLETYPE] ; wd05a cp $2 ; safari ld a, $b ; safari menu id jr nz, .menuselected ld a, $1b ; regular menu id .menuselected ld [wd125], a call DisplayTextBoxID ld a, [W_BATTLETYPE] ; wd05a dec a jp nz, RegularBattleMenu ; regular battle ; the following happens for the old man tutorial ld hl, W_PLAYERNAME ; wd158 ld de, W_GRASSRATE ; W_GRASSRATE ld bc, $b call CopyData ; temporarily save the player name in unused space, ; which is supposed to get overwritten when entering a ; map with wild pokémon. due to an oversight, the data ; may not get overwritten (cinnabar) and the infamous ; missingno. glitch can show up. ld hl, OldManName ; $4f12 ld de, W_PLAYERNAME ; wd158 ld bc, $b call CopyData ; the following simulates the keystrokes by drawing menus on screen FuncCoord 9, 14 ld hl, Coord ld [hl], "▶" ld c, $50 call DelayFrames ld [hl], $7f FuncCoord 9, 16 ld hl, Coord ld [hl], "▶" ld c, $32 call DelayFrames ld [hl], $ec ld a, $2 jp Func_3cfe8 OldManName: ; 3cf12 (f:4f12) db "OLD MAN@" RegularBattleMenu: ; 3cf1a (f:4f1a) ld a, [wcc2d] ld [wCurrentMenuItem], a ; wCurrentMenuItem ld [wLastMenuItem], a ; wLastMenuItem sub $2 jr c, .leftcolumn ld [wCurrentMenuItem], a ; wCurrentMenuItem ld [wLastMenuItem], a ; wLastMenuItem jr .rightcolumn .leftcolumn ld a, [W_BATTLETYPE] ; wd05a cp $2 ld a, " " jr z, .safaribattle FuncCoord 15, 14 ld [Coord], a FuncCoord 15, 16 ld [Coord], a ld b, $9 jr .notsafari .safaribattle FuncCoord 13, 14 ld [Coord], a FuncCoord 13, 16 ld [Coord], a FuncCoord 7, 14 ld hl, Coord ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS ld bc, $102 call PrintNumber ld b, $1 .notsafari ld hl, wTopMenuItemY ; wTopMenuItemY ld a, $e ld [hli], a ld a, b ld [hli], a inc hl inc hl ld a, $1 ld [hli], a ld [hl], $11 call HandleMenuInput bit 4, a jr nz, .rightcolumn jr .selection .rightcolumn ld a, [W_BATTLETYPE] ; wd05a cp $2 ld a, " " jr z, .safarirightcolumn FuncCoord 9, 14 ld [Coord], a FuncCoord 9, 16 ld [Coord], a ld b, $f jr .notsafarirightcolumn .safarirightcolumn FuncCoord 1, 14 ld [Coord], a FuncCoord 1, 16 ld [Coord], a FuncCoord 7, 14 ld hl, Coord ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS ld bc, $102 call PrintNumber ld b, $d .notsafarirightcolumn ld hl, wTopMenuItemY ; wTopMenuItemY ld a, $e ld [hli], a ld a, b ld [hli], a inc hl inc hl ld a, $1 ld [hli], a ld a, $21 ld [hli], a call HandleMenuInput bit 5, a jr nz, .leftcolumn ld a, [wCurrentMenuItem] ; wCurrentMenuItem add $2 ; if we're in the right column, the actual id is +2 ld [wCurrentMenuItem], a ; wCurrentMenuItem .selection call PlaceUnfilledArrowMenuCursor ld a, [W_BATTLETYPE] ; wd05a cp $2 ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld [wcc2d], a jr z, .asm_3cfd0 cp $1 jr nz, .asm_3cfcb inc a jr .asm_3cfd0 .asm_3cfcb cp $2 ; what jr nz, .asm_3cfd0 dec a .asm_3cfd0 and a jr nz, Func_3cfe8 ; first option was selected... ld a, [W_BATTLETYPE] ; wd05a cp $2 jr z, .safari1 xor a ld [wd120], a jp LoadScreenTilesFromBuffer1 ; restore saved screen and return?? .safari1 ; safari first option?? ld a, SAFARI_BALL ld [wcf91], a jr asm_3d05f Func_3cfe8: ; 3cfe8 (f:4fe8) cp $2 jp nz, Func_3d0ca ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3cffd ld hl, ItemsCantBeUsedHereText call PrintText jp InitBattleMenu .asm_3cffd ; bag? call SaveScreenTilesToBuffer2 ; copy bg? ld a, [W_BATTLETYPE] ; wd05a cp $2 jr nz, asm_3d00e ld a, SAFARI_BAIT ld [wcf91], a jr asm_3d05f asm_3d00e: ; 3d00e (f:500e) call LoadScreenTilesFromBuffer1 ld a, [W_BATTLETYPE] ; wd05a and a jr nz, .asm_3d01a call Func_3cd5a .asm_3d01a ld a, [W_BATTLETYPE] ; wd05a dec a jr nz, Func_3d031 ld hl, OldManItemList ld a, l ld [wcf8b], a ld a, h ld [wcf8c], a jr Func_3d03c OldManItemList: ; 3d02d (f:502d) db $01, POKE_BALL, 50, $ff Func_3d031 ld hl, wNumBagItems ; wNumBagItems ld a, l ld [wcf8b], a ld a, h ld [wcf8c], a Func_3d03c xor a ld [wcf93], a ld a, $3 ld [wListMenuID], a ; wListMenuID ld a, [wcc2c] ld [wCurrentMenuItem], a ; wCurrentMenuItem call DisplayListMenuID ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld [wcc2c], a ld a, $0 ld [wcc37], a ld [wcc35], a jp c, InitBattleMenu asm_3d05f: ; 3d05f (f:505f) ld a, [wcf91] ld [wd11e], a call GetItemName call CopyStringToCF4B ; copy name xor a ld [wd152], a call UseItem call Func_3ee5b call ClearSprites xor a ld [wCurrentMenuItem], a ; wCurrentMenuItem ld a, [W_BATTLETYPE] ; wd05a cp $2 jr z, .asm_3d09c ld a, [wcd6a] and a jp z, asm_3d00e ld a, [W_PLAYERBATTSTATUS1] ; W_PLAYERBATTSTATUS1 bit 5, a jr z, .asm_3d09c ld hl, wd06a dec [hl] jr nz, .asm_3d09c ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 res 5, [hl] .asm_3d09c ld a, [wd11c] and a jr nz, .asm_3d0b7 ld a, [W_BATTLETYPE] ; wd05a cp $2 jr z, .asm_3d0b2 call LoadScreenTilesFromBuffer1 call Func_3cd5a ; redraw name and hp bar? call Delay3 .asm_3d0b2 call GBPalNormal and a ret .asm_3d0b7 call GBPalNormal xor a ld [wd11c], a ld a, $2 ld [wcf0b], a scf ret ItemsCantBeUsedHereText: ; 3d0c5 (f:50c5) TX_FAR _ItemsCantBeUsedHereText db "@" Func_3d0ca: ; 3d0ca (f:50ca) dec a jp nz, Func_3d1fa call SaveScreenTilesToBuffer2 ld a, [W_BATTLETYPE] ; wd05a cp $2 jr nz, Func_3d0e0 ld a, SAFARI_ROCK ld [wcf91], a jp asm_3d05f Func_3d0e0: ; 3d0e0 (f:50e0) call LoadScreenTilesFromBuffer1 xor a ld [wd07d], a ld [wcc35], a call DisplayPartyMenu asm_3d0ed: ; 3d0ed (f:50ed) jp nc, Func_3d119 asm_3d0f0: ; 3d0f0 (f:50f0) call ClearSprites call GBPalWhiteOut call Func_3ee5b call LoadScreenTilesFromBuffer2 call GoPAL_SET_CF1C call GBPalNormal jp InitBattleMenu Func_3d105: ; 3d105 (f:5105) FuncCoord 11, 11 ld hl, Coord ld bc, $81 ld a, $7f call FillMemory xor a ld [wd07d], a call GoBackToPartyMenu jr asm_3d0ed Func_3d119: ; 3d119 (f:5119) ld a, $c ld [wd125], a call DisplayTextBoxID ld hl, wTopMenuItemY ; wTopMenuItemY ld a, $c ld [hli], a ld [hli], a xor a ld [hli], a inc hl ld a, $2 ld [hli], a ld a, $3 ld [hli], a xor a ld [hl], a call HandleMenuInput bit 1, a jr nz, Func_3d105 call PlaceUnfilledArrowMenuCursor ld a, [wCurrentMenuItem] ; wCurrentMenuItem cp $2 jr z, asm_3d0f0 and a jr z, .asm_3d18a xor a ld [wcc49], a ld hl, W_PARTYMON1_NUM ; W_PARTYMON1_NUM (aliases: W_PARTYMON1DATA) call ClearSprites ld a, $36 call Predef ; indirect jump to StatusScreen (12953 (4:6953)) ld a, $37 call Predef ; indirect jump to StatusScreen2 (12b57 (4:6b57)) ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2 bit 4, a ld hl, AnimationSubstitute jr nz, .asm_3d182 ld a, [wccf3] and a ld hl, AnimationMinimizeMon jr nz, .asm_3d182 ld a, [wcfe5] ld [wcf91], a ld [wd0b5], a call GetMonHeader ld de, $9000 call LoadMonFrontSprite jr .asm_3d187 .asm_3d182 ld b, BANK(AnimationSubstitute) ; BANK(AnimationMinimizeMon) call Bankswitch .asm_3d187 jp Func_3d0e0 .asm_3d18a ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld d, a ld a, [wWhichPokemon] ; wWhichPokemon cp d jr nz, .asm_3d19d ld hl, AlreadyOutText call PrintText jp Func_3d105 .asm_3d19d call Func_3ca97 jp z, Func_3d105 ld a, $1 ld [wcd6a], a call GBPalWhiteOut call ClearSprites call Func_3ee5b call LoadScreenTilesFromBuffer1 call GoPAL_SET_CF1C call GBPalNormal Func_3d1ba: ; 3d1ba (f:51ba) callab RetreatMon ld c, $32 call DelayFrames call Func_3ccfa ld a, [wWhichPokemon] ; wWhichPokemon ld [wPlayerMonNumber], a ; wPlayerMonNumber ld c, a ld b, $1 push bc ld hl, W_PLAYERMONSALIVEFLAGS ld a, $10 ; FlagActionPredef call Predef pop bc ld hl, wccf5 ld a, $10 ; FlagActionPredef call Predef call Func_3cba6 call Func_3cc91 call SaveScreenTilesToBuffer1 ld a, $2 ld [wCurrentMenuItem], a ; wCurrentMenuItem and a ret AlreadyOutText: ; 3d1f5 (f:51f5) TX_FAR _AlreadyOutText db "@" Func_3d1fa: ; 3d1fa (f:51fa) call LoadScreenTilesFromBuffer1 ld a, $3 ld [wCurrentMenuItem], a ; wCurrentMenuItem ld hl, W_PLAYERMONSPEED ld de, W_ENEMYMONSPEED call Func_3cab9 ld a, $0 ld [wd11f], a ret c ld a, [wcd6a] and a ret nz jp InitBattleMenu MoveSelectionMenu: ; 3d219 (f:5219) ld a, [wMoveMenuType] dec a jr z, .mimicmenu dec a jr z, .relearnmenu jr .regularmenu .loadmoves ld de, wd0dc ld bc, $4 call CopyData callab Func_39b87 ret .writemoves ld de, wd0e1 ld a, [$fff6] set 2, a ld [$fff6], a call PlaceString ld a, [$fff6] res 2, a ld [$fff6], a ret .regularmenu call Func_3d3f5 ret z ld hl, W_PLAYERMONMOVES call .loadmoves FuncCoord 4, 12 ld hl, Coord ld b, $4 ld c, $e di call TextBoxBorder FuncCoord 4, 12 ld hl, Coord ld [hl], $7a FuncCoord 10, 12 ld hl, Coord ld [hl], $7e ei FuncCoord 6, 13 ld hl, Coord call .writemoves ld b, $5 ld a, $c jr .menuset .mimicmenu ld hl, W_ENEMYMONMOVES call .loadmoves FuncCoord 0, 7 ld hl, Coord ld b, $4 ld c, $e call TextBoxBorder FuncCoord 2, 8 ld hl, Coord call .writemoves ld b, $1 ld a, $7 jr .menuset .relearnmenu ld a, [wWhichPokemon] ; wWhichPokemon ld hl, W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1 ld bc, $2c call AddNTimes call .loadmoves FuncCoord 4, 7 ld hl, Coord ld b, $4 ld c, $e call TextBoxBorder FuncCoord 6, 8 ld hl, Coord call .writemoves ld b, $5 ld a, $7 .menuset ld hl, wTopMenuItemY ; wTopMenuItemY ld [hli], a ld a, b ld [hli], a ; wTopMenuItemX ld a, [wMoveMenuType] cp $1 jr z, .selectedmoveknown ld a, $1 jr nc, .selectedmoveknown ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex inc a .selectedmoveknown ld [hli], a ; wCurrentMenuItem inc hl ; wTileBehindCursor untouched ld a, [wcd6c] inc a inc a ld [hli], a ; wMaxMenuItem ld a, [wMoveMenuType] dec a ld b, $c1 ; can't use B jr z, .matchedkeyspicked dec a ld b, $c3 jr z, .matchedkeyspicked ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr z, .matchedkeyspicked ld a, [W_FLAGS_D733] bit 0, a ld b, $c7 jr z, .matchedkeyspicked ld b, $ff .matchedkeyspicked ld a, b ld [hli], a ; wMenuWatchedKeys ld a, [wMoveMenuType] cp $1 jr z, .movelistindex1 ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex inc a .movelistindex1 ld [hl], a ; wLastMenuItem Func_3d2fe: ; 3d2fe (f:52fe) ld a, [wMoveMenuType] and a jr z, .battleselect dec a jr nz, .select FuncCoord 1, 14 ld hl, Coord ld de, WhichTechniqueString ; $53b8 call PlaceString jr .select .battleselect ld a, [W_FLAGS_D733] bit 0, a jr nz, .select call Func_3d4b6 ld a, [wcc35] and a jr z, .select FuncCoord 5, 13 ld hl, Coord dec a ld bc, $14 call AddNTimes ld [hl], $ec .select ld hl, $fff6 set 1, [hl] call HandleMenuInput ld hl, $fff6 res 1, [hl] bit 6, a jp nz, Func_3d3c9 ; up bit 7, a jp nz, Func_3d3dd ; down bit 2, a jp nz, Func_3d435 ; select bit 1, a ; B, but was it reset above? push af xor a ld [wcc35], a ld a, [wCurrentMenuItem] ; wCurrentMenuItem dec a ld [wCurrentMenuItem], a ; wCurrentMenuItem ld b, a ld a, [wMoveMenuType] dec a ; if not mimic jr nz, .nob pop af ret .nob dec a ld a, b ld [wPlayerMoveListIndex], a ; wPlayerMoveListIndex jr nz, .moveselected pop af ret .moveselected pop af ret nz ld hl, W_PLAYERMONPP ; W_PLAYERMONPP ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld c, a ld b, $0 add hl, bc ld a, [hl] and $3f jr z, .nopp ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE swap a and $f dec a cp c jr z, .disabled ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3 bit 3, a ; transformed jr nz, .dummy ; game freak derp .dummy ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld hl, W_PLAYERMONMOVES ld c, a ld b, $0 add hl, bc ld a, [hl] ld [wPlayerSelectedMove], a ; wPlayerSelectedMove xor a ret .disabled ld hl, MoveDisabledText jr .print .nopp ld hl, MoveNoPPText .print call PrintText call LoadScreenTilesFromBuffer1 jp MoveSelectionMenu MoveNoPPText: ; 3d3ae (f:53ae) TX_FAR _MoveNoPPText db "@" MoveDisabledText: ; 3d3b3 (f:53b3) TX_FAR _MoveDisabledText db "@" WhichTechniqueString: ; 3d3b8 (f:53b8) db "WHICH TECHNIQUE?@" Func_3d3c9: ; 3d3c9 (f:53c9) ld a, [wCurrentMenuItem] ; wCurrentMenuItem and a jp nz, Func_3d2fe call EraseMenuCursor ld a, [wcd6c] inc a ld [wCurrentMenuItem], a ; wCurrentMenuItem jp Func_3d2fe Func_3d3dd: ; 3d3dd (f:53dd) ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld b, a ld a, [wcd6c] inc a inc a cp b jp nz, Func_3d2fe call EraseMenuCursor ld a, $1 ld [wCurrentMenuItem], a ; wCurrentMenuItem jp Func_3d2fe Func_3d3f5: ; 3d3f5 (f:53f5) ld a, $a5 ld [wPlayerSelectedMove], a ; wPlayerSelectedMove ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE and a ld hl, W_PLAYERMONPP ; W_PLAYERMONPP jr nz, .asm_3d40e ld a, [hli] or [hl] inc hl or [hl] inc hl or [hl] and $3f ret nz jr .asm_3d423 .asm_3d40e swap a and $f ld b, a ld d, $5 xor a .asm_3d416 dec d jr z, .asm_3d421 ld c, [hl] inc hl dec b jr z, .asm_3d416 or c jr .asm_3d416 .asm_3d421 and a ret nz .asm_3d423 ld hl, NoMovesLeftText call PrintText ld c, $3c call DelayFrames xor a ret NoMovesLeftText: ; 3d430 (f:5430) TX_FAR _NoMovesLeftText db "@" Func_3d435: ; 3d435 (f:5435) ld a, [wcc35] and a jr z, asm_3d4ad ld hl, W_PLAYERMONMOVES call Func_3d493 ld hl, W_PLAYERMONPP ; W_PLAYERMONPP call Func_3d493 ld hl, W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE ld a, [hl] swap a and $f ld b, a ld a, [wCurrentMenuItem] ; wCurrentMenuItem cp b jr nz, .asm_3d463 ld a, [hl] and $f ld b, a ld a, [wcc35] swap a add b ld [hl], a jr .asm_3d474 .asm_3d463 ld a, [wcc35] cp b jr nz, .asm_3d474 ld a, [hl] and $f ld b, a ld a, [wCurrentMenuItem] ; wCurrentMenuItem swap a add b ld [hl], a .asm_3d474 ld hl, W_PARTYMON1_MOVE1 ; W_PARTYMON1_MOVE1 ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld bc, $2c call AddNTimes push hl call Func_3d493 pop hl ld bc, $15 add hl, bc call Func_3d493 xor a ld [wcc35], a jp MoveSelectionMenu Func_3d493: ; 3d493 (f:5493) push hl ld a, [wcc35] dec a ld c, a ld b, $0 add hl, bc ld d, h ld e, l pop hl ld a, [wCurrentMenuItem] ; wCurrentMenuItem 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 asm_3d4ad: ; 3d4ad (f:54ad) ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld [wcc35], a jp MoveSelectionMenu Func_3d4b6: ; 3d4b6 (f:54b6) xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba FuncCoord 0, 8 ld hl, Coord ld b, $3 ld c, $9 call TextBoxBorder ld a, [W_PLAYERDISABLEDMOVE] ; W_PLAYERDISABLEDMOVE and a jr z, .asm_3d4df swap a and $f ld b, a ld a, [wCurrentMenuItem] ; wCurrentMenuItem cp b jr nz, .asm_3d4df FuncCoord 1, 10 ld hl, Coord ld de, DisabledText call PlaceString jr .asm_3d54e .asm_3d4df ld hl, wCurrentMenuItem ; wCurrentMenuItem dec [hl] xor a ld [H_WHOSETURN], a ; $fff3 ld hl, W_PLAYERMONMOVES ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld c, a ld b, $0 add hl, bc ld a, [hl] ld [wPlayerSelectedMove], a ; wPlayerSelectedMove ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld [wWhichPokemon], a ; wWhichPokemon ld a, $4 ld [wcc49], a callab GetMaxPP ld hl, wCurrentMenuItem ; wCurrentMenuItem ld c, [hl] inc [hl] ld b, $0 ld hl, W_PLAYERMONPP ; W_PLAYERMONPP add hl, bc ld a, [hl] and $3f ld [wcd6d], a FuncCoord 1, 9 ld hl, Coord ld de, TypeText call PlaceString FuncCoord 7, 11 ld hl, Coord ld [hl], "/" FuncCoord 5, 9 ld hl, Coord ld [hl], "/" FuncCoord 5, 11 ld hl, Coord ld de, wcd6d ld bc, $102 call PrintNumber FuncCoord 8, 11 ld hl, Coord ld de, wd11e ld bc, $102 call PrintNumber call GetCurrentMove FuncCoord 2, 10 ld hl, Coord ld a, $5d call Predef ; indirect jump to Func_27d98 (27d98 (9:7d98)) .asm_3d54e ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a ; $ffba jp Delay3 DisabledText: ; 3d555 (f:5555) db "disabled!@" TypeText: ; 3d55f (f:555f) db "TYPE@" SelectEnemyMove: ; 3d564 (f:5564) ld a, [W_ISLINKBATTLE] sub $4 jr nz, .noLinkBattle call SaveScreenTilesToBuffer1 call Func_3d605 call LoadScreenTilesFromBuffer1 ld a, [wcc3e] cp $e jp z, .asm_3d601 cp $d jr z, .unableToMove cp $4 ret nc ld [wEnemyMoveListIndex], a ld c, a ld hl, W_ENEMYMONMOVES ld b, $0 add hl, bc ld a, [hl] jr .done .noLinkBattle ld a, [W_ENEMYBATTSTATUS2] and $60 ; need to recharge or using rage ret nz ld hl, W_ENEMYBATTSTATUS1 ld a, [hl] and $12 ; using multi-turn move or bide ret nz ld a, [W_ENEMYMONSTATUS] and SLP | 1 << FRZ ; sleeping or frozen ret nz ld a, [W_ENEMYBATTSTATUS1] and $21 ; using fly/dig or thrash/petal dance ret nz ld a, [W_PLAYERBATTSTATUS1] bit 5, a ; caught in player's multi-turn move (e.g. wrap) jr z, .notCaughtInWrap .unableToMove ld a, $ff jr .done .notCaughtInWrap ld hl, W_ENEMYMONMOVES+1 ; 2nd enemy move ld a, [hld] and a jr nz, .atLeastTwoMovesAvailable ld a, [W_ENEMYDISABLEDMOVE] and a ld a, STRUGGLE ; struggle if the only move is disabled jr nz, .done .atLeastTwoMovesAvailable ld a, [W_ISINBATTLE] dec a jr z, .chooseRandomMove ; wild encounter callab AIEnemyTrainerChooseMoves .chooseRandomMove push hl call BattleRandom ld b, $1 cp $3f ; select move 1 in [0,3e] (63/256 chance) jr c, .moveChosen inc hl inc b cp $7f ; select move 1 in [3f,7e] (64/256 chance) jr c, .moveChosen inc hl inc b cp $be ; select move 1 in [7f,bd] (63/256 chance) jr c, .moveChosen inc hl inc b ; select move 4 in [be,ff] (66/256 chance) .moveChosen ld a, b dec a ld [wEnemyMoveListIndex], a ld a, [W_ENEMYDISABLEDMOVE] swap a and $f cp b ld a, [hl] pop hl jr z, .chooseRandomMove ; move disabled, try again and a jr z, .chooseRandomMove ; move non-existant, try again .done ld [wEnemySelectedMove], a ret .asm_3d601 ld a, $a5 jr .done Func_3d605: ; 3d605 (f:5605) ld a, $ff ld [wcc3e], a ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex cp $f jr z, .asm_3d630 ld a, [wcd6a] and a jr nz, .asm_3d629 ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove cp $a5 ld b, $e jr z, .asm_3d62f dec b inc a jr z, .asm_3d62f ld a, [wPlayerMoveListIndex] ; wPlayerMoveListIndex jr .asm_3d630 .asm_3d629 ld a, [wWhichPokemon] ; wWhichPokemon add $4 ld b, a .asm_3d62f ld a, b .asm_3d630 ld [wcc42], a callab PrintWaitingText .asm_3d63b call Func_22c3 call DelayFrame ld a, [wcc3e] inc a jr z, .asm_3d63b ld b, $a .asm_3d649 call DelayFrame call Func_22c3 dec b jr nz, .asm_3d649 ld b, $a .asm_3d654 call DelayFrame call Func_22ed dec b jr nz, .asm_3d654 ret Func_3d65e: ; 3d65e (f:565e) xor a ld [H_WHOSETURN], a ; $fff3 ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove inc a jp z, Func_3d80a xor a ld [W_MOVEMISSED], a ; W_MOVEMISSED ld [wcced], a ld [wccf4], a ld a, $a ld [wd05b], a ld a, [wcd6a] and a jp nz, Func_3d80a call PrintGhostText jp z, Func_3d80a call Func_3d854 jr nz, .asm_3d68a jp [hl] .asm_3d68a call GetCurrentMove ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 bit 4, [hl] jr nz, asm_3d6a9 call Func_3dc88 jp z, Func_3d80a Func_3d69a: ; 3d69a (f:569a) ld a, [W_PLAYERMOVEEFFECT] ; wcfd3 cp CHARGE_EFFECT jp z, Func_3f132 cp FLY_EFFECT jp z, Func_3f132 jr asm_3d6b0 ; in-battle stuff asm_3d6a9: ; 3d6a9 (f:56a9) ld hl,W_PLAYERBATTSTATUS1 res 4,[hl] res 6,[hl] asm_3d6b0: ; 3d6b0 (f:56b0) call PrintMonName1Text ld hl,DecrementPP ld de,wPlayerSelectedMove ; pointer to the move just used ld b,BANK(DecrementPP) call Bankswitch ld a,[W_PLAYERMOVEEFFECT] ; effect of the move just used ld hl,EffectsArray1 ld de,1 call IsInArray jp c,Func_3f132 ld a,[W_PLAYERMOVEEFFECT] ld hl,EffectsArray5B ld de,1 call IsInArray call c,Func_3f132 asm_3d6dc: ; 3d6dc (f:56dc) ld a,[W_PLAYERMOVEEFFECT] ld hl,EffectsArray2 ld de,1 call IsInArray jp c,.asm_3d702 call CriticalHitTest call HandleCounterMove jr z,asm_3d705 call CalculateDamage call MoreCalculateDamage jp z,asm_3d74b call AdjustDamageForMoveType call Func_3e687 .asm_3d702 call MoveHitTest asm_3d705 ld a,[W_MOVEMISSED] and a jr z,asm_3d714 ld a,[W_PLAYERMOVEEFFECT] sub a,7 jr z,asm_3d71e jr asm_3d74b ; 574B asm_3d714 ld a,[W_PLAYERMOVEEFFECT] and a ld a,4 jr z,asm_3d71e ld a,5 asm_3d71e push af ld a,[W_PLAYERBATTSTATUS2] bit 4,a ld hl,Func_79747 ld b,BANK(Func_79747) call nz,Bankswitch pop af ld [wcc5b],a ld a,[W_PLAYERMOVENUM] call PlayMoveAnimation call Func_3eed3 call Func_3cd60 ld a,[W_PLAYERBATTSTATUS2] bit 4,a ld hl,Func_79771 ld b,BANK(Func_79771) call nz,Bankswitch jr asm_3d766 asm_3d74b ld c,$1E call DelayFrames ld a,[W_PLAYERMOVEEFFECT] cp a,FLY_EFFECT jr z,.next5 cp a,CHARGE_EFFECT jr z,.next5 jr asm_3d766 .next5 xor a ld [wcc5b],a ld a,STATUS_AFFECTED_ANIM call PlayMoveAnimation asm_3d766 ld a,[W_PLAYERMOVEEFFECT] cp a,MIRROR_MOVE_EFFECT jr nz,.next6 ; 577A call MirrorMoveCopyMove jp z,Func_3d80a xor a ld [wcced],a jp Func_3d69a .next6 cp a,METRONOME_EFFECT jr nz,.next7 ; 5784 call MetronomePickMove jp Func_3d69a .next7 ld a,[W_PLAYERMOVEEFFECT] ld hl,EffectsArray3 ld de,1 call IsInArray jp c,Func_3f132 ld a,[W_MOVEMISSED] and a jr z,.next8 ; 57A6 call PrintMoveFailureText ld a,[W_PLAYERMOVEEFFECT] cp a,EXPLODE_EFFECT jr z,.next9 ; 57B9 jp Func_3d80a .next8 call ApplyAttackToEnemyPokemon call Func_3dc5c callab DisplayEffectiveness ld a,1 ld [wccf4],a .next9 ld a,[W_PLAYERMOVEEFFECT] ld hl,EffectsArray4 ld de,1 call IsInArray call c,Func_3f132 ld hl,W_ENEMYMONCURHP ld a,[hli] ld b,[hl] or b ret z call HandleBuildingRage ld hl,W_PLAYERBATTSTATUS1 bit 2,[hl] jr z,.next10 ; 57EF ld a,[wd06a] dec a ld [wd06a],a jp nz,asm_3d714 res 2,[hl] ld hl,MultiHitText call PrintText xor a ld [W_NUMHITS],a ; reset .next10 ld a,[W_PLAYERMOVEEFFECT] and a jp z,Func_3d80a ld hl,EffectsArray5 ld de,1 call IsInArray call nc,Func_3f132 jp Func_3d80a MultiHitText: ; 3d805 (f:5805) TX_FAR _MultiHitText db "@" Func_3d80a: ; 3d80a (f:580a) xor a ld [wcd6a],a ld b,1 ret PrintGhostText: ; 3d811 (f:5811) ; print the ghost battle messages call IsGhostBattle ret nz ld a,[H_WHOSETURN] and a jr nz,.Ghost ld a,[W_PLAYERMONSTATUS] ; player’s turn and a,SLP | (1 << FRZ) ret nz ld hl,ScaredText call PrintText xor a ret .Ghost ; ghost’s turn ld hl,GetOutText call PrintText xor a ret ScaredText: ; 3d830 (f:5830) TX_FAR _ScaredText db "@" GetOutText: ; 3d835 (f:5835) TX_FAR _GetOutText db "@" IsGhostBattle: ; 3d83a (f:583a) ld a,[W_ISINBATTLE] dec a ret nz ld a,[W_CURMAP] cp a,POKEMONTOWER_1 jr c,.next cp a,LAVENDER_HOUSE_1 jr nc,.next ld b,SILPH_SCOPE call IsItemInBag ; $3493 ret z .next ld a,1 and a ret Func_3d854: ; 3d854 (f:5854) ld hl,W_PLAYERMONSTATUS ld a,[hl] and a,SLP jr z,.FrozenCheck ; to 5884 dec a ld [W_PLAYERMONSTATUS],a ; decrement sleep count and a jr z,.WakeUp ; to 5874 xor a ld [wcc5b],a ld a,SLP_ANIM - 1 call PlayMoveAnimation ld hl,FastAsleepText call PrintText jr .sleepDone .WakeUp ld hl,WokeUpText call PrintText .sleepDone xor a ld [wccf1],a ld hl,Func_3d80a jp Func_3da37 .FrozenCheck bit FRZ,[hl] ; frozen? jr z,.HeldInPlaceCheck ; to 5898 ld hl,IsFrozenText call PrintText xor a ld [wccf1],a ld hl,Func_3d80a jp Func_3da37 .HeldInPlaceCheck ld a,[W_ENEMYBATTSTATUS1] bit 5,a jp z,FlinchedCheck ld hl,CantMoveText call PrintText ld hl,Func_3d80a jp Func_3da37 FlinchedCheck: ; 3d8ac (f:58ac) ld hl,W_PLAYERBATTSTATUS1 bit 3,[hl] jp z,HyperBeamCheck res 3,[hl] ld hl,FlinchedText call PrintText ld hl,Func_3d80a jp Func_3da37 HyperBeamCheck: ; 3d8c2 (f:58c2) ld hl,W_PLAYERBATTSTATUS2 bit 5,[hl] jr z,.next ; 58D7 res 5,[hl] ld hl,MustRechargeText call PrintText ld hl,Func_3d80a ; $580a jp Func_3da37 .next ld hl,W_PLAYERDISABLEDMOVE ld a,[hl] and a jr z,.next2 ; 58EE dec a ld [hl],a and a,$F jr nz,.next2 ld [hl],a ld [wccee],a ld hl,DisabledNoMoreText call PrintText .next2 ld a,[W_PLAYERBATTSTATUS1] add a jr nc,.next3 ; 5929 ld hl,wd06b dec [hl] jr nz,.next4 ; 5907 ld hl,W_PLAYERBATTSTATUS1 res 7,[hl] ld hl,ConfusedNoMoreText call PrintText jr .next3 .next4 ld hl,IsConfusedText call PrintText xor a ld [wcc5b],a ld a,CONF_ANIM - 1 call PlayMoveAnimation call BattleRandom cp a,$80 jr c,.next3 ld hl,W_PLAYERBATTSTATUS1 ld a,[hl] and a,$80 ; confused ld [hl],a call PrintHurtItselfText jr .next5 ; 5952 .next3 ld a,[wccee] and a jr z,.ParalysisCheck ; 593E ld hl,wPlayerSelectedMove cp [hl] jr nz,.ParalysisCheck call PrintMoveIsDisabledText ld hl,Func_3d80a ; $580a jp Func_3da37 .ParalysisCheck ld hl,W_PLAYERMONSTATUS bit PAR,[hl] jr z,.next7 ; 5975 call BattleRandom cp a,$3F jr nc,.next7 ld hl,FullyParalyzedText call PrintText .next5 ld hl,W_PLAYERBATTSTATUS1 ld a,[hl] and a,$CC ld [hl],a ld a,[W_PLAYERMOVEEFFECT] cp a,FLY_EFFECT jr z,.next8 ; 5966 cp a,CHARGE_EFFECT jr z,.next8 jr .next9 ; 596F .next8 xor a ld [wcc5b],a ld a,STATUS_AFFECTED_ANIM call PlayMoveAnimation .next9 ld hl,Func_3d80a ; $580a jp Func_3da37 .next7 ld hl,W_PLAYERBATTSTATUS1 bit 0,[hl] jr z,.next10 ; 59D0 xor a ld [W_PLAYERMOVENUM],a ld hl,W_DAMAGE ld a,[hli] ld b,a ld c,[hl] ld hl,wd075 ld a,[hl] add c ld [hld],a ld a,[hl] adc b ld [hl],a ld hl,wd06a dec [hl] jr z,.next11 ; 599B ld hl,Func_3d80a ; $580a jp Func_3da37 .next11 ld hl,W_PLAYERBATTSTATUS1 res 0,[hl] ld hl,UnleashedEnergyText call PrintText ld a,1 ld [W_PLAYERMOVEPOWER],a ld hl,wd075 ld a,[hld] add a ld b,a ld [wd0d8],a ld a,[hl] rl a ld [W_DAMAGE],a or b jr nz,.next12 ; 59C2 ld a,1 ld [W_MOVEMISSED],a .next12 xor a ld [hli],a ld [hl],a ld a,BIDE ld [W_PLAYERMOVENUM],a ld hl,asm_3d705 ; $5705 jp Func_3da37 .next10 bit 1,[hl] jr z,.next13 ; 59FF ld a,THRASH ld [W_PLAYERMOVENUM],a ld hl,ThrashingAboutText call PrintText ld hl,wd06a dec [hl] ld hl,asm_3d6dc ; $56dc jp nz,Func_3da37 push hl ld hl,W_PLAYERBATTSTATUS1 res 1,[hl] set 7,[hl] call BattleRandom and a,3 inc a inc a ld [wd06b],a pop hl jp Func_3da37 .next13 bit 5,[hl] jp z,Func_3da1a ld hl,AttackContinuesText call PrintText ld a,[wd06a] dec a ld [wd06a],a ld hl,asm_3d714 ; $5714 jp nz,Func_3da37 jp Func_3da37 Func_3da1a: ; 3da1a (f:5a1a) ld a, [W_PLAYERBATTSTATUS2] ; W_PLAYERBATTSTATUS2 bit 6, a jp z, Func_3da39 ld a, RAGE ld [wd11e], a call GetMoveName call CopyStringToCF4B xor a ld [W_PLAYERMOVEEFFECT], a ; wcfd3 ld hl, asm_3d6b0 ; $56b0 jp Func_3da37 Func_3da37: ; 3da37 (f:5a37) xor a ret Func_3da39: ; 3da39 (f:5a39) ld a, $1 and a ret FastAsleepText: ; 3da3d (f:5a3d) TX_FAR _FastAsleepText db "@" WokeUpText: ; 3da42 (f:5a42) TX_FAR _WokeUpText db "@" IsFrozenText: ; 3da47 (f:5a47) TX_FAR _IsFrozenText db "@" FullyParalyzedText: ; 3da4c (f:5a4c) TX_FAR _FullyParalyzedText db "@" FlinchedText: ; 3da51 (f:5a51) TX_FAR _FlinchedText db "@" MustRechargeText: ; 3da56 (f:5a56) TX_FAR _MustRechargeText db "@" DisabledNoMoreText: ; 3da5b (f:5a5b) TX_FAR _DisabledNoMoreText db "@" IsConfusedText: ; 3da60 (f:5a60) TX_FAR _IsConfusedText db "@" HurtItselfText: ; 3da65 (f:5a65) TX_FAR _HurtItselfText db "@" ConfusedNoMoreText: ; 3da6a (f:5a6a) TX_FAR _ConfusedNoMoreText db "@" SavingEnergyText: ; 3da6f (f:5a6f) TX_FAR _SavingEnergyText db "@" UnleashedEnergyText: ; 3da74 (f:5a74) TX_FAR _UnleashedEnergyText db "@" ThrashingAboutText: ; 3da79 (f:5a79) TX_FAR _ThrashingAboutText db "@" AttackContinuesText: ; 3da7e (f:5a7e) TX_FAR _AttackContinuesText db "@" CantMoveText: ; 3da83 (f:5a83) TX_FAR _CantMoveText db "@" PrintMoveIsDisabledText: ; 3da88 (f:5a88) ld hl, wPlayerSelectedMove ; wPlayerSelectedMove ld de, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3da97 inc hl ld de, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 .asm_3da97 ld a, [de] res 4, a ld [de], a ld a, [hl] ld [wd11e], a call GetMoveName ld hl, MoveIsDisabledText jp PrintText MoveIsDisabledText: ; 3daa8 (f:5aa8) TX_FAR _MoveIsDisabledText db "@" PrintHurtItselfText: ; 3daad (f:5aad) ld hl, HurtItselfText call PrintText ld hl, W_ENEMYMONDEFENSE ; wcff8 ld a, [hli] push af ld a, [hld] push af ld a, [W_PLAYERMONDEF] ld [hli], a ld a, [W_PLAYERMONDEF + 1] ld [hl], a ld hl, W_PLAYERMOVEEFFECT ; wcfd3 push hl ld a, [hl] push af xor a ld [hli], a ld [wd05e], a ld a, $28 ld [hli], a xor a ld [hl], a call CalculateDamage call MoreCalculateDamage pop af pop hl ld [hl], a ld hl, W_ENEMYMONDEFENSE + 1 pop af ld [hld], a pop af ld [hl], a xor a ld [wcc5b], a inc a ld [H_WHOSETURN], a ; $fff3 call PlayMoveAnimation call Func_3cd60 xor a ld [H_WHOSETURN], a ; $fff3 jp ApplyDamageToPlayerPokemon PrintMonName1Text: ; 3daf5 (f:5af5) ld hl, MonName1Text jp PrintText MonName1Text: ; 3dafb (f:5afb) TX_FAR _MonName1Text db $08 ; asm ld a, [H_WHOSETURN] ; $fff3 and a ld a, [W_PLAYERMOVENUM] ; wcfd2 ld hl, wccf1 jr z, .asm_3db11 ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM ld hl, wccf2 .asm_3db11 ld [hl], a ld [wd11e], a call Func_3db85 ld a, [wcced] and a ld hl, Used2Text ret nz ld a, [wd11e] cp DOUBLESLAP ld hl, Used2Text ret c ld hl, Used1Text ret Used1Text: ; 3db2d (f:5b2d) TX_FAR _Used1Text db $08 ; asm jr PrintInsteadText Used2Text: ; 3db34 (f:5b34) TX_FAR _Used2Text db $08 ; asm PrintInsteadText: ; 3db39 (f:5b39) ld a, [wcced] and a jr z, PrintCF4BText ld hl, InsteadText ret InsteadText: ; 3db43 (f:5b43) TX_FAR _InsteadText db $08 ; asm PrintCF4BText: ; 3db48 (f:5b48) ld hl, CF4BText ret CF4BText: ; 3db4c (f:5b4c) TX_FAR _CF4BText db $08 ; asm ld hl, ExclamationPointPointerTable ld a, [wd11e] add a push bc ld b, $0 ld c, a add hl, bc pop bc ld a, [hli] ld h, [hl] ld l, a ret ExclamationPointPointerTable: ; 3db62 (f:5b62) dw ExclamationPoint1Text dw ExclamationPoint2Text dw ExclamationPoint3Text dw ExclamationPoint4Text dw ExclamationPoint5Text ExclamationPoint1Text: ; 3db6c (f:5b6c) TX_FAR _ExclamationPoint1Text db "@" ExclamationPoint2Text: ; 3db71 (f:5b71) TX_FAR _ExclamationPoint2Text db "@" ExclamationPoint3Text: ; 3db76 (f:5b76) TX_FAR _ExclamationPoint3Text db "@" ExclamationPoint4Text: ; 3db7b (f:5b7b) TX_FAR _ExclamationPoint4Text db "@" ExclamationPoint5Text: ; 3db80 (f:5b80) TX_FAR _ExclamationPoint5Text db "@" Func_3db85: ; 3db85 (f:5b85) push bc ld a, [wd11e] ; move number ld c, a ld b, $0 ld hl, UnknownMovesList_3dba3 ; $5ba3 .asm_3db8f ld a, [hli] cp $ff jr z, .asm_3db9d cp c jr z, .asm_3db9d and a jr nz, .asm_3db8f inc b jr .asm_3db8f .asm_3db9d ld a, b ld [wd11e], a pop bc ret UnknownMovesList_3dba3: ; 3dba3 (f:5ba3) db SWORDS_DANCE, GROWTH db $00 db RECOVER, BIDE, SELFDESTRUCT, AMNESIA db $00 db MEDITATE, AGILITY, TELEPORT, MIMIC, DOUBLE_TEAM, BARRAGE db $00 db POUND, SCRATCH, VICEGRIP, WING_ATTACK, FLY, BIND, SLAM, HORN_ATTACK, BODY_SLAM db WRAP, THRASH, TAIL_WHIP, LEER, BITE, GROWL, ROAR, SING, PECK, COUNTER db STRENGTH, ABSORB, STRING_SHOT, EARTHQUAKE, FISSURE, DIG, TOXIC, SCREECH, HARDEN db MINIMIZE, WITHDRAW, DEFENSE_CURL, METRONOME, LICK, CLAMP, CONSTRICT, POISON_GAS db LEECH_LIFE, BUBBLE, FLASH, SPLASH, ACID_ARMOR, FURY_SWIPES, REST, SHARPEN, SLASH, SUBSTITUTE db $00 db $FF ; terminator PrintMoveFailureText: ; 3dbe2 (f:5be2) ld de, W_PLAYERMOVEEFFECT ; wcfd3 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3dbed ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT .asm_3dbed ld hl, DoesntAffectMonText ; $5c57 ld a, [wd05b] and $7f jr z, .asm_3dc04 ld hl, AttackMissedText ; $5c42 ld a, [wd05e] cp $ff jr nz, .asm_3dc04 ld hl, UnaffectedText ; $5c4c .asm_3dc04 push de call PrintText xor a ld [wd05e], a pop de ld a, [de] cp JUMP_KICK_EFFECT ret nz ; if you get here, the mon used hi jump kick and missed ld hl, W_DAMAGE ; W_DAMAGE ld a, [hli] ld b, [hl] srl a rr b srl a rr b srl a rr b ld [hl], b dec hl ld [hli], a or b jr nz, .asm_3dc2a inc a ld [hl], a .asm_3dc2a ld hl, KeptGoingAndCrashedText ; $5c47 call PrintText ld b, $4 ld a, $24 call Predef ; indirect jump to Func_48125 (48125 (12:4125)) ld a, [H_WHOSETURN] ; $fff3 and a jr nz, .asm_3dc3f jp ApplyDamageToPlayerPokemon .asm_3dc3f jp ApplyDamageToEnemyPokemon AttackMissedText: ; 3dc42 (f:5c42) TX_FAR _AttackMissedText db "@" KeptGoingAndCrashedText: ; 3dc47 (f:5c47) TX_FAR _KeptGoingAndCrashedText db "@" UnaffectedText: ; 3dc4c (f:5c4c) TX_FAR _UnaffectedText db "@" PrintDoesntAffectText: ; 3dc51 (f:5c51) ld hl, DoesntAffectMonText ; $5c57 jp PrintText DoesntAffectMonText: ; 3dc57 (f:5c57) TX_FAR _DoesntAffectMonText db "@" Func_3dc5c: ; 3dc5c (f:5c5c) ld a, [wd05e] and a jr z, .asm_3dc75 dec a add a ld hl, CriticalOHKOTextPointers ; $5c7a ld b, $0 ld c, a add hl, bc ld a, [hli] ld h, [hl] ld l, a call PrintText xor a ld [wd05e], a .asm_3dc75 ld c, $14 jp DelayFrames CriticalOHKOTextPointers: ; 3dc7a (f:5c7a) dw CriticalHitText dw OHKOText CriticalHitText: ; 3dc7e (f:5c7e) TX_FAR _CriticalHitText db "@" OHKOText: ; 3dc83 (f:5c83) TX_FAR _OHKOText db "@" Func_3dc88: ; 3dc88 (f:5c88) xor a ld [wcced], a ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3dc97 ld a, $1 and a ret .asm_3dc97 ld hl, W_PARTYMON1_OTID ; W_PARTYMON1_OTID ld bc, $2c ld a, [wPlayerMonNumber] ; wPlayerMonNumber call AddNTimes ld a, [wPlayerID] ; wPlayerID cp [hl] jr nz, .asm_3dcb1 inc hl ld a, [wPlayerID + 1] ; wd35a cp [hl] jp z, Func_3ddb0 .asm_3dcb1 ; what level might disobey? ld hl, W_OBTAINEDBADGES bit 7, [hl] ld a, 101 jr nz, .asm_3dcce bit 5, [hl] ld a, 70 jr nz, .asm_3dcce bit 3, [hl] ld a, 50 jr nz, .asm_3dcce bit 1, [hl] ld a, 30 jr nz, .asm_3dcce ld a, 10 .asm_3dcce ld b, a ld c, a ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL ld d, a add b ld b, a jr nc, .asm_3dcda ld b, $ff .asm_3dcda ld a, c cp d jp nc, Func_3ddb0 .asm_3dcdf call BattleRandom swap a cp b jr nc, .asm_3dcdf cp c jp c, Func_3ddb0 .asm_3dceb call BattleRandom cp b jr nc, .asm_3dceb cp c jr c, .asm_3dd3f ld a, d sub c ld b, a call BattleRandom swap a sub b jr c, .asm_3dd0e cp b jr nc, .asm_3dd20 ld hl, WontObeyText call PrintText call PrintHurtItselfText jp Func_3ddb4 .asm_3dd0e call BattleRandom add a swap a and $7 jr z, .asm_3dd0e ld [W_PLAYERMONSTATUS], a ; W_PLAYERMONSTATUS ld hl, BeganToNapText jr .asm_3dd3a .asm_3dd20 call BattleRandom and $3 ld hl, LoafingAroundText and a jr z, .asm_3dd3a ld hl, WontObeyText dec a jr z, .asm_3dd3a ld hl, TurnedAwayText dec a jr z, .asm_3dd3a ld hl, IgnoredOrdersText .asm_3dd3a call PrintText jr Func_3ddb4 .asm_3dd3f ld a, [W_PLAYERMONMOVES + 1] and a jr z, .asm_3dd20 ld a, [wccee] and a jr nz, .asm_3dd20 ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove cp $a5 jr z, .asm_3dd20 ld hl, W_PLAYERMONPP ; W_PLAYERMONPP push hl ld a, [hli] and $3f ld b, a ld a, [hli] and $3f add b ld b, a ld a, [hli] and $3f add b ld b, a ld a, [hl] and $3f add b pop hl push af ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld c, a ld b, $0 add hl, bc ld a, [hl] and $3f ld b, a pop af cp b jr z, .asm_3dd20 ld a, $1 ld [wcced], a ld a, [wMaxMenuItem] ; wMaxMenuItem ld b, a ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld c, a .asm_3dd86 call BattleRandom and $3 cp b jr nc, .asm_3dd86 cp c jr z, .asm_3dd86 ld [wCurrentMenuItem], a ; wCurrentMenuItem ld hl, W_PLAYERMONPP ; W_PLAYERMONPP ld e, a ld d, $0 add hl, de ld a, [hl] and a jr z, .asm_3dd86 ld a, [wCurrentMenuItem] ; wCurrentMenuItem ld c, a ld b, $0 ld hl, W_PLAYERMONMOVES add hl, bc ld a, [hl] ld [wPlayerSelectedMove], a ; wPlayerSelectedMove call GetCurrentMove Func_3ddb0: ; 3ddb0 (f:5db0) ld a, $1 and a ret Func_3ddb4: ; 3ddb4 (f:5db4) xor a ret LoafingAroundText: ; 3ddb6 (f:5db6) TX_FAR _LoafingAroundText db "@" BeganToNapText: ; 3ddbb (f:5dbb) TX_FAR _BeganToNapText db "@" WontObeyText: ; 3ddc0 (f:5dc0) TX_FAR _WontObeyText db "@" TurnedAwayText: ; 3ddc5 (f:5dc5) TX_FAR _TurnedAwayText db "@" IgnoredOrdersText: ; 3ddca (f:5dca) TX_FAR _IgnoredOrdersText db "@" CalculateDamage: ; 3ddcf (f:5dcf) xor a ld hl, W_DAMAGE ;damage to eventually inflict, intitialise to zero ldi [hl], a ld [hl], a ld hl, W_PLAYERMOVEPOWER ld a, [hli] ;*read attack base power and a ld d, a ;*D = attack base, used later ret z ;return if attack is zero ld a, [hl] ;*test attacking type cp a, $14 ;types >= $14 are all special jr nc, .specialAttack .physicalAttack ld hl, W_ENEMYMONDEFENSE ;opponent defense ld a, [hli] ;*BC = opponent defense used later ld b, a ld c, [hl] ld a, [W_ENEMYBATTSTATUS3] ;test for reflect bit 2, a jr z, .next .doubleDefense sla c ;x2 defense if bit2 of D069 is set rl b .next ld hl, W_PLAYERMONATK ;attack pointer ld a, [wd05e] and a jr z, .next3 ld c, 3 call Func_3df1c ld a, [$ff97] ld b, a ld a, [$ff98] ld c, a push bc ld hl, W_PARTYMON1_ATACK ld a, [wPlayerMonNumber] ld bc, $002c call AddNTimes pop bc jr .next3 .specialAttack ld hl, W_ENEMYMONSPECIAL ;opponent special ld a, [hli] ;*BC = opponent special defense used later ld b, a ld c, [hl] ld a, [W_ENEMYBATTSTATUS3] ;test for lightscreen bit 1, a jr z, .next2 .doubleSpecialDefense sla c ;x2 special defense if bit1 of D069 set rl b .next2 ld hl, W_PLAYERMONSPECIAL ld a, [wd05e] ;XXX and a jr z, .next3 ;skip portion of code that pulls up inactive pokemon .loadOtherPoke ld c, 5 call Func_3df1c ld a, [$ff97] ld b, a ld a, [$ff98] ld c, a push bc ld hl, W_PARTYMON1_SPECIAL ld a, [wPlayerMonNumber] ld bc, $002c call AddNTimes pop bc .next3 ld a, [hli] ;HL: when this was taken ld l, [hl] ld h, a ;*HL = attacker attack or b ;is either attack or defense high byte nonzero? jr z, .next4 srl b ;[defense] BC /= 4 [this is just so it fits into a single byte, 10bits max] rr c srl b rr c srl h ;[attack] HL /= 4 [to apply equal scaling] rr l srl h rr l ld a, l or h jr nz, .next4 ;is HL result zero? inc l ;minimum HL = 1 .next4 ld b, l ;*B = attack [possibly scaled] [C contains defense] ld a, [W_PLAYERMONLEVEL] ;*E = level ld e, a ld a, [wd05e] ;critical hit? and a jr z, .next5 sla e ;double level if it was a critical hit .next5 ld a, 1 ;return Z = 0 and a ret Func_3de75: ; 3de75 (f:5e75) ld hl, W_DAMAGE ; W_DAMAGE xor a ld [hli], a ld [hl], a ld hl, W_ENEMYMOVEPOWER ; wcfce ld a, [hli] ld d, a and a ret z ld a, [hl] cp $14 jr nc, .asm_3debc ld hl, W_PLAYERMONDEF ld a, [hli] ld b, a ld c, [hl] ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3 bit 2, a jr z, .asm_3de98 sla c rl b .asm_3de98 ld hl, W_ENEMYMONATTACK ld a, [wd05e] and a jr z, .asm_3deef ld hl, W_PARTYMON1_DEFENSE ; wd191 ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld bc, $2c call AddNTimes ld a, [hli] ld b, a ld c, [hl] push bc ld c, $2 call Func_3df1c ld hl, $ff97 pop bc jr .asm_3deef .asm_3debc ld hl, W_PLAYERMONSPECIAL ld a, [hli] ld b, a ld c, [hl] ld a, [W_PLAYERBATTSTATUS3] ; W_PLAYERBATTSTATUS3 bit 1, a jr z, .asm_3decd sla c rl b .asm_3decd ld hl, W_ENEMYMONSPECIAL ; wcffc ld a, [wd05e] and a jr z, .asm_3deef ld hl, W_PARTYMON1_SPECIAL ; W_PARTYMON1_SPECIAL ld a, [wPlayerMonNumber] ; wPlayerMonNumber ld bc, $2c call AddNTimes ld a, [hli] ld b, a ld c, [hl] push bc ld c, $5 call Func_3df1c ld hl, $ff97 pop bc .asm_3deef ld a, [hli] ld l, [hl] ld h, a or b jr z, .asm_3df0a srl b rr c srl b rr c srl h rr l srl h rr l ld a, l or h jr nz, .asm_3df0a inc l .asm_3df0a ld b, l ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL ld e, a ld a, [wd05e] and a jr z, .asm_3df17 sla e .asm_3df17 ld a, $1 and a and a ret Func_3df1c: ; 3df1c (f:5f1c) push de push bc ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3df40 ld hl, wd8c6 dec c sla c ld b, $0 add hl, bc ld a, [W_ENEMYMONNUMBER] ; W_ENEMYMONNUMBER ld bc, $2c call AddNTimes ld a, [hli] ld [$ff97], a ld a, [hl] ld [$ff98], a pop bc pop de ret .asm_3df40 ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL ld [W_CURENEMYLVL], a ; W_CURENEMYLVL ld a, [wcfe5] ld [wd0b5], a call GetMonHeader ld hl, W_ENEMYMONATKDEFIV ld de, wcfaf ld a, [hli] ld [de], a inc de ld a, [hl] ld [de], a pop bc ld b, $0 ld hl, wcfa4 call CalcStat pop de ret MoreCalculateDamage: ; 3df65 (f:5f65) ; input: ; b: attack ; c: opponent defense ; d: base power ; e: level ld a, [$fff3] ; whose turn? and a ld a, [W_PLAYERMOVEEFFECT] jr z, .effect ld a, [W_ENEMYMOVEEFFECT] .effect ; EXPLODE_EFFECT halves defense. cp a, EXPLODE_EFFECT jr nz, .ok srl c jr nz, .ok inc c ; ...with a minimum value of 1 (used as a divisor later on) .ok ; Multi-hit attacks may or may not have 0 bp. cp a, TWO_TO_FIVE_ATTACKS_EFFECT jr z, .skipbp cp a, $1e jr z, .skipbp ; Calculate OHKO damage based on remaining HP. cp a, OHKO_EFFECT jp z, Func_3e016 ; Don't calculate damage for moves that don't do any. ld a, d ; base power and a ret z .skipbp xor a ld hl, H_DIVIDEND ldi [hl], a ldi [hl], a ld [hl], a ; Multiply level by 2 ld a, e ; level add a jr nc, .nc push af ld a, 1 ld [hl], a pop af .nc inc hl ldi [hl], a ; Divide by 5 ld a, 5 ldd [hl], a push bc ld b, 4 call Divide pop bc ; Add 2 inc [hl] inc [hl] inc hl ; multiplier ; Multiply by attack base power ld [hl], d call Multiply ; Multiply by attack stat ld [hl], b call Multiply ; Divide by defender's defense stat ld [hl], c ld b, 4 call Divide ; Divide by 50 ld [hl], 50 ld b, 4 call Divide ld hl, W_DAMAGE ld b, [hl] ld a, [H_QUOTIENT + 3] add b ld [H_QUOTIENT + 3], a jr nc, .asm_3dfd0 ld a, [H_QUOTIENT + 2] inc a ld [H_QUOTIENT + 2], a and a jr z, .asm_3e004 .asm_3dfd0 ld a, [H_QUOTIENT] ld b, a ld a, [H_QUOTIENT + 1] or a jr nz, .asm_3e004 ld a, [H_QUOTIENT + 2] cp 998 / $100 jr c, .asm_3dfe8 cp 998 / $100 + 1 jr nc, .asm_3e004 ld a, [H_QUOTIENT + 3] cp 998 % $100 jr nc, .asm_3e004 .asm_3dfe8 inc hl ld a, [H_QUOTIENT + 3] ld b, [hl] add b ld [hld], a ld a, [H_QUOTIENT + 2] ld b, [hl] adc b ld [hl], a jr c, .asm_3e004 ld a, [hl] cp 998 / $100 jr c, .asm_3e00a cp 998 / $100 + 1 jr nc, .asm_3e004 inc hl ld a, [hld] cp 998 % $100 jr c, .asm_3e00a .asm_3e004 ld a, 997 / $100 ld [hli], a ld a, 997 % $100 ld [hld], a .asm_3e00a inc hl ld a, [hl] add 2 ld [hld], a jr nc, .done inc [hl] .done ld a, 1 and a ret Func_3e016: ; 3e016 (f:6016) call Func_3f132 ld a, [W_MOVEMISSED] ; W_MOVEMISSED dec a ret UnusedHighCriticalMoves: ; 3e01e (f:601e) db KARATE_CHOP db RAZOR_LEAF db CRABHAMMER db SLASH db $FF ; 3e023 ; determines if attack is a critical hit ; azure heights claims "the fastest pokémon (who are,not coincidentally, ; among the most popular) tend to CH about 20 to 25% of the time." CriticalHitTest: ; 3e023 (f:6023) xor a ld [wd05e], a ld a, [H_WHOSETURN] ; $fff3 and a ld a, [wcfe5] jr nz, .asm_3e032 ld a, [W_PLAYERMONID] .asm_3e032 ld [wd0b5], a call GetMonHeader ld a, [W_MONHBASESPEED] ld b, a srl b ; (effective (base speed/2)) ld a, [H_WHOSETURN] ; $fff3 and a ld hl, W_PLAYERMOVEPOWER ; W_PLAYERMOVEPOWER ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 jr z, .calcCriticalHitProbability ld hl, W_ENEMYMOVEPOWER ; wcfce ld de, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 .calcCriticalHitProbability ; 0x3e04f ld a, [hld] ; read base power from RAM and a ret z ; do nothing if zero dec hl ld c, [hl] ; read move id ld a, [de] bit 2, a ; test for focus energy jr nz, .focusEnergyUsed ; bug: using focus energy causes a shift to the right instead of left, ; resulting in 1/4 the usual crit chance sla b ; (effective (base speed/2)*2) jr nc, .noFocusEnergyUsed ld b, $ff ; cap at 255/256 jr .noFocusEnergyUsed .focusEnergyUsed srl b .noFocusEnergyUsed ld hl, HighCriticalMoves ; table of high critical hit moves .Loop ld a, [hli] ; read move from move table cp c ; does it match the move about to be used? jr z, .HighCritical ; if so, the move about to be used is a high critical hit ratio move inc a ; move on to the next move, FF terminates loop jr nz, .Loop ; check the next move in HighCriticalMoves srl b ; /2 for regular move (effective (base speed / 2)) jr .SkipHighCritical ; continue as a normal move .HighCritical sla b ; *2 for high critical hit moves jr nc, .noCarry ld b, $ff ; cap at 255/256 .noCarry sla b ; *4 for high critical move (effective (base speed/2)*8)) jr nc, .SkipHighCritical ld b, $ff .SkipHighCritical call BattleRandom ; generates a random value, in "a" rlc a rlc a rlc a cp b ; check a against calculated crit rate ret nc ; no critical hit if no borrow ld a, $1 ld [wd05e], a ; set critical hit flag ret ; high critical hit moves HighCriticalMoves: ; 3e08e (f:608e) db KARATE_CHOP db RAZOR_LEAF db CRABHAMMER db SLASH db $FF ; function to determine if Counter hits and if so, how much damage it does HandleCounterMove: ; 3e093 (f:6093) ld a,[H_WHOSETURN] ; whose turn and a ; player's turn ld hl,wEnemySelectedMove ld de,W_ENEMYMOVEPOWER ld a,[wPlayerSelectedMove] jr z,.next ; enemy's turn ld hl,wPlayerSelectedMove ld de,W_PLAYERMOVEPOWER ld a,[wEnemySelectedMove] .next cp a,COUNTER ret nz ; return if not using Counter ld a,$01 ld [W_MOVEMISSED],a ; initialize the move missed variable to true (it is set to false below if the move hits) ld a,[hl] cp a,COUNTER ret z ; if the target also used Counter, miss ld a,[de] and a ret z ; if the move the target used has 0 power, miss ; check if the move the target used was Normal or Fighting type inc de ld a,[de] and a ; normal type jr z,.counterableType cp a,FIGHTING jr z,.counterableType ; if the move wasn't Normal or Fighting type, miss xor a ret .counterableType ld hl,W_DAMAGE ld a,[hli] or [hl] ret z ; Counter misses if the target did no damage to the Counter user ; double the damage that the target did to the Counter user ld a,[hl] add a ldd [hl],a ld a,[hl] adc a ld [hl],a jr nc,.noCarry ; damage is capped at 0xFFFF ld a,$ff ld [hli],a ld [hl],a .noCarry xor a ld [W_MOVEMISSED],a call MoveHitTest ; do the normal move hit test in addition to Counter's special rules xor a ret ApplyAttackToEnemyPokemon: ; 3e0df (f:60df) ld a,[W_PLAYERMOVEEFFECT] cp a,OHKO_EFFECT jr z,ApplyDamageToEnemyPokemon cp a,SUPER_FANG_EFFECT jr z,.superFangEffect cp a,SPECIAL_DAMAGE_EFFECT jr z,.specialDamage ld a,[W_PLAYERMOVEPOWER] and a jp z,ApplyAttackToEnemyPokemonDone jr ApplyDamageToEnemyPokemon .superFangEffect ; set the damage to half the target's HP ld hl,W_ENEMYMONCURHP ld de,W_DAMAGE ld a,[hli] srl a ld [de],a inc de ld b,a ld a,[hl] rr a ld [de],a or b jr nz,ApplyDamageToEnemyPokemon ; make sure Super Fang's damage is always at least 1 ld a,$01 ld [de],a jr ApplyDamageToEnemyPokemon .specialDamage ld hl,W_PLAYERMONLEVEL ld a,[hl] ld b,a ld a,[W_PLAYERMOVENUM] cp a,SEISMIC_TOSS jr z,.storeDamage cp a,NIGHT_SHADE jr z,.storeDamage ld b,SONICBOOM_DAMAGE cp a,SONICBOOM jr z,.storeDamage ld b,DRAGON_RAGE_DAMAGE cp a,DRAGON_RAGE jr z,.storeDamage ; Psywave ld a,[hl] ld b,a srl a add b ld b,a ; b = level * 1.5 ; loop until a random number in the range [1, b) is found .loop call BattleRandom and a jr z,.loop cp b jr nc,.loop ld b,a .storeDamage ld hl,W_DAMAGE xor a ld [hli],a ld a,b ld [hl],a ApplyDamageToEnemyPokemon: ; 3e142 (f:6142) ld hl,W_DAMAGE ld a,[hli] ld b,a ld a,[hl] or b jr z,ApplyAttackToEnemyPokemonDone ; we're done if damage is 0 ld a,[W_ENEMYBATTSTATUS2] bit 4,a ; does the enemy have a substitute? jp nz,AttackSubstitute ; subtract the damage from the pokemon's current HP ; also, save the current HP at wHPBarOldHP ld a,[hld] ld b,a ld a,[W_ENEMYMONCURHP + 1] ld [wHPBarOldHP],a sub b ld [W_ENEMYMONCURHP + 1],a ld a,[hl] ld b,a ld a,[W_ENEMYMONCURHP] ld [wHPBarOldHP+1],a sbc b ld [W_ENEMYMONCURHP],a jr nc,.animateHpBar ; if more damage was done than the current HP, zero the HP and set the damage ; equal to how much HP the pokemon had before the attack ld a,[wHPBarOldHP+1] ld [hli],a ld a,[wHPBarOldHP] ld [hl],a xor a ld hl,W_ENEMYMONCURHP ld [hli],a ld [hl],a .animateHpBar ld hl,W_ENEMYMONMAXHP ld a,[hli] ld [wHPBarMaxHP+1],a ld a,[hl] ld [wHPBarMaxHP],a ld hl,W_ENEMYMONCURHP ld a,[hli] ld [wHPBarNewHP+1],a ld a,[hl] ld [wHPBarNewHP],a FuncCoord 2, 2 ld hl,Coord xor a ld [wListMenuID],a ld a,$48 call Predef ; animate the HP bar shortening ApplyAttackToEnemyPokemonDone: ; 3e19d (f:619d) jp Func_3cd5a ; redraw pokemon names and HP bars ApplyAttackToPlayerPokemon: ; 3e1a0 (f:61a0) ld a,[W_ENEMYMOVEEFFECT] cp a,OHKO_EFFECT jr z,ApplyDamageToPlayerPokemon cp a,SUPER_FANG_EFFECT jr z,.superFangEffect cp a,SPECIAL_DAMAGE_EFFECT jr z,.specialDamage ld a,[W_ENEMYMOVEPOWER] and a jp z,ApplyAttackToPlayerPokemonDone jr ApplyDamageToPlayerPokemon .superFangEffect ; set the damage to half the target's HP ld hl,W_PLAYERMONCURHP ld de,W_DAMAGE ld a,[hli] srl a ld [de],a inc de ld b,a ld a,[hl] rr a ld [de],a or b jr nz,ApplyDamageToPlayerPokemon ; make sure Super Fang's damage is always at least 1 ld a,$01 ld [de],a jr ApplyDamageToPlayerPokemon .specialDamage ld hl,W_ENEMYMONLEVEL ld a,[hl] ld b,a ld a,[W_ENEMYMOVENUM] cp a,SEISMIC_TOSS jr z,.storeDamage cp a,NIGHT_SHADE jr z,.storeDamage ld b,SONICBOOM_DAMAGE cp a,SONICBOOM jr z,.storeDamage ld b,DRAGON_RAGE_DAMAGE cp a,DRAGON_RAGE jr z,.storeDamage ; Psywave ld a,[hl] ld b,a srl a add b ld b,a ; b = attacker's level * 1.5 ; loop until a random number in the range [0, b) is found ; this differs from the range when the player attacks, which is [1, b) ; it's possible for the enemy to do 0 damage with Psywave, but the player always does at least 1 damage .loop call BattleRandom cp b jr nc,.loop ld b,a .storeDamage ld hl,W_DAMAGE xor a ld [hli],a ld a,b ld [hl],a ApplyDamageToPlayerPokemon: ; 3e200 (f:6200) ld hl,W_DAMAGE ld a,[hli] ld b,a ld a,[hl] or b jr z,ApplyAttackToPlayerPokemonDone ; we're done if damage is 0 ld a,[W_PLAYERBATTSTATUS2] bit 4,a ; does the player have a substitute? jp nz,AttackSubstitute ; subtract the damage from the pokemon's current HP ; also, save the current HP at wHPBarOldHP and the new HP at wHPBarNewHP ld a,[hld] ld b,a ld a,[W_PLAYERMONCURHP + 1] ld [wHPBarOldHP],a sub b ld [W_PLAYERMONCURHP + 1],a ld [wHPBarNewHP],a ld b,[hl] ld a,[W_PLAYERMONCURHP] ld [wHPBarOldHP+1],a sbc b ld [W_PLAYERMONCURHP],a ld [wHPBarNewHP+1],a jr nc,.animateHpBar ; if more damage was done than the current HP, zero the HP and set the damage ; equal to how much HP the pokemon had before the attack ld a,[wHPBarOldHP+1] ld [hli],a ld a,[wHPBarOldHP] ld [hl],a xor a ld hl,W_PLAYERMONCURHP ld [hli],a ld [hl],a ld hl,wHPBarNewHP ld [hli],a ld [hl],a .animateHpBar ld hl,W_PLAYERMONMAXHP ld a,[hli] ld [wHPBarMaxHP+1],a ld a,[hl] ld [wHPBarMaxHP],a FuncCoord 10, 9 ld hl,Coord ld a,$01 ld [wListMenuID],a ld a,$48 call Predef ; animate the HP bar shortening ApplyAttackToPlayerPokemonDone jp Func_3cd5a ; redraw pokemon names and HP bars AttackSubstitute: ; 3e25e (f:625e) ld hl,SubstituteTookDamageText call PrintText ; values for player turn ld de,wEnemySubstituteHP ld bc,W_ENEMYBATTSTATUS2 ld a,[H_WHOSETURN] and a jr z,.applyDamageToSubstitute ; values for enemy turn ld de,wPlayerSubstituteHP ld bc,W_PLAYERBATTSTATUS2 .applyDamageToSubstitute ld hl,W_DAMAGE ld a,[hli] and a jr nz,.substituteBroke ; damage > 0xFF always breaks substitutes ; subtract damage from HP of substitute ld a,[de] sub [hl] ld [de],a ret nc .substituteBroke ld h,b ld l,c res 4,[hl] ; unset the substitute bit ld hl,SubstituteBrokeText call PrintText ; flip whose turn it is for the next function call ld a,[H_WHOSETURN] xor a,$01 ld [H_WHOSETURN],a callab Func_79747 ; animate the substitute breaking ; flip the turn back to the way it was ld a,[H_WHOSETURN] xor a,$01 ld [H_WHOSETURN],a ld hl,W_PLAYERMOVEEFFECT ; value for player's turn and a jr z,.nullifyEffect ld hl,W_ENEMYMOVEEFFECT ; value for enemy's turn .nullifyEffect xor a ld [hl],a ; zero the effect of the attacker's move jp Func_3cd5a ; redraw pokemon names and HP bars SubstituteTookDamageText: ; 3e2ac (f:62ac) TX_FAR _SubstituteTookDamageText db "@" SubstituteBrokeText: ; 3e2b1 (f:62b1) TX_FAR _SubstituteBrokeText db "@" ; this function raises the attack modifier of a pokemon using Rage when that pokemon is attacked HandleBuildingRage: ; 3e2b6 (f:62b6) ; values for the player turn ld hl,W_ENEMYBATTSTATUS2 ld de,wEnemyMonStatMods ld bc,W_ENEMYMOVENUM ld a,[H_WHOSETURN] and a jr z,.next ; values for the enemy turn ld hl,W_PLAYERBATTSTATUS2 ld de,wPlayerMonStatMods ld bc,W_PLAYERMOVENUM .next bit 6,[hl] ; is the pokemon being attacked under the effect of Rage? ret z ; return if not ld a,[de] cp a,$0d ; maximum stat modifier value ret z ; return if attack modifier is already maxed ld a,[H_WHOSETURN] xor a,$01 ; flip turn for the stat modifier raising function ld [H_WHOSETURN],a ; change the target pokemon's move to $00 and the effect to the one ; that causes the attack modifier to go up one stage ld h,b ld l,c ld [hl],$00 ; null move number inc hl ld [hl],ATTACK_UP1_EFFECT push hl ld hl,BuildingRageText call PrintText call StatModifierUpEffect ; stat modifier raising function pop hl xor a ldd [hl],a ; null move effect ld a,RAGE ld [hl],a ; restore the target pokemon's move number to Rage ld a,[H_WHOSETURN] xor a,$01 ; flip turn back to the way it was ld [H_WHOSETURN],a ret BuildingRageText: ; 3e2f8 (f:62f8) TX_FAR _BuildingRageText db "@" ; copy last move for Mirror Move ; sets zero flag on failure and unsets zero flag on success MirrorMoveCopyMove: ; 3e2fd (f:62fd) ld a,[H_WHOSETURN] and a ; values for player turn ld a,[wccf2] ld hl,wPlayerSelectedMove ld de,W_PLAYERMOVENUM jr z,.next ; values for enemy turn ld a,[wccf1] ld de,W_ENEMYMOVENUM ld hl,wEnemySelectedMove .next ld [hl],a cp a,MIRROR_MOVE ; did the target pokemon also use Mirror Move? jr z,.mirrorMoveFailed and a ; null move? jr nz,ReloadMoveData .mirrorMoveFailed ; Mirror Move fails on itself and null moves ld hl,MirrorMoveFailedText call PrintText xor a ret MirrorMoveFailedText: ; 3e324 (f:6324) TX_FAR _MirrorMoveFailedText db "@" ; function used to reload move data for moves like Mirror Move and Metronome ReloadMoveData: ; 3e329 (f:6329) ld [wd11e],a dec a ld hl,Moves ld bc,$0006 call AddNTimes ld a,BANK(Moves) call FarCopyData ; copy the move's stats call IncrementMovePP ; the follow two function calls are used to reload the move name call GetMoveName call CopyStringToCF4B ld a,$01 and a ret ; function that picks a random move for metronome MetronomePickMove: ; 3e348 (f:6348) xor a ld [wcc5b],a ld a,METRONOME call PlayMoveAnimation ; play Metronome's animation ; values for player turn ld de,W_PLAYERMOVENUM ld hl,wPlayerSelectedMove ld a,[H_WHOSETURN] and a jr z,.pickMoveLoop ; values for enemy turn ld de,W_ENEMYMOVENUM ld hl,wEnemySelectedMove ; loop to pick a random number in the range [1, $a5) to be the move used by Metronome .pickMoveLoop call BattleRandom and a jr z,.pickMoveLoop cp a,NUM_MOVES + 1 ; max normal move number + 1 (this is Struggle's move number) jr nc,.pickMoveLoop cp a,METRONOME jr z,.pickMoveLoop ld [hl],a jr ReloadMoveData ; this function increments the current move's PP ; it's used to prevent moves that run another move within the same turn ; (like Mirror Move and Metronome) from losing 2 PP IncrementMovePP: ; 3e373 (f:6373) ld a,[H_WHOSETURN] and a ; values for player turn ld hl,W_PLAYERMONPP ld de,W_PARTYMON1_MOVE1PP ld a,[wPlayerMoveListIndex] jr z,.next ; values for enemy turn ld hl,W_ENEMYMONPP ld de,wd8c1 ; enemy party pokemon 1 PP ld a,[wEnemyMoveListIndex] .next ld b,$00 ld c,a add hl,bc inc [hl] ; increment PP in the currently battling pokemon memory location ld h,d ld l,e add hl,bc ld a,[H_WHOSETURN] and a ld a,[wPlayerMonNumber] ; value for player turn jr z,.next2 ld a,[W_ENEMYMONNUMBER] ; value for enemy turn .next2 ld bc,$002c call AddNTimes inc [hl] ; increment PP in the party memory location ret ; function to adjust the base damage of an attack to account for type effectiveness AdjustDamageForMoveType: ; 3e3a5 (f:63a5) ; values for player turn ld hl,W_PLAYERMONTYPES ld a,[hli] ld b,a ; b = type 1 of attacker ld c,[hl] ; c = type 2 of attacker ld hl,W_ENEMYMONTYPES ld a,[hli] ld d,a ; d = type 1 of defender ld e,[hl] ; e = type 2 of defender ld a,[W_PLAYERMOVETYPE] ld [wd11e],a ld a,[H_WHOSETURN] and a jr z,.next ; values for enemy turn ld hl,W_ENEMYMONTYPES ld a,[hli] ld b,a ; b = type 1 of attacker ld c,[hl] ; c = type 2 of attacker ld hl,W_PLAYERMONTYPES ld a,[hli] ld d,a ; d = type 1 of defender ld e,[hl] ; e = type 2 of defender ld a,[W_ENEMYMOVETYPE] ld [wd11e],a .next ld a,[wd11e] ; move type cp b ; does the move type match type 1 of the attacker? jr z,.sameTypeAttackBonus cp c ; does the move type match type 2 of the attacker? jr z,.sameTypeAttackBonus jr .skipSameTypeAttackBonus .sameTypeAttackBonus ; if the move type matches one of the attacker's types ld hl,W_DAMAGE + 1 ld a,[hld] ld h,[hl] ld l,a ; hl = damage ld b,h ld c,l ; bc = damage srl b rr c ; bc = floor(0.5 * damage) add hl,bc ; hl = floor(1.5 * damage) ; store damage ld a,h ld [W_DAMAGE],a ld a,l ld [W_DAMAGE + 1],a ld hl,wd05b set 7,[hl] .skipSameTypeAttackBonus ld a,[wd11e] ld b,a ; b = move type ld hl,TypeEffects .loop ld a,[hli] ; a = "attacking type" of the current type pair cp a,$ff jr z,.done cp b ; does move type match "attacking type"? jr nz,.nextTypePair ld a,[hl] ; a = "defending type" of the current type pair cp d ; does type 1 of defender match "defending type"? jr z,.matchingPairFound cp e ; does type 2 of defender match "defending type"? jr z,.matchingPairFound jr .nextTypePair .matchingPairFound ; if the move type matches the "attacking type" and one of the defender's types matches the "defending type" push hl push bc inc hl ld a,[wd05b] and a,$80 ld b,a ld a,[hl] ; a = damage multiplier ld [H_MULTIPLIER],a add b ld [wd05b],a xor a ld [H_MULTIPLICAND],a ld hl,W_DAMAGE ld a,[hli] ld [H_MULTIPLICAND + 1],a ld a,[hld] ld [H_MULTIPLICAND + 2],a call Multiply ld a,10 ld [H_DIVISOR],a ld b,$04 call Divide ld a,[H_QUOTIENT + 2] ld [hli],a ld b,a ld a,[H_QUOTIENT + 3] ld [hl],a or b ; is damage 0? jr nz,.skipTypeImmunity .typeImmunity ; if damage is 0, make the move miss inc a ld [W_MOVEMISSED],a .skipTypeImmunity pop bc pop hl .nextTypePair inc hl inc hl jp .loop .done ret ; function to tell how effective the type of an enemy attack is on the player's current pokemon ; this doesn't take into account the effects that dual types can have ; (e.g. 4x weakness / resistance, weaknesses and resistances canceling) ; the result is stored in [wd11e] ; ($05 is not very effective, $10 is neutral, $14 is super effective) ; as far is can tell, this is only used once in some AI code to help decide which move to use AIGetTypeEffectiveness: ; 3e449 (f:6449) ld a,[W_ENEMYMOVETYPE] ld d,a ; d = type of enemy move ld hl,W_PLAYERMONTYPES ld b,[hl] ; b = type 1 of player's pokemon inc hl ld c,[hl] ; c = type 2 of player's pokemon ld a,$10 ld [wd11e],a ; initialize [wd11e] to neutral effectiveness ld hl,TypeEffects .loop ld a,[hli] cp a,$ff ret z cp d ; match the type of the move jr nz,.nextTypePair1 ld a,[hli] cp b ; match with type 1 of pokemon jr z,.done cp c ; or match with type 2 of pokemon jr z,.done jr .nextTypePair2 .nextTypePair1 inc hl .nextTypePair2 inc hl jr .loop .done ld a,[hl] ld [wd11e],a ; store damage multiplier ret INCLUDE "data/type_effects.asm" ; some tests that need to pass for a move to hit MoveHitTest: ; 3e56b (f:656b) ; player's turn ld hl,W_ENEMYBATTSTATUS1 ld de,W_PLAYERMOVEEFFECT ld bc,W_ENEMYMONSTATUS ld a,[H_WHOSETURN] and a jr z,.dreamEaterCheck ; enemy's turn ld hl,W_PLAYERBATTSTATUS1 ld de,W_ENEMYMOVEEFFECT ld bc,W_PLAYERMONSTATUS .dreamEaterCheck ld a,[de] cp a,DREAM_EATER_EFFECT jr nz,.swiftCheck ld a,[bc] and a,$07 ; is the target pokemon sleeping? jp z,.moveMissed .swiftCheck ld a,[de] cp a,SWIFT_EFFECT ret z ; Swift never misses (interestingly, Azure Heights lists this is a myth, but it appears to be true) call CheckTargetSubstitute ; substitute check (note that this overwrites a) jr z,.checkForDigOrFlyStatus ; this code is buggy. it's supposed to prevent HP draining moves from working on substitutes. ; since $7b79 overwrites a with either $00 or $01, it never works. cp a,DRAIN_HP_EFFECT ; $03 jp z,.moveMissed cp a,DREAM_EATER_EFFECT ; $08 jp z,.moveMissed .checkForDigOrFlyStatus bit 6,[hl] jp nz,.moveMissed ld a,[H_WHOSETURN] and a jr nz,.enemyTurn .playerTurn ; this checks if the move effect is disallowed by mist ld a,[W_PLAYERMOVEEFFECT] cp a,ATTACK_DOWN1_EFFECT jr c,.skipEnemyMistCheck cp a,BIDE_EFFECT jr c,.enemyMistCheck cp a,$3a jr c,.skipEnemyMistCheck cp a,POISON_EFFECT jr c,.enemyMistCheck jr .skipEnemyMistCheck .enemyMistCheck ; if move effect is from $12 to $19 inclusive or $3a to $41 inclusive ; i.e. the following moves ; GROWL, TAIL WHIP, LEER, STRING SHOT, SAND-ATTACK, SMOKESCREEN, KINESIS, ; FLASH, CONVERSION, HAZE*, SCREECH, LIGHT SCREEN*, REFLECT* ; the moves that are marked with an asterisk are not affected since this ; function is not called when those moves are used ; XXX are there are any others like those three? ld a,[W_ENEMYBATTSTATUS2] bit 1,a ; is mon protected by mist? jp nz,.moveMissed .skipEnemyMistCheck ld a,[W_PLAYERBATTSTATUS2] bit 0,a ; is the player using X Accuracy? ret nz ; if so, always hit regardless of accuracy/evasion jr .calcHitChance .enemyTurn ld a,[W_ENEMYMOVEEFFECT] cp a,ATTACK_DOWN1_EFFECT jr c,.skipPlayerMistCheck cp a,BIDE_EFFECT jr c,.playerMistCheck cp a,$3a jr c,.skipPlayerMistCheck cp a,POISON_EFFECT jr c,.playerMistCheck jr .skipPlayerMistCheck .playerMistCheck ; similar to enemy mist check ld a,[W_PLAYERBATTSTATUS2] bit 1,a ; is mon protected by mist? jp nz,.moveMissed .skipPlayerMistCheck ld a,[W_ENEMYBATTSTATUS2] bit 0,a ; is the enemy using X Accuracy? ret nz ; if so, always hit regardless of accuracy/evasion .calcHitChance call CalcHitChance ; scale the move accuracy according to attacker's accuracy and target's evasion ld a,[W_PLAYERMOVEACCURACY] ld b,a ld a,[H_WHOSETURN] and a jr z,.doAccuracyCheck ld a,[W_ENEMYMOVEACCURACY] ld b,a .doAccuracyCheck ; if the random number generated is greater than or equal to the scaled accuracy, the move misses ; note that this means that even the highest accuracy is still just a 255/256 chance, not 100% call BattleRandom cp b jr nc,.moveMissed ret .moveMissed xor a ld hl,W_DAMAGE ; zero the damage ld [hli],a ld [hl],a inc a ld [W_MOVEMISSED],a ld a,[H_WHOSETURN] and a jr z,.playerTurn2 .enemyTurn2 ld hl,W_ENEMYBATTSTATUS1 res 5,[hl] ; end multi-turn attack e.g. wrap ret .playerTurn2 ld hl,W_PLAYERBATTSTATUS1 res 5,[hl] ; end multi-turn attack e.g. wrap ret ; values for player turn CalcHitChance: ; 3e624 (f:6624) ld hl,W_PLAYERMOVEACCURACY ld a,[H_WHOSETURN] and a ld a,[wPlayerMonAccuracyMod] ld b,a ld a,[wEnemyMonEvasionMod] ld c,a jr z,.next ; values for enemy turn ld hl,W_ENEMYMOVEACCURACY ld a,[wEnemyMonAccuracyMod] ld b,a ld a,[wPlayerMonEvasionMod] ld c,a .next ld a,$0e sub c ld c,a ; c = 14 - EVASIONMOD (this "reflects" the value over 7, so that an increase in the target's evasion decreases the hit chance instead of increasing the hit chance) ; zero the high bytes of the multiplicand xor a ld [H_MULTIPLICAND],a ld [H_MULTIPLICAND + 1],a ld a,[hl] ld [H_MULTIPLICAND + 2],a ; set multiplicand to move accuracy push hl ld d,$02 ; loop has two iterations ; loop to do the calculations, the first iteration multiplies by the accuracy ratio and the second iteration multiplies by the evasion ratio .loop push bc ld hl, StatModifierRatios ; $76cb ; stat modifier ratios dec b sla b ld c,b ld b,$00 add hl,bc ; hl = address of stat modifier ratio pop bc ld a,[hli] ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio call Multiply ld a,[hl] ld [H_DIVISOR],a ; set divisor to the the denominator of the ratio (the dividend is the product of the previous multiplication) ld b,$04 ; number of bytes in the dividend call Divide ld a,[H_QUOTIENT + 3] ld b,a ld a,[H_QUOTIENT + 2] or b jp nz,.nextCalculation ; make sure the result is always at least one ld [H_QUOTIENT + 2],a ld a,$01 ld [H_QUOTIENT + 3],a .nextCalculation ld b,c dec d jr nz,.loop ld a,[H_QUOTIENT + 2] and a ; is the calculated hit chance over 0xFF? ld a,[H_QUOTIENT + 3] jr z,.storeAccuracy ; if calculated hit chance over 0xFF ld a,$ff ; set the hit chance to 0xFF .storeAccuracy pop hl ld [hl],a ; store the hit chance in the move accuracy variable ret Func_3e687: ; 3e687 (f:6687) ld hl, W_DAMAGE ; W_DAMAGE ld a, [hli] and a jr nz, .asm_3e692 ld a, [hl] cp $2 ret c .asm_3e692 xor a ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) dec hl ld a, [hli] ld [$ff97], a ld a, [hl] ld [$ff98], a .asm_3e69c call BattleRandom rrca cp $d9 jr c, .asm_3e69c ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) call Multiply ld a, $ff ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld b, $4 call Divide ld a, [$ff97] ld hl, W_DAMAGE ; W_DAMAGE ld [hli], a ld a, [$ff98] ld [hl], a ret Func_3e6bc: ; 3e6bc (f:66bc) ld a, [wEnemySelectedMove] ; wccdd inc a jp z, Func_3e88c call PrintGhostText jp z, Func_3e88c ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3e6dc ld b, $1 ld a, [wcc3e] cp $e jr z, .asm_3e6dc cp $4 ret nc .asm_3e6dc ld hl, wccd5 inc [hl] xor a ld [W_MOVEMISSED], a ; W_MOVEMISSED ld [wccf4], a ld a, $a ld [wd05b], a call Func_3e88f jr nz, .asm_3e6f2 jp [hl] .asm_3e6f2 ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 bit 4, [hl] jr nz, asm_3e70b call GetCurrentMove Func_3e6fc: ; 3e6fc (f:66fc) ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT cp CHARGE_EFFECT jp z, Func_3f132 cp FLY_EFFECT jp z, Func_3f132 jr asm_3e72b asm_3e70b: ; 3e70b (f:670b) ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 4, [hl] ; no longer charging up for attack res 6, [hl] ; no longer invulnerable to typcial attacks ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM ld [wd0b5], a ld a, $2c ld [wPredefBank], a ld a, MOVE_NAME ld [W_LISTTYPE], a call GetName ld de, wcd6d call CopyStringToCF4B asm_3e72b: ; 3e72b (f:672b) xor a ld [wcced], a call PrintMonName1Text ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT ld hl, EffectsArray1 ; $4000 ld de, $1 call IsInArray jp c, Func_3f132 ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT ld hl, EffectsArray5B ; $4049 ld de, $1 call IsInArray call c, Func_3f132 asm_3e750: ; 3e750 (f:6750) call Func_3ec81 ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT ld hl, EffectsArray2 ; $4011 ld de, $1 call IsInArray jp c, Func_3e77f call CriticalHitTest call HandleCounterMove jr z, asm_3e782 call Func_3ec81 call Func_3de75 call Func_3ec81 call MoreCalculateDamage jp z, Func_3e7d1 call AdjustDamageForMoveType call Func_3e687 Func_3e77f: ; 3e77f (f:677f) call MoveHitTest asm_3e782: ; 3e782 (f:6782) ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jr z, .asm_3e791 ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT cp EXPLODE_EFFECT jr z, asm_3e7a0 jr Func_3e7d1 .asm_3e791 call Func_3ec81 Func_3e794: ; 3e794 (f:6794) ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT and a ld a, $1 jr z, asm_3e7a4 ld a, $2 jr asm_3e7a4 asm_3e7a0: ; 3e7a0 (f:67a0) call Func_3ec81 xor a asm_3e7a4: ; 3e7a4 (f:67a4) push af ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2 bit 4, a ; does mon have a substitute? ld hl, Func_79747 ld b, BANK(Func_79747) call nz, Bankswitch pop af ld [wcc5b], a ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM call PlayMoveAnimation call Func_3eed3 call Func_3cdec ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2 bit 4, a ; does mon have a substitute? ld hl, Func_79771 ld b, BANK(Func_79771) call nz, Bankswitch ; slide the substitute's sprite out jr asm_3e7ef Func_3e7d1: ; 3e7d1 (f:67d1) call Func_3ec81 ld c, $1e call DelayFrames ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT cp FLY_EFFECT jr z, .asm_3e7e6 cp CHARGE_EFFECT jr z, .asm_3e7e6 jr asm_3e7ef .asm_3e7e6 xor a ld [wcc5b], a ld a,STATUS_AFFECTED_ANIM call PlayMoveAnimation asm_3e7ef: ; 3e7ef (f:67ef) ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT cp MIRROR_MOVE_EFFECT jr nz, .notMirrorMoveEffect call MirrorMoveCopyMove jp z, Func_3e88c jp Func_3e6fc .notMirrorMoveEffect cp METRONOME_EFFECT jr nz, .notMetronomeEffect call MetronomePickMove jp Func_3e6fc .notMetronomeEffect ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT ld hl, EffectsArray3 ; $4014 ld de, $1 call IsInArray jp c, Func_3f132 ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jr z, .asm_3e82b call PrintMoveFailureText ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT cp EXPLODE_EFFECT jr z, .asm_3e83e jp Func_3e88c .asm_3e82b call ApplyAttackToPlayerPokemon call Func_3dc5c callab DisplayEffectiveness ld a, $1 ld [wccf4], a .asm_3e83e ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT ld hl, EffectsArray4 ; $4030 ld de, $1 call IsInArray call c, Func_3f132 ld hl, W_PLAYERMONCURHP ; wd015 ld a, [hli] ld b, [hl] or b ret z call HandleBuildingRage ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 bit 2, [hl] ; is mon hitting multiple times? (example: double kick) jr z, .asm_3e873 push hl ld hl, wd06f dec [hl] pop hl jp nz, Func_3e794 res 2, [hl] ; mon is no longer hitting multiple times ld hl, HitXTimesText ; $6887 call PrintText xor a ld [wcd05], a .asm_3e873 ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT and a jr z, Func_3e88c ld hl, EffectsArray5 ; $403b ld de, $1 call IsInArray call nc, Func_3f132 jr Func_3e88c HitXTimesText: ; 3e887 (f:6887) TX_FAR _HitXTimesText db "@" Func_3e88c: ; 3e88c (f:688c) ld b, $1 ret Func_3e88f: ; 3e88f (f:688f) ld hl, W_ENEMYMONSTATUS ; wcfe9 ld a, [hl] and $7 jr z, .asm_3e8bf dec a ld [W_ENEMYMONSTATUS], a ; wcfe9 and a jr z, .asm_3e8af ld hl, FastAsleepText call PrintText xor a ld [wcc5b], a ld a,SLP_ANIM call PlayMoveAnimation jr .asm_3e8b5 .asm_3e8af ld hl, WokeUpText call PrintText .asm_3e8b5 xor a ld [wccf2], a ld hl, Func_3e88c ; $688c jp Func_3eab8 .asm_3e8bf bit 5, [hl] jr z, .asm_3e8d3 ld hl, IsFrozenText call PrintText xor a ld [wccf2], a ld hl, Func_3e88c ; $688c jp Func_3eab8 .asm_3e8d3 ld a, [W_PLAYERBATTSTATUS1] ; W_PLAYERBATTSTATUS1 bit 5, a jp z, Func_3e8e7 ld hl, CantMoveText call PrintText ld hl, Func_3e88c ; $688c jp Func_3eab8 Func_3e8e7: ; 3e8e7 (f:68e7) ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 bit 3, [hl] jp z, Func_3e8fd res 3, [hl] ld hl, FlinchedText call PrintText ld hl, Func_3e88c ; $688c jp Func_3eab8 Func_3e8fd: ; 3e8fd (f:68fd) ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 bit 5, [hl] jr z, .asm_3e912 res 5, [hl] ld hl, MustRechargeText call PrintText ld hl, Func_3e88c ; $688c jp Func_3eab8 .asm_3e912 ld hl, W_ENEMYDISABLEDMOVE ; W_ENEMYDISABLEDMOVE ld a, [hl] and a jr z, .asm_3e929 dec a ld [hl], a and $f jr nz, .asm_3e929 ld [hl], a ld [wccef], a ld hl, DisabledNoMoreText call PrintText .asm_3e929 ld a, [W_ENEMYBATTSTATUS1] ; W_ENEMYBATTSTATUS1 add a jp nc, Func_3e9aa ld hl, wd070 dec [hl] jr nz, .asm_3e944 ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 7, [hl] ld hl, ConfusedNoMoreText call PrintText jp Func_3e9aa .asm_3e944 ld hl, IsConfusedText call PrintText xor a ld [wcc5b], a ld a,CONF_ANIM call PlayMoveAnimation call BattleRandom cp $80 jr c, Func_3e9aa ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld a, [hl] and $80 ld [hl], a ld hl, HurtItselfText call PrintText ld hl, W_PLAYERMONDEF ld a, [hli] push af ld a, [hld] push af ld a, [W_ENEMYMONDEFENSE] ; wcff8 ld [hli], a ld a, [W_ENEMYMONDEFENSE + 1] ld [hl], a ld hl, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT push hl ld a, [hl] push af xor a ld [hli], a ld [wd05e], a ld a, $28 ld [hli], a xor a ld [hl], a call Func_3de75 call MoreCalculateDamage pop af pop hl ld [hl], a ld hl, W_PLAYERMONDEF + 1 pop af ld [hld], a pop af ld [hl], a xor a ld [wcc5b], a ld [H_WHOSETURN], a ; $fff3 ld a, POUND call PlayMoveAnimation ld a, $1 ld [H_WHOSETURN], a ; $fff3 call ApplyDamageToEnemyPokemon jr asm_3e9d3 Func_3e9aa: ; 3e9aa (f:69aa) ld a, [wccef] and a jr z, .asm_3e9bf ld hl, wEnemySelectedMove ; wccdd cp [hl] jr nz, .asm_3e9bf call PrintMoveIsDisabledText ld hl, Func_3e88c ; $688c jp Func_3eab8 .asm_3e9bf ld hl, W_ENEMYMONSTATUS ; wcfe9 bit 6, [hl] jr z, asm_3e9f6 call BattleRandom cp $3f jr nc, asm_3e9f6 ld hl, FullyParalyzedText call PrintText asm_3e9d3: ; 3e9d3 (f:69d3) ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld a, [hl] and $cc ld [hl], a ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT cp FLY_EFFECT jr z, .asm_3e9e7 cp CHARGE_EFFECT jr z, .asm_3e9e7 jr .asm_3e9f0 .asm_3e9e7 xor a ld [wcc5b], a ld a, STATUS_AFFECTED_ANIM call PlayMoveAnimation .asm_3e9f0 ld hl, Func_3e88c ; $688c jp Func_3eab8 asm_3e9f6: ; 3e9f6 (f:69f6) ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 bit 0, [hl] ; is mon using bide? jr z, .asm_3ea54 xor a ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM ld hl, W_DAMAGE ; W_DAMAGE ld a, [hli] ld b, a ld c, [hl] ld hl, wcd06 ld a, [hl] add c ld [hld], a ld a, [hl] adc b ld [hl], a ld hl, wd06f dec [hl] jr z, .asm_3ea1c ld hl, Func_3e88c ; $688c jp Func_3eab8 .asm_3ea1c ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 0, [hl] ld hl, UnleashedEnergyText call PrintText ld a, $1 ld [W_ENEMYMOVEPOWER], a ; wcfce ld hl, wcd06 ld a, [hld] add a ld b, a ld [wd0d8], a ld a, [hl] rl a ld [W_DAMAGE], a ; W_DAMAGE or b jr nz, .asm_3ea43 ld a, $1 ld [W_MOVEMISSED], a ; W_MOVEMISSED .asm_3ea43 xor a ld [hli], a ld [hl], a ld a, BIDE ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM call Func_3ec81 ld hl, asm_3e782 ; $6782 jp Func_3eab8 .asm_3ea54 bit 1, [hl] ; is mon using thrash or petal dance? jr z, .asm_3ea83 ld a, THRASH ld [W_ENEMYMOVENUM], a ; W_ENEMYMOVENUM ld hl, ThrashingAboutText call PrintText ld hl, wd06f dec [hl] ld hl, asm_3e750 ; $6750 jp nz, Func_3eab8 push hl ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 res 1, [hl] ; mon is no longer using thrash or petal dance set 7, [hl] ; mon is now confused call BattleRandom and $3 inc a inc a ld [wd070], a pop hl jp Func_3eab8 .asm_3ea83 bit 5, [hl] ; is mon using multi-turn move? jp z, Func_3ea9b ld hl, AttackContinuesText call PrintText ld hl, wd06f dec [hl] ld hl, Func_3e794 ; $6794 jp nz, Func_3eab8 jp Func_3eab8 Func_3ea9b: ; 3ea9b (f:6a9b) ld a, [W_ENEMYBATTSTATUS2] ; W_ENEMYBATTSTATUS2 bit 6, a ; is mon using rage? jp z, Func_3eaba ld a, RAGE ld [wd11e], a call GetMoveName call CopyStringToCF4B xor a ld [W_ENEMYMOVEEFFECT], a ; W_ENEMYMOVEEFFECT ld hl, asm_3e72b ; $672b jp Func_3eab8 Func_3eab8: ; 3eab8 (f:6ab8) xor a ret Func_3eaba: ; 3eaba (f:6aba) ld a, $1 and a ret GetCurrentMove: ; 3eabe (f:6abe) ld a, [H_WHOSETURN] ; $fff3 and a jp z, .player ld de, W_ENEMYMOVENUM ; W_ENEMYMOVENUM ld a, [wEnemySelectedMove] ; wccdd jr .selected .player ld de, W_PLAYERMOVENUM ; wcfd2 ld a, [W_FLAGS_D733] bit 0, a ld a, [wccd9] jr nz, .selected ld a, [wPlayerSelectedMove] ; wPlayerSelectedMove .selected ld [wd0b5], a dec a ld hl, Moves ; $4000 ld bc, $6 call AddNTimes ld a, BANK(Moves) call FarCopyData ld a, $2c ld [wPredefBank], a ld a, $2 ld [W_LISTTYPE], a ; list type 2 = move name call GetName ld de, wcd6d jp CopyStringToCF4B Func_3eb01: ; 3eb01 (f:6b01) ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jp z, Func_3cc13 ld a, [W_ENEMYMONID] ld [wcfe5], a ld [wd0b5], a call GetMonHeader ld a, [W_ENEMYBATTSTATUS3] ; W_ENEMYBATTSTATUS3 bit 3, a ld hl, wcceb ld a, [hli] ld b, [hl] jr nz, .asm_3eb33 ld a, [W_ISINBATTLE] ; W_ISINBATTLE cp $2 ld a, $98 ld b, $88 jr z, .asm_3eb33 call BattleRandom ld b, a call BattleRandom .asm_3eb33 ld hl, W_ENEMYMONATKDEFIV ld [hli], a ld [hl], b ld de, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL ld [de], a inc de ld b, $0 ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP push hl call CalcStats pop hl ld a, [W_ISINBATTLE] ; W_ISINBATTLE cp $2 jr z, .asm_3eb65 ld a, [W_ENEMYBATTSTATUS3] ; W_ENEMYBATTSTATUS3 bit 3, a jr nz, .asm_3eb86 ld a, [W_ENEMYMONMAXHP] ; W_ENEMYMONMAXHP ld [hli], a ld a, [W_ENEMYMONMAXHP+1] ld [hli], a xor a inc hl ld [hl], a jr .asm_3eb86 .asm_3eb65 ld hl, W_ENEMYMON1HP ; wd8a5 (aliases: W_WATERMONS) ld a, [wWhichPokemon] ; wWhichPokemon ld bc, $2c call AddNTimes ld a, [hli] ld [W_ENEMYMONCURHP], a ; W_ENEMYMONCURHP ld a, [hli] ld [W_ENEMYMONCURHP + 1], a ld a, [wWhichPokemon] ; wWhichPokemon ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER inc hl ld a, [hl] ld [W_ENEMYMONSTATUS], a ; wcfe9 jr .asm_3eb86 .asm_3eb86 ld hl, W_MONHTYPES ld de, W_ENEMYMONTYPES ; wcfea ld a, [hli] ; copy type 1 ld [de], a inc de ld a, [hli] ; copy type 2 ld [de], a inc de ld a, [hli] ; copy catch rate ld [de], a inc de ld a, [W_ISINBATTLE] ; W_ISINBATTLE cp $2 jr nz, .asm_3ebb0 ld hl, wd8ac ld a, [wWhichPokemon] ; wWhichPokemon ld bc, $2c call AddNTimes ld bc, $4 call CopyData jr .asm_3ebca .asm_3ebb0 ld hl, W_MONHMOVES ld a, [hli] ld [de], a inc de ld a, [hli] ld [de], a inc de ld a, [hli] ld [de], a inc de ld a, [hl] ld [de], a dec de dec de dec de xor a ld [wHPBarMaxHP], a ld a, $3e call Predef ; indirect jump to WriteMonMoves (3afb8 (e:6fb8)) .asm_3ebca ld hl, W_ENEMYMONMOVES ld de, W_ENEMYMONSPECIAL + 1 ld a, $5e call Predef ; indirect jump to LoadMovePPs (f473 (3:7473)) ld hl, W_MONHBASESTATS ld de, wd002 ld b, $5 .asm_3ebdd ld a, [hli] ld [de], a inc de dec b jr nz, .asm_3ebdd ld hl, W_MONHCATCHRATE ld a, [hli] ld [de], a inc de ld a, [hl] ; base exp ld [de], a ld a, [W_ENEMYMONID] ld [wd11e], a call GetMonName ld hl, wcd6d ld de, W_ENEMYMONNAME ld bc, $b call CopyData ld a, [W_ENEMYMONID] ld [wd11e], a ld a, $3a call Predef ; indirect jump to IndexToPokedex (41010 (10:5010)) ld a, [wd11e] dec a ld c, a ld b, $1 ld hl, wPokedexSeen ; wd30a ld a, $10 ; FlagActionPredef call Predef ld hl, W_ENEMYMONLEVEL ; W_ENEMYMONLEVEL ld de, wcd23 ld bc, $b call CopyData ld a, $7 ld b, $8 ld hl, wEnemyMonStatMods ; wcd2e .asm_3ec2d ld [hli], a dec b jr nz, .asm_3ec2d ret Func_3ec32: ; 3ec32 (f:6c32) ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr nz, .asm_3ec4d xor a ld [wMenuJoypadPollCount], a ; wMenuJoypadPollCount callab Func_372d6 ld a, $1 ld [wcfcb], a call ClearScreen .asm_3ec4d call DelayFrame ld a, $30 call Predef ; indirect jump to BattleTransition (7096d (1c:496d)) callab Func_3ee58 ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld a, $ff ld [wcfcb], a call ClearSprites call ClearScreen xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld [$ffb0], a ld [rWY], a ; $ff4a ld [$ffd7], a ld hl, wd060 ld [hli], a ld [hli], a ld [hli], a ld [hli], a ld [hl], a ld [W_PLAYERDISABLEDMOVE], a ; W_PLAYERDISABLEDMOVE ret Func_3ec81: ; 3ec81 (f:6c81) push bc ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL ld b, a ld a, [W_ENEMYMONLEVEL] ; W_ENEMYMONLEVEL ld [W_PLAYERMONLEVEL], a ; W_PLAYERMONLEVEL ld a, b ld [W_ENEMYMONLEVEL], a ; W_ENEMYMONLEVEL pop bc ret Func_3ec92: ; 3ec92 (f:6c92) ld a, [W_BATTLETYPE] ; wd05a dec a ld de, RedPicBack ; $7e0a jr nz, .asm_3ec9e ld de, OldManPic ; $7e9a .asm_3ec9e ld a, BANK(RedPicBack) call UncompressSpriteFromDE ld a, $3 call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40)) ld hl, wOAMBuffer xor a ld [H_DOWNARROWBLINKCNT1], a ; $ff8b ld b, $7 ld e, $a0 .asm_3ecb2 ld c, $3 ld d, $38 .asm_3ecb6 ld [hl], d inc hl ld [hl], e ld a, $8 add d ld d, a inc hl ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b ld [hli], a inc a ld [H_DOWNARROWBLINKCNT1], a ; $ff8b inc hl dec c jr nz, .asm_3ecb6 ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b add $4 ld [H_DOWNARROWBLINKCNT1], a ; $ff8b ld a, $8 add e ld e, a dec b jr nz, .asm_3ecb2 ld de, $9310 call InterlaceMergeSpriteBuffers ld a, $a ld [$0], a xor a ld [$4000], a ld hl, $8000 ld de, S_SPRITEBUFFER1 ld a, [H_LOADEDROMBANK] ld b, a ld c, $31 call CopyVideoData xor a ld [$0], a ld a, $31 ld [$ffe1], a FuncCoord 1, 5 ld hl, Coord ld a, $1 jp Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6)) Func_3ed02: ; 3ed02 (f:6d02) callab Func_39680 ld hl, Func_396a7 ld b, BANK(Func_396a7) jp Bankswitch ScrollTrainerPicAfterBattle: ; 3ed12 (f:6d12) ld hl, _ScrollTrainerPicAfterBattle ld b, BANK(_ScrollTrainerPicAfterBattle) jp Bankswitch Func_3ed1a: ; 3ed1a (f:6d1a) ld a, $1 jr asm_3ed1f Func_3ed1e: ; 3ed1e (f:6d1e) xor a asm_3ed1f: ; 3ed1f (f:6d1f) ld [H_WHOSETURN], a ; $fff3 call Func_3ed27 jp Func_3ed64 Func_3ed27: ; 3ed27 (f:6d27) ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3ed48 ld a, [W_PLAYERMONSTATUS] ; W_PLAYERMONSTATUS and $40 ret z ld hl, W_PLAYERMONSPEED + 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, .asm_3ed46 ld b, $1 .asm_3ed46 ld [hl], b ret .asm_3ed48 ld a, [W_ENEMYMONSTATUS] ; wcfe9 and $40 ret z ld hl, W_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, .asm_3ed62 ld b, $1 .asm_3ed62 ld [hl], b ret Func_3ed64: ; 3ed64 (f:6d64) ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3ed81 ld a, [W_PLAYERMONSTATUS] ; W_PLAYERMONSTATUS and $10 ret z ld hl, W_PLAYERMONATK + 1 ld a, [hld] ld b, a ld a, [hl] srl a rr b ld [hli], a or b jr nz, .asm_3ed7f ld b, $1 .asm_3ed7f ld [hl], b ret .asm_3ed81 ld a, [W_ENEMYMONSTATUS] ; wcfe9 and $10 ret z ld hl, W_ENEMYMONATTACK + 1 ld a, [hld] ld b, a ld a, [hl] srl a rr b ld [hli], a or b jr nz, .asm_3ed97 ld b, $1 .asm_3ed97 ld [hl], b ret Func_3ed99: ; 3ed99 (f:6d99) ld c, $0 .asm_3ed9b call Func_3eda5 inc c ld a, c cp $4 jr nz, .asm_3ed9b ret Func_3eda5: ; 3eda5 (f:6da5) push bc push bc ld a, [wd11e] and a ld a, c ld hl, W_PLAYERMONATK ld de, wcd12 ld bc, wPlayerMonAttackMod ; wcd1a jr z, .asm_3edc0 ld hl, W_ENEMYMONATTACK ld de, wcd26 ld bc, wEnemyMonStatMods ; wcd2e .asm_3edc0 add c ld c, a jr nc, .asm_3edc5 inc b .asm_3edc5 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, .asm_3edd4 inc d .asm_3edd4 pop bc push hl ld hl, StatModifierRatios ; $76cb dec b sla b ld c, b ld b, $0 add hl, bc xor a ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, [de] ld [$ff97], a inc de ld a, [de] ld [$ff98], a ld a, [hli] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) call Multiply ld a, [hl] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld b, $4 call Divide pop hl ld a, [$ff98] sub $e7 ld a, [$ff97] sbc $3 jp c, Func_3ee0c ld a, $3 ld [$ff97], a ld a, $e7 ld [$ff98], a Func_3ee0c: ; 3ee0c (f:6e0c) ld a, [$ff97] ld [hli], a ld b, a ld a, [$ff98] ld [hl], a or b jr nz, .asm_3ee17 inc [hl] .asm_3ee17 pop bc ret Func_3ee19: ; 3ee19 (f:6e19) ld a, [W_ISLINKBATTLE] cp $4 ret z ld a, [W_OBTAINEDBADGES] ld b, a ld hl, W_PLAYERMONATK ld c, $4 .asm_3ee28 srl b call c, Func_3ee35 inc hl inc hl srl b dec c jr nz, .asm_3ee28 ret Func_3ee35: ; 3ee35 (f:6e35) 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 ld a, [hld] sub $e7 ld a, [hl] sbc $3 ret c ld a, $3 ld [hli], a ld a, $e7 ld [hld], a ret Func_3ee58: ; 3ee58 (f:6e58) call LoadHpBarAndStatusTilePatterns Func_3ee5b: ; 3ee5b (f:6e5b) ld a, [rLCDC] ; $ff40 add a jr c, .asm_3ee7c ld hl, BattleHudTiles1 ; $6080 ld de, $96d0 ld bc, $18 ld a, BANK(BattleHudTiles1) call FarCopyDataDouble ld hl, BattleHudTiles2 ; $6098 ld de, $9730 ld bc, $30 ld a, BANK(BattleHudTiles2) jp FarCopyDataDouble .asm_3ee7c ld de, BattleHudTiles1 ; $6080 ld hl, $96d0 ld bc, (BANK(BattleHudTiles1) << 8) + $03 call CopyVideoDataDouble ld de, BattleHudTiles2 ; $6098 ld hl, $9730 ld bc, (BANK(BattleHudTiles2) << 8) + $06 jp CopyVideoDataDouble Func_3ee94: ; 3ee94 (f:6e94) ld hl, TerminatorText_3ee9a ; $6e9a jp PrintText TerminatorText_3ee9a: ; 3ee9a (f:6e9a) db "@" BattleRandom: ; Link battles use a shared PRNG. ld a, [W_ISLINKBATTLE] cp $4 jp nz, Random push hl push bc ld a, [wccde] ld c, a ld b, 0 ld hl, wd148 add hl, bc inc a ld [wccde], a cp 9 ld a, [hl] pop bc pop hl ret c push hl push bc push af xor a ld [wccde], a ld hl, wd148 ld b, 9 .loop ld a, [hl] ld c, a add a add a add c inc a ld [hli], a dec b jr nz, .loop pop af pop bc pop hl ret Func_3eed3: ; 3eed3 (f:6ed3) ld a, [H_WHOSETURN] ; $fff3 and a ld hl, W_ENEMYMONTYPE1 ; wcfea (aliases: W_ENEMYMONTYPES) ld de, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld a, [W_PLAYERMOVENUM] ; wcfd2 jr z, .asm_3eeea ld hl, W_PLAYERMONTYPE1 ; wd019 (aliases: W_PLAYERMONTYPES) ld de, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM .asm_3eeea cp SELFDESTRUCT jr z, .asm_3eef1 cp EXPLOSION ret nz .asm_3eef1 ld a, [de] bit 6, a ; fly/dig ret nz ld a, [hli] cp GHOST ret z ld a, [hl] cp GHOST ret z ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a ret nz ld a, MEGA_PUNCH ld [wcc5b], a PlayMoveAnimation: ; 3ef07 (f:6f07) ld [W_ANIMATIONID],a call Delay3 PREDEF_JUMP MoveAnimationPredef ; predef 8 InitBattle: ; 3ef12 (f:6f12) ld a, [W_CUROPPONENT] ; wd059 and a jr z, asm_3ef23 InitOpponent: ; 3ef18 (f:6f18) ld a, [W_CUROPPONENT] ; wd059 ld [wcf91], a ld [W_ENEMYMONID], a jr asm_3ef3d asm_3ef23: ; 3ef23 (f:6f23) ld a, [wd732] bit 1, a jr z, .asm_3ef2f ld a, [hJoyHeld] bit 1, a ret nz .asm_3ef2f ld a, [wd13c] and a ret nz callab Func_13870 ret nz asm_3ef3d: ; 3ef3d (f:6f3d) ld a, [wd35d] push af ld hl, wd358 ld a, [hl] push af res 1, [hl] callab Func_525af ld a, [W_ENEMYMONID] sub $c8 jp c, InitWildBattle ld [W_TRAINERCLASS], a ; wd031 call GetTrainerInformation callab ReadTrainer call Func_3ec32 call _LoadTrainerPic xor a ld [W_ENEMYMONID], a ld [$ffe1], a dec a ld [wAICount], a ; wccdf FuncCoord 12, 0 ld hl, Coord ld a, $1 call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6)) ld a, $ff ld [W_ENEMYMONNUMBER], a ; W_ENEMYMONNUMBER ld a, $2 ld [W_ISINBATTLE], a ; W_ISINBATTLE jp Func_3efeb InitWildBattle: ; 3ef8b (f:6f8b) ld a, $1 ld [W_ISINBATTLE], a ; W_ISINBATTLE call Func_3eb01 call Func_3ec32 ld a, [W_CUROPPONENT] ; wd059 cp MAROWAK jr z, .isGhost call IsGhostBattle jr nz, .isNoGhost .isGhost ld hl, W_MONHSPRITEDIM ld a, $66 ld [hli], a ; write sprite dimensions ld bc, GhostPic ; $66b5 ld a, c ld [hli], a ; write front sprite pointer ld [hl], b ld hl, W_ENEMYMONNAME ; set name to "GHOST" ld a, "G" ld [hli], a ld a, "H" ld [hli], a ld a, "O" ld [hli], a ld a, "S" ld [hli], a ld a, "T" ld [hli], a ld [hl], "@" ld a, [wcf91] push af ld a, MON_GHOST ld [wcf91], a ld de, $9000 call LoadMonFrontSprite ; load ghost sprite pop af ld [wcf91], a jr .spriteLoaded .isNoGhost ld de, $9000 call LoadMonFrontSprite ; load mon sprite .spriteLoaded xor a ld [W_TRAINERCLASS], a ; wd031 ld [$ffe1], a FuncCoord 12, 0 ld hl, Coord ld a, $1 call Predef ; indirect jump to Func_3f0c6 (3f0c6 (f:70c6)) Func_3efeb: ; 3efeb (f:6feb) ld b, $0 call GoPAL_SET call Func_3c04c xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba ld hl, TerminatorText_3f04a call PrintText call SaveScreenTilesToBuffer1 call ClearScreen ld a, $98 ld [$ffbd], a ld a, $1 ld [H_AUTOBGTRANSFERENABLED], a ; $ffba call Delay3 ld a, $9c ld [$ffbd], a call LoadScreenTilesFromBuffer1 FuncCoord 9, 7 ld hl, Coord ld bc, $50a call ClearScreenArea FuncCoord 1, 0 ld hl, Coord ld bc, $40a call ClearScreenArea call ClearSprites ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a call z, Func_3cdec call Func_3c11e callab Func_137aa pop af ld [wd358], a pop af ld [wd35d], a ld a, [wd0d4] ld [$ffd7], a scf ret TerminatorText_3f04a: ; 3f04a (f:704a) db "@" _LoadTrainerPic: ; 3f04b (f:704b) ; wd033-wd034 contain pointer to pic ld a, [wd033] ld e, a ld a, [wd034] ld d, a ; de contains pointer to trainer pic ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE and a ld a, Bank(TrainerPics) ; this is where all the trainer pics are (not counting Red's) jr z, .loadSprite ld a, Bank(RedPicFront) .loadSprite call UncompressSpriteFromDE ld de, $9000 ld a, $77 ld c, a jp LoadUncompressedSpriteData Func_3f069: ; 3f069 (f:7069) xor a ld [wc0f1], a ld [wc0f2], a jp PlaySound Func_3f073: ; 3f073 (f:7073) ld a, [wPredefRegisters] ld h, a ld a, [wPredefRegisters + 1] ld l, a ld a, [$ffe1] ld [H_DOWNARROWBLINKCNT1], a ; $ff8b ld b, $4c ld a, [W_ISINBATTLE] ; W_ISINBATTLE and a jr z, .asm_3f0bc add b ld [hl], a call Delay3 ld bc, $ffd7 add hl, bc ld a, $1 ld [wcd6c], a ld bc, $303 ld a, $5 call Predef ; indirect jump to Func_79aba (79aba (1e:5aba)) ld c, $4 call DelayFrames ld bc, $ffd7 add hl, bc xor a ld [wcd6c], a ld bc, $505 ld a, $5 call Predef ; indirect jump to Func_79aba (79aba (1e:5aba)) ld c, $5 call DelayFrames ld bc, $ffd7 jr .asm_3f0bf .asm_3f0bc ld bc, $ff85 .asm_3f0bf add hl, bc ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b add $31 jr asm_3f0d0 Func_3f0c6: ; 3f0c6 (f:70c6) ld a, [wPredefRegisters] ld h, a ld a, [wPredefRegisters + 1] ld l, a ld a, [$ffe1] asm_3f0d0: ; 3f0d0 (f:70d0) ld bc, $707 ld de, $14 push af ld a, [W_SPRITEFLIPPED] and a jr nz, .asm_3f0ed pop af .asm_3f0de push bc push hl .asm_3f0e0 ld [hl], a add hl, de inc a dec c jr nz, .asm_3f0e0 pop hl inc hl pop bc dec b jr nz, .asm_3f0de ret .asm_3f0ed push bc ld b, $0 dec c add hl, bc pop bc pop af .asm_3f0f4 push bc push hl .asm_3f0f6 ld [hl], a add hl, de inc a dec c jr nz, .asm_3f0f6 pop hl dec hl pop bc dec b jr nz, .asm_3f0f4 ret ; loads back sprite of mon to $8000 ; assumes the corresponding mon header is already loaded LoadMonBackSprite: ; 3f103 (f:7103) ld a, [wcfd9] ld [wcf91], a FuncCoord 1, 5 ld hl, Coord ld b, $7 ld c, $8 call ClearScreenArea ld hl, W_MONHBACKSPRITE - W_MONHEADER call UncompressMonSprite ld a, $3 call Predef ; indirect jump to ScaleSpriteByTwo (2fe40 (b:7e40)) ld de, $9310 call InterlaceMergeSpriteBuffers ; combine the two buffers to a single 2bpp sprite ld hl, $8000 ld de, $9310 ld c, (2*SPRITEBUFFERSIZE)/16 ; count of 16-byte chunks to be copied ld a, [H_LOADEDROMBANK] ld b, a jp CopyVideoData Func_3f132: ; 3f132 (f:7132) call JumpMoveEffect ld b, $1 ret JumpMoveEffect: ; 3f138 (f:7138) ld a, [$fff3] ;whose turn? and a ld a, [W_PLAYERMOVEEFFECT] jr z, .next1 ld a, [W_ENEMYMOVEEFFECT] .next1 dec a ;subtract 1, there is no special effect for 00 add a ;x2, 16bit pointers ld hl, MoveEffectPointerTable ld b, 0 ld c, a add hl, bc ld a, [hli] ld h, [hl] ld l, a jp [hl] ;jump to special effect handler MoveEffectPointerTable: ; 3f150 (f:7150) dw SleepEffect ; unused effect dw PoisonEffect ; POISON_SIDE_EFFECT1 dw DrainHPEffect ; DRAIN_HP_EFFECT dw FreezeBurnParalyzeEffect ; BURN_SIDE_EFFECT1 dw FreezeBurnParalyzeEffect ; FREEZE_SIDE_EFFECT dw FreezeBurnParalyzeEffect ; PARALYZE_SIDE_EFFECT1 dw ExplodeEffect ; EXPLODE_EFFECT dw DrainHPEffect ; DREAM_EATER_EFFECT dw $0000 ; MIRROR_MOVE_EFFECT dw StatModifierUpEffect ; ATTACK_UP1_EFFECT dw StatModifierUpEffect ; DEFENSE_UP1_EFFECT dw StatModifierUpEffect ; SPEED_UP1_EFFECT dw StatModifierUpEffect ; SPECIAL_UP1_EFFECT dw StatModifierUpEffect ; ACCURACY_UP1_EFFECT dw StatModifierUpEffect ; EVASION_UP1_EFFECT dw PayDayEffect ; PAY_DAY_EFFECT dw $0000 ; SWIFT_EFFECT dw StatModifierDownEffect ; ATTACK_DOWN1_EFFECT dw StatModifierDownEffect ; DEFENSE_DOWN1_EFFECT dw StatModifierDownEffect ; SPEED_DOWN1_EFFECT dw StatModifierDownEffect ; SPECIAL_DOWN1_EFFECT dw StatModifierDownEffect ; ACCURACY_DOWN1_EFFECT dw StatModifierDownEffect ; EVASION_DOWN1_EFFECT dw ConversionEffect ; CONVERSION_EFFECT dw HazeEffect ; HAZE_EFFECT dw BideEffect ; BIDE_EFFECT dw ThrashPetalDanceEffect ; THRASH_PETAL_DANCE_EFFECT dw SwitchAndTeleportEffect ; SWITCH_AND_TELEPORT_EFFECT dw TwoToFiveAttacksEffect ; TWO_TO_FIVE_ATTACKS_EFFECT dw TwoToFiveAttacksEffect ; unused effect dw FlichSideEffect ; FLINCH_SIDE_EFFECT1 dw SleepEffect ; SLEEP_EFFECT dw PoisonEffect ; POISON_SIDE_EFFECT2 dw FreezeBurnParalyzeEffect ; BURN_SIDE_EFFECT2 dw FreezeBurnParalyzeEffect ; unused effect dw FreezeBurnParalyzeEffect ; PARALYZE_SIDE_EFFECT2 dw FlichSideEffect ; FLINCH_SIDE_EFFECT2 dw OneHitKOEffect ; OHKO_EFFECT dw ChargeEffect ; CHARGE_EFFECT dw $0000 ; SUPER_FANG_EFFECT dw $0000 ; SPECIAL_DAMAGE_EFFECT dw TrappingEffect ; TRAPPING_EFFECT dw ChargeEffect ; FLY_EFFECT dw TwoToFiveAttacksEffect ; ATTACK_TWICE_EFFECT dw $0000 ; JUMP_KICK_EFFECT dw MistEffect ; MIST_EFFECT dw FocusEnergyEffect ; FOCUS_ENERGY_EFFECT dw RecoilEffect ; RECOIL_EFFECT dw ConfusionEffect ; CONFUSION_EFFECT dw StatModifierUpEffect ; ATTACK_UP2_EFFECT dw StatModifierUpEffect ; DEFENSE_UP2_EFFECT dw StatModifierUpEffect ; SPEED_UP2_EFFECT dw StatModifierUpEffect ; SPECIAL_UP2_EFFECT dw StatModifierUpEffect ; ACCURACY_UP2_EFFECT dw StatModifierUpEffect ; EVASION_UP2_EFFECT dw HealEffect ; HEAL_EFFECT dw TransformEffect ; TRANSFORM_EFFECT dw StatModifierDownEffect ; ATTACK_DOWN2_EFFECT dw StatModifierDownEffect ; DEFENSE_DOWN2_EFFECT dw StatModifierDownEffect ; SPEED_DOWN2_EFFECT dw StatModifierDownEffect ; SPECIAL_DOWN2_EFFECT dw StatModifierDownEffect ; ACCURACY_DOWN2_EFFECT dw StatModifierDownEffect ; EVASION_DOWN2_EFFECT dw ReflectLightScreenEffect ; LIGHT_SCREEN_EFFECT dw ReflectLightScreenEffect ; REFLECT_EFFECT dw PoisonEffect ; POISON_EFFECT dw ParalyzeEffect ; PARALYZE_EFFECT dw StatModifierDownEffect ; ATTACK_DOWN_SIDE_EFFECT dw StatModifierDownEffect ; DEFENSE_DOWN_SIDE_EFFECT dw StatModifierDownEffect ; SPEED_DOWN_SIDE_EFFECT dw StatModifierDownEffect ; SPECIAL_DOWN_SIDE_EFFECT dw StatModifierDownEffect ; unused effect dw StatModifierDownEffect ; unused effect dw StatModifierDownEffect ; unused effect dw StatModifierDownEffect ; unused effect dw ConfusionSideEffect ; CONFUSION_SIDE_EFFECT dw TwoToFiveAttacksEffect ; TWINEEDLE_EFFECT dw $0000 ; unused effect dw SubstituteEffect ; SUBSTITUTE_EFFECT dw HyperBeamEffect ; HYPER_BEAM_EFFECT dw RageEffect ; RAGE_EFFECT dw MimicEffect ; MIMIC_EFFECT dw $0000 ; METRONOME_EFFECT dw LeechSeedEffect ; LEECH_SEED_EFFECT dw SplashEffect ; SPLASH_EFFECT dw DisableEffect ; DISABLE_EFFECT SleepEffect: ; 3f1fc (f:71fc) ld de, W_ENEMYMONSTATUS ; wcfe9 ld bc, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 ld a, [H_WHOSETURN] ; $fff3 and a jp z, .asm_3f20e ld de, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS ld bc, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 .asm_3f20e ld a, [bc] bit 5, a ; does the mon need to recharge? (hyper beam) res 5, a ; mon no longer needs to recharge ld [bc], a jr nz, .asm_3f231 ld a, [de] ld b, a and $7 jr z, .asm_3f222 ld hl, AlreadyAsleepText jp PrintText .asm_3f222 ld a, b and a jr nz, .asm_3f242 push de call MoveHitTest pop de ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jr nz, .asm_3f242 .asm_3f231 call BattleRandom and $7 jr z, .asm_3f231 ld [de], a call Func_3fb89 ld hl, FellAsleepText jp PrintText .asm_3f242 jp PrintDidntAffectText FellAsleepText: ; 3f245 (f:7245) TX_FAR _FellAsleepText db "@" AlreadyAsleepText: ; 3f24a (f:724a) TX_FAR _AlreadyAsleepText db "@" PoisonEffect: ; 3f24f (f:724f) ld hl, W_ENEMYMONSTATUS ; wcfe9 ld de, W_PLAYERMOVEEFFECT ; wcfd3 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f260 ld hl, W_PLAYERMONSTATUS ; W_PLAYERMONSTATUS ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT .asm_3f260 call CheckTargetSubstitute jr nz, .asm_3f2d3 ld a, [hli] ld b, a and a jr nz, .asm_3f2d3 ld a, [hli] cp $3 jr z, .asm_3f2d3 ld a, [hld] cp $3 jr z, .asm_3f2d3 ld a, [de] cp POISON_SIDE_EFFECT1 ld b, $34 ; ~20% chance of poisoning jr z, .asm_3f290 cp POISON_SIDE_EFFECT2 ld b, $67 ; ~40% chance of poisoning jr z, .asm_3f290 push hl push de call MoveHitTest pop de pop hl ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jr nz, .asm_3f2d7 jr .asm_3f295 .asm_3f290 call BattleRandom cp b ret nc .asm_3f295 dec hl set 3, [hl] push de dec de ld a, [H_WHOSETURN] ; $fff3 and a ld b, $c7 ld hl, W_PLAYERBATTSTATUS3 ; W_PLAYERBATTSTATUS3 ld a, [de] ld de, W_PLAYERTOXICCOUNTER ; wd06c jr nz, .asm_3f2b0 ld b, $a9 ld hl, W_ENEMYBATTSTATUS3 ; W_ENEMYBATTSTATUS3 ld de, W_ENEMYTOXICCOUNTER ; wd071 .asm_3f2b0 cp $5c jr nz, .asm_3f2bd set 0, [hl] xor a ld [de], a ld hl, BadlyPoisonedText jr .asm_3f2c0 .asm_3f2bd ld hl, PoisonedText .asm_3f2c0 pop de ld a, [de] cp POISON_EFFECT jr z, .asm_3f2cd ld a, b call Func_3fb96 jp PrintText .asm_3f2cd call Func_3fb89 jp PrintText .asm_3f2d3 ld a, [de] cp POISON_EFFECT ret nz .asm_3f2d7 ld c, $32 call DelayFrames jp PrintDidntAffectText PoisonedText: ; 3f2df (f:72df) TX_FAR _PoisonedText db "@" BadlyPoisonedText: ; 3f2e4 (f:72e4) TX_FAR _BadlyPoisonedText db "@" DrainHPEffect: ; 3f2e9 (f:72e9) ld hl, DrainHPEffect_ ld b, BANK(DrainHPEffect_) jp Bankswitch ExplodeEffect: ; 3f2f1 (f:72f1) ld hl, W_PLAYERMONCURHP ; wd015 ld de, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f302 ld hl, W_ENEMYMONCURHP ; W_ENEMYMONCURHP ld de, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 .asm_3f302 xor a ld [hli], a ; set the mon's HP to 0 ld [hli], a inc hl ld [hl], a ; set mon's status to 0 ld a, [de] res 7, a ; clear mon's leech seed status ld [de], a ret FreezeBurnParalyzeEffect: ; 3f30c (f:730c) xor a ld [wcc5b], a call CheckTargetSubstitute ;test bit 4 of d063/d068 flags [target has substitute flag] ret nz ;return if they have a substitute, can't effect them ld a, [$fff3] ;whose turn? and a jp nz, opponentAttacker ld a, [W_ENEMYMONSTATUS] and a jp nz, CheckDefrost ;opponent has no existing status ld a, [W_PLAYERMOVETYPE] ld b, a ld a, [W_ENEMYMONTYPE1] cp b ret z ;return if they match [can't freeze an ice type etc.] ld a, [W_ENEMYMONTYPE2] cp b ret z ;return.. ld a, [W_PLAYERMOVEEFFECT] cp a, 7 ;10% status effects are 04, 05, 06 so 07 will set carry for those ld b, $1a ;[1A-1]/100 or [26-1]/256 = 9.8%~ chance jr c, .next1 ;branch ahead if this is a 10% chance effect.. ld b, $4d ;..or use [4D-1]/100 or [76-1]/256 = 29.7%~ chance sub a, $1e ;subtract $1E to map to equivalent 10% chance effects .next1 push af ;push effect... call BattleRandom ;get random 8bit value for probability test cp b ;success? pop bc ;...pop effect into C ret nc ;do nothing if random value is >= 1A or 4D [no status applied] ;the test passed ld a, b ;what type of effect is this? cp a, BURN_SIDE_EFFECT1 jr z, .burn cp a, FREEZE_SIDE_EFFECT jr z, .freeze ld a, 1 << PAR ld [W_ENEMYMONSTATUS], a call Func_3ed27 ;quarter speed of affected monster ld a, $a9 call Func_3fbb9 ;animation jp PrintMayNotAttackText ;print paralysis text .burn ld a, 1 << BRN ld [W_ENEMYMONSTATUS], a call Func_3ed64 ld a, $a9 call Func_3fbb9 ;animation ld hl, BurnedText jp PrintText .freeze call Func_3f9cf ;resets bit 5 of the D063/D068 flags ld a, 1 << FRZ ld [W_ENEMYMONSTATUS], a ld a, $a9 call Func_3fbb9 ;animation ld hl, FrozenText jp PrintText opponentAttacker: ; 3f382 (f:7382) ld a, [W_PLAYERMONSTATUS] ;this appears to the same as above with addresses swapped for opponent and a jp nz, CheckDefrost ld a, [W_ENEMYMOVETYPE] ld b, a ld a, [W_PLAYERMONTYPE1] cp b ret z ld a, [W_PLAYERMONTYPE2] cp b ret z ld a, [W_ENEMYMOVEEFFECT] cp a, 7 ld b, $1a jr c, .next1 ld b, $4d sub a, $1e .next1 push af call BattleRandom cp b pop bc ret nc ld a, b cp a, BURN_SIDE_EFFECT1 jr z, .burn cp a, FREEZE_SIDE_EFFECT jr z, .freeze ld a, 1 << PAR ld [W_PLAYERMONSTATUS], a call Func_3ed27 jp PrintMayNotAttackText .burn ld a, 1 << BRN ld [W_PLAYERMONSTATUS], a call Func_3ed64 ld hl, BurnedText jp PrintText .freeze ld a, 1 << FRZ ld [W_PLAYERMONSTATUS], a ld hl, FrozenText jp PrintText BurnedText: ; 3f3d8 (f:73d8) TX_FAR _BurnedText db "@" FrozenText: ; 3f3dd (f:73dd) TX_FAR _FrozenText db "@" CheckDefrost: ; 3f3e2 (f:73e2) and a, 1 << FRZ ;are they frozen? ret z ;return if so ;not frozen ld a, [$fff3] ;whose turn? and a jr nz, .opponent ;player [attacker] ld a, [W_PLAYERMOVETYPE] sub a, FIRE ret nz ;return if it isn't fire ;type is fire ld [W_ENEMYMONSTATUS], a ;set opponent status to 00 ["defrost" a frozen monster] ld hl, wd8a8 ;status of first opponent monster in their roster ld a, [W_ENEMYMONNUMBER] ld bc, $002c ;$2C bytes per roster entry call AddNTimes xor a ld [hl], a ;clear status in roster ld hl, FireDefrostedText jr .common .opponent ld a, [W_ENEMYMOVETYPE] ;same as above with addresses swapped sub a, FIRE ret nz ld [W_PLAYERMONSTATUS], a ld hl, W_PARTYMON1_STATUS ld a, [wPlayerMonNumber] ld bc, $002c call AddNTimes xor a ld [hl], a ld hl, FireDefrostedText .common jp PrintText FireDefrostedText: ; 3f423 (f:7423) TX_FAR _FireDefrostedText db "@" StatModifierUpEffect: ; 3f428 (f:7428) ld hl, wPlayerMonStatMods ; wcd1a ld de, W_PLAYERMOVEEFFECT ; wcfd3 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f439 ld hl, wEnemyMonStatMods ; wcd2e ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT .asm_3f439 ld a, [de] sub $a cp $8 jr c, .asm_3f442 sub $28 .asm_3f442 ld c, a ld b, $0 add hl, bc ld b, [hl] inc b ld a, $d cp b jp c, Func_3f522 ld a, [de] cp $12 jr c, .asm_3f45a inc b ld a, $d cp b jr nc, .asm_3f45a ld b, a .asm_3f45a ld [hl], b ld a, c cp $4 jr nc, asm_3f4ca push hl ld hl, W_PLAYERMONATK + 1 ld de, wcd12 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f472 ld hl, W_ENEMYMONATTACK + 1 ld de, wcd26 .asm_3f472 push bc sla c ld b, $0 add hl, bc ld a, c add e ld e, a jr nc, .asm_3f47e inc d .asm_3f47e pop bc ld a, [hld] sub $e7 jr nz, .asm_3f48a ld a, [hl] sbc $3 jp z, Func_3f520 .asm_3f48a push hl push bc ld hl, StatModifierRatios ; $76cb dec b sla b ld c, b ld b, $0 add hl, bc pop bc xor a ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, [de] ld [$ff97], a inc de ld a, [de] ld [$ff98], a ld a, [hli] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) call Multiply ld a, [hl] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld b, $4 call Divide pop hl ld a, [$ff98] sub $e7 ld a, [$ff97] sbc $3 jp c, Func_3f4c3 ld a, 999 / $100 ld [$ff97], a ld a, 999 % $100 ld [$ff98], a Func_3f4c3: ; 3f4c3 (f:74c3) ld a, [$ff97] ld [hli], a ld a, [$ff98] ld [hl], a pop hl asm_3f4ca: ; 3f4ca (f:74ca) ld b, c inc b call Func_3f688 ld hl, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 ld de, W_PLAYERMOVENUM ; wcfd2 ld bc, wccf7 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f4e6 ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 ld de, W_ENEMYMOVENUM ; W_ENEMYMOVENUM ld bc, wccf3 .asm_3f4e6 ld a, [de] cp MINIMIZE jr nz, .asm_3f4f9 bit 4, [hl] push af push bc ld hl, Func_79747 ld b, BANK(Func_79747) push de call nz, Bankswitch pop de .asm_3f4f9 call Func_3fba8 ld a, [de] cp MINIMIZE jr nz, .asm_3f50e pop bc ld a, $1 ld [bc], a ld hl, Func_79771 ld b, BANK(Func_79771) pop af call nz, Bankswitch .asm_3f50e ld a, [H_WHOSETURN] ; $fff3 and a call z, Func_3ee19 ld hl, MonsStatsRoseText call PrintText call Func_3ed27 jp Func_3ed64 Func_3f520: ; 3f520 (f:7520) pop hl dec [hl] Func_3f522: ; 3f522 (f:7522) ld hl, NothingHappenedText jp PrintText MonsStatsRoseText: ; 3f528 (f:7528) TX_FAR _MonsStatsRoseText db $08 ; asm ld hl, GreatlyRoseText ld a, [H_WHOSETURN] ; $fff3 and a ld a, [W_PLAYERMOVEEFFECT] ; wcfd3 jr z, .asm_3f53b ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT .asm_3f53b cp ATTACK_DOWN1_EFFECT ret nc ld hl, RoseText ret GreatlyRoseText: ; 3f542 (f:7542) db $0a TX_FAR _GreatlyRoseText RoseText: ; 3f547 (f:7547) TX_FAR _RoseText db "@" StatModifierDownEffect: ; 3f54c (f:754c) ld hl, wEnemyMonStatMods ; wcd2e ld de, W_PLAYERMOVEEFFECT ; wcfd3 ld bc, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f572 ld hl, wPlayerMonStatMods ; wcd1a ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT ld bc, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 jr z, .asm_3f572 call BattleRandom cp $40 jp c, Func_3f65a .asm_3f572 call CheckTargetSubstitute jp nz, Func_3f65a ld a, [de] cp ATTACK_DOWN_SIDE_EFFECT jr c, .asm_3f58a call BattleRandom cp SPLASH_EFFECT jp nc, Func_3f650 ld a, [de] sub ATTACK_DOWN_SIDE_EFFECT jr .asm_3f5a9 .asm_3f58a push hl push de push bc call MoveHitTest pop bc pop de pop hl ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jp nz, Func_3f65a ld a, [bc] bit 6, a jp nz, Func_3f65a ld a, [de] sub $12 cp $8 jr c, .asm_3f5a9 sub $28 .asm_3f5a9 ld c, a ld b, $0 add hl, bc ld b, [hl] dec b jp z, Func_3f650 ld a, [de] cp $24 jr c, .asm_3f5bf cp $44 jr nc, .asm_3f5bf dec b jr nz, .asm_3f5bf inc b .asm_3f5bf ld [hl], b ld a, c cp $4 jr nc, asm_3f62c push hl push de ld hl, W_ENEMYMONATTACK + 1 ld de, wcd26 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f5d8 ld hl, W_PLAYERMONATK + 1 ld de, wcd12 .asm_3f5d8 push bc sla c ld b, $0 add hl, bc ld a, c add e ld e, a jr nc, .asm_3f5e4 inc d .asm_3f5e4 pop bc ld a, [hld] sub $1 jr nz, .asm_3f5ef ld a, [hl] and a jp z, Func_3f64d .asm_3f5ef push hl push bc ld hl, StatModifierRatios ; $76cb dec b sla b ld c, b ld b, $0 add hl, bc pop bc xor a ld [H_NUMTOPRINT], a ; $ff96 (aliases: H_MULTIPLICAND) ld a, [de] ld [$ff97], a inc de ld a, [de] ld [$ff98], a ld a, [hli] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) call Multiply ld a, [hl] ld [H_REMAINDER], a ; $ff99 (aliases: H_DIVISOR, H_MULTIPLIER, H_POWEROFTEN) ld b, $4 call Divide pop hl ld a, [$ff98] ld b, a ld a, [$ff97] or b jp nz, Func_3f624 ld [$ff97], a ld a, $1 ld [$ff98], a Func_3f624: ; 3f624 (f:7624) ld a, [$ff97] ld [hli], a ld a, [$ff98] ld [hl], a pop de pop hl asm_3f62c: ; 3f62c (f:762c) ld b, c inc b push de call Func_3f688 pop de ld a, [de] cp $44 jr nc, .asm_3f63b call Func_3fb89 .asm_3f63b ld a, [H_WHOSETURN] ; $fff3 and a call nz, Func_3ee19 ld hl, MonsStatsFellText call PrintText call Func_3ed27 jp Func_3ed64 Func_3f64d: ; 3f64d (f:764d) pop de pop hl inc [hl] Func_3f650: ; 3f650 (f:7650) ld a, [de] cp ATTACK_DOWN_SIDE_EFFECT ret nc ld hl, NothingHappenedText jp PrintText Func_3f65a: ; 3f65a (f:765a) ld a, [de] cp $44 ret nc jp Func_3fb4e MonsStatsFellText: ; 3f661 (f:7661) TX_FAR _MonsStatsFellText db $08 ; asm ld hl, FellText ld a, [H_WHOSETURN] ; $fff3 and a ld a, [W_PLAYERMOVEEFFECT] ; wcfd3 jr z, .asm_3f674 ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT .asm_3f674 cp $1a ret c cp $44 ret nc ld hl, GreatlyFellText ret GreatlyFellText: ; 3f67e (f:767e) db $0a TX_FAR _GreatlyFellText FellText: ; 3f683 (f:7683) TX_FAR _FellText db "@" Func_3f688: ; 3f688 (f:7688) ld hl, StatsTextStrings ld c, $50 .asm_3f68d dec b jr z, .asm_3f696 .asm_3f690 ld a, [hli] cp c jr z, .asm_3f68d jr .asm_3f690 .asm_3f696 ld de, wcf4b ld bc, $a jp CopyData StatsTextStrings: ; 3f69f (f:769f) db "ATTACK@" db "DEFENSE@" db "SPEED@" db "SPECIAL@" db "ACCURACY@" db "EVADE@" StatModifierRatios: ; 3f6cb (f:76cb) ; first byte is numerator, second byte is denominator db 25, 100 ; 0.25 db 28, 100 ; 0.28 db 33, 100 ; 0.33 db 40, 100 ; 0.40 db 50, 100 ; 0.50 db 66, 100 ; 0.66 db 1, 1 ; 1.00 db 15, 10 ; 1.50 db 2, 1 ; 2.00 db 25, 10 ; 2.50 db 3, 1 ; 3.00 db 35, 10 ; 3.50 db 4, 1 ; 4.00 BideEffect: ; 3f6e5 (f:76e5) ld hl, W_PLAYERBATTSTATUS1 ld de, W_NUMHITS ld bc, wd06a ld a, [H_WHOSETURN] and a jr z, .asm_3f6fc ld hl, W_ENEMYBATTSTATUS1 ld de, wcd05 ld bc, wd06f .asm_3f6fc set 0, [hl] ; mon is now using bide xor a ld [de], a inc de ld [de], a ld [W_PLAYERMOVEEFFECT], a ld [W_ENEMYMOVEEFFECT], a call BattleRandom and $1 inc a inc a ld [bc], a ld a, [H_WHOSETURN] add $ae jp Func_3fb96 ThrashPetalDanceEffect: ; 3f717 (f:7717) ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld de, wd06a ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f728 ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld de, wd06f .asm_3f728 set 1, [hl] ; mon is now using thrash/petal dance call BattleRandom and $1 inc a inc a ld [de], a ld a, [H_WHOSETURN] ; $fff3 add $b0 jp Func_3fb96 SwitchAndTeleportEffect: ; 3f739 (f:7739) ld a, [H_WHOSETURN] ; $fff3 and a jr nz, .asm_3f791 ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a jr nz, .asm_3f77e ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL ld b, a ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL cp b jr nc, .asm_3f76e add b ld c, a inc c .asm_3f751 call BattleRandom cp c jr nc, .asm_3f751 srl b srl b cp b jr nc, .asm_3f76e ld c, $32 call DelayFrames ld a, [W_PLAYERMOVENUM] ; wcfd2 cp TELEPORT jp nz, PrintDidntAffectText jp PrintButItFailedText_ .asm_3f76e call ReadPlayerMonCurHPAndStatus xor a ld [wcc5b], a inc a ld [wd078], a ld a, [W_PLAYERMOVENUM] ; wcfd2 jr .asm_3f7e4 .asm_3f77e ld c, $32 call DelayFrames ld hl, IsUnaffectedText ld a, [W_PLAYERMOVENUM] ; wcfd2 cp TELEPORT jp nz, PrintText jp PrintButItFailedText_ .asm_3f791 ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a jr nz, .asm_3f7d1 ld a, [W_PLAYERMONLEVEL] ; W_PLAYERMONLEVEL ld b, a ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL cp b jr nc, .asm_3f7c1 add b ld c, a inc c .asm_3f7a4 call BattleRandom cp c jr nc, .asm_3f7a4 srl b srl b cp b jr nc, .asm_3f7c1 ld c, $32 call DelayFrames ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM cp TELEPORT jp nz, PrintDidntAffectText jp PrintButItFailedText_ .asm_3f7c1 call ReadPlayerMonCurHPAndStatus xor a ld [wcc5b], a inc a ld [wd078], a ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM jr .asm_3f7e4 .asm_3f7d1 ld c, $32 call DelayFrames ld hl, IsUnaffectedText ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM cp TELEPORT jp nz, PrintText jp Func_3fb4e .asm_3f7e4 push af call Func_3fbb9 ld c, $14 call DelayFrames pop af ld hl, RanFromBattleText ; $7802 cp TELEPORT jr z, .asm_3f7ff ld hl, RanAwayScaredText ; $7807 cp ROAR jr z, .asm_3f7ff ld hl, WasBlownAwayText ; $780c .asm_3f7ff jp PrintText RanFromBattleText: ; 3f802 (f:7802) TX_FAR _RanFromBattleText db "@" RanAwayScaredText: ; 3f807 (f:7807) TX_FAR _RanAwayScaredText db "@" WasBlownAwayText: ; 3f80c (f:780c) TX_FAR _WasBlownAwayText db "@" TwoToFiveAttacksEffect: ; 3f811 (f:7811) ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld de, wd06a ld bc, W_NUMHITS ; wd074 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f828 ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld de, wd06f ld bc, wcd05 .asm_3f828 bit 2, [hl] ; is mon attacking multiple times? ret nz set 2, [hl] ; mon is now attacking multiple times ld hl, W_PLAYERMOVEEFFECT ; wcfd3 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f838 ld hl, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT .asm_3f838 ld a, [hl] cp TWINEEDLE_EFFECT jr z, .asm_3f856 cp ATTACK_TWICE_EFFECT ld a, $2 jr z, .asm_3f853 call BattleRandom and $3 cp $2 jr c, .asm_3f851 call BattleRandom and $3 .asm_3f851 inc a inc a .asm_3f853 ld [de], a ld [bc], a ret .asm_3f856 ld a, $2 ld [hl], a jr .asm_3f853 FlichSideEffect: ; 3f85b (f:785b) call CheckTargetSubstitute ret nz ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld de, W_PLAYERMOVEEFFECT ; wcfd3 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f870 ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT .asm_3f870 ld a, [de] cp FLINCH_SIDE_EFFECT1 ld b, $1a ; ~10% chance of flinch jr z, .asm_3f879 ld b, $4d ; ~30% chance of flinch .asm_3f879 call BattleRandom cp b ret nc set 3, [hl] ; set mon's status to flinching call Func_3f9cf ret OneHitKOEffect: ; 3f884 (f:7884) ld hl, OneHitKOEffect_ ld b, BANK(OneHitKOEffect_) jp Bankswitch ChargeEffect: ; 3f88c (f:788c) ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld de, W_PLAYERMOVEEFFECT ; wcfd3 ld a, [H_WHOSETURN] ; $fff3 and a ld b, $ae jr z, .asm_3f8a1 ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld de, W_ENEMYMOVEEFFECT ; W_ENEMYMOVEEFFECT ld b, $af .asm_3f8a1 set 4, [hl] ld a, [de] dec de ; de contains enemy or player MOVENUM cp FLY_EFFECT jr nz, .asm_3f8ad set 6, [hl] ; mon is now invulnerable to typical attacks (fly/dig) ld b, $64 .asm_3f8ad ld a, [de] cp DIG jr nz, .asm_3f8b6 set 6, [hl] ; mon is now invulnerable to typical attacks (fly/dig) ld b, $c0 .asm_3f8b6 xor a ld [wcc5b], a ld a, b call Func_3fbb9 ld a, [de] ld [wWhichTrade], a ; wWhichTrade ld hl, ChargeMoveEffectText ; $78c8 jp PrintText ChargeMoveEffectText: ; 3f8c8 (f:78c8) TX_FAR _ChargeMoveEffectText db $08 ; asm ld a, [wWhichTrade] ; wWhichTrade cp RAZOR_WIND ld hl, MadeWhirlwindText ; $78f9 jr z, .asm_3f8f8 cp SOLARBEAM ld hl, TookInSunlightText ; $78fe jr z, .asm_3f8f8 cp SKULL_BASH ld hl, LoweredItsHeadText ; $7903 jr z, .asm_3f8f8 cp SKY_ATTACK ld hl, SkyAttackGlowingText ; $7908 jr z, .asm_3f8f8 cp FLY ld hl, FlewUpHighText ; $790d jr z, .asm_3f8f8 cp DIG ld hl, DugAHoleText ; $7912 .asm_3f8f8 ret MadeWhirlwindText: ; 3f8f9 (f:78f9) TX_FAR _MadeWhirlwindText db "@" TookInSunlightText: ; 3f8fe (f:78fe) TX_FAR _TookInSunlightText db "@" LoweredItsHeadText: ; 3f903 (f:7903) TX_FAR _LoweredItsHeadText db "@" SkyAttackGlowingText: ; 3f908 (f:7908) TX_FAR _SkyAttackGlowingText db "@" FlewUpHighText: ; 3f90d (f:790d) TX_FAR _FlewUpHighText db "@" DugAHoleText: ; 3f912 (f:7912) TX_FAR _DugAHoleText db "@" TrappingEffect: ; 3f917 (f:7917) ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld de, wd06a ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f928 ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld de, wd06f .asm_3f928 bit 5, [hl] ret nz call Func_3f9cf set 5, [hl] call BattleRandom and $3 cp $2 jr c, .asm_3f93e call BattleRandom and $3 .asm_3f93e inc a ld [de], a ret MistEffect: ; 3f941 (f:7941) ld hl, MistEffect_ ld b, BANK(MistEffect_) jp Bankswitch FocusEnergyEffect: ; 3f949 (f:7949) ld hl, FocusEnergyEffect_ ld b, BANK(FocusEnergyEffect_) jp Bankswitch RecoilEffect: ; 3f951 (f:7951) ld hl, RecoilEffect_ ld b, BANK(RecoilEffect_) jp Bankswitch ConfusionSideEffect: ; 3f959 (f:7959) call BattleRandom cp $19 ret nc jr Func_3f96f ConfusionEffect: ; 3f961 (f:7961) call CheckTargetSubstitute jr nz, Func_3f9a6 call MoveHitTest ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jr nz, Func_3f9a6 Func_3f96f: ; 3f96f (f:796f) ld a, [H_WHOSETURN] ; $fff3 and a ld hl, W_ENEMYBATTSTATUS1 ; W_ENEMYBATTSTATUS1 ld bc, wd070 ld a, [W_PLAYERMOVEEFFECT] ; wcfd3 jr z, .asm_3f986 ld hl, W_PLAYERBATTSTATUS1 ; W_PLAYERBATTSTATUS1 ld bc, wd06b ld a, [W_ENEMYMOVEEFFECT] ; W_ENEMYMOVEEFFECT .asm_3f986 bit 7, [hl] ; is mon confused? jr nz, Func_3f9a6 set 7, [hl] ; mon is now confused push af call BattleRandom and $3 inc a inc a ld [bc], a pop af cp CONFUSION_SIDE_EFFECT call nz, Func_3fb89 ld hl, BecameConfusedText ; $79a1 jp PrintText BecameConfusedText: ; 3f9a1 (f:79a1) TX_FAR _BecameConfusedText db "@" Func_3f9a6: ; 3f9a6 (f:79a6) cp CONFUSION_SIDE_EFFECT ret z ld c, $32 call DelayFrames jp Func_3fb4e ParalyzeEffect: ; 3f9b1 (f:79b1) ld hl, ParalyzeEffect_ ld b, BANK(ParalyzeEffect_) jp Bankswitch SubstituteEffect: ; 3f9b9 (f:79b9) ld hl, SubstituteEffectHandler ld b, BANK(SubstituteEffectHandler) jp Bankswitch HyperBeamEffect: ; 3f9c1 (f:79c1) ld hl, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f9cc ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 .asm_3f9cc set 5, [hl] ; mon now needs to recharge ret Func_3f9cf: ; 3f9cf (f:79cf) push hl ld hl, W_ENEMYBATTSTATUS2 ; W_ENEMYBATTSTATUS2 ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3f9db ld hl, W_PLAYERBATTSTATUS2 ; W_PLAYERBATTSTATUS2 .asm_3f9db res 5, [hl] ; mon no longer needs to recharge pop hl ret RageEffect: ; 3f9df (f:79df) ld hl, W_PLAYERBATTSTATUS2 ld a, [H_WHOSETURN] and a jr z, .player ld hl, W_ENEMYBATTSTATUS2 .player set 6, [hl] ; mon is now in "rage" mode ret MimicEffect: ; 3f9ed (f:79ed) ld c, $32 call DelayFrames call MoveHitTest ld a, [W_MOVEMISSED] and a jr nz, .asm_3fa74 ld a, [H_WHOSETURN] and a ld hl, W_PLAYERMONMOVES ld a, [W_PLAYERBATTSTATUS1] jr nz, .asm_3fa13 ld a, [W_ISLINKBATTLE] cp $4 jr nz, .asm_3fa3a ld hl, W_ENEMYMONMOVES ld a, [W_ENEMYBATTSTATUS1] .asm_3fa13 bit 6, a jr nz, .asm_3fa74 .asm_3fa17 push hl call BattleRandom and $3 ld c, a ld b, $0 add hl, bc ld a, [hl] pop hl and a jr z, .asm_3fa17 ld d, a ld a, [H_WHOSETURN] and a ld hl, W_PLAYERMONMOVES ld a, [wPlayerMoveListIndex] jr z, .asm_3fa5f ld hl, W_ENEMYMONMOVES ld a, [wEnemyMoveListIndex] jr .asm_3fa5f .asm_3fa3a ld a, [W_ENEMYBATTSTATUS1] bit 6, a jr nz, .asm_3fa74 ld a, [wCurrentMenuItem] push af ld a, $1 ld [wMoveMenuType], a call MoveSelectionMenu call LoadScreenTilesFromBuffer1 ld hl, W_ENEMYMONMOVES ld a, [wCurrentMenuItem] ld c, a ld b, $0 add hl, bc ld d, [hl] pop af ld hl, W_PLAYERMONMOVES .asm_3fa5f ld c, a ld b, $0 add hl, bc ld a, d ld [hl], a ld [wd11e], a call GetMoveName call Func_3fba8 ld hl, MimicLearnedMoveText jp PrintText .asm_3fa74 jp PrintButItFailedText_ MimicLearnedMoveText: ; 3fa77 (f:7a77) TX_FAR _MimicLearnedMoveText db "@" LeechSeedEffect: ; 3fa7c (f:7a7c) ld hl, LeechSeedEffect_ ld b, BANK(LeechSeedEffect_) jp Bankswitch SplashEffect: ; 3fa84 (f:7a84) call Func_3fba8 jp PrintNoEffectText DisableEffect: ; 3fa8a (f:7a8a) call MoveHitTest ld a, [W_MOVEMISSED] ; W_MOVEMISSED and a jr nz, .asm_3fb06 ld de, W_ENEMYDISABLEDMOVE ; W_ENEMYDISABLEDMOVE ld hl, W_ENEMYMONMOVES ld a, [H_WHOSETURN] ; $fff3 and a jr z, .asm_3faa4 ld de, W_PLAYERDISABLEDMOVE ; W_PLAYERDISABLEDMOVE ld hl, W_PLAYERMONMOVES .asm_3faa4 ld a, [de] and a jr nz, .asm_3fb06 .asm_3faa8 push hl call BattleRandom and $3 ld c, a ld b, $0 add hl, bc ld a, [hl] pop hl and a jr z, .asm_3faa8 ld [wd11e], a push hl ld a, [H_WHOSETURN] ; $fff3 and a ld hl, W_PLAYERMONPP ; W_PLAYERMONPP jr nz, .asm_3facf ld a, [W_ISLINKBATTLE] ; W_ISLINKBATTLE cp $4 pop hl jr nz, .asm_3fae1 push hl ld hl, W_ENEMYMONPP ; wcffe .asm_3facf push hl ld a, [hli] or [hl] inc hl or [hl] inc hl or [hl] and $3f pop hl jr z, .asm_3fb05 add hl, bc ld a, [hl] pop hl and a jr z, .asm_3faa8 .asm_3fae1 call BattleRandom and $7 inc a inc c swap c add c ld [de], a call Func_3fb89 ld hl, wccee ld a, [H_WHOSETURN] ; $fff3 and a jr nz, .asm_3faf8 inc hl .asm_3faf8 ld a, [wd11e] ld [hl], a call GetMoveName ld hl, MoveWasDisabledText ; $7b09 jp PrintText .asm_3fb05 pop hl .asm_3fb06 jp PrintButItFailedText_ MoveWasDisabledText: ; 3fb09 (f:7b09) TX_FAR _MoveWasDisabledText db "@" PayDayEffect: ; 3fb0e (f:7b0e) ld hl, PayDayEffect_ ld b, BANK(PayDayEffect_) jp Bankswitch ConversionEffect: ; 3fb16 (f:7b16) ld hl, ConversionEffect_ ld b, BANK(ConversionEffect_) jp Bankswitch HazeEffect: ; 3fb1e (f:7b1e) ld hl, HazeEffect_ ld b, BANK(HazeEffect_) jp Bankswitch HealEffect: ; 3fb26 (f:7b26) ld hl, HealEffect_ ld b, BANK(HealEffect_) jp Bankswitch TransformEffect: ; 3fb2e (f:7b2e) ld hl, TransformEffect_ ld b, BANK(TransformEffect_) jp Bankswitch ReflectLightScreenEffect: ; 3fb36 (f:7b36) ld hl, ReflectLightScreenEffect_ ld b, BANK(ReflectLightScreenEffect_) jp Bankswitch NothingHappenedText: ; 3fb3e (f:7b3e) TX_FAR _NothingHappenedText db "@" PrintNoEffectText: ; 3fb43 (f:7b43) ld hl, NoEffectText jp PrintText NoEffectText: ; 3fb49 (f:7b49) TX_FAR _NoEffectText db "@" Func_3fb4e: ; 3fb4e (f:7b4e) ld a, [wccf4] and a ret nz PrintButItFailedText_: ; 3fb53 (f:7b53) ld hl, ButItFailedText jp PrintText ButItFailedText: ; 3fb59 (f:7b59) TX_FAR _ButItFailedText db "@" PrintDidntAffectText: ; 3fb5e (f:7b5e) ld hl, DidntAffectText jp PrintText DidntAffectText: ; 3fb64 (f:7b64) TX_FAR _DidntAffectText db "@" IsUnaffectedText: ; 3fb69 (f:7b69) TX_FAR _IsUnaffectedText db "@" PrintMayNotAttackText: ; 3fb6e (f:7b6e) ld hl, ParalyzedMayNotAttackText ; $7b74 jp PrintText ParalyzedMayNotAttackText: ; 3fb74 (f:7b74) TX_FAR _ParalyzedMayNotAttackText db "@" CheckTargetSubstitute: ; 3fb79 (f:7b79) push hl ld hl, W_ENEMYBATTSTATUS2 ld a, [$fff3] ;whose turn? and a jr z, .next1 ld hl, W_PLAYERBATTSTATUS2 .next1 bit 4, [hl] ;test bit 4 in d063/d068 flags pop hl ret Func_3fb89: ; 3fb89 (f:7b89) ld a, [H_WHOSETURN] ; $fff3 and a ld a, [W_PLAYERMOVENUM] ; wcfd2 jr z, .asm_3fb94 ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM .asm_3fb94 and a ret z Func_3fb96: ; 3fb96 (f:7b96) ld [W_ANIMATIONID], a ; W_ANIMATIONID ld a, [H_WHOSETURN] ; $fff3 and a ld a, $6 jr z, .asm_3fba2 ld a, $3 .asm_3fba2 ld [wcc5b], a jp Func_3fbbc Func_3fba8: ; 3fba8 (f:7ba8) xor a ld [wcc5b], a ld a, [H_WHOSETURN] ; $fff3 and a ld a, [W_PLAYERMOVENUM] ; wcfd2 jr z, .asm_3fbb7 ld a, [W_ENEMYMOVENUM] ; W_ENEMYMOVENUM .asm_3fbb7 and a ret z Func_3fbb9: ; 3fbb9 (f:7bb9) ld [W_ANIMATIONID], a ; W_ANIMATIONID Func_3fbbc: ; 3fbbc (f:7bbc) push hl push de push bc ld a, $8 call Predef ; indirect jump to MoveAnimation (78d5e (1e:4d5e)) pop bc pop de pop hl ret