Merge pull request #90 from xCrystal/master

Rename/split battle and move effect files. Battle functions, AI, and attack animations
This commit is contained in:
yenatch 2015-04-01 12:56:42 -04:00
commit c2efe700ac
45 changed files with 2092 additions and 2035 deletions

View file

@ -1,77 +0,0 @@
; returns whether the player is one tile outside the map in Z
IsPlayerJustOutsideMap: ; 128d8 (4:68d8)
ld a, [W_YCOORD]
ld b, a
ld a, [W_CURMAPHEIGHT]
call .compareCoordWithMapDimension
ret z
ld a, [W_XCOORD]
ld b, a
ld a, [W_CURMAPWIDTH]
.compareCoordWithMapDimension
add a
cp b
ret z
inc b
ret
DrawHP: ; 128ef (4:68ef)
call GetPredefRegisters
ld a, $1
jr DrawHP_
DrawHP2: ; 128f6 (4:68f6)
call GetPredefRegisters
ld a, $2
DrawHP_: ; 128fb (4:68fb)
ld [wHPBarType], a
push hl
ld a, [wLoadedMonHP]
ld b, a
ld a, [wLoadedMonHP + 1]
ld c, a
or b
jr nz, .nonzeroHP
xor a
ld c, a
ld e, a
ld a, $6
ld d, a
jp .drawHPBarAndPrintFraction
.nonzeroHP
ld a, [wLoadedMonMaxHP]
ld d, a
ld a, [wLoadedMonMaxHP + 1]
ld e, a
predef HPBarLength
ld a, $6
ld d, a
ld c, a
.drawHPBarAndPrintFraction
pop hl
push de
push hl
push hl
call DrawHPBar
pop hl
ld a, [hFlags_0xFFF6]
bit 0, a
jr z, .printFractionBelowBar
ld bc, $9 ; right of bar
jr .printFraction
.printFractionBelowBar
ld bc, SCREEN_WIDTH + 1 ; below bar
.printFraction
add hl, bc
ld de, wLoadedMonHP
ld bc, $203
call PrintNumber
ld a, "/"
ld [hli], a
ld de, wLoadedMonMaxHP
ld bc, $203
call PrintNumber
pop hl
pop de
ret

View file

@ -1,413 +0,0 @@
EndOfBattle: ; 137aa (4:77aa)
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jr nz, .notLinkBattle
; link battle
ld a, [wEnemyMonPartyPos]
ld hl, wEnemyMon1Status
ld bc, wEnemyMon2 - wEnemyMon1
call AddNTimes
ld a, [wEnemyMonStatus]
ld [hl], a
call ClearScreen
callab DisplayLinkBattleVersusTextBox
ld a, [wBattleResult]
cp $1
ld de, YouWinText
jr c, .placeWinOrLoseString
ld de, YouLoseText
jr z, .placeWinOrLoseString
ld de, DrawText
.placeWinOrLoseString
hlCoord 6, 8
call PlaceString
ld c, $c8
call DelayFrames
jr .evolution
.notLinkBattle
ld a, [wBattleResult]
and a
jr nz, .resetVariables
ld hl, wTotalPayDayMoney
ld a, [hli]
or [hl]
inc hl
or [hl]
jr z, .evolution ; if pay day money is 0, jump
ld de, wPlayerMoney + 2
ld c, $3
predef AddBCDPredef
ld hl, PickUpPayDayMoneyText
call PrintText
.evolution
xor a
ld [wccd4], a
predef EvolutionAfterBattle
.resetVariables
xor a
ld [wLowHealthAlarm], a ;disable low health alarm
ld [wc02a], a
ld [W_ISINBATTLE], a
ld [W_BATTLETYPE], a
ld [W_MOVEMISSED], a
ld [W_CUROPPONENT], a
ld [wd11f], a
ld [wNumRunAttempts], a
ld [wEscapedFromBattle], a
ld hl, wcc2b
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld [wListScrollOffset], a
ld hl, wPlayerStatsToDouble
ld b, $18
.loop
ld [hli], a
dec b
jr nz, .loop
ld hl, wd72c
set 0, [hl]
call WaitForSoundToFinish
call GBPalWhiteOut
ld a, $ff
ld [wDestinationWarpID], a
ret
YouWinText: ; 13853 (4:7853)
db "YOU WIN@"
YouLoseText: ; 1385b (4:785b)
db "YOU LOSE@"
DrawText: ; 13864 (4:7864)
db " DRAW@"
PickUpPayDayMoneyText: ; 1386b (4:786b)
TX_FAR _PickUpPayDayMoneyText
db "@"
; try to initiate a wild pokemon encounter
; returns success in Z
TryDoWildEncounter: ; 13870 (4:7870)
ld a, [wNPCMovementScriptPointerTableNum]
and a
ret nz
ld a, [wd736]
and a
ret nz
callab IsPlayerStandingOnDoorTileOrWarpTile
jr nc, .notStandingOnDoorOrWarpTile
.CantEncounter
ld a, $1
and a
ret
.notStandingOnDoorOrWarpTile
callab IsPlayerJustOutsideMap
jr z, .CantEncounter
ld a, [wRepelRemainingSteps]
and a
jr z, .asm_1389e
dec a
jr z, .lastRepelStep
ld [wRepelRemainingSteps], a
.asm_1389e
; determine if wild pokémon can appear in the half-block were standing in
; is the bottom right tile (9,9) of the half-block we're standing in a grass/water tile?
hlCoord 9, 9
ld c, [hl]
ld a, [W_GRASSTILE]
cp c
ld a, [W_GRASSRATE]
jr z, .CanEncounter
ld a, $14 ; in all tilesets with a water tile, this is its id
cp c
ld a, [W_WATERRATE]
jr z, .CanEncounter
; even if not in grass/water, standing anywhere we can encounter pokémon
; so long as the map is “indoor” and has wild pokémon defined.
; …as long as its not Viridian Forest or Safari Zone.
ld a, [W_CURMAP]
cp REDS_HOUSE_1F ; is this an indoor map?
jr c, .CantEncounter2
ld a, [W_CURMAPTILESET]
cp FOREST ; Viridian Forest/Safari Zone
jr z, .CantEncounter2
ld a, [W_GRASSRATE]
.CanEncounter
; compare encounter chance with a random number to determine if there will be an encounter
ld b, a
ld a, [hRandomAdd]
cp b
jr nc, .CantEncounter2
ld a, [hRandomSub]
ld b, a
ld hl, WildMonEncounterSlotChances
.determineEncounterSlot
ld a, [hli]
cp b
jr nc, .gotEncounterSlot
inc hl
jr .determineEncounterSlot
.gotEncounterSlot
; determine which wild pokémon (grass or water) can appear in the half-block were standing in
ld c, [hl]
ld hl, W_GRASSMONS
aCoord 8, 9
cp $14 ; is the bottom left tile (8,9) of the half-block we're standing in a water tile?
jr nz, .gotWildEncounterType ; else, it's treated as a grass tile by default
ld hl, W_WATERMONS
; since the bottom right tile of a "left shore" half-block is $14 but the bottom left tile is not,
; "left shore" half-blocks (such as the one in the east coast of Cinnabar) load grass encounters.
.gotWildEncounterType
ld b, $0
add hl, bc
ld a, [hli]
ld [W_CURENEMYLVL], a
ld a, [hl]
ld [wcf91], a
ld [wEnemyMonSpecies2], a
ld a, [wRepelRemainingSteps]
and a
jr z, .willEncounter
ld a, [wPartyMon1Level]
ld b, a
ld a, [W_CURENEMYLVL]
cp b
jr c, .CantEncounter2 ; repel prevents encounters if the leading party mon's level is higher than the wild mon
jr .willEncounter
.lastRepelStep
ld [wRepelRemainingSteps], a
ld a, $d2
ld [H_DOWNARROWBLINKCNT2], a
call EnableAutoTextBoxDrawing
call DisplayTextID
.CantEncounter2
ld a, $1
and a
ret
.willEncounter
xor a
ret
WildMonEncounterSlotChances: ; 13918 (4:7918)
; There are 10 slots for wild pokemon, and this is the table that defines how common each of
; those 10 slots is. A random number is generated and then the first byte of each pair in this
; table is compared against that random number. If the random number is less than or equal
; to the first byte, then that slot is chosen. The second byte is double the slot number.
db $32, $00 ; 51/256 = 19.9% chance of slot 0
db $65, $02 ; 51/256 = 19.9% chance of slot 1
db $8C, $04 ; 39/256 = 15.2% chance of slot 2
db $A5, $06 ; 25/256 = 9.8% chance of slot 3
db $BE, $08 ; 25/256 = 9.8% chance of slot 4
db $D7, $0A ; 25/256 = 9.8% chance of slot 5
db $E4, $0C ; 13/256 = 5.1% chance of slot 6
db $F1, $0E ; 13/256 = 5.1% chance of slot 7
db $FC, $10 ; 11/256 = 4.3% chance of slot 8
db $FF, $12 ; 3/256 = 1.2% chance of slot 9
RecoilEffect_: ; 1392c (4:792c)
ld a, [H_WHOSETURN]
and a
ld a, [W_PLAYERMOVENUM]
ld hl, wBattleMonMaxHP
jr z, .asm_1393d
ld a, [W_ENEMYMOVENUM]
ld hl, wEnemyMonMaxHP
.asm_1393d
ld d, a
ld a, [W_DAMAGE]
ld b, a
ld a, [W_DAMAGE + 1]
ld c, a
srl b
rr c
ld a, d
cp STRUGGLE
jr z, .asm_13953
srl b
rr c
.asm_13953
ld a, b
or c
jr nz, .asm_13958
inc c
.asm_13958
ld a, [hli]
ld [wHPBarMaxHP+1], a
ld a, [hl]
ld [wHPBarMaxHP], a
push bc
ld bc, $fff2
add hl, bc
pop bc
ld a, [hl]
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, .asm_13982
xor a
ld [hli], a
ld [hl], a
ld hl, wHPBarNewHP
ld [hli], a
ld [hl], a
.asm_13982
hlCoord 10, 9
ld a, [H_WHOSETURN]
and a
ld a, $1
jr z, .asm_13990
hlCoord 2, 2
xor a
.asm_13990
ld [wHPBarType], a
predef UpdateHPBar2
ld hl, HitWithRecoilText
jp PrintText
HitWithRecoilText: ; 1399e (4:799e)
TX_FAR _HitWithRecoilText
db "@"
ConversionEffect_: ; 139a3 (4:79a3)
ld hl, wEnemyMonType1
ld de, wBattleMonType1
ld a, [H_WHOSETURN]
and a
ld a, [W_ENEMYBATTSTATUS1]
jr z, .asm_139b8
push hl
ld h, d
ld l, e
pop de
ld a, [W_PLAYERBATTSTATUS1]
.asm_139b8
bit Invulnerable, a ; is mon immune to typical attacks (dig/fly)
jr nz, PrintButItFailedText
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
ld hl, PlayCurrentMoveAnimation
call CallBankF
ld hl, ConvertedTypeText
jp PrintText
ConvertedTypeText: ; 139cd (4:79cd)
TX_FAR _ConvertedTypeText
db "@"
PrintButItFailedText: ; 139d2 (4:79d2)
ld hl, PrintButItFailedText_
CallBankF: ; 139d5 (4:79d5)
ld b, BANK(PrintButItFailedText_)
jp Bankswitch
HazeEffect_: ; 139da (4:79da)
ld a, $7
ld hl, wPlayerMonAttackMod
call ResetStatMods
ld hl, wEnemyMonAttackMod
call ResetStatMods
ld hl, wPlayerMonUnmodifiedAttack
ld de, wBattleMonAttack
call ResetStats
ld hl, wEnemyMonUnmodifiedAttack
ld de, wEnemyMonAttack
call ResetStats
ld hl, wEnemyMonStatus
ld de, wEnemySelectedMove
ld a, [H_WHOSETURN]
and a
jr z, .asm_13a09
ld hl, wBattleMonStatus
dec de
.asm_13a09
ld a, [hl]
ld [hl], $0
and $27
jr z, .asm_13a13
ld a, $ff
ld [de], a
.asm_13a13
xor a
ld [W_PLAYERDISABLEDMOVE], a
ld [W_ENEMYDISABLEDMOVE], a
ld hl, wccee
ld [hli], a
ld [hl], a
ld hl, W_PLAYERBATTSTATUS1
call CureStatuses
ld hl, W_ENEMYBATTSTATUS1
call CureStatuses
ld hl, PlayCurrentMoveAnimation
call CallBankF
ld hl, StatusChangesEliminatedText
jp PrintText
CureStatuses: ; 13a37 (4:7a37)
res Confused, [hl]
inc hl ; BATTSTATUS2
ld a, [hl]
and (1 << UsingRage) | (1 << NeedsToRecharge) | (1 << HasSubstituteUp) | (1 << 3) ; clear all but these from BATTSTATUS2
ld [hli], a ; BATTSTATUS3
ld a, [hl]
and %11110000 | (1 << Transformed) ; clear Bad Poison, Reflect and Light Screen statuses
ld [hl], a
ret
ResetStatMods: ; 13a43 (4:7a43)
ld b, $8
.loop
ld [hli], a
dec b
jr nz, .loop
ret
ResetStats: ; 13a4a (4:7a4a)
ld b, $8
.loop
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .loop
ret
StatusChangesEliminatedText: ; 13a53 (4:7a53)
TX_FAR _StatusChangesEliminatedText
db "@"
GetTrainerName_: ; 13a58 (4:7a58)
ld hl, W_GRASSRATE
ld a, [wLinkState]
and a
jr nz, .rival
ld hl, W_RIVALNAME
ld a, [W_TRAINERCLASS]
cp SONY1
jr z, .rival
cp SONY2
jr z, .rival
cp SONY3
jr z, .rival
ld [wd0b5], a
ld a, TRAINER_NAME
ld [wNameListType], a
ld a, BANK(TrainerNames)
ld [wPredefBank], a
call GetName
ld hl, wcd6d
.rival
ld de, W_TRAINERNAME
ld bc, $d
jp CopyData

View file

@ -407,7 +407,7 @@ MoveAnimation: ; 78d5e (1e:4d5e)
ld c,30 ld c,30
call DelayFrames call DelayFrames
.next4 .next4
call Func_78dbd ; reload pic and flash the pic in and out (to show damage) call PlayApplyingAttackAnimation ; shake the screen or flash the pic in and out (to show damage)
.AnimationFinished .AnimationFinished
call WaitForSoundToFinish call WaitForSoundToFinish
xor a xor a
@ -445,56 +445,58 @@ ShareMoveAnimations: ; 78da6 (1e:4da6)
ld [W_ANIMATIONID],a ld [W_ANIMATIONID],a
ret ret
Func_78dbd: ; 78dbd (1e:4dbd) PlayApplyingAttackAnimation: ; 78dbd (1e:4dbd)
ld a,[wcc5b] ; Generic animation that shows after the move's individual animation
; Different animation depending on whether the move has an additional effect and on whose turn it is
ld a,[wAnimationType]
and a and a
ret z ret z
dec a dec a
add a add a
ld c,a ld c,a
ld b,0 ld b,0
ld hl,PointerTable_78dcf ld hl,AnimationTypePointerTable
add hl,bc add hl,bc
ld a,[hli] ld a,[hli]
ld h,[hl] ld h,[hl]
ld l,a ld l,a
jp [hl] jp [hl]
PointerTable_78dcf: ; 78dcf (1e:4dcf) AnimationTypePointerTable: ; 78dcf (1e:4dcf)
dw Func_78ddb dw ShakeScreenVertically ; enemy mon has used a damaging move without a side effect
dw Func_78de3 dw ShakeScreenHorizontallyHeavy ; enemy mon has used a damaging move with a side effect
dw Func_78deb dw ShakeScreenHorizontallySlow ; enemy mon has used a non-damaging move
dw Func_78df0 dw BlinkEnemyMonSprite ; player mon has used a damaging move without a side effect
dw Func_78df6 dw ShakeScreenHorizontallyLight ; player mon has used a damaging move with a side effect
dw Func_78dfe dw ShakeScreenHorizontallySlow2 ; player mon has used a non-damaging move
Func_78ddb: ; 78ddb (1e:4ddb) ShakeScreenVertically: ; 78ddb (1e:4ddb)
call Func_79e6a call PlayApplyingAttackSound
ld b, $8 ld b, $8
jp Func_79209 jp AnimationShakeScreenVertically
Func_78de3: ; 78de3 (1e:4de3) ShakeScreenHorizontallyHeavy: ; 78de3 (1e:4de3)
call Func_79e6a call PlayApplyingAttackSound
ld b, $8 ld b, $8
jp Func_79210 jp AnimationShakeScreenHorizontallyFast
Func_78deb: ; 78deb (1e:4deb) ShakeScreenHorizontallySlow: ; 78deb (1e:4deb)
ld bc, $602 ld bc, $602
jr Func_78e01 jr AnimationShakeScreenHorizontallySlow
Func_78df0: ; 78df0 (1e:4df0) BlinkEnemyMonSprite: ; 78df0 (1e:4df0)
call Func_79e6a call PlayApplyingAttackSound
jp AnimationBlinkEnemyMon jp AnimationBlinkEnemyMon
Func_78df6: ; 78df6 (1e:4df6) ShakeScreenHorizontallyLight: ; 78df6 (1e:4df6)
call Func_79e6a call PlayApplyingAttackSound
ld b, $2 ld b, $2
jp Func_79210 jp AnimationShakeScreenHorizontallyFast
Func_78dfe: ; 78dfe (1e:4dfe) ShakeScreenHorizontallySlow2: ; 78dfe (1e:4dfe)
ld bc, $302 ld bc, $302
Func_78e01: ; 78e01 (1e:4e01) AnimationShakeScreenHorizontallySlow: ; 78e01 (1e:4e01)
push bc push bc
push bc push bc
.asm_78e03 .asm_78e03
@ -516,7 +518,7 @@ Func_78e01: ; 78e01 (1e:4e01)
jr nz, .asm_78e11 jr nz, .asm_78e11
pop bc pop bc
dec c dec c
jr nz, Func_78e01 jr nz, AnimationShakeScreenHorizontallySlow
ret ret
Func_78e23: ; 78e23 (1e:4e23) Func_78e23: ; 78e23 (1e:4e23)
@ -1225,14 +1227,14 @@ Func_791fc: ; 791fc (1e:51fc)
ld b, $5 ld b, $5
Func_79209: ; 79209 (1e:5209) AnimationShakeScreenVertically: ; 79209 (1e:5209)
predef_jump Func_480ff predef_jump Func_480ff
AnimationShakeScreen: ; 7920e (1e:520e) AnimationShakeScreen: ; 7920e (1e:520e)
; Shakes the screen for a while. Used in Earthquake/Fissure/etc. animations. ; Shakes the screen for a while. Used in Earthquake/Fissure/etc. animations.
ld b, $8 ld b, $8
Func_79210: ; 79210 (1e:5210) AnimationShakeScreenHorizontallyFast: ; 79210 (1e:5210)
predef_jump Func_48125 predef_jump Func_48125
AnimationWaterDropletsEverywhere: ; 79215 (1e:5215) AnimationWaterDropletsEverywhere: ; 79215 (1e:5215)
@ -2929,9 +2931,11 @@ TossBallAnimation: ; 79e16 (1e:5e16)
ld [W_ANIMATIONID],a ld [W_ANIMATIONID],a
jp PlayAnimation jp PlayAnimation
Func_79e6a: ; 79e6a (1e:5e6a) PlayApplyingAttackSound: ; 79e6a (1e:5e6a)
; play a different sound depending if move is not very effective, neutral, or super-effective
; don't play any sound at all if move is ineffective
call WaitForSoundToFinish call WaitForSoundToFinish
ld a, [wd05b] ld a, [wDamageMultipliers]
and $7f and $7f
ret z ret z
cp $a cp $a

View file

@ -0,0 +1,122 @@
; formats a string at wMovesString that lists the moves at wMoves
FormatMovesString: ; 39b87 (e:5b87)
ld hl, wMoves
ld de, wMovesString
ld b, $0
.printMoveNameLoop
ld a, [hli]
and a ; end of move list?
jr z, .printDashLoop ; print dashes when no moves are left
push hl
ld [wd0b5], a
ld a, BANK(MoveNames)
ld [wPredefBank], a
ld a, MOVE_NAME
ld [wNameListType], a
call GetName
ld hl, wcd6d
.copyNameLoop
ld a, [hli]
cp $50
jr z, .doneCopyingName
ld [de], a
inc de
jr .copyNameLoop
.doneCopyingName
ld a, b
ld [wcd6c], a
inc b
ld a, $4e ; line break
ld [de], a
inc de
pop hl
ld a, b
cp NUM_MOVES
jr z, .done
jr .printMoveNameLoop
.printDashLoop
ld a, "-"
ld [de], a
inc de
inc b
ld a, b
cp NUM_MOVES
jr z, .done
ld a, $4e ; line break
ld [de], a
inc de
jr .printDashLoop
.done
ld a, "@"
ld [de], a
ret
; XXX this is called in a few places, but it doesn't appear to do anything useful
Func_39bd5: ; 39bd5 (e:5bd5)
ld a, [wd11b]
cp $1
jr nz, .asm_39be6
ld hl, wEnemyPartyCount
ld de, wEnemyMonOT
ld a, ENEMYOT_NAME
jr .asm_39c18
.asm_39be6
cp $4
jr nz, .calcAttackStat4
ld hl, wPartyCount
ld de, wPartyMonOT
ld a, PLAYEROT_NAME
jr .asm_39c18
.calcAttackStat4
cp $5
jr nz, .asm_39c02
ld hl, wStringBuffer2 + 11
ld de, MonsterNames
ld a, MONSTER_NAME
jr .asm_39c18
.asm_39c02
cp $2
jr nz, .asm_39c10
ld hl, wNumBagItems
ld de, ItemNames
ld a, ITEM_NAME
jr .asm_39c18
.asm_39c10
ld hl, wStringBuffer2 + 11
ld de, ItemNames
ld a, ITEM_NAME
.asm_39c18
ld [wNameListType], a
ld a, l
ld [wList], a
ld a, h
ld [wList + 1], a
ld a, e
ld [wcf8d], a
ld a, d
ld [wcf8e], a
ld bc, ItemPrices
ld a, c
ld [wItemPrices], a
ld a, b
ld [wItemPrices + 1], a
ret
; get species of mon e in list [wcc49] for LoadMonData
GetMonSpecies: ; 39c37 (e:5c37)
ld hl, wPartySpecies
ld a, [wcc49]
and a
jr z, .getSpecies
dec a
jr z, .enemyParty
ld hl, wBoxSpecies
jr .getSpecies
.enemyParty
ld hl, wEnemyPartyMons
.getSpecies
ld d, 0
add hl, de
ld a, [hl]
ld [wcf91], a
ret

View file

@ -1,93 +1,3 @@
MarowakAnim: ; 708ca (1c:48ca)
; animate the ghost being unveiled as a Marowak
ld a, $e4
ld [rOBP1], a
call CopyMonPicFromBGToSpriteVRAM ; cover the BG ghost pic with a sprite ghost pic that looks the same
; now that the ghost pic is being displayed using sprites, clear the ghost pic from the BG tilemap
hlCoord 12, 0
ld bc, $707
call ClearScreenArea
call Delay3
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; disable BG transfer so we don't see the Marowak too soon
; replace ghost pic with Marowak in BG
ld a, MAROWAK
ld [wHPBarMaxHP], a
ld a, $1
ld [H_WHOSETURN], a
callab Func_79793
; alternate between black and light grey 8 times.
; this makes the ghost's body appear to flash
ld d, $80
call FlashSprite8Times
.fadeOutGhostLoop
ld c, 10
call DelayFrames
ld a, [rOBP1]
sla a
sla a
ld [rOBP1], a
jr nz, .fadeOutGhostLoop
call ClearSprites
call CopyMonPicFromBGToSpriteVRAM ; copy Marowak pic from BG to sprite VRAM
ld b, $e4
.fadeInMarowakLoop
ld c, 10
call DelayFrames
ld a, [rOBP1]
srl b
rra
srl b
rra
ld [rOBP1], a
ld a, b
and a
jr nz, .fadeInMarowakLoop
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; enable BG transfer so the BG Marowak pic will be visible after the sprite one is cleared
call Delay3
jp ClearSprites
; copies a mon pic's from background VRAM to sprite VRAM and sets up OAM
CopyMonPicFromBGToSpriteVRAM: ; 7092a (1c:492a)
ld de, vFrontPic
ld hl, vSprites
ld bc, 7 * 7
call CopyVideoData
ld a, $10
ld [W_BASECOORDY], a
ld a, $70
ld [W_BASECOORDX], a
ld hl, wOAMBuffer
ld bc, $606
ld d, $8
.oamLoop
push bc
ld a, [W_BASECOORDY]
ld e, a
.oamInnerLoop
ld a, e
add $8
ld e, a
ld [hli], a
ld a, [W_BASECOORDX]
ld [hli], a
ld a, d
ld [hli], a
ld a, $10 ; use OBP1
ld [hli], a
inc d
dec c
jr nz, .oamInnerLoop
inc d
ld a, [W_BASECOORDX]
add $8
ld [W_BASECOORDX], a
pop bc
dec b
jr nz, .oamLoop
ret
BattleTransition: ; 7096d (1c:496d) BattleTransition: ; 7096d (1c:496d)
ld a, $1 ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ld [H_AUTOBGTRANSFERENABLED], a

0
engine/battle/16.asm → engine/battle/common_text.asm Executable file → Normal file
View file

View file

@ -454,7 +454,8 @@ MainInBattleLoop: ; 3c233 (f:4233)
ld b, 0 ld b, 0
add hl, bc add hl, bc
ld a, [hl] ld a, [hl]
cp METRONOME ; a MIRROR MOVE check is missing, might lead to a desync in link battles when combined with multi-turn moves cp METRONOME ; a MIRROR MOVE check is missing, might lead to a desync in link battles
; when combined with multi-turn moves
jr nz, .asm_3c2dd jr nz, .asm_3c2dd
ld [wPlayerSelectedMove], a ld [wPlayerSelectedMove], a
.asm_3c2dd .asm_3c2dd
@ -581,7 +582,7 @@ HandlePoisonBurnLeechSeed: ; 3c3bd (f:43bd)
.poisoned .poisoned
call PrintText call PrintText
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a,BURN_PSN_ANIM ld a,BURN_PSN_ANIM
call PlayMoveAnimation ; play burn/poison animation call PlayMoveAnimation ; play burn/poison animation
pop hl pop hl
@ -602,7 +603,7 @@ HandlePoisonBurnLeechSeed: ; 3c3bd (f:43bd)
xor $1 xor $1
ld [H_WHOSETURN], a ld [H_WHOSETURN], a
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a,ABSORB ld a,ABSORB
call PlayMoveAnimation ; play leech seed animation (from opposing mon) call PlayMoveAnimation ; play leech seed animation (from opposing mon)
pop af pop af
@ -874,7 +875,7 @@ FaintEnemyPokemon ; 0x3c567
call WaitForSoundToFinish call WaitForSoundToFinish
jr .sfxplayed jr .sfxplayed
.wild_win .wild_win
call Func_3c643 call EndLowHealthAlarm
ld a, MUSIC_DEFEATED_WILD_MON ld a, MUSIC_DEFEATED_WILD_MON
call PlayBattleVictoryMusic call PlayBattleVictoryMusic
.sfxplayed .sfxplayed
@ -918,7 +919,7 @@ FaintEnemyPokemon ; 0x3c567
; if exp all is in the bag, this will be only be half of the stat exp and normal exp, due to the above loop ; if exp all is in the bag, this will be only be half of the stat exp and normal exp, due to the above loop
.giveExpToMonsThatFought .giveExpToMonsThatFought
xor a xor a
ld [wcc5b], a ld [wBoostExpByExpAll], a
callab GainExperience callab GainExperience
pop af pop af
ret z ; return if no exp all ret z ; return if no exp all
@ -927,7 +928,7 @@ FaintEnemyPokemon ; 0x3c567
; now, set the gain exp flag for every party member ; now, set the gain exp flag for every party member
; half of the total stat exp and normal exp will divided evenly amongst every party member ; half of the total stat exp and normal exp will divided evenly amongst every party member
ld a, $1 ld a, $1
ld [wcc5b], a ld [wBoostExpByExpAll], a
ld a, [wPartyCount] ld a, [wPartyCount]
ld b, 0 ld b, 0
.gainExpFlagsLoop .gainExpFlagsLoop
@ -945,7 +946,7 @@ EnemyMonFaintedText: ; 0x3c63e
TX_FAR _EnemyMonFaintedText TX_FAR _EnemyMonFaintedText
db "@" db "@"
Func_3c643: ; 3c643 (f:4643) EndLowHealthAlarm: ; 3c643 (f:4643)
xor a xor a
ld [wLowHealthAlarm], a ;disable low health alarm ld [wLowHealthAlarm], a ;disable low health alarm
ld [wc02a], a ld [wc02a], a
@ -990,12 +991,12 @@ ReplaceFaintedEnemyMon: ; 3c664 (f:4664)
xor a xor a
ld [W_ENEMYMOVENUM], a ld [W_ENEMYMOVENUM], a
ld [wcd6a], a ld [wcd6a], a
ld [wccd5], a ld [wAILayer2Encouragement], a
inc a ; reset Z flag inc a ; reset Z flag
ret ret
TrainerBattleVictory: ; 3c696 (f:4696) TrainerBattleVictory: ; 3c696 (f:4696)
call Func_3c643 call EndLowHealthAlarm
ld b, MUSIC_DEFEATED_GYM_LEADER ld b, MUSIC_DEFEATED_GYM_LEADER
ld a, [W_GYMLEADERNO] ld a, [W_GYMLEADERNO]
and a and a
@ -1640,7 +1641,8 @@ TryRunningFromBattle: ; 3cab9 (f:4ab9)
ld b, a ld b, a
ld a, [H_QUOTIENT + 3] ld a, [H_QUOTIENT + 3]
cp b cp b
jr nc, .canEscape ; if the random value was less than or equal to the quotient plus 30 times the number of attempts, the player can escape jr nc, .canEscape ; if the random value was less than or equal to the quotient
; plus 30 times the number of attempts, the player can escape
; can't escape ; can't escape
ld a, $1 ld a, $1
ld [wcd6a], a ld [wcd6a], a
@ -1809,8 +1811,8 @@ SendOutMon: ; 3cc91 (f:4c91)
ld hl, wcc2d ld hl, wcc2d
ld [hli], a ld [hli], a
ld [hl], a ld [hl], a
ld [wcc5b], a ld [wBoostExpByExpAll], a
ld [wd05b], a ld [wDamageMultipliers], a
ld [W_PLAYERMOVENUM], a ld [W_PLAYERMOVENUM], a
ld hl, wPlayerUsedMove ld hl, wPlayerUsedMove
ld [hli], a ld [hli], a
@ -2046,8 +2048,10 @@ GetBattleHealthBarColor: ; 3ce90 (f:4e90)
jp GoPAL_SET jp GoPAL_SET
; center's mon's name on the battle screen ; center's mon's name on the battle screen
; if the name is 1 or 2 letters long, it is printed 2 spaces more to the right than usual (i.e. for names longer than 4 letters) ; if the name is 1 or 2 letters long, it is printed 2 spaces more to the right than usual
; if the name is 3 or 4 letters long, it is printed 1 space more to the right than usual (i.e. for names longer than 4 letters) ; (i.e. for names longer than 4 letters)
; if the name is 3 or 4 letters long, it is printed 1 space more to the right than usual
; (i.e. for names longer than 4 letters)
CenterMonName: ; 3ce9c (f:4e9c) CenterMonName: ; 3ce9c (f:4e9c)
push de push de
inc hl inc hl
@ -2204,7 +2208,8 @@ DisplayBattleMenu: ; 3ceb3 (f:4eb3)
ld [wcc2d], a ld [wcc2d], a
jr z, .handleMenuSelection jr z, .handleMenuSelection
; not Safari battle ; not Safari battle
; swap the IDs of the item menu and party menu (this is probably because they swapped the positions of these menu items in first generation English versions) ; swap the IDs of the item menu and party menu (this is probably because they swapped the positions
; of these menu items in first generation English versions)
cp $1 ; was the item menu selected? cp $1 ; was the item menu selected?
jr nz, .notItemMenu jr nz, .notItemMenu
; item menu was selected ; item menu was selected
@ -3123,10 +3128,10 @@ ExecutePlayerMove: ; 3d65e (f:565e)
jp z, ExecutePlayerMoveDone ; for selected move = FF, skip most of player's turn jp z, ExecutePlayerMoveDone ; for selected move = FF, skip most of player's turn
xor a xor a
ld [W_MOVEMISSED], a ld [W_MOVEMISSED], a
ld [wcced], a ld [wMonIsDisobedient], a
ld [wccf4], a ld [wMoveDidntMiss], a
ld a, $a ld a, $a
ld [wd05b], a ld [wDamageMultipliers], a
ld a, [wcd6a] ld a, [wcd6a]
and a and a
jp nz, ExecutePlayerMoveDone jp nz, ExecutePlayerMoveDone
@ -3155,8 +3160,8 @@ CheckIfPlayerNeedsToChargeUp: ; 3d69a (f:569a)
PlayerCanExecuteChargingMove: ; 3d6a9 (f:56a9) PlayerCanExecuteChargingMove: ; 3d6a9 (f:56a9)
ld hl,W_PLAYERBATTSTATUS1 ld hl,W_PLAYERBATTSTATUS1
res ChargingUp,[hl] ; reset charging up and invulnerability statuses if mon was charging up for an attack res ChargingUp,[hl] ; reset charging up and invulnerability statuses if mon was charging up for an attack
; being fully paralyzed or hurting oneself in confusion removes charging up status ; being fully paralyzed or hurting oneself in confusion removes charging up status
; resulting in the Pokemon being invulnerable for the whole battle ; resulting in the Pokemon being invulnerable for the whole battle
res Invulnerable,[hl] res Invulnerable,[hl]
PlayerCanExecuteMove: ; 3d6b0 (f:56b0) PlayerCanExecuteMove: ; 3d6b0 (f:56b0)
call PrintMonName1Text call PrintMonName1Text
@ -3183,30 +3188,30 @@ PlayerCalcMoveDamage: ; 3d6dc (f:56dc)
jp c,.moveHitTest ; SetDamageEffects moves (e.g. Seismic Toss and Super Fang) skip damage calculation jp c,.moveHitTest ; SetDamageEffects moves (e.g. Seismic Toss and Super Fang) skip damage calculation
call CriticalHitTest call CriticalHitTest
call HandleCounterMove call HandleCounterMove
jr z,asm_3d705 jr z,handleIfPlayerMoveMissed
call GetDamageVarsForPlayerAttack call GetDamageVarsForPlayerAttack
call CalculateDamage call CalculateDamage
jp z,asm_3d74b ; for moves with 0 BP, skip any further damage calculation and, for now, skip MoveHitTest jp z,playerCheckIfFlyOrChargeEffect ; for moves with 0 BP, skip any further damage calculation and, for now, skip MoveHitTest
; for these moves, accuracy tests will only occur if they are called as part of the effect itself ; for these moves, accuracy tests will only occur if they are called as part of the effect itself
call AdjustDamageForMoveType call AdjustDamageForMoveType
call RandomizeDamage call RandomizeDamage
.moveHitTest .moveHitTest
call MoveHitTest call MoveHitTest
asm_3d705 handleIfPlayerMoveMissed
ld a,[W_MOVEMISSED] ld a,[W_MOVEMISSED]
and a and a
jr z,asm_3d714 jr z,getPlayerAnimationType
ld a,[W_PLAYERMOVEEFFECT] ld a,[W_PLAYERMOVEEFFECT]
sub a,EXPLODE_EFFECT sub a,EXPLODE_EFFECT
jr z,asm_3d71e ; don't play any animation if the move missed, unless it was EXPLODE_EFFECT jr z,playPlayerMoveAnimation ; don't play any animation if the move missed, unless it was EXPLODE_EFFECT
jr asm_3d74b jr playerCheckIfFlyOrChargeEffect
asm_3d714 getPlayerAnimationType
ld a,[W_PLAYERMOVEEFFECT] ld a,[W_PLAYERMOVEEFFECT]
and a and a
ld a,4 ld a,4 ; move has no effect other than dealing damage
jr z,asm_3d71e jr z,playPlayerMoveAnimation
ld a,5 ld a,5 ; move has effect
asm_3d71e playPlayerMoveAnimation
push af push af
ld a,[W_PLAYERBATTSTATUS2] ld a,[W_PLAYERBATTSTATUS2]
bit 4,a bit 4,a
@ -3214,7 +3219,7 @@ asm_3d71e
ld b,BANK(Func_79747) ld b,BANK(Func_79747)
call nz,Bankswitch call nz,Bankswitch
pop af pop af
ld [wcc5b],a ld [wAnimationType],a
ld a,[W_PLAYERMOVENUM] ld a,[W_PLAYERMOVENUM]
call PlayMoveAnimation call PlayMoveAnimation
call HandleExplodingAnimation call HandleExplodingAnimation
@ -3225,7 +3230,7 @@ asm_3d71e
ld b,BANK(Func_79771) ld b,BANK(Func_79771)
call nz,Bankswitch call nz,Bankswitch
jr MirrorMoveCheck jr MirrorMoveCheck
asm_3d74b playerCheckIfFlyOrChargeEffect
ld c,$1E ld c,$1E
call DelayFrames call DelayFrames
ld a,[W_PLAYERMOVEEFFECT] ld a,[W_PLAYERMOVEEFFECT]
@ -3236,7 +3241,7 @@ asm_3d74b
jr MirrorMoveCheck jr MirrorMoveCheck
.playAnim .playAnim
xor a xor a
ld [wcc5b],a ld [wAnimationType],a
ld a,STATUS_AFFECTED_ANIM ld a,STATUS_AFFECTED_ANIM
call PlayMoveAnimation call PlayMoveAnimation
MirrorMoveCheck MirrorMoveCheck
@ -3246,7 +3251,7 @@ MirrorMoveCheck
call MirrorMoveCopyMove call MirrorMoveCopyMove
jp z,ExecutePlayerMoveDone jp z,ExecutePlayerMoveDone
xor a xor a
ld [wcced],a ld [wMonIsDisobedient],a
jp CheckIfPlayerNeedsToChargeUp ; if Mirror Move was successful go back to damage calculation for copied move jp CheckIfPlayerNeedsToChargeUp ; if Mirror Move was successful go back to damage calculation for copied move
.metronomeCheck .metronomeCheck
cp a,METRONOME_EFFECT cp a,METRONOME_EFFECT
@ -3272,7 +3277,7 @@ MirrorMoveCheck
call PrintCriticalOHKOText call PrintCriticalOHKOText
callab DisplayEffectiveness callab DisplayEffectiveness
ld a,1 ld a,1
ld [wccf4],a ld [wMoveDidntMiss],a
.notDone .notDone
ld a,[W_PLAYERMOVEEFFECT] ld a,[W_PLAYERMOVEEFFECT]
ld hl,AlwaysHappenSideEffects ld hl,AlwaysHappenSideEffects
@ -3292,8 +3297,8 @@ MirrorMoveCheck
ld a,[wPlayerNumAttacksLeft] ld a,[wPlayerNumAttacksLeft]
dec a dec a
ld [wPlayerNumAttacksLeft],a ld [wPlayerNumAttacksLeft],a
jp nz,asm_3d714 ; for multi-hit moves, apply attack until PlayerNumAttacksLeft hits 0 or the enemy faints. jp nz,getPlayerAnimationType ; for multi-hit moves, apply attack until PlayerNumAttacksLeft hits 0 or the enemy faints.
; damage calculation and accuracy tests only happen for the first hit ; damage calculation and accuracy tests only happen for the first hit
res AttackingMultipleTimes,[hl] ; clear attacking multiple times status when all attacks are over res AttackingMultipleTimes,[hl] ; clear attacking multiple times status when all attacks are over
ld hl,MultiHitText ld hl,MultiHitText
call PrintText call PrintText
@ -3307,9 +3312,9 @@ MirrorMoveCheck
ld de,1 ld de,1
call IsInArray call IsInArray
call nc,JumpMoveEffect ; move effects not included in SpecialEffects or in either of the ResidualEffect arrays, call nc,JumpMoveEffect ; move effects not included in SpecialEffects or in either of the ResidualEffect arrays,
; which are the effects not covered yet. Rage's effect will be executed for a second time (although it's irrelevant). ; which are the effects not covered yet. Rage effect will be executed for a second time (though it's irrelevant).
; Includes side effects that only need to be called if the target didn't faint. ; Includes side effects that only need to be called if the target didn't faint.
; Responsible for executing Twineedle's second effect (poison) ; Responsible for executing Twineedle's second side effect (poison).
jp ExecutePlayerMoveDone jp ExecutePlayerMoveDone
MultiHitText: ; 3d805 (f:5805) MultiHitText: ; 3d805 (f:5805)
@ -3381,7 +3386,7 @@ CheckPlayerStatusConditions: ; 3d854 (f:5854)
jr z,.WakeUp ; if the number of turns hit 0, wake up jr z,.WakeUp ; if the number of turns hit 0, wake up
; fast asleep ; fast asleep
xor a xor a
ld [wcc5b],a ld [wAnimationType],a
ld a,SLP_ANIM - 1 ld a,SLP_ANIM - 1
call PlayMoveAnimation call PlayMoveAnimation
ld hl,FastAsleepText ld hl,FastAsleepText
@ -3465,7 +3470,7 @@ CheckPlayerStatusConditions: ; 3d854 (f:5854)
ld hl,IsConfusedText ld hl,IsConfusedText
call PrintText call PrintText
xor a xor a
ld [wcc5b],a ld [wAnimationType],a
ld a,CONF_ANIM - 1 ld a,CONF_ANIM - 1
call PlayMoveAnimation call PlayMoveAnimation
call BattleRandom call BattleRandom
@ -3514,7 +3519,7 @@ CheckPlayerStatusConditions: ; 3d854 (f:5854)
.FlyOrChargeEffect .FlyOrChargeEffect
xor a xor a
ld [wcc5b],a ld [wAnimationType],a
ld a,STATUS_AFFECTED_ANIM ld a,STATUS_AFFECTED_ANIM
call PlayMoveAnimation call PlayMoveAnimation
.NotFlyOrChargeEffect .NotFlyOrChargeEffect
@ -3568,7 +3573,7 @@ CheckPlayerStatusConditions: ; 3d854 (f:5854)
ld [hl],a ld [hl],a
ld a,BIDE ld a,BIDE
ld [W_PLAYERMOVENUM],a ld [W_PLAYERMOVENUM],a
ld hl,asm_3d705 ; skip damage calculation, DecrementPP and MoveHitTest ld hl,handleIfPlayerMoveMissed ; skip damage calculation, DecrementPP and MoveHitTest
jp .returnToHL jp .returnToHL
.ThrashingAboutCheck .ThrashingAboutCheck
@ -3602,7 +3607,8 @@ CheckPlayerStatusConditions: ; 3d854 (f:5854)
ld a,[wPlayerNumAttacksLeft] ld a,[wPlayerNumAttacksLeft]
dec a ; did multi-turn move end? dec a ; did multi-turn move end?
ld [wPlayerNumAttacksLeft],a ld [wPlayerNumAttacksLeft],a
ld hl,asm_3d714 ; if it didn't, skip damage calculation (deal damage equal to last hit), DecrementPP and MoveHitTest ld hl,getPlayerAnimationType ; if it didn't, skip damage calculation (deal damage equal to last hit),
; DecrementPP and MoveHitTest
jp nz,.returnToHL jp nz,.returnToHL
jp .returnToHL jp .returnToHL
@ -3734,7 +3740,8 @@ HandleSelfConfusionDamage: ; 3daad (f:5aad)
xor a xor a
ld [hl], a ld [hl], a
call GetDamageVarsForPlayerAttack call GetDamageVarsForPlayerAttack
call CalculateDamage ; ignores AdjustDamageForMoveType (type-less damage), RandomizeDamage, and MoveHitTest (always hits) call CalculateDamage ; ignores AdjustDamageForMoveType (type-less damage), RandomizeDamage,
; and MoveHitTest (always hits)
pop af pop af
pop hl pop hl
ld [hl], a ld [hl], a
@ -3744,7 +3751,7 @@ HandleSelfConfusionDamage: ; 3daad (f:5aad)
pop af pop af
ld [hl], a ld [hl], a
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
inc a inc a
ld [H_WHOSETURN], a ld [H_WHOSETURN], a
call PlayMoveAnimation call PlayMoveAnimation
@ -3771,12 +3778,12 @@ MonName1Text: ; 3dafb (f:5afb)
ld [hl], a ld [hl], a
ld [wd11e], a ld [wd11e], a
call Func_3db85 call Func_3db85
ld a, [wcced] ld a, [wMonIsDisobedient]
and a and a
ld hl, Used2Text ld hl, Used2Text
ret nz ret nz
ld a, [wd11e] ld a, [wd11e]
cp DOUBLESLAP cp 3
ld hl, Used2Text ld hl, Used2Text
ret c ret c
ld hl, Used1Text ld hl, Used1Text
@ -3792,7 +3799,7 @@ Used2Text: ; 3db34 (f:5b34)
db $08 ; asm db $08 ; asm
PrintInsteadText: ; 3db39 (f:5b39) PrintInsteadText: ; 3db39 (f:5b39)
ld a, [wcced] ld a, [wMonIsDisobedient]
and a and a
jr z, PrintCF4BText jr z, PrintCF4BText
ld hl, InsteadText ld hl, InsteadText
@ -3894,7 +3901,7 @@ PrintMoveFailureText: ; 3dbe2 (f:5be2)
ld de, W_ENEMYMOVEEFFECT ld de, W_ENEMYMOVEEFFECT
.playersTurn .playersTurn
ld hl, DoesntAffectMonText ld hl, DoesntAffectMonText
ld a, [wd05b] ld a, [wDamageMultipliers]
and $7f and $7f
jr z, .gotTextToPrint jr z, .gotTextToPrint
ld hl, AttackMissedText ld hl, AttackMissedText
@ -3914,7 +3921,8 @@ PrintMoveFailureText: ; 3dbe2 (f:5be2)
; if you get here, the mon used jump kick or hi jump kick and missed ; if you get here, the mon used jump kick or hi jump kick and missed
ld hl, W_DAMAGE ; since the move missed, W_DAMAGE will always contain 0 at this point. ld hl, W_DAMAGE ; since the move missed, W_DAMAGE will always contain 0 at this point.
; Thus, recoil damage will always be equal to 1 even if it was intended to be potential damage/8. ; Thus, recoil damage will always be equal to 1
; even if it was intended to be potential damage/8.
ld a, [hli] ld a, [hli]
ld b, [hl] ld b, [hl]
srl a srl a
@ -3999,7 +4007,7 @@ OHKOText: ; 3dc83 (f:5c83)
; stores whether the mon will use a move in Z flag ; stores whether the mon will use a move in Z flag
CheckForDisobedience: ; 3dc88 (f:5c88) CheckForDisobedience: ; 3dc88 (f:5c88)
xor a xor a
ld [wcced], a ld [wMonIsDisobedient], a
ld a, [wLinkState] ld a, [wLinkState]
cp LINK_STATE_BATTLING cp LINK_STATE_BATTLING
jr nz, .checkIfMonIsTraded jr nz, .checkIfMonIsTraded
@ -4140,7 +4148,7 @@ CheckForDisobedience: ; 3dc88 (f:5c88)
cp b cp b
jr z, .monDoesNothing ; mon will not use move if only one move has remaining PP jr z, .monDoesNothing ; mon will not use move if only one move has remaining PP
ld a, $1 ld a, $1
ld [wcced], a ld [wMonIsDisobedient], a
ld a, [wMaxMenuItem] ld a, [wMaxMenuItem]
ld b, a ld b, a
ld a, [wCurrentMenuItem] ld a, [wCurrentMenuItem]
@ -4296,7 +4304,8 @@ GetDamageVarsForPlayerAttack: ; 3ddcf (f:5dcf)
jr nz, .next jr nz, .next
inc l ; if the player's offensive stat is 0, bump it up to 1 inc l ; if the player's offensive stat is 0, bump it up to 1
.next .next
ld b, l ; b = player's offensive stat (possibly scaled) (c already contains enemy's defensive stat (possibly scaled)) ld b, l ; b = player's offensive stat (possibly scaled)
; (c already contains enemy's defensive stat (possibly scaled))
ld a, [wBattleMonLevel] ld a, [wBattleMonLevel]
ld e, a ; e = level ld e, a ; e = level
ld a, [wCriticalHitOrOHKO] ld a, [wCriticalHitOrOHKO]
@ -4408,7 +4417,8 @@ GetDamageVarsForEnemyAttack: ; 3de75 (f:5e75)
jr nz, .next jr nz, .next
inc l ; if the enemy's offensive stat is 0, bump it up to 1 inc l ; if the enemy's offensive stat is 0, bump it up to 1
.next .next
ld b, l ; b = enemy's offensive stat (possibly scaled) (c already contains player's defensive stat (possibly scaled)) ld b, l ; b = enemy's offensive stat (possibly scaled)
; (c already contains player's defensive stat (possibly scaled))
ld a, [wEnemyMonLevel] ld a, [wEnemyMonLevel]
ld e, a ld e, a
ld a, [wCriticalHitOrOHKO] ld a, [wCriticalHitOrOHKO]
@ -4471,7 +4481,7 @@ CalculateDamage: ; 3df65 (f:5f65)
; d: base power ; d: base power
; e: level ; e: level
ld a, [$fff3] ; whose turn? ld a, [H_WHOSETURN] ; whose turn?
and a and a
ld a, [W_PLAYERMOVEEFFECT] ld a, [W_PLAYERMOVEEFFECT]
jr z, .effect jr z, .effect
@ -4494,7 +4504,7 @@ CalculateDamage: ; 3df65 (f:5f65)
; Calculate OHKO damage based on remaining HP. ; Calculate OHKO damage based on remaining HP.
cp a, OHKO_EFFECT cp a, OHKO_EFFECT
jp z, Func_3e016 jp z, JumpToOHKOMoveEffect
; Don't calculate damage for moves that don't do any. ; Don't calculate damage for moves that don't do any.
ld a, d ; base power ld a, d ; base power
@ -4626,7 +4636,7 @@ CalculateDamage: ; 3df65 (f:5f65)
and a and a
ret ret
Func_3e016: ; 3e016 (f:6016) JumpToOHKOMoveEffect: ; 3e016 (f:6016)
call JumpMoveEffect call JumpMoveEffect
ld a, [W_MOVEMISSED] ld a, [W_MOVEMISSED]
dec a dec a
@ -5025,8 +5035,10 @@ ApplyAttackToPlayerPokemonDone
AttackSubstitute: ; 3e25e (f:625e) AttackSubstitute: ; 3e25e (f:625e)
; Unlike the two ApplyAttackToPokemon functions, Attack Substitute is shared by player and enemy. ; Unlike the two ApplyAttackToPokemon functions, Attack Substitute is shared by player and enemy.
; Self-confusion damage as well as Hi-Jump Kick and Jump Kick recoil cause a momentary turn swap before being applied. ; Self-confusion damage as well as Hi-Jump Kick and Jump Kick recoil cause a momentary turn swap before being applied.
; If the user has a Substitute up and would take damage because of that, damage will be applied to the other player's Substitute. ; If the user has a Substitute up and would take damage because of that,
; Normal recoil such as from Double-Edge isn't affected by this glitch, because this function is never called in that case. ; damage will be applied to the other player's Substitute.
; Normal recoil such as from Double-Edge isn't affected by this glitch,
; because this function is never called in that case.
ld hl,SubstituteTookDamageText ld hl,SubstituteTookDamageText
call PrintText call PrintText
@ -5050,10 +5062,11 @@ AttackSubstitute: ; 3e25e (f:625e)
ld [de],a ld [de],a
ret nc ret nc
.substituteBroke .substituteBroke
; If the target's Substitute breaks, W_DAMAGE isn't updated with the amount of HP the Substitute had before being attacked. ; If the target's Substitute breaks, W_DAMAGE isn't updated with the amount of HP
; the Substitute had before being attacked.
ld h,b ld h,b
ld l,c ld l,c
res 4,[hl] ; unset the substitute bit res HasSubstituteUp,[hl] ; unset the substitute bit
ld hl,SubstituteBrokeText ld hl,SubstituteBrokeText
call PrintText call PrintText
; flip whose turn it is for the next function call ; flip whose turn it is for the next function call
@ -5185,7 +5198,7 @@ ReloadMoveData: ; 3e329 (f:6329)
; function that picks a random move for metronome ; function that picks a random move for metronome
MetronomePickMove: ; 3e348 (f:6348) MetronomePickMove: ; 3e348 (f:6348)
xor a xor a
ld [wcc5b],a ld [wAnimationType],a
ld a,METRONOME ld a,METRONOME
call PlayMoveAnimation ; play Metronome's animation call PlayMoveAnimation ; play Metronome's animation
; values for player turn ; values for player turn
@ -5293,7 +5306,7 @@ AdjustDamageForMoveType: ; 3e3a5 (f:63a5)
ld [W_DAMAGE],a ld [W_DAMAGE],a
ld a,l ld a,l
ld [W_DAMAGE + 1],a ld [W_DAMAGE + 1],a
ld hl,wd05b ld hl,wDamageMultipliers
set 7,[hl] set 7,[hl]
.skipSameTypeAttackBonus .skipSameTypeAttackBonus
ld a,[wd11e] ld a,[wd11e]
@ -5316,13 +5329,13 @@ AdjustDamageForMoveType: ; 3e3a5 (f:63a5)
push hl push hl
push bc push bc
inc hl inc hl
ld a,[wd05b] ld a,[wDamageMultipliers]
and a,$80 and a,$80
ld b,a ld b,a
ld a,[hl] ; a = damage multiplier ld a,[hl] ; a = damage multiplier
ld [H_MULTIPLIER],a ld [H_MULTIPLIER],a
add b add b
ld [wd05b],a ld [wDamageMultipliers],a
xor a xor a
ld [H_MULTIPLICAND],a ld [H_MULTIPLICAND],a
ld hl,W_DAMAGE ld hl,W_DAMAGE
@ -5536,7 +5549,8 @@ CalcHitChance: ; 3e624 (f:6624)
.next .next
ld a,$0e ld a,$0e
sub c 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) 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 ; zero the high bytes of the multiplicand
xor a xor a
ld [H_MULTIPLICAND],a ld [H_MULTIPLICAND],a
@ -5545,7 +5559,8 @@ CalcHitChance: ; 3e624 (f:6624)
ld [H_MULTIPLICAND + 2],a ; set multiplicand to move accuracy ld [H_MULTIPLICAND + 2],a ; set multiplicand to move accuracy
push hl push hl
ld d,$02 ; loop has two iterations 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 to do the calculations, the first iteration multiplies by the accuracy ratio and
; the second iteration multiplies by the evasion ratio
.loop .loop
push bc push bc
ld hl, StatModifierRatios ; $76cb ; stat modifier ratios ld hl, StatModifierRatios ; $76cb ; stat modifier ratios
@ -5559,7 +5574,8 @@ CalcHitChance: ; 3e624 (f:6624)
ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio ld [H_MULTIPLIER],a ; set multiplier to the numerator of the ratio
call Multiply call Multiply
ld a,[hl] 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 [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 ld b,$04 ; number of bytes in the dividend
call Divide call Divide
ld a,[H_QUOTIENT + 3] ld a,[H_QUOTIENT + 3]
@ -5623,6 +5639,7 @@ RandomizeDamage: ; 3e687 (f:6687)
ld [hl], a ld [hl], a
ret ret
; for more detailed commentary, see equivalent function for player side (ExecutePlayerMove)
ExecuteEnemyMove: ; 3e6bc (f:66bc) ExecuteEnemyMove: ; 3e6bc (f:66bc)
ld a, [wEnemySelectedMove] ld a, [wEnemySelectedMove]
inc a inc a
@ -5639,13 +5656,13 @@ ExecuteEnemyMove: ; 3e6bc (f:66bc)
cp $4 cp $4
ret nc ret nc
.executeEnemyMove .executeEnemyMove
ld hl, wccd5 ld hl, wAILayer2Encouragement
inc [hl] inc [hl]
xor a xor a
ld [W_MOVEMISSED], a ld [W_MOVEMISSED], a
ld [wccf4], a ld [wMoveDidntMiss], a
ld a, $a ld a, $a
ld [wd05b], a ld [wDamageMultipliers], a
call CheckEnemyStatusConditions call CheckEnemyStatusConditions
jr nz, .enemyHasNoSpecialConditions jr nz, .enemyHasNoSpecialConditions
jp [hl] jp [hl]
@ -5677,7 +5694,7 @@ EnemyCanExecuteChargingMove: ; 3e70b (f:670b)
call CopyStringToCF4B call CopyStringToCF4B
EnemyCanExecuteMove: ; 3e72b (f:672b) EnemyCanExecuteMove: ; 3e72b (f:672b)
xor a xor a
ld [wcced], a ld [wMonIsDisobedient], a
call PrintMonName1Text call PrintMonName1Text
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
ld hl, ResidualEffects1 ld hl, ResidualEffects1
@ -5695,42 +5712,42 @@ EnemyCalcMoveDamage: ; 3e750 (f:6750)
ld hl, SetDamageEffects ld hl, SetDamageEffects
ld de, $1 ld de, $1
call IsInArray call IsInArray
jp c, Func_3e77f jp c, EnemyMoveHitTest
call CriticalHitTest call CriticalHitTest
call HandleCounterMove call HandleCounterMove
jr z, asm_3e782 jr z, handleIfEnemyMoveMissed
call SwapPlayerAndEnemyLevels call SwapPlayerAndEnemyLevels
call GetDamageVarsForEnemyAttack call GetDamageVarsForEnemyAttack
call SwapPlayerAndEnemyLevels call SwapPlayerAndEnemyLevels
call CalculateDamage call CalculateDamage
jp z, Func_3e7d1 jp z, EnemyCheckIfFlyOrChargeEffect
call AdjustDamageForMoveType call AdjustDamageForMoveType
call RandomizeDamage call RandomizeDamage
Func_3e77f: ; 3e77f (f:677f) EnemyMoveHitTest: ; 3e77f (f:677f)
call MoveHitTest call MoveHitTest
asm_3e782: ; 3e782 (f:6782) handleIfEnemyMoveMissed: ; 3e782 (f:6782)
ld a, [W_MOVEMISSED] ld a, [W_MOVEMISSED]
and a and a
jr z, .asm_3e791 jr z, .asm_3e791
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
cp EXPLODE_EFFECT cp EXPLODE_EFFECT
jr z, asm_3e7a0 jr z, asm_3e7a0
jr Func_3e7d1 jr EnemyCheckIfFlyOrChargeEffect
.asm_3e791 .asm_3e791
call SwapPlayerAndEnemyLevels call SwapPlayerAndEnemyLevels
Func_3e794: ; 3e794 (f:6794) GetEnemyAnimationType: ; 3e794 (f:6794)
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
and a and a
ld a, $1 ld a, $1
jr z, asm_3e7a4 jr z, playEnemyMoveAnimation
ld a, $2 ld a, $2
jr asm_3e7a4 jr playEnemyMoveAnimation
asm_3e7a0: ; 3e7a0 (f:67a0) asm_3e7a0: ; 3e7a0 (f:67a0)
call SwapPlayerAndEnemyLevels call SwapPlayerAndEnemyLevels
xor a xor a
asm_3e7a4: ; 3e7a4 (f:67a4) playEnemyMoveAnimation: ; 3e7a4 (f:67a4)
push af push af
ld a, [W_ENEMYBATTSTATUS2] ld a, [W_ENEMYBATTSTATUS2]
bit HasSubstituteUp, a ; does mon have a substitute? bit HasSubstituteUp, a ; does mon have a substitute?
@ -5738,7 +5755,7 @@ asm_3e7a4: ; 3e7a4 (f:67a4)
ld b, BANK(Func_79747) ld b, BANK(Func_79747)
call nz, Bankswitch call nz, Bankswitch
pop af pop af
ld [wcc5b], a ld [wAnimationType], a
ld a, [W_ENEMYMOVENUM] ld a, [W_ENEMYMOVENUM]
call PlayMoveAnimation call PlayMoveAnimation
call HandleExplodingAnimation call HandleExplodingAnimation
@ -5748,24 +5765,24 @@ asm_3e7a4: ; 3e7a4 (f:67a4)
ld hl, Func_79771 ld hl, Func_79771
ld b, BANK(Func_79771) ld b, BANK(Func_79771)
call nz, Bankswitch ; slide the substitute's sprite out call nz, Bankswitch ; slide the substitute's sprite out
jr asm_3e7ef jr EnemyCheckIfMirrorMoveEffect
Func_3e7d1: ; 3e7d1 (f:67d1) EnemyCheckIfFlyOrChargeEffect: ; 3e7d1 (f:67d1)
call SwapPlayerAndEnemyLevels call SwapPlayerAndEnemyLevels
ld c, $1e ld c, $1e
call DelayFrames call DelayFrames
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
cp FLY_EFFECT cp FLY_EFFECT
jr z, .asm_3e7e6 jr z, .playAnim
cp CHARGE_EFFECT cp CHARGE_EFFECT
jr z, .asm_3e7e6 jr z, .playAnim
jr asm_3e7ef jr EnemyCheckIfMirrorMoveEffect
.asm_3e7e6 .playAnim
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a,STATUS_AFFECTED_ANIM ld a,STATUS_AFFECTED_ANIM
call PlayMoveAnimation call PlayMoveAnimation
asm_3e7ef: ; 3e7ef (f:67ef) EnemyCheckIfMirrorMoveEffect: ; 3e7ef (f:67ef)
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
cp MIRROR_MOVE_EFFECT cp MIRROR_MOVE_EFFECT
jr nz, .notMirrorMoveEffect jr nz, .notMirrorMoveEffect
@ -5796,7 +5813,7 @@ asm_3e7ef: ; 3e7ef (f:67ef)
call PrintCriticalOHKOText call PrintCriticalOHKOText
callab DisplayEffectiveness callab DisplayEffectiveness
ld a, 1 ld a, 1
ld [wccf4], a ld [wMoveDidntMiss], a
.asm_3e83e .asm_3e83e
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
ld hl, AlwaysHappenSideEffects ld hl, AlwaysHappenSideEffects
@ -5816,7 +5833,7 @@ asm_3e7ef: ; 3e7ef (f:67ef)
ld hl, wEnemyNumAttacksLeft ld hl, wEnemyNumAttacksLeft
dec [hl] dec [hl]
pop hl pop hl
jp nz, Func_3e794 jp nz, GetEnemyAnimationType
res AttackingMultipleTimes, [hl] ; mon is no longer hitting multiple times res AttackingMultipleTimes, [hl] ; mon is no longer hitting multiple times
ld hl, HitXTimesText ld hl, HitXTimesText
call PrintText call PrintText
@ -5854,7 +5871,7 @@ CheckEnemyStatusConditions: ; 3e88f (f:688f)
ld hl, FastAsleepText ld hl, FastAsleepText
call PrintText call PrintText
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a,SLP_ANIM ld a,SLP_ANIM
call PlayMoveAnimation call PlayMoveAnimation
jr .next1 jr .next1
@ -5930,7 +5947,7 @@ CheckEnemyStatusConditions: ; 3e88f (f:688f)
ld hl, IsConfusedText ld hl, IsConfusedText
call PrintText call PrintText
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a,CONF_ANIM ld a,CONF_ANIM
call PlayMoveAnimation call PlayMoveAnimation
call BattleRandom call BattleRandom
@ -5973,7 +5990,7 @@ CheckEnemyStatusConditions: ; 3e88f (f:688f)
pop af pop af
ld [hl], a ld [hl], a
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld [H_WHOSETURN], a ld [H_WHOSETURN], a
ld a, POUND ld a, POUND
call PlayMoveAnimation call PlayMoveAnimation
@ -6014,7 +6031,7 @@ CheckEnemyStatusConditions: ; 3e88f (f:688f)
jr .notFlyOrChargeEffect jr .notFlyOrChargeEffect
.flyOrChargeEffect .flyOrChargeEffect
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a, STATUS_AFFECTED_ANIM ld a, STATUS_AFFECTED_ANIM
call PlayMoveAnimation call PlayMoveAnimation
.notFlyOrChargeEffect .notFlyOrChargeEffect
@ -6068,7 +6085,7 @@ CheckEnemyStatusConditions: ; 3e88f (f:688f)
ld a, BIDE ld a, BIDE
ld [W_ENEMYMOVENUM], a ld [W_ENEMYMOVENUM], a
call SwapPlayerAndEnemyLevels call SwapPlayerAndEnemyLevels
ld hl, asm_3e782 ld hl, handleIfEnemyMoveMissed
jp .enemyReturnToHL jp .enemyReturnToHL
.checkIfThrashingAbout .checkIfThrashingAbout
bit ThrashingAbout, [hl] ; is mon using thrash or petal dance? bit ThrashingAbout, [hl] ; is mon using thrash or petal dance?
@ -6099,7 +6116,7 @@ CheckEnemyStatusConditions: ; 3e88f (f:688f)
call PrintText call PrintText
ld hl, wEnemyNumAttacksLeft ld hl, wEnemyNumAttacksLeft
dec [hl] dec [hl]
ld hl, Func_3e794 ld hl, GetEnemyAnimationType
jp nz, .enemyReturnToHL jp nz, .enemyReturnToHL
jp .enemyReturnToHL jp .enemyReturnToHL
.checkIfUsingRage .checkIfUsingRage
@ -6787,7 +6804,7 @@ HandleExplodingAnimation: ; 3eed3 (f:6ed3)
and a and a
ret nz ret nz
ld a, 5 ld a, 5
ld [wcc5b], a ld [wAnimationType], a
PlayMoveAnimation: ; 3ef07 (f:6f07) PlayMoveAnimation: ; 3ef07 (f:6f07)
ld [W_ANIMATIONID],a ld [W_ANIMATIONID],a
@ -6955,6 +6972,7 @@ _LoadTrainerPic: ; 3f04b (f:704b)
ld c, a ld c, a
jp LoadUncompressedSpriteData jp LoadUncompressedSpriteData
; unreferenced
Func_3f069: ; 3f069 (f:7069) Func_3f069: ; 3f069 (f:7069)
xor a xor a
ld [wc0f1], a ld [wc0f1], a
@ -7030,6 +7048,7 @@ asm_3f0d0: ; 3f0d0 (f:70d0)
dec b dec b
jr nz, .asm_3f0de jr nz, .asm_3f0de
ret ret
.asm_3f0ed .asm_3f0ed
push bc push bc
ld b, $0 ld b, $0
@ -7053,7 +7072,7 @@ asm_3f0d0: ; 3f0d0 (f:70d0)
jr nz, .asm_3f0f4 jr nz, .asm_3f0f4
ret ret
LoadMonBackPic: LoadMonBackPic: ; 3f103 (f:7103)
; Assumes the monster's attributes have ; Assumes the monster's attributes have
; been loaded with GetMonHeader. ; been loaded with GetMonHeader.
ld a, [wBattleMonSpecies2] ld a, [wBattleMonSpecies2]
@ -7080,14 +7099,14 @@ JumpMoveEffect: ; 3f132 (f:7132)
ret ret
_JumpMoveEffect: ; 3f138 (f:7138) _JumpMoveEffect: ; 3f138 (f:7138)
ld a, [$fff3] ;whose turn? ld a, [H_WHOSETURN]
and a and a
ld a, [W_PLAYERMOVEEFFECT] ld a, [W_PLAYERMOVEEFFECT]
jr z, .next1 jr z, .next1
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
.next1 .next1
dec a ;subtract 1, there is no special effect for 00 dec a ; subtract 1, there is no special effect for 00
add a ;x2, 16bit pointers add a ; x2, 16bit pointers
ld hl, MoveEffectPointerTable ld hl, MoveEffectPointerTable
ld b, 0 ld b, 0
ld c, a ld c, a
@ -7095,7 +7114,7 @@ _JumpMoveEffect: ; 3f138 (f:7138)
ld a, [hli] ld a, [hli]
ld h, [hl] ld h, [hl]
ld l, a ld l, a
jp [hl] ;jump to special effect handler jp [hl] ; jump to special effect handler
MoveEffectPointerTable: ; 3f150 (f:7150) MoveEffectPointerTable: ; 3f150 (f:7150)
dw SleepEffect ; unused effect dw SleepEffect ; unused effect
@ -7223,7 +7242,7 @@ SleepEffect: ; 3f1fc (f:71fc)
and $7 and $7
jr z, .setSleepCounter jr z, .setSleepCounter
ld [de], a ld [de], a
call Func_3fb89 call PlayCurrentMoveAnimation2
ld hl, FellAsleepText ld hl, FellAsleepText
jp PrintText jp PrintText
.didntAffect .didntAffect
@ -7309,10 +7328,10 @@ PoisonEffect: ; 3f24f (f:724f)
cp POISON_EFFECT cp POISON_EFFECT
jr z, .asm_3f2cd jr z, .asm_3f2cd
ld a, b ld a, b
call Func_3fb96 call PlayBattleAnimation2
jp PrintText jp PrintText
.asm_3f2cd .asm_3f2cd
call Func_3fb89 call PlayCurrentMoveAnimation2
jp PrintText jp PrintText
.noEffect .noEffect
ld a, [de] ld a, [de]
@ -7357,10 +7376,10 @@ ExplodeEffect: ; 3f2f1 (f:72f1)
FreezeBurnParalyzeEffect: ; 3f30c (f:730c) FreezeBurnParalyzeEffect: ; 3f30c (f:730c)
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
call CheckTargetSubstitute ; test bit 4 of d063/d068 flags [target has substitute flag] 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 ret nz ; return if they have a substitute, can't effect them
ld a, [$fff3] ld a, [H_WHOSETURN]
and a and a
jp nz, opponentAttacker jp nz, opponentAttacker
ld a, [wEnemyMonStatus] ld a, [wEnemyMonStatus]
@ -7472,7 +7491,7 @@ CheckDefrost: ; 3f3e2 (f:73e2)
; any fire-type move that has a chance inflict burn (all but Fire Spin) will defrost a frozen target ; any fire-type move that has a chance inflict burn (all but Fire Spin) will defrost a frozen target
and a, 1 << FRZ ; are they frozen? and a, 1 << FRZ ; are they frozen?
ret z ; return if so ret z ; return if so
ld a, [$fff3] ld a, [H_WHOSETURN]
and a and a
jr nz, .opponent jr nz, .opponent
;player [attacker] ;player [attacker]
@ -7568,7 +7587,7 @@ StatModifierUpEffect: ; 3f428 (f:7428)
jr nz, .recalculateStat jr nz, .recalculateStat
ld a, [hl] ld a, [hl]
sbc 999 / $100 sbc 999 / $100
jp z, Func_3f520 jp z, RestoreOriginalStatModifier
.recalculateStat ; recalculate affected stat .recalculateStat ; recalculate affected stat
; paralysis and burn penalties, as well as badge boosts are ignored ; paralysis and burn penalties, as well as badge boosts are ignored
push hl push hl
@ -7661,7 +7680,7 @@ UpdateStatDone: ; 3f4ca (f:74ca)
call QuarterSpeedDueToParalysis ; apply speed penalty to the player whose turn is not, if it's paralyzed call QuarterSpeedDueToParalysis ; apply speed penalty to the player whose turn is not, if it's paralyzed
jp HalveAttackDueToBurn ; apply attack penalty to the player whose turn is not, if it's burned jp HalveAttackDueToBurn ; apply attack penalty to the player whose turn is not, if it's burned
Func_3f520: ; 3f520 (f:7520) RestoreOriginalStatModifier: ; 3f520 (f:7520)
pop hl pop hl
dec [hl] dec [hl]
@ -7838,7 +7857,7 @@ UpdateLoweredStatDone: ; 3f62c (f:762c)
ld a, [de] ld a, [de]
cp $44 cp $44
jr nc, .ApplyBadgeBoostsAndStatusPenalties jr nc, .ApplyBadgeBoostsAndStatusPenalties
call Func_3fb89 call PlayCurrentMoveAnimation2
.ApplyBadgeBoostsAndStatusPenalties .ApplyBadgeBoostsAndStatusPenalties
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
and a and a
@ -7869,7 +7888,7 @@ MoveMissed: ; 3f65a (f:765a)
ld a, [de] ld a, [de]
cp $44 cp $44
ret nc ret nc
jp Func_3fb4e jp ConditionalPrintButItFailed
MonsStatsFellText: ; 3f661 (f:7661) MonsStatsFellText: ; 3f661 (f:7661)
TX_FAR _MonsStatsFellText TX_FAR _MonsStatsFellText
@ -7961,7 +7980,7 @@ BideEffect: ; 3f6e5 (f:76e5)
ld [bc], a ; set Bide counter to 2 or 3 at random ld [bc], a ; set Bide counter to 2 or 3 at random
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
add XSTATITEM_ANIM add XSTATITEM_ANIM
jp Func_3fb96 jp PlayBattleAnimation2
ThrashPetalDanceEffect: ; 3f717 (f:7717) ThrashPetalDanceEffect: ; 3f717 (f:7717)
ld hl, W_PLAYERBATTSTATUS1 ld hl, W_PLAYERBATTSTATUS1
@ -7980,7 +7999,7 @@ ThrashPetalDanceEffect: ; 3f717 (f:7717)
ld [de], a ; set thrash/petal dance counter to 2 or 3 at random ld [de], a ; set thrash/petal dance counter to 2 or 3 at random
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
add ANIM_B0 add ANIM_B0
jp Func_3fb96 jp PlayBattleAnimation2
SwitchAndTeleportEffect: ; 3f739 (f:7739) SwitchAndTeleportEffect: ; 3f739 (f:7739)
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
@ -8014,7 +8033,7 @@ SwitchAndTeleportEffect: ; 3f739 (f:7739)
.asm_3f76e .asm_3f76e
call ReadPlayerMonCurHPAndStatus call ReadPlayerMonCurHPAndStatus
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
inc a inc a
ld [wEscapedFromBattle], a ld [wEscapedFromBattle], a
ld a, [W_PLAYERMOVENUM] ld a, [W_PLAYERMOVENUM]
@ -8056,7 +8075,7 @@ SwitchAndTeleportEffect: ; 3f739 (f:7739)
.asm_3f7c1 .asm_3f7c1
call ReadPlayerMonCurHPAndStatus call ReadPlayerMonCurHPAndStatus
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
inc a inc a
ld [wEscapedFromBattle], a ld [wEscapedFromBattle], a
ld a, [W_ENEMYMOVENUM] ld a, [W_ENEMYMOVENUM]
@ -8068,7 +8087,7 @@ SwitchAndTeleportEffect: ; 3f739 (f:7739)
ld a, [W_ENEMYMOVENUM] ld a, [W_ENEMYMOVENUM]
cp TELEPORT cp TELEPORT
jp nz, PrintText jp nz, PrintText
jp Func_3fb4e jp ConditionalPrintButItFailed
.asm_3f7e4 .asm_3f7e4
push af push af
call PlayBattleAnimation call PlayBattleAnimation
@ -8197,7 +8216,7 @@ ChargeEffect: ; 3f88c (f:788c)
ld b, ANIM_C0 ld b, ANIM_C0
.notDigOrFly .notDigOrFly
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a, b ld a, b
call PlayBattleAnimation call PlayBattleAnimation
ld a, [de] ld a, [de]
@ -8329,7 +8348,7 @@ ConfusionSideEffectSuccess: ; 3f96f (f:796f)
ld [bc], a ; confusion status will last 2-5 turns ld [bc], a ; confusion status will last 2-5 turns
pop af pop af
cp CONFUSION_SIDE_EFFECT cp CONFUSION_SIDE_EFFECT
call nz, Func_3fb89 call nz, PlayCurrentMoveAnimation2
ld hl, BecameConfusedText ld hl, BecameConfusedText
jp PrintText jp PrintText
@ -8342,7 +8361,7 @@ ConfusionEffectFailed: ; 3f9a6 (f:79a6)
ret z ret z
ld c, $32 ld c, $32
call DelayFrames call DelayFrames
jp Func_3fb4e jp ConditionalPrintButItFailed
ParalyzeEffect: ; 3f9b1 (f:79b1) ParalyzeEffect: ; 3f9b1 (f:79b1)
ld hl, ParalyzeEffect_ ld hl, ParalyzeEffect_
@ -8350,8 +8369,8 @@ ParalyzeEffect: ; 3f9b1 (f:79b1)
jp Bankswitch jp Bankswitch
SubstituteEffect: ; 3f9b9 (f:79b9) SubstituteEffect: ; 3f9b9 (f:79b9)
ld hl, SubstituteEffectHandler ld hl, SubstituteEffect_
ld b, BANK(SubstituteEffectHandler) ld b, BANK(SubstituteEffect_)
jp Bankswitch jp Bankswitch
HyperBeamEffect: ; 3f9c1 (f:79c1) HyperBeamEffect: ; 3f9c1 (f:79c1)
@ -8534,7 +8553,7 @@ DisableEffect: ; 3fa8a (f:7a8a)
swap c swap c
add c add c
ld [de], a ld [de], a
call Func_3fb89 call PlayCurrentMoveAnimation2
ld hl, wccee ld hl, wccee
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
and a and a
@ -8597,10 +8616,10 @@ NoEffectText: ; 3fb49 (f:7b49)
TX_FAR _NoEffectText TX_FAR _NoEffectText
db "@" db "@"
Func_3fb4e: ; 3fb4e (f:7b4e) ConditionalPrintButItFailed: ; 3fb4e (f:7b4e)
ld a, [wccf4] ld a, [wMoveDidntMiss]
and a and a
ret nz ret nz ; return if the side effect failed, yet the attack was successful
PrintButItFailedText_: ; 3fb53 (f:7b53) PrintButItFailedText_: ; 3fb53 (f:7b53)
ld hl, ButItFailedText ld hl, ButItFailedText
@ -8642,30 +8661,35 @@ CheckTargetSubstitute: ; 3fb79 (f:7b79)
pop hl pop hl
ret ret
Func_3fb89: ; 3fb89 (f:7b89) PlayCurrentMoveAnimation2: ; 3fb89 (f:7b89)
; animation at MOVENUM will be played unless MOVENUM is 0
; plays wAnimationType 3 or 6
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
and a and a
ld a, [W_PLAYERMOVENUM] ld a, [W_PLAYERMOVENUM]
jr z, .asm_3fb94 jr z, .notEnemyTurn
ld a, [W_ENEMYMOVENUM] ld a, [W_ENEMYMOVENUM]
.asm_3fb94 .notEnemyTurn
and a and a
ret z ret z
Func_3fb96: ; 3fb96 (f:7b96) PlayBattleAnimation2: ; 3fb96 (f:7b96)
; play animation ID at a and animation type 6 or 3
ld [W_ANIMATIONID], a ld [W_ANIMATIONID], a
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
and a and a
ld a, $6 ld a, $6
jr z, .asm_3fba2 jr z, .storeAnimationType
ld a, $3 ld a, $3
.asm_3fba2 .storeAnimationType
ld [wcc5b], a ld [wAnimationType], a
jp Func_3fbbc jp PlayBattleAnimationGotID
PlayCurrentMoveAnimation: ; 3fba8 (f:7ba8) PlayCurrentMoveAnimation: ; 3fba8 (f:7ba8)
; animation at MOVENUM will be played unless MOVENUM is 0
; resets wAnimationType
xor a xor a
ld [wcc5b], a ld [wAnimationType], a
ld a, [H_WHOSETURN] ld a, [H_WHOSETURN]
and a and a
ld a, [W_PLAYERMOVENUM] ld a, [W_PLAYERMOVENUM]
@ -8676,9 +8700,11 @@ PlayCurrentMoveAnimation: ; 3fba8 (f:7ba8)
ret z ret z
PlayBattleAnimation: ; 3fbb9 (f:7bb9) PlayBattleAnimation: ; 3fbb9 (f:7bb9)
; play animation ID at a and predefined animation type
ld [W_ANIMATIONID], a ld [W_ANIMATIONID], a
Func_3fbbc: ; 3fbbc (f:7bbc) PlayBattleAnimationGotID: ; 3fbbc (f:7bbc)
; play animation at W_ANIMATIONID
push hl push hl
push de push de
push bc push bc

View file

View file

@ -1,5 +1,5 @@
DisplayEffectiveness: ; 2fb7b (b:7b7b) DisplayEffectiveness: ; 2fb7b (b:7b7b)
ld a, [wd05b] ld a, [wDamageMultipliers]
and a, $7F and a, $7F
cp a, $0A cp a, $0A
ret z ret z

View file

@ -0,0 +1,191 @@
DrawAllPokeballs: ; 3a849 (e:6849)
call LoadPartyPokeballGfx
call SetupOwnPartyPokeballs
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
ret z ; return if wild pokémon
jp SetupEnemyPartyPokeballs
DrawEnemyPokeballs: ; 0x3a857
call LoadPartyPokeballGfx
jp SetupEnemyPartyPokeballs
LoadPartyPokeballGfx: ; 3a85d (e:685d)
ld de, PokeballTileGraphics ; $697e
ld hl, vSprites + $310
ld bc, (BANK(PokeballTileGraphics) << 8) + $04
jp CopyVideoData
SetupOwnPartyPokeballs: ; 3a869 (e:6869)
call PlacePlayerHUDTiles
ld hl, wPartyMon1
ld de, wPartyCount ; wPartyCount
call SetupPokeballs
ld a, $60
ld hl, W_BASECOORDX ; wd081
ld [hli], a
ld [hl], a
ld a, $8
ld [wTrainerEngageDistance], a
ld hl, wOAMBuffer
jp WritePokeballOAMData
SetupEnemyPartyPokeballs: ; 3a887 (e:6887)
call PlaceEnemyHUDTiles
ld hl, wEnemyMons
ld de, wEnemyPartyCount ; wEnemyPartyCount
call SetupPokeballs
ld hl, W_BASECOORDX ; wd081
ld a, $48
ld [hli], a
ld [hl], $20
ld a, $f8
ld [wTrainerEngageDistance], a
ld hl, wOAMBuffer + PARTY_LENGTH * 4
jp WritePokeballOAMData
SetupPokeballs: ; 0x3a8a6
ld a, [de]
push af
ld de, wBuffer
ld c, PARTY_LENGTH
ld a, $34 ; empty pokeball
.emptyloop
ld [de], a
inc de
dec c
jr nz, .emptyloop
pop af
ld de, wBuffer
.monloop
push af
call PickPokeball
inc de
pop af
dec a
jr nz, .monloop
ret
PickPokeball: ; 3a8c2 (e:68c2)
inc hl
ld a, [hli]
and a
jr nz, .alive
ld a, [hl]
and a
ld b, $33 ; crossed ball (fainted)
jr z, .done_fainted
.alive
inc hl
inc hl
ld a, [hl] ; status
and a
ld b, $32 ; black ball (status)
jr nz, .done
dec b ; regular ball
jr .done
.done_fainted
inc hl
inc hl
.done
ld a, b
ld [de], a
ld bc, $0028 ; rest of mon struct
add hl, bc
ret
WritePokeballOAMData: ; 3a8e1 (e:68e1)
ld de, wBuffer
ld c, PARTY_LENGTH
.loop
ld a, [W_BASECOORDY] ; wd082
ld [hli], a
ld a, [W_BASECOORDX] ; wd081
ld [hli], a
ld a, [de]
ld [hli], a
xor a
ld [hli], a
ld a, [W_BASECOORDX] ; wd081
ld b, a
ld a, [wTrainerEngageDistance]
add b
ld [W_BASECOORDX], a ; wd081
inc de
dec c
jr nz, .loop
ret
PlacePlayerHUDTiles: ; 3a902 (e:6902)
ld hl, PlayerBattleHUDGraphicsTiles ; $6916
ld de, wTrainerFacingDirection
ld bc, $3
call CopyData
hlCoord 18, 10
ld de, rIE ; $ffff
jr PlaceHUDTiles
PlayerBattleHUDGraphicsTiles: ; 3a916 (e:6916)
; The tile numbers for specific parts of the battle display for the player's pokemon
db $73 ; unused ($73 is hardcoded into the routine that uses these bytes)
db $77 ; lower-right corner tile of the HUD
db $6F ; lower-left triangle tile of the HUD
PlaceEnemyHUDTiles: ; 3a919 (e:6919)
ld hl, EnemyBattleHUDGraphicsTiles ; $692d
ld de, wTrainerFacingDirection
ld bc, $3
call CopyData
hlCoord 1, 2
ld de, $1
jr PlaceHUDTiles
EnemyBattleHUDGraphicsTiles: ; 3a92d (e:692d)
; The tile numbers for specific parts of the battle display for the enemy
db $73 ; unused ($73 is hardcoded in the routine that uses these bytes)
db $74 ; lower-left corner tile of the HUD
db $78 ; lower-right triangle tile of the HUD
PlaceHUDTiles: ; 3a930 (e:6930)
ld [hl], $73
ld bc, $14
add hl, bc
ld a, [wTrainerScreenY]
ld [hl], a
ld a, $8
.asm_3a93c
add hl, de
ld [hl], $76
dec a
jr nz, .asm_3a93c
add hl, de
ld a, [wTrainerScreenX]
ld [hl], a
ret
SetupPlayerAndEnemyPokeballs: ; 3a948 (e:6948)
call LoadPartyPokeballGfx
ld hl, wPartyMon1Species ; wPartyMon1Species (aliases: wPartyMon1)
ld de, wPartyCount ; wPartyCount
call SetupPokeballs
ld hl, W_BASECOORDX ; wd081
ld a, $50
ld [hli], a
ld [hl], $40
ld a, $8
ld [wTrainerEngageDistance], a
ld hl, wOAMBuffer
call WritePokeballOAMData
ld hl, wEnemyMons ; wEnemyMon1Species
ld de, wEnemyPartyCount ; wEnemyPartyCount
call SetupPokeballs
ld hl, W_BASECOORDX ; wd081
ld a, $50
ld [hli], a
ld [hl], $68
ld hl, wOAMBuffer + $18
jp WritePokeballOAMData
; four tiles: pokeball, black pokeball (status ailment), crossed out pokeball (faited) and pokeball slot (no mon)
PokeballTileGraphics:: ; 3a97e (e:697e)
INCBIN "gfx/pokeball.2bpp"

View file

@ -1,301 +0,0 @@
HealEffect_: ; 3b9ec (e:79ec)
ld a, [H_WHOSETURN]
and a
ld de, wBattleMonHP
ld hl, wBattleMonMaxHP
ld a, [W_PLAYERMOVENUM]
jr z, .asm_3ba03
ld de, wEnemyMonHP
ld hl, wEnemyMonMaxHP
ld a, [W_ENEMYMOVENUM]
.asm_3ba03
ld b, a
ld a, [de]
cp [hl]
inc de
inc hl
ld a, [de]
sbc [hl]
jp z, .failed
ld a, b
cp REST
jr nz, .asm_3ba37
push hl
push de
push af
ld c, 50
call DelayFrames
ld hl, wBattleMonStatus
ld a, [H_WHOSETURN]
and a
jr z, .asm_3ba25
ld hl, wEnemyMonStatus
.asm_3ba25
ld a, [hl]
and a
ld [hl], 2 ; Number of turns from Rest
ld hl, StartedSleepingEffect
jr z, .asm_3ba31
ld hl, FellAsleepBecameHealthyText
.asm_3ba31
call PrintText
pop af
pop de
pop hl
.asm_3ba37
ld a, [hld]
ld [wHPBarMaxHP], a
ld c, a
ld a, [hl]
ld [wHPBarMaxHP+1], a
ld b, a
jr z, .asm_3ba47
srl b
rr c
.asm_3ba47
ld a, [de]
ld [wHPBarOldHP], a
add c
ld [de], a
ld [wHPBarNewHP], a
dec de
ld a, [de]
ld [wHPBarOldHP+1], a
adc b
ld [de], a
ld [wHPBarNewHP+1], a
inc hl
inc de
ld a, [de]
dec de
sub [hl]
dec hl
ld a, [de]
sbc [hl]
jr c, .asm_3ba6f
ld a, [hli]
ld [de], a
ld [wHPBarNewHP+1], a
inc de
ld a, [hl]
ld [de], a
ld [wHPBarNewHP], a
.asm_3ba6f
ld hl, PlayCurrentMoveAnimation
call BankswitchEtoF
ld a, [H_WHOSETURN]
and a
hlCoord 10, 9
ld a, $1
jr z, .asm_3ba83
hlCoord 2, 2
xor a
.asm_3ba83
ld [wHPBarType], a
predef UpdateHPBar2
ld hl, DrawHUDsAndHPBars
call BankswitchEtoF
ld hl, RegainedHealthText
jp PrintText
.failed
ld c, 50
call DelayFrames
ld hl, PrintButItFailedText_
jp BankswitchEtoF
StartedSleepingEffect: ; 3baa2 (e:7aa2)
TX_FAR _StartedSleepingEffect
db "@"
FellAsleepBecameHealthyText: ; 3baa7 (e:7aa7)
TX_FAR _FellAsleepBecameHealthyText
db "@"
RegainedHealthText: ; 3baac (e:7aac)
TX_FAR _RegainedHealthText
db "@"
TransformEffect_: ; 3bab1 (e:7ab1)
ld hl, wBattleMonSpecies
ld de, wEnemyMonSpecies
ld bc, W_ENEMYBATTSTATUS3
ld a, [W_ENEMYBATTSTATUS1]
ld a, [H_WHOSETURN]
and a
jr nz, .asm_3bad1
ld hl, wEnemyMonSpecies
ld de, wBattleMonSpecies
ld bc, W_PLAYERBATTSTATUS3
ld [wPlayerMoveListIndex], a
ld a, [W_PLAYERBATTSTATUS1]
.asm_3bad1
bit Invulnerable, a ; is mon invulnerable to typical attacks? (fly/dig)
jp nz, .failed
push hl
push de
push bc
ld hl, W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bae4
ld hl, W_ENEMYBATTSTATUS2
.asm_3bae4
bit HasSubstituteUp, [hl]
push af
ld hl, Func_79747
ld b, BANK(Func_79747)
call nz, Bankswitch
ld a, [W_OPTIONS]
add a
ld hl, PlayCurrentMoveAnimation
ld b, BANK(PlayCurrentMoveAnimation)
jr nc, .asm_3baff
ld hl, AnimationTransformMon
ld b, BANK(AnimationTransformMon)
.asm_3baff
call Bankswitch
ld hl, Func_79771
ld b, BANK(Func_79771)
pop af
call nz, Bankswitch
pop bc
ld a, [bc]
set Transformed, a
ld [bc], a
pop de
pop hl
push hl
ld a, [hl]
ld [de], a
ld bc, $5
add hl, bc
inc de
inc de
inc de
inc de
inc de
inc bc
inc bc
call CopyData
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bb32
ld a, [de]
ld [wcceb], a
inc de
ld a, [de]
ld [wccec], a
dec de
.asm_3bb32
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
inc de
inc hl
inc hl
inc hl
inc de
inc de
inc de
ld bc, $8
call CopyData
ld bc, $ffef
add hl, bc
ld b, $4
.asm_3bb4a
ld a, [hli]
and a
jr z, .asm_3bb57
ld a, $5
ld [de], a
inc de
dec b
jr nz, .asm_3bb4a
jr .asm_3bb5d
.asm_3bb57
xor a
ld [de], a
inc de
dec b
jr nz, .asm_3bb57
.asm_3bb5d
pop hl
ld a, [hl]
ld [wd11e], a
call GetMonName
ld hl, wEnemyMonUnmodifiedAttack
ld de, wPlayerMonUnmodifiedAttack
call .copyBasedOnTurn
ld hl, wEnemyMonStatMods
ld de, wPlayerMonStatMods
call .copyBasedOnTurn
ld hl, TransformedText
jp PrintText
.copyBasedOnTurn
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bb86
push hl
ld h, d
ld l, e
pop de
.asm_3bb86
ld bc, $8
jp CopyData
.failed
ld hl, PrintButItFailedText_
jp BankswitchEtoF
TransformedText: ; 3bb92 (e:7b92)
TX_FAR _TransformedText
db "@"
ReflectLightScreenEffect_: ; 3bb97 (e:7b97)
ld hl, W_PLAYERBATTSTATUS3
ld de, W_PLAYERMOVEEFFECT
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bba8
ld hl, W_ENEMYBATTSTATUS3
ld de, W_ENEMYMOVEEFFECT
.asm_3bba8
ld a, [de]
cp LIGHT_SCREEN_EFFECT
jr nz, .reflect
bit HasLightScreenUp, [hl] ; is mon already protected by light screen?
jr nz, .moveFailed
set HasLightScreenUp, [hl] ; mon is now protected by light screen
ld hl, LightScreenProtectedText
jr .asm_3bbc1
.reflect
bit HasReflectUp, [hl] ; is mon already protected by reflect?
jr nz, .moveFailed
set HasReflectUp, [hl] ; mon is now protected by reflect
ld hl, ReflectGainedArmorText
.asm_3bbc1
push hl
ld hl, PlayCurrentMoveAnimation
call BankswitchEtoF
pop hl
jp PrintText
.moveFailed
ld c, $32
call DelayFrames
ld hl, PrintButItFailedText_
jp BankswitchEtoF
LightScreenProtectedText: ; 3bbd7 (e:7bd7)
TX_FAR _LightScreenProtectedText
db "@"
ReflectGainedArmorText: ; 3bbdc (e:7bdc)
TX_FAR _ReflectGainedArmorText
db "@"
BankswitchEtoF: ; 3bbe1 (e:7be1)
ld b, BANK(BattleCore)
jp Bankswitch

View file

@ -0,0 +1,88 @@
EndOfBattle: ; 137aa (4:77aa)
ld a, [wLinkState]
cp LINK_STATE_BATTLING
jr nz, .notLinkBattle
; link battle
ld a, [wEnemyMonPartyPos]
ld hl, wEnemyMon1Status
ld bc, wEnemyMon2 - wEnemyMon1
call AddNTimes
ld a, [wEnemyMonStatus]
ld [hl], a
call ClearScreen
callab DisplayLinkBattleVersusTextBox
ld a, [wBattleResult]
cp $1
ld de, YouWinText
jr c, .placeWinOrLoseString
ld de, YouLoseText
jr z, .placeWinOrLoseString
ld de, DrawText
.placeWinOrLoseString
hlCoord 6, 8
call PlaceString
ld c, $c8
call DelayFrames
jr .evolution
.notLinkBattle
ld a, [wBattleResult]
and a
jr nz, .resetVariables
ld hl, wTotalPayDayMoney
ld a, [hli]
or [hl]
inc hl
or [hl]
jr z, .evolution ; if pay day money is 0, jump
ld de, wPlayerMoney + 2
ld c, $3
predef AddBCDPredef
ld hl, PickUpPayDayMoneyText
call PrintText
.evolution
xor a
ld [wccd4], a
predef EvolutionAfterBattle
.resetVariables
xor a
ld [wLowHealthAlarm], a ;disable low health alarm
ld [wc02a], a
ld [W_ISINBATTLE], a
ld [W_BATTLETYPE], a
ld [W_MOVEMISSED], a
ld [W_CUROPPONENT], a
ld [wd11f], a
ld [wNumRunAttempts], a
ld [wEscapedFromBattle], a
ld hl, wcc2b
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld [wListScrollOffset], a
ld hl, wPlayerStatsToDouble
ld b, $18
.loop
ld [hli], a
dec b
jr nz, .loop
ld hl, wd72c
set 0, [hl]
call WaitForSoundToFinish
call GBPalWhiteOut
ld a, $ff
ld [wDestinationWarpID], a
ret
YouWinText: ; 13853 (4:7853)
db "YOU WIN@"
YouLoseText: ; 1385b (4:785b)
db "YOU LOSE@"
DrawText: ; 13864 (4:7864)
db " DRAW@"
PickUpPayDayMoneyText: ; 1386b (4:786b)
TX_FAR _PickUpPayDayMoneyText
db "@"

6
engine/battle/15.asm → engine/battle/experience.asm Executable file → Normal file
View file

@ -82,7 +82,7 @@ GainExperience: ; 5524f (15:524f)
call BoostExp ; traded mon exp boost call BoostExp ; traded mon exp boost
ld a, $1 ld a, $1
.next .next
ld [wcf4d], a ld [wGainBoostedExp], a
ld a, [W_ISINBATTLE] ld a, [W_ISINBATTLE]
dec a ; is it a trainer battle? dec a ; is it a trainer battle?
call nz, BoostExp ; if so, boost exp call nz, BoostExp ; if so, boost exp
@ -342,12 +342,12 @@ BoostExp: ; 5549f (15:549f)
GainedText: ; 554b2 (15:54b2) GainedText: ; 554b2 (15:54b2)
TX_FAR _GainedText TX_FAR _GainedText
db $08 ; asm db $08 ; asm
ld a, [wcc5b] ld a, [wBoostExpByExpAll]
ld hl, WithExpAllText ld hl, WithExpAllText
and a and a
ret nz ret nz
ld hl, ExpPointsText ld hl, ExpPointsText
ld a, [wcf4d] ld a, [wGainBoostedExp]
and a and a
ret z ret z
ld hl, BoostedText ld hl, BoostedText

View file

@ -0,0 +1,24 @@
GetTrainerName_: ; 13a58 (4:7a58)
ld hl, W_GRASSRATE
ld a, [wLinkState]
and a
jr nz, .rival
ld hl, W_RIVALNAME
ld a, [W_TRAINERCLASS]
cp SONY1
jr z, .rival
cp SONY2
jr z, .rival
cp SONY3
jr z, .rival
ld [wd0b5], a
ld a, TRAINER_NAME
ld [wNameListType], a
ld a, BANK(TrainerNames)
ld [wPredefBank], a
call GetName
ld hl, wcd6d
.rival
ld de, W_TRAINERNAME
ld bc, $d
jp CopyData

View file

@ -0,0 +1,89 @@
MarowakAnim: ; 708ca (1c:48ca)
; animate the ghost being unveiled as a Marowak
ld a, $e4
ld [rOBP1], a
call CopyMonPicFromBGToSpriteVRAM ; cover the BG ghost pic with a sprite ghost pic that looks the same
; now that the ghost pic is being displayed using sprites, clear the ghost pic from the BG tilemap
hlCoord 12, 0
ld bc, $707
call ClearScreenArea
call Delay3
xor a
ld [H_AUTOBGTRANSFERENABLED], a ; disable BG transfer so we don't see the Marowak too soon
; replace ghost pic with Marowak in BG
ld a, MAROWAK
ld [wHPBarMaxHP], a
ld a, $1
ld [H_WHOSETURN], a
callab Func_79793
; alternate between black and light grey 8 times.
; this makes the ghost's body appear to flash
ld d, $80
call FlashSprite8Times
.fadeOutGhostLoop
ld c, 10
call DelayFrames
ld a, [rOBP1]
sla a
sla a
ld [rOBP1], a
jr nz, .fadeOutGhostLoop
call ClearSprites
call CopyMonPicFromBGToSpriteVRAM ; copy Marowak pic from BG to sprite VRAM
ld b, $e4
.fadeInMarowakLoop
ld c, 10
call DelayFrames
ld a, [rOBP1]
srl b
rra
srl b
rra
ld [rOBP1], a
ld a, b
and a
jr nz, .fadeInMarowakLoop
ld a, $1
ld [H_AUTOBGTRANSFERENABLED], a ; enable BG transfer so the BG Marowak pic will be visible after the sprite one is cleared
call Delay3
jp ClearSprites
; copies a mon pic's from background VRAM to sprite VRAM and sets up OAM
CopyMonPicFromBGToSpriteVRAM: ; 7092a (1c:492a)
ld de, vFrontPic
ld hl, vSprites
ld bc, 7 * 7
call CopyVideoData
ld a, $10
ld [W_BASECOORDY], a
ld a, $70
ld [W_BASECOORDX], a
ld hl, wOAMBuffer
ld bc, $606
ld d, $8
.oamLoop
push bc
ld a, [W_BASECOORDY]
ld e, a
.oamInnerLoop
ld a, e
add $8
ld e, a
ld [hli], a
ld a, [W_BASECOORDX]
ld [hli], a
ld a, d
ld [hli], a
ld a, $10 ; use OBP1
ld [hli], a
inc d
dec c
jr nz, .oamInnerLoop
inc d
ld a, [W_BASECOORDX]
add $8
ld [W_BASECOORDX], a
pop bc
dec b
jr nz, .oamLoop
ret

View file

@ -0,0 +1,40 @@
InitBattleVariables: ; 525af (14:65af)
ld a, [hTilesetType]
ld [wd0d4], a
xor a
ld [wcd6a], a
ld [wBattleResult], a
ld hl, wcc2b
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld [wListScrollOffset], a
ld [wCriticalHitOrOHKO], a
ld [wBattleMonSpecies], a
ld [wPartyGainExpFlags], a
ld [wPlayerMonNumber], a
ld [wEscapedFromBattle], a
ld [wMapPalOffset], a
ld hl, wcf1d
ld [hli], a
ld [hl], a
ld hl, wccd3
ld b, $3c
.loop
ld [hli], a
dec b
jr nz, .loop
inc a
ld [wccd9], a
ld a, [W_CURMAP]
cp SAFARI_ZONE_EAST
jr c, .notSafariBattle
cp SAFARI_ZONE_REST_HOUSE_1
jr nc, .notSafariBattle
ld a, $2 ; safari battle
ld [W_BATTLETYPE], a
.notSafariBattle
ld hl, PlayBattleMusic
ld b, BANK(PlayBattleMusic)
jp Bankswitch

View file

View file

@ -0,0 +1,34 @@
ConversionEffect_: ; 139a3 (4:79a3)
ld hl, wEnemyMonType1
ld de, wBattleMonType1
ld a, [H_WHOSETURN]
and a
ld a, [W_ENEMYBATTSTATUS1]
jr z, .asm_139b8
push hl
ld h, d
ld l, e
pop de
ld a, [W_PLAYERBATTSTATUS1]
.asm_139b8
bit Invulnerable, a ; is mon immune to typical attacks (dig/fly)
jr nz, PrintButItFailedText
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
ld hl, PlayCurrentMoveAnimation
call CallBankF
ld hl, ConvertedTypeText
jp PrintText
ConvertedTypeText: ; 139cd (4:79cd)
TX_FAR _ConvertedTypeText
db "@"
PrintButItFailedText: ; 139d2 (4:79d2)
ld hl, PrintButItFailedText_
CallBankF: ; 139d5 (4:79d5)
ld b, BANK(PrintButItFailedText_)
jp Bankswitch

View file

View file

@ -0,0 +1,24 @@
FocusEnergyEffect_: ; 27f86 (9:7f86)
ld hl, W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN]
and a
jr z, .notEnemy
ld hl, W_ENEMYBATTSTATUS2
.notEnemy
bit GettingPumped, [hl] ; is mon already using focus energy?
jr nz, .alreadyUsing
set GettingPumped, [hl] ; mon is now using focus energy
callab PlayCurrentMoveAnimation
ld hl, GettingPumpedText
jp PrintText
.alreadyUsing
ld c, $32
call DelayFrames
ld hl, PrintButItFailedText_
ld b, BANK(PrintButItFailedText_)
jp Bankswitch
GettingPumpedText: ; 27fb3 (9:7fb3)
db $0a
TX_FAR _GettingPumpedText
db "@"

View file

@ -0,0 +1,76 @@
HazeEffect_: ; 139da (4:79da)
ld a, $7
ld hl, wPlayerMonAttackMod
call ResetStatMods
ld hl, wEnemyMonAttackMod
call ResetStatMods
ld hl, wPlayerMonUnmodifiedAttack
ld de, wBattleMonAttack
call ResetStats
ld hl, wEnemyMonUnmodifiedAttack
ld de, wEnemyMonAttack
call ResetStats
ld hl, wEnemyMonStatus
ld de, wEnemySelectedMove
ld a, [H_WHOSETURN]
and a
jr z, .asm_13a09
ld hl, wBattleMonStatus
dec de
.asm_13a09
ld a, [hl]
ld [hl], $0
and $27
jr z, .asm_13a13
ld a, $ff
ld [de], a
.asm_13a13
xor a
ld [W_PLAYERDISABLEDMOVE], a
ld [W_ENEMYDISABLEDMOVE], a
ld hl, wccee
ld [hli], a
ld [hl], a
ld hl, W_PLAYERBATTSTATUS1
call CureStatuses
ld hl, W_ENEMYBATTSTATUS1
call CureStatuses
ld hl, PlayCurrentMoveAnimation
call CallBankF
ld hl, StatusChangesEliminatedText
jp PrintText
CureStatuses: ; 13a37 (4:7a37)
res Confused, [hl]
inc hl ; BATTSTATUS2
ld a, [hl]
and (1 << UsingRage) | (1 << NeedsToRecharge) | (1 << HasSubstituteUp) | (1 << 3) ; clear all but these from BATTSTATUS2
ld [hli], a ; BATTSTATUS3
ld a, [hl]
and %11110000 | (1 << Transformed) ; clear Bad Poison, Reflect and Light Screen statuses
ld [hl], a
ret
ResetStatMods: ; 13a43 (4:7a43)
ld b, $8
.loop
ld [hli], a
dec b
jr nz, .loop
ret
ResetStats: ; 13a4a (4:7a4a)
ld b, $8
.loop
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .loop
ret
StatusChangesEliminatedText: ; 13a53 (4:7a53)
TX_FAR _StatusChangesEliminatedText
db "@"

View file

@ -0,0 +1,116 @@
HealEffect_: ; 3b9ec (e:79ec)
ld a, [H_WHOSETURN]
and a
ld de, wBattleMonHP
ld hl, wBattleMonMaxHP
ld a, [W_PLAYERMOVENUM]
jr z, .asm_3ba03
ld de, wEnemyMonHP
ld hl, wEnemyMonMaxHP
ld a, [W_ENEMYMOVENUM]
.asm_3ba03
ld b, a
ld a, [de]
cp [hl]
inc de
inc hl
ld a, [de]
sbc [hl]
jp z, .failed
ld a, b
cp REST
jr nz, .asm_3ba37
push hl
push de
push af
ld c, 50
call DelayFrames
ld hl, wBattleMonStatus
ld a, [H_WHOSETURN]
and a
jr z, .asm_3ba25
ld hl, wEnemyMonStatus
.asm_3ba25
ld a, [hl]
and a
ld [hl], 2 ; Number of turns from Rest
ld hl, StartedSleepingEffect
jr z, .asm_3ba31
ld hl, FellAsleepBecameHealthyText
.asm_3ba31
call PrintText
pop af
pop de
pop hl
.asm_3ba37
ld a, [hld]
ld [wHPBarMaxHP], a
ld c, a
ld a, [hl]
ld [wHPBarMaxHP+1], a
ld b, a
jr z, .asm_3ba47
srl b
rr c
.asm_3ba47
ld a, [de]
ld [wHPBarOldHP], a
add c
ld [de], a
ld [wHPBarNewHP], a
dec de
ld a, [de]
ld [wHPBarOldHP+1], a
adc b
ld [de], a
ld [wHPBarNewHP+1], a
inc hl
inc de
ld a, [de]
dec de
sub [hl]
dec hl
ld a, [de]
sbc [hl]
jr c, .asm_3ba6f
ld a, [hli]
ld [de], a
ld [wHPBarNewHP+1], a
inc de
ld a, [hl]
ld [de], a
ld [wHPBarNewHP], a
.asm_3ba6f
ld hl, PlayCurrentMoveAnimation
call BankswitchEtoF
ld a, [H_WHOSETURN]
and a
hlCoord 10, 9
ld a, $1
jr z, .asm_3ba83
hlCoord 2, 2
xor a
.asm_3ba83
ld [wHPBarType], a
predef UpdateHPBar2
ld hl, DrawHUDsAndHPBars
call BankswitchEtoF
ld hl, RegainedHealthText
jp PrintText
.failed
ld c, 50
call DelayFrames
ld hl, PrintButItFailedText_
jp BankswitchEtoF
StartedSleepingEffect: ; 3baa2 (e:7aa2)
TX_FAR _StartedSleepingEffect
db "@"
FellAsleepBecameHealthyText: ; 3baa7 (e:7aa7)
TX_FAR _FellAsleepBecameHealthyText
db "@"
RegainedHealthText: ; 3baac (e:7aac)
TX_FAR _RegainedHealthText
db "@"

View file

@ -0,0 +1,21 @@
MistEffect_: ; 33f2b (c:7f2b)
ld hl, W_PLAYERBATTSTATUS2
ld a, [$fff3]
and a
jr z, .asm_33f36
ld hl, W_ENEMYBATTSTATUS2
.asm_33f36
bit ProtectedByMist, [hl] ; is mon protected by mist?
jr nz, .asm_33f4a
set ProtectedByMist, [hl] ; mon is now protected by mist
callab PlayCurrentMoveAnimation
ld hl, ShroudedInMistText
jp PrintText
.asm_33f4a
ld hl, PrintButItFailedText_
ld b, BANK(PrintButItFailedText_)
jp Bankswitch
ShroudedInMistText: ; 33f52 (c:7f52)
TX_FAR _ShroudedInMistText
db "@"

View file

@ -1,25 +1,3 @@
MistEffect_: ; 33f2b (c:7f2b)
ld hl, W_PLAYERBATTSTATUS2
ld a, [$fff3]
and a
jr z, .asm_33f36
ld hl, W_ENEMYBATTSTATUS2
.asm_33f36
bit ProtectedByMist, [hl] ; is mon protected by mist?
jr nz, .asm_33f4a
set ProtectedByMist, [hl] ; mon is now protected by mist
callab PlayCurrentMoveAnimation
ld hl, ShroudedInMistText
jp PrintText
.asm_33f4a
ld hl, PrintButItFailedText_
ld b, BANK(PrintButItFailedText_)
jp Bankswitch
ShroudedInMistText: ; 33f52 (c:7f52)
TX_FAR _ShroudedInMistText
db "@"
OneHitKOEffect_: ; 33f57 (c:7f57) OneHitKOEffect_: ; 33f57 (c:7f57)
ld hl, W_DAMAGE ld hl, W_DAMAGE
xor a xor a

View file

@ -1,44 +1,3 @@
InitBattleVariables: ; 525af (14:65af)
ld a, [hTilesetType]
ld [wd0d4], a
xor a
ld [wcd6a], a
ld [wBattleResult], a
ld hl, wcc2b
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld [wListScrollOffset], a
ld [wCriticalHitOrOHKO], a
ld [wBattleMonSpecies], a
ld [wPartyGainExpFlags], a
ld [wPlayerMonNumber], a
ld [wEscapedFromBattle], a
ld [wMapPalOffset], a
ld hl, wcf1d
ld [hli], a
ld [hl], a
ld hl, wccd3
ld b, $3c
.loop
ld [hli], a
dec b
jr nz, .loop
inc a
ld [wccd9], a
ld a, [W_CURMAP]
cp SAFARI_ZONE_EAST
jr c, .notSafariBattle
cp SAFARI_ZONE_REST_HOUSE_1
jr nc, .notSafariBattle
ld a, $2 ; safari battle
ld [W_BATTLETYPE], a
.notSafariBattle
ld hl, PlayBattleMusic
ld b, BANK(PlayBattleMusic)
jp Bankswitch
ParalyzeEffect_: ; 52601 (14:6601) ParalyzeEffect_: ; 52601 (14:6601)
ld hl, wEnemyMonStatus ld hl, wEnemyMonStatus
ld de, W_PLAYERMOVETYPE ld de, W_PLAYERMOVETYPE

View file

@ -0,0 +1,43 @@
PayDayEffect_ ; 2feb8 (b:7eb8)
xor a
ld hl, wcd6d
ld [hli], a
ld a, [H_WHOSETURN]
and a
ld a, [wBattleMonLevel]
jr z, .asm_2fec8
ld a, [wEnemyMonLevel]
.asm_2fec8
add a
ld [H_DIVIDEND + 3], a
xor a
ld [H_DIVIDEND], a
ld [H_DIVIDEND + 1], a
ld [H_DIVIDEND + 2], a
ld a, $64
ld [H_DIVISOR], a
ld b, $4
call Divide
ld a, [H_QUOTIENT + 3]
ld [hli], a
ld a, [H_REMAINDER]
ld [H_DIVIDEND + 3], a
ld a, $a
ld [H_DIVISOR], a
ld b, $4
call Divide
ld a, [H_QUOTIENT + 3]
swap a
ld b, a
ld a, [H_REMAINDER]
add b
ld [hl], a
ld de, wTotalPayDayMoney + 2
ld c, $3
predef AddBCDPredef
ld hl, CoinsScatteredText
jp PrintText
CoinsScatteredText: ; 2ff04 (b:7f04)
TX_FAR _CoinsScatteredText
db "@"

View file

@ -0,0 +1,68 @@
RecoilEffect_: ; 1392c (4:792c)
ld a, [H_WHOSETURN]
and a
ld a, [W_PLAYERMOVENUM]
ld hl, wBattleMonMaxHP
jr z, .asm_1393d
ld a, [W_ENEMYMOVENUM]
ld hl, wEnemyMonMaxHP
.asm_1393d
ld d, a
ld a, [W_DAMAGE]
ld b, a
ld a, [W_DAMAGE + 1]
ld c, a
srl b
rr c
ld a, d
cp STRUGGLE
jr z, .asm_13953
srl b
rr c
.asm_13953
ld a, b
or c
jr nz, .asm_13958
inc c
.asm_13958
ld a, [hli]
ld [wHPBarMaxHP+1], a
ld a, [hl]
ld [wHPBarMaxHP], a
push bc
ld bc, $fff2
add hl, bc
pop bc
ld a, [hl]
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, .asm_13982
xor a
ld [hli], a
ld [hl], a
ld hl, wHPBarNewHP
ld [hli], a
ld [hl], a
.asm_13982
hlCoord 10, 9
ld a, [H_WHOSETURN]
and a
ld a, $1
jr z, .asm_13990
hlCoord 2, 2
xor a
.asm_13990
ld [wHPBarType], a
predef UpdateHPBar2
ld hl, HitWithRecoilText
jp PrintText
HitWithRecoilText: ; 1399e (4:799e)
TX_FAR _HitWithRecoilText
db "@"

View file

@ -0,0 +1,45 @@
ReflectLightScreenEffect_: ; 3bb97 (e:7b97)
ld hl, W_PLAYERBATTSTATUS3
ld de, W_PLAYERMOVEEFFECT
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bba8
ld hl, W_ENEMYBATTSTATUS3
ld de, W_ENEMYMOVEEFFECT
.asm_3bba8
ld a, [de]
cp LIGHT_SCREEN_EFFECT
jr nz, .reflect
bit HasLightScreenUp, [hl] ; is mon already protected by light screen?
jr nz, .moveFailed
set HasLightScreenUp, [hl] ; mon is now protected by light screen
ld hl, LightScreenProtectedText
jr .asm_3bbc1
.reflect
bit HasReflectUp, [hl] ; is mon already protected by reflect?
jr nz, .moveFailed
set HasReflectUp, [hl] ; mon is now protected by reflect
ld hl, ReflectGainedArmorText
.asm_3bbc1
push hl
ld hl, PlayCurrentMoveAnimation
call BankswitchEtoF
pop hl
jp PrintText
.moveFailed
ld c, $32
call DelayFrames
ld hl, PrintButItFailedText_
jp BankswitchEtoF
LightScreenProtectedText: ; 3bbd7 (e:7bd7)
TX_FAR _LightScreenProtectedText
db "@"
ReflectGainedArmorText: ; 3bbdc (e:7bdc)
TX_FAR _ReflectGainedArmorText
db "@"
BankswitchEtoF: ; 3bbe1 (e:7be1)
ld b, BANK(BattleCore)
jp Bankswitch

View file

@ -1,4 +1,4 @@
SubstituteEffectHandler: ; 17dad (5:7dad) SubstituteEffect_: ; 17dad (5:7dad)
ld c, 50 ld c, 50
call DelayFrames call DelayFrames
ld hl, wBattleMonMaxHP ld hl, wBattleMonMaxHP

View file

@ -0,0 +1,138 @@
TransformEffect_: ; 3bab1 (e:7ab1)
ld hl, wBattleMonSpecies
ld de, wEnemyMonSpecies
ld bc, W_ENEMYBATTSTATUS3
ld a, [W_ENEMYBATTSTATUS1]
ld a, [H_WHOSETURN]
and a
jr nz, .asm_3bad1
ld hl, wEnemyMonSpecies
ld de, wBattleMonSpecies
ld bc, W_PLAYERBATTSTATUS3
ld [wPlayerMoveListIndex], a
ld a, [W_PLAYERBATTSTATUS1]
.asm_3bad1
bit Invulnerable, a ; is mon invulnerable to typical attacks? (fly/dig)
jp nz, .failed
push hl
push de
push bc
ld hl, W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bae4
ld hl, W_ENEMYBATTSTATUS2
.asm_3bae4
bit HasSubstituteUp, [hl]
push af
ld hl, Func_79747
ld b, BANK(Func_79747)
call nz, Bankswitch
ld a, [W_OPTIONS]
add a
ld hl, PlayCurrentMoveAnimation
ld b, BANK(PlayCurrentMoveAnimation)
jr nc, .asm_3baff
ld hl, AnimationTransformMon
ld b, BANK(AnimationTransformMon)
.asm_3baff
call Bankswitch
ld hl, Func_79771
ld b, BANK(Func_79771)
pop af
call nz, Bankswitch
pop bc
ld a, [bc]
set Transformed, a
ld [bc], a
pop de
pop hl
push hl
ld a, [hl]
ld [de], a
ld bc, $5
add hl, bc
inc de
inc de
inc de
inc de
inc de
inc bc
inc bc
call CopyData
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bb32
ld a, [de]
ld [wcceb], a
inc de
ld a, [de]
ld [wccec], a
dec de
.asm_3bb32
ld a, [hli]
ld [de], a
inc de
ld a, [hli]
ld [de], a
inc de
inc hl
inc hl
inc hl
inc de
inc de
inc de
ld bc, $8
call CopyData
ld bc, $ffef
add hl, bc
ld b, $4
.asm_3bb4a
ld a, [hli]
and a
jr z, .asm_3bb57
ld a, $5
ld [de], a
inc de
dec b
jr nz, .asm_3bb4a
jr .asm_3bb5d
.asm_3bb57
xor a
ld [de], a
inc de
dec b
jr nz, .asm_3bb57
.asm_3bb5d
pop hl
ld a, [hl]
ld [wd11e], a
call GetMonName
ld hl, wEnemyMonUnmodifiedAttack
ld de, wPlayerMonUnmodifiedAttack
call .copyBasedOnTurn
ld hl, wEnemyMonStatMods
ld de, wPlayerMonStatMods
call .copyBasedOnTurn
ld hl, TransformedText
jp PrintText
.copyBasedOnTurn
ld a, [H_WHOSETURN]
and a
jr z, .asm_3bb86
push hl
ld h, d
ld l, e
pop de
.asm_3bb86
ld bc, $8
jp CopyData
.failed
ld hl, PrintButItFailedText_
jp BankswitchEtoF
TransformedText: ; 3bb92 (e:7b92)
TX_FAR _TransformedText
db "@"

View file

@ -0,0 +1,52 @@
; [wd0b5] = pokemon ID
; hl = dest addr
PrintMonType: ; 27d6b (9:7d6b)
call GetPredefRegisters
push hl
call GetMonHeader
pop hl
push hl
ld a, [W_MONHTYPE1]
call PrintType
ld a, [W_MONHTYPE1]
ld b, a
ld a, [W_MONHTYPE2]
cp b
pop hl
jr z, EraseType2Text
ld bc, SCREEN_WIDTH * 2
add hl, bc
; a = type
; hl = dest addr
PrintType: ; 27d89 (9:7d89)
push hl
jr PrintType_
; erase "TYPE2/" if the mon only has 1 type
EraseType2Text: ; 27d8c (9:7d8c)
ld a, " "
ld bc, $13
add hl, bc
ld bc, $6
jp FillMemory
PrintMoveType: ; 27d98 (9:7d98)
call GetPredefRegisters
push hl
ld a, [W_PLAYERMOVETYPE]
; fall through
PrintType_: ; 27d9f (9:7d9f)
add a
ld hl, TypeNames
ld e, a
ld d, $0
add hl, de
ld a, [hli]
ld e, a
ld d, [hl]
pop hl
jp PlaceString
INCLUDE "text/type_names.asm"

View file

@ -0,0 +1,164 @@
ReadTrainer: ; 39c53 (e:5c53)
; don't change any moves in a link battle
ld a,[wLinkState]
and a
ret nz
; set [wEnemyPartyCount] to 0, [wEnemyPartyMons] to FF
; XXX first is total enemy pokemon?
; XXX second is species of first pokemon?
ld hl,wEnemyPartyCount
xor a
ld [hli],a
dec a
ld [hl],a
; get the pointer to trainer data for this class
ld a,[W_CUROPPONENT]
sub $C9 ; convert value from pokemon to trainer
add a,a
ld hl,TrainerDataPointers
ld c,a
ld b,0
add hl,bc ; hl points to trainer class
ld a,[hli]
ld h,[hl]
ld l,a
ld a,[W_TRAINERNO]
ld b,a
; At this point b contains the trainer number,
; and hl points to the trainer class.
; Our next task is to iterate through the trainers,
; decrementing b each time, until we get to the right one.
.outer
dec b
jr z,.IterateTrainer
.inner
ld a,[hli]
and a
jr nz,.inner
jr .outer
; if the first byte of trainer data is FF,
; - each pokemon has a specific level
; (as opposed to the whole team being of the same level)
; - if [W_LONEATTACKNO] != 0, one pokemon on the team has a special move
; else the first byte is the level of every pokemon on the team
.IterateTrainer
ld a,[hli]
cp $FF ; is the trainer special?
jr z,.SpecialTrainer ; if so, check for special moves
ld [W_CURENEMYLVL],a
.LoopTrainerData
ld a,[hli]
and a ; have we reached the end of the trainer data?
jr z,.FinishUp
ld [wcf91],a ; write species somewhere (XXX why?)
ld a,1
ld [wcc49],a
push hl
call AddPartyMon
pop hl
jr .LoopTrainerData
.SpecialTrainer
; if this code is being run:
; - each pokemon has a specific level
; (as opposed to the whole team being of the same level)
; - if [W_LONEATTACKNO] != 0, one pokemon on the team has a special move
ld a,[hli]
and a ; have we reached the end of the trainer data?
jr z,.AddLoneMove
ld [W_CURENEMYLVL],a
ld a,[hli]
ld [wcf91],a
ld a,1
ld [wcc49],a
push hl
call AddPartyMon
pop hl
jr .SpecialTrainer
.AddLoneMove
; does the trainer have a single monster with a different move
ld a,[W_LONEATTACKNO] ; Brock is 01, Misty is 02, Erika is 04, etc
and a
jr z,.AddTeamMove
dec a
add a,a
ld c,a
ld b,0
ld hl,LoneMoves
add hl,bc
ld a,[hli]
ld d,[hl]
ld hl,wEnemyMon1Moves + 2
ld bc,wEnemyMon2 - wEnemyMon1
call AddNTimes
ld [hl],d
jr .FinishUp
.AddTeamMove
; check if our trainer's team has special moves
; get trainer class number
ld a,[W_CUROPPONENT]
sub $C8
ld b,a
ld hl,TeamMoves
; iterate through entries in TeamMoves, checking each for our trainer class
.IterateTeamMoves
ld a,[hli]
cp b
jr z,.GiveTeamMoves ; is there a match?
inc hl ; if not, go to the next entry
inc a
jr nz,.IterateTeamMoves
; no matches found. is this trainer champion rival?
ld a,b
cp SONY3
jr z,.ChampionRival
jr .FinishUp ; nope
.GiveTeamMoves
ld a,[hl]
ld [wEnemyMon5Moves + 2],a
jr .FinishUp
.ChampionRival ; give moves to his team
; pidgeot
ld a,SKY_ATTACK
ld [wEnemyMon1Moves + 2],a
; starter
ld a,[W_RIVALSTARTER]
cp STARTER3
ld b,MEGA_DRAIN
jr z,.GiveStarterMove
cp STARTER1
ld b,FIRE_BLAST
jr z,.GiveStarterMove
ld b,BLIZZARD ; must be squirtle
.GiveStarterMove
ld a,b
ld [wEnemyMon6Moves + 2],a
.FinishUp ; XXX this needs documenting
xor a ; clear D079-D07B
ld de,wd079
ld [de],a
inc de
ld [de],a
inc de
ld [de],a
ld a,[W_CURENEMYLVL]
ld b,a
.LastLoop
ld hl,wd047
ld c,2
push bc
predef AddBCDPredef
pop bc
inc de
inc de
dec b
jr nz,.LastLoop
ret

View file

@ -1,56 +1,3 @@
; [wd0b5] = pokemon ID
; hl = dest addr
PrintMonType: ; 27d6b (9:7d6b)
call GetPredefRegisters
push hl
call GetMonHeader
pop hl
push hl
ld a, [W_MONHTYPE1]
call PrintType
ld a, [W_MONHTYPE1]
ld b, a
ld a, [W_MONHTYPE2]
cp b
pop hl
jr z, EraseType2Text
ld bc, SCREEN_WIDTH * 2
add hl, bc
; a = type
; hl = dest addr
PrintType: ; 27d89 (9:7d89)
push hl
jr PrintType_
; erase "TYPE2/" if the mon only has 1 type
EraseType2Text: ; 27d8c (9:7d8c)
ld a, " "
ld bc, $13
add hl, bc
ld bc, $6
jp FillMemory
PrintMoveType: ; 27d98 (9:7d98)
call GetPredefRegisters
push hl
ld a, [W_PLAYERMOVETYPE]
; fall through
PrintType_: ; 27d9f (9:7d9f)
add a
ld hl, TypeNames
ld e, a
ld d, $0
add hl, de
ld a, [hli]
ld e, a
ld d, [hl]
pop hl
jp PlaceString
INCLUDE "text/type_names.asm"
SaveTrainerName: ; 27e4a (9:7e4a) SaveTrainerName: ; 27e4a (9:7e4a)
ld hl,TrainerNamePointers ld hl,TrainerNamePointers
ld a,[W_TRAINERCLASS] ld a,[W_TRAINERCLASS]
@ -163,28 +110,3 @@ CooltrainerMName: ; 27f6c (9:7f6c)
db "COOLTRAINER♂@" db "COOLTRAINER♂@"
CooltrainerFName: ; 27f79 (9:7f79) CooltrainerFName: ; 27f79 (9:7f79)
db "COOLTRAINER♀@" db "COOLTRAINER♀@"
FocusEnergyEffect_: ; 27f86 (9:7f86)
ld hl, W_PLAYERBATTSTATUS2
ld a, [H_WHOSETURN]
and a
jr z, .notEnemy
ld hl, W_ENEMYBATTSTATUS2
.notEnemy
bit GettingPumped, [hl] ; is mon already using focus energy?
jr nz, .alreadyUsing
set GettingPumped, [hl] ; mon is now using focus energy
callab PlayCurrentMoveAnimation
ld hl, GettingPumpedText
jp PrintText
.alreadyUsing
ld c, $32
call DelayFrames
ld hl, PrintButItFailedText_
ld b, BANK(PrintButItFailedText_)
jp Bankswitch
GettingPumpedText: ; 27fb3 (9:7fb3)
db $0a
TX_FAR _GettingPumpedText
db "@"

View file

@ -83,47 +83,3 @@ DuplicateBitsTable: ; 2fea8 (b:7ea8)
db $30, $33, $3c, $3f db $30, $33, $3c, $3f
db $c0, $c3, $cc, $cf db $c0, $c3, $cc, $cf
db $f0, $f3, $fc, $ff db $f0, $f3, $fc, $ff
PayDayEffect_ ; 2feb8 (b:7eb8)
xor a
ld hl, wcd6d
ld [hli], a
ld a, [H_WHOSETURN]
and a
ld a, [wBattleMonLevel]
jr z, .asm_2fec8
ld a, [wEnemyMonLevel]
.asm_2fec8
add a
ld [H_DIVIDEND + 3], a
xor a
ld [H_DIVIDEND], a
ld [H_DIVIDEND + 1], a
ld [H_DIVIDEND + 2], a
ld a, $64
ld [H_DIVISOR], a
ld b, $4
call Divide
ld a, [H_QUOTIENT + 3]
ld [hli], a
ld a, [H_REMAINDER]
ld [H_DIVIDEND + 3], a
ld a, $a
ld [H_DIVISOR], a
ld b, $4
call Divide
ld a, [H_QUOTIENT + 3]
swap a
ld b, a
ld a, [H_REMAINDER]
add b
ld [hl], a
ld de, wTotalPayDayMoney + 2
ld c, $3
predef AddBCDPredef
ld hl, CoinsScatteredText
jp PrintText
CoinsScatteredText: ; 2ff04 (b:7f04)
TX_FAR _CoinsScatteredText
db "@"

View file

@ -0,0 +1,50 @@
_ScrollTrainerPicAfterBattle: ; 396d3 (e:56d3)
; Load the enemy trainer's pic and scrolls it into
; the screen from the right.
xor a
ld [wEnemyMonSpecies2], a
ld b, $1
call GoPAL_SET
callab _LoadTrainerPic
hlCoord 19, 0
ld c, $0
.scrollLoop
inc c
ld a, c
cp 7
ret z
ld d, $0
push bc
push hl
.drawTrainerPicLoop
call DrawTrainerPicColumn
inc hl
ld a, 7
add d
ld d, a
dec c
jr nz, .drawTrainerPicLoop
ld c, 4
call DelayFrames
pop hl
pop bc
dec hl
jr .scrollLoop
; write one 7-tile column of the trainer pic to the tilemap
DrawTrainerPicColumn: ; 39707 (e:5707)
push hl
push de
push bc
ld e, 7
.loop
ld [hl], d
ld bc, SCREEN_WIDTH
add hl, bc
inc d
dec e
jr nz, .loop
pop bc
pop de
pop hl
ret

806
engine/battle/e.asm → engine/battle/trainer_ai.asm Executable file → Normal file
View file

@ -1,117 +1,3 @@
; does nothing since no stats are ever selected (barring glitches)
DoubleSelectedStats: ; 39680 (e:5680)
ld a, [H_WHOSETURN]
and a
ld a, [wPlayerStatsToDouble]
ld hl, wBattleMonAttack + 1
jr z, .notEnemyTurn
ld a, [wEnemyStatsToDouble]
ld hl, wEnemyMonAttack + 1
.notEnemyTurn
ld c, 4
ld b, a
.loop
srl b
call c, .doubleStat
inc hl
inc hl
dec c
ret z
jr .loop
.doubleStat
ld a, [hl]
add a
ld [hld], a
ld a, [hl]
rl a
ld [hli], a
ret
; does nothing since no stats are ever selected (barring glitches)
HalveSelectedStats: ; 396a7 (e:56a7)
ld a, [H_WHOSETURN]
and a
ld a, [wPlayerStatsToHalve]
ld hl, wBattleMonAttack
jr z, .notEnemyTurn
ld a, [wEnemyStatsToHalve]
ld hl, wEnemyMonAttack
.notEnemyTurn
ld c, 4
ld b, a
.loop
srl b
call c, .halveStat
inc hl
inc hl
dec c
ret z
jr .loop
.halveStat
ld a, [hl]
srl a
ld [hli], a
rr [hl]
or [hl]
jr nz, .nonzeroStat
ld [hl], 1
.nonzeroStat
dec hl
ret
_ScrollTrainerPicAfterBattle: ; 396d3 (e:56d3)
; Load the enemy trainer's pic and scrolls it into
; the screen from the right.
xor a
ld [wEnemyMonSpecies2], a
ld b, $1
call GoPAL_SET
callab _LoadTrainerPic
hlCoord 19, 0
ld c, $0
.scrollLoop
inc c
ld a, c
cp 7
ret z
ld d, $0
push bc
push hl
.drawTrainerPicLoop
call DrawTrainerPicColumn
inc hl
ld a, 7
add d
ld d, a
dec c
jr nz, .drawTrainerPicLoop
ld c, 4
call DelayFrames
pop hl
pop bc
dec hl
jr .scrollLoop
; write one 7-tile column of the trainer pic to the tilemap
DrawTrainerPicColumn: ; 39707 (e:5707)
push hl
push de
push bc
ld e, 7
.loop
ld [hl], d
ld bc, SCREEN_WIDTH
add hl, bc
inc d
dec e
jr nz, .loop
pop bc
pop de
pop hl
ret
; creates a set of moves that may be used and returns its address in hl ; creates a set of moves that may be used and returns its address in hl
; unused slots are filled with 0, all used slots may be chosen with equal probability ; unused slots are filled with 0, all used slots may be chosen with equal probability
AIEnemyTrainerChooseMoves: ; 39719 (e:5719) AIEnemyTrainerChooseMoves: ; 39719 (e:5719)
@ -227,17 +113,17 @@ AIMoveChoiceModificationFunctionPointers: ; 397a3 (e:57a3)
AIMoveChoiceModification1: ; 397ab (e:57ab) AIMoveChoiceModification1: ; 397ab (e:57ab)
ld a, [wBattleMonStatus] ld a, [wBattleMonStatus]
and a and a
ret z ; return if no status ailment on player's mon ret z ; return if no status ailment on player's mon
ld hl, wBuffer - 1 ; temp move selection array (-1 byte offest) ld hl, wBuffer - 1 ; temp move selection array (-1 byte offest)
ld de, wEnemyMonMoves ; enemy moves ld de, wEnemyMonMoves ; enemy moves
ld b, $5 ld b, NUM_MOVES + 1
.nextMove .nextMove
dec b dec b
ret z ; processed all 4 moves ret z ; processed all 4 moves
inc hl inc hl
ld a, [de] ld a, [de]
and a and a
ret z ; no more moves in move set ret z ; no more moves in move set
inc de inc de
call ReadMove call ReadMove
ld a, [W_ENEMYMOVEPOWER] ld a, [W_ENEMYMOVEPOWER]
@ -255,32 +141,34 @@ AIMoveChoiceModification1: ; 397ab (e:57ab)
pop hl pop hl
jr nc, .nextMove jr nc, .nextMove
ld a, [hl] ld a, [hl]
add $5 ; discourage move add $5 ; heavily discourage move
ld [hl], a ld [hl], a
jr .nextMove jr .nextMove
StatusAilmentMoveEffects ; 57e2 StatusAilmentMoveEffects ; 57e2
db $01 ; some sleep effect? db $01 ; unused sleep effect
db SLEEP_EFFECT db SLEEP_EFFECT
db POISON_EFFECT db POISON_EFFECT
db PARALYZE_EFFECT db PARALYZE_EFFECT
db $FF db $FF
; slightly encourage moves with specific effects ; slightly encourage moves with specific effects.
; in particular, stat-modifying moves and other move effects
; that fall in-bewteen
AIMoveChoiceModification2: ; 397e7 (e:57e7) AIMoveChoiceModification2: ; 397e7 (e:57e7)
ld a, [wccd5] ld a, [wAILayer2Encouragement]
cp $1 cp $1
ret nz ret nz
ld hl, wBuffer - 1 ; temp move selection array (-1 byte offest) ld hl, wBuffer - 1 ; temp move selection array (-1 byte offset)
ld de, wEnemyMonMoves ; enemy moves ld de, wEnemyMonMoves ; enemy moves
ld b, $5 ld b, NUM_MOVES + 1
.nextMove .nextMove
dec b dec b
ret z ; processed all 4 moves ret z ; processed all 4 moves
inc hl inc hl
ld a, [de] ld a, [de]
and a and a
ret z ; no more moves in move set ret z ; no more moves in move set
inc de inc de
call ReadMove call ReadMove
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
@ -294,21 +182,23 @@ AIMoveChoiceModification2: ; 397e7 (e:57e7)
jr c, .preferMove jr c, .preferMove
jr .nextMove jr .nextMove
.preferMove .preferMove
dec [hl] ; slighly encourage this move dec [hl] ; sligthly encourage this move
jr .nextMove jr .nextMove
; encourages moves that are effective against the player's mon ; encourages moves that are effective against the player's mon (even if non-damaging).
; discourage damaging moves that are ineffective or not very effective against the player's mon,
; unless there's no damaging move that deals at least neutral damage
AIMoveChoiceModification3: ; 39817 (e:5817) AIMoveChoiceModification3: ; 39817 (e:5817)
ld hl, wBuffer - 1 ; temp move selection array (-1 byte offest) ld hl, wBuffer - 1 ; temp move selection array (-1 byte offset)
ld de, wEnemyMonMoves ; enemy moves ld de, wEnemyMonMoves ; enemy moves
ld b, $5 ld b, $5
.nextMove .nextMove
dec b dec b
ret z ; processed all 4 moves ret z ; processed all 4 moves
inc hl inc hl
ld a, [de] ld a, [de]
and a and a
ret z ; no more moves in move set ret z ; no more moves in move set
inc de inc de
call ReadMove call ReadMove
push hl push hl
@ -322,16 +212,16 @@ AIMoveChoiceModification3: ; 39817 (e:5817)
cp $10 cp $10
jr z, .nextMove jr z, .nextMove
jr c, .notEffectiveMove jr c, .notEffectiveMove
dec [hl] ; slighly encourage this move dec [hl] ; sligthly encourage this move
jr .nextMove jr .nextMove
.notEffectiveMove ; discourages non-effective moves if better moves are available .notEffectiveMove ; discourages non-effective moves if better moves are available
push hl push hl
push de push de
push bc push bc
ld a, [W_ENEMYMOVETYPE] ld a, [W_ENEMYMOVETYPE]
ld d, a ld d, a
ld hl, wEnemyMonMoves ; enemy moves ld hl, wEnemyMonMoves ; enemy moves
ld b, $5 ld b, NUM_MOVES + 1
ld c, $0 ld c, $0
.loopMoves .loopMoves
dec b dec b
@ -342,17 +232,17 @@ AIMoveChoiceModification3: ; 39817 (e:5817)
call ReadMove call ReadMove
ld a, [W_ENEMYMOVEEFFECT] ld a, [W_ENEMYMOVEEFFECT]
cp SUPER_FANG_EFFECT cp SUPER_FANG_EFFECT
jr z, .betterMoveFound ; Super Fang is considered to be a better move jr z, .betterMoveFound ; Super Fang is considered to be a better move
cp SPECIAL_DAMAGE_EFFECT cp SPECIAL_DAMAGE_EFFECT
jr z, .betterMoveFound ; any special damage moves are considered to be better moves jr z, .betterMoveFound ; any special damage moves are considered to be better moves
cp FLY_EFFECT cp FLY_EFFECT
jr z, .betterMoveFound ; Fly is considered to be a better move jr z, .betterMoveFound ; Fly is considered to be a better move
ld a, [W_ENEMYMOVETYPE] ld a, [W_ENEMYMOVETYPE]
cp d cp d
jr z, .loopMoves jr z, .loopMoves
ld a, [W_ENEMYMOVEPOWER] ld a, [W_ENEMYMOVEPOWER]
and a and a
jr nz, .betterMoveFound ; damaging moves of a different type are considered to be better moves jr nz, .betterMoveFound ; damaging moves of a different type are considered to be better moves
jr .loopMoves jr .loopMoves
.betterMoveFound .betterMoveFound
ld c, a ld c, a
@ -363,7 +253,7 @@ AIMoveChoiceModification3: ; 39817 (e:5817)
pop hl pop hl
and a and a
jr z, .nextMove jr z, .nextMove
inc [hl] ; slighly discourage this move inc [hl] ; sligthly discourage this move
jr .nextMove jr .nextMove
AIMoveChoiceModification4: ; 39883 (e:5883) AIMoveChoiceModification4: ; 39883 (e:5883)
ret ret
@ -434,439 +324,13 @@ TrainerClassMoveChoiceModifications: ; 3989b (e:589b)
db 1,0 ; AGATHA db 1,0 ; AGATHA
db 1,3,0 ; LANCE db 1,3,0 ; LANCE
TrainerPicAndMoneyPointers: ; 39914 (e:5914) INCLUDE "engine/battle/trainer_pic_money_pointers.asm"
; trainer pic pointers and base money.
; money received after battle = base money × level of highest-level enemy mon INCLUDE "text/trainer_names.asm"
dw YoungsterPic
money 1500
dw BugCatcherPic INCLUDE "engine/battle/bank_e_misc.asm"
money 1000
dw LassPic INCLUDE "engine/battle/read_trainer_party.asm"
money 1500
dw SailorPic
money 3000
dw JrTrainerMPic
money 2000
dw JrTrainerFPic
money 2000
dw PokemaniacPic
money 5000
dw SuperNerdPic
money 2500
dw HikerPic
money 3500
dw BikerPic
money 2000
dw BurglarPic
money 9000
dw EngineerPic
money 5000
dw JugglerPic
money 3500
dw FisherPic
money 3500
dw SwimmerPic
money 500
dw CueBallPic
money 2500
dw GamblerPic
money 7000
dw BeautyPic
money 7000
dw PsychicPic
money 1000
dw RockerPic
money 2500
dw JugglerPic
money 3500
dw TamerPic
money 4000
dw BirdKeeperPic
money 2500
dw BlackbeltPic
money 2500
dw Rival1Pic
money 3500
dw ProfOakPic
money 9900
dw ChiefPic
money 3000
dw ScientistPic
money 5000
dw GiovanniPic
money 9900
dw RocketPic
money 3000
dw CooltrainerMPic
money 3500
dw CooltrainerFPic
money 3500
dw BrunoPic
money 9900
dw BrockPic
money 9900
dw MistyPic
money 9900
dw LtSurgePic
money 9900
dw ErikaPic
money 9900
dw KogaPic
money 9900
dw BlainePic
money 9900
dw SabrinaPic
money 9900
dw GentlemanPic
money 7000
dw Rival2Pic
money 6500
dw Rival3Pic
money 9900
dw LoreleiPic
money 9900
dw ChannelerPic
money 3000
dw AgathaPic
money 9900
dw LancePic
money 9900
INCLUDE "text/trainer_names.asm"
; formats a string at wMovesString that lists the moves at wMoves
FormatMovesString: ; 39b87 (e:5b87)
ld hl, wMoves
ld de, wMovesString
ld b, $0
.printMoveNameLoop
ld a, [hli]
and a ; end of move list?
jr z, .printDashLoop ; print dashes when no moves are left
push hl
ld [wd0b5], a
ld a, BANK(MoveNames)
ld [wPredefBank], a
ld a, MOVE_NAME
ld [wNameListType], a
call GetName
ld hl, wcd6d
.copyNameLoop
ld a, [hli]
cp $50
jr z, .doneCopyingName
ld [de], a
inc de
jr .copyNameLoop
.doneCopyingName
ld a, b
ld [wcd6c], a
inc b
ld a, $4e ; line break
ld [de], a
inc de
pop hl
ld a, b
cp NUM_MOVES
jr z, .done
jr .printMoveNameLoop
.printDashLoop
ld a, "-"
ld [de], a
inc de
inc b
ld a, b
cp NUM_MOVES
jr z, .done
ld a, $4e ; line break
ld [de], a
inc de
jr .printDashLoop
.done
ld a, "@"
ld [de], a
ret
; XXX this is called in a few places, but it doesn't appear to do anything useful
Func_39bd5: ; 39bd5 (e:5bd5)
ld a, [wd11b]
cp $1
jr nz, .asm_39be6
ld hl, wEnemyPartyCount
ld de, wEnemyMonOT
ld a, ENEMYOT_NAME
jr .asm_39c18
.asm_39be6
cp $4
jr nz, .calcAttackStat4
ld hl, wPartyCount
ld de, wPartyMonOT
ld a, PLAYEROT_NAME
jr .asm_39c18
.calcAttackStat4
cp $5
jr nz, .asm_39c02
ld hl, wStringBuffer2 + 11
ld de, MonsterNames
ld a, MONSTER_NAME
jr .asm_39c18
.asm_39c02
cp $2
jr nz, .asm_39c10
ld hl, wNumBagItems
ld de, ItemNames
ld a, ITEM_NAME
jr .asm_39c18
.asm_39c10
ld hl, wStringBuffer2 + 11
ld de, ItemNames
ld a, ITEM_NAME
.asm_39c18
ld [wNameListType], a
ld a, l
ld [wList], a
ld a, h
ld [wList + 1], a
ld a, e
ld [wcf8d], a
ld a, d
ld [wcf8e], a
ld bc, ItemPrices
ld a, c
ld [wItemPrices], a
ld a, b
ld [wItemPrices + 1], a
ret
; get species of mon e in list [wcc49] for LoadMonData
GetMonSpecies: ; 39c37 (e:5c37)
ld hl, wPartySpecies
ld a, [wcc49]
and a
jr z, .getSpecies
dec a
jr z, .enemyParty
ld hl, wBoxSpecies
jr .getSpecies
.enemyParty
ld hl, wEnemyPartyMons
.getSpecies
ld d, 0
add hl, de
ld a, [hl]
ld [wcf91], a
ret
ReadTrainer: ; 39c53 (e:5c53)
; don't change any moves in a link battle
ld a,[wLinkState]
and a
ret nz
; set [wEnemyPartyCount] to 0, [wEnemyPartyMons] to FF
; XXX first is total enemy pokemon?
; XXX second is species of first pokemon?
ld hl,wEnemyPartyCount
xor a
ld [hli],a
dec a
ld [hl],a
; get the pointer to trainer data for this class
ld a,[W_CUROPPONENT]
sub $C9 ; convert value from pokemon to trainer
add a,a
ld hl,TrainerDataPointers
ld c,a
ld b,0
add hl,bc ; hl points to trainer class
ld a,[hli]
ld h,[hl]
ld l,a
ld a,[W_TRAINERNO]
ld b,a
; At this point b contains the trainer number,
; and hl points to the trainer class.
; Our next task is to iterate through the trainers,
; decrementing b each time, until we get to the right one.
.outer
dec b
jr z,.IterateTrainer
.inner
ld a,[hli]
and a
jr nz,.inner
jr .outer
; if the first byte of trainer data is FF,
; - each pokemon has a specific level
; (as opposed to the whole team being of the same level)
; - if [W_LONEATTACKNO] != 0, one pokemon on the team has a special move
; else the first byte is the level of every pokemon on the team
.IterateTrainer
ld a,[hli]
cp $FF ; is the trainer special?
jr z,.SpecialTrainer ; if so, check for special moves
ld [W_CURENEMYLVL],a
.LoopTrainerData
ld a,[hli]
and a ; have we reached the end of the trainer data?
jr z,.FinishUp
ld [wcf91],a ; write species somewhere (XXX why?)
ld a,1
ld [wcc49],a
push hl
call AddPartyMon
pop hl
jr .LoopTrainerData
.SpecialTrainer
; if this code is being run:
; - each pokemon has a specific level
; (as opposed to the whole team being of the same level)
; - if [W_LONEATTACKNO] != 0, one pokemon on the team has a special move
ld a,[hli]
and a ; have we reached the end of the trainer data?
jr z,.AddLoneMove
ld [W_CURENEMYLVL],a
ld a,[hli]
ld [wcf91],a
ld a,1
ld [wcc49],a
push hl
call AddPartyMon
pop hl
jr .SpecialTrainer
.AddLoneMove
; does the trainer have a single monster with a different move
ld a,[W_LONEATTACKNO] ; Brock is 01, Misty is 02, Erika is 04, etc
and a
jr z,.AddTeamMove
dec a
add a,a
ld c,a
ld b,0
ld hl,LoneMoves
add hl,bc
ld a,[hli]
ld d,[hl]
ld hl,wEnemyMon1Moves + 2
ld bc,wEnemyMon2 - wEnemyMon1
call AddNTimes
ld [hl],d
jr .FinishUp
.AddTeamMove
; check if our trainer's team has special moves
; get trainer class number
ld a,[W_CUROPPONENT]
sub $C8
ld b,a
ld hl,TeamMoves
; iterate through entries in TeamMoves, checking each for our trainer class
.IterateTeamMoves
ld a,[hli]
cp b
jr z,.GiveTeamMoves ; is there a match?
inc hl ; if not, go to the next entry
inc a
jr nz,.IterateTeamMoves
; no matches found. is this trainer champion rival?
ld a,b
cp SONY3
jr z,.ChampionRival
jr .FinishUp ; nope
.GiveTeamMoves
ld a,[hl]
ld [wEnemyMon5Moves + 2],a
jr .FinishUp
.ChampionRival ; give moves to his team
; pidgeot
ld a,SKY_ATTACK
ld [wEnemyMon1Moves + 2],a
; starter
ld a,[W_RIVALSTARTER]
cp STARTER3
ld b,MEGA_DRAIN
jr z,.GiveStarterMove
cp STARTER1
ld b,FIRE_BLAST
jr z,.GiveStarterMove
ld b,BLIZZARD ; must be squirtle
.GiveStarterMove
ld a,b
ld [wEnemyMon6Moves + 2],a
.FinishUp ; XXX this needs documenting
xor a ; clear D079-D07B
ld de,wd079
ld [de],a
inc de
ld [de],a
inc de
ld [de],a
ld a,[W_CURENEMYLVL]
ld b,a
.LastLoop
ld hl,wd047
ld c,2
push bc
predef AddBCDPredef
pop bc
inc de
inc de
dec b
jr nz,.LastLoop
ret
INCLUDE "data/trainer_moves.asm" INCLUDE "data/trainer_moves.asm"
@ -1371,195 +835,3 @@ AIPrintItemUse_: ; 3a835 (e:6835)
AIBattleUseItemText: ; 3a844 (e:6844) AIBattleUseItemText: ; 3a844 (e:6844)
TX_FAR _AIBattleUseItemText TX_FAR _AIBattleUseItemText
db "@" db "@"
DrawAllPokeballs: ; 3a849 (e:6849)
call LoadPartyPokeballGfx
call SetupOwnPartyPokeballs
ld a, [W_ISINBATTLE] ; W_ISINBATTLE
dec a
ret z ; return if wild pokémon
jp SetupEnemyPartyPokeballs
DrawEnemyPokeballs: ; 0x3a857
call LoadPartyPokeballGfx
jp SetupEnemyPartyPokeballs
LoadPartyPokeballGfx: ; 3a85d (e:685d)
ld de, PokeballTileGraphics ; $697e
ld hl, vSprites + $310
ld bc, (BANK(PokeballTileGraphics) << 8) + $04
jp CopyVideoData
SetupOwnPartyPokeballs: ; 3a869 (e:6869)
call PlacePlayerHUDTiles
ld hl, wPartyMon1
ld de, wPartyCount ; wPartyCount
call SetupPokeballs
ld a, $60
ld hl, W_BASECOORDX ; wd081
ld [hli], a
ld [hl], a
ld a, $8
ld [wTrainerEngageDistance], a
ld hl, wOAMBuffer
jp WritePokeballOAMData
SetupEnemyPartyPokeballs: ; 3a887 (e:6887)
call PlaceEnemyHUDTiles
ld hl, wEnemyMons
ld de, wEnemyPartyCount ; wEnemyPartyCount
call SetupPokeballs
ld hl, W_BASECOORDX ; wd081
ld a, $48
ld [hli], a
ld [hl], $20
ld a, $f8
ld [wTrainerEngageDistance], a
ld hl, wOAMBuffer + PARTY_LENGTH * 4
jp WritePokeballOAMData
SetupPokeballs: ; 0x3a8a6
ld a, [de]
push af
ld de, wBuffer
ld c, PARTY_LENGTH
ld a, $34 ; empty pokeball
.emptyloop
ld [de], a
inc de
dec c
jr nz, .emptyloop
pop af
ld de, wBuffer
.monloop
push af
call PickPokeball
inc de
pop af
dec a
jr nz, .monloop
ret
PickPokeball: ; 3a8c2 (e:68c2)
inc hl
ld a, [hli]
and a
jr nz, .alive
ld a, [hl]
and a
ld b, $33 ; crossed ball (fainted)
jr z, .done_fainted
.alive
inc hl
inc hl
ld a, [hl] ; status
and a
ld b, $32 ; black ball (status)
jr nz, .done
dec b ; regular ball
jr .done
.done_fainted
inc hl
inc hl
.done
ld a, b
ld [de], a
ld bc, $0028 ; rest of mon struct
add hl, bc
ret
WritePokeballOAMData: ; 3a8e1 (e:68e1)
ld de, wBuffer
ld c, PARTY_LENGTH
.loop
ld a, [W_BASECOORDY] ; wd082
ld [hli], a
ld a, [W_BASECOORDX] ; wd081
ld [hli], a
ld a, [de]
ld [hli], a
xor a
ld [hli], a
ld a, [W_BASECOORDX] ; wd081
ld b, a
ld a, [wTrainerEngageDistance]
add b
ld [W_BASECOORDX], a ; wd081
inc de
dec c
jr nz, .loop
ret
PlacePlayerHUDTiles: ; 3a902 (e:6902)
ld hl, PlayerBattleHUDGraphicsTiles ; $6916
ld de, wTrainerFacingDirection
ld bc, $3
call CopyData
hlCoord 18, 10
ld de, rIE ; $ffff
jr PlaceHUDTiles
PlayerBattleHUDGraphicsTiles: ; 3a916 (e:6916)
; The tile numbers for specific parts of the battle display for the player's pokemon
db $73 ; unused ($73 is hardcoded into the routine that uses these bytes)
db $77 ; lower-right corner tile of the HUD
db $6F ; lower-left triangle tile of the HUD
PlaceEnemyHUDTiles: ; 3a919 (e:6919)
ld hl, EnemyBattleHUDGraphicsTiles ; $692d
ld de, wTrainerFacingDirection
ld bc, $3
call CopyData
hlCoord 1, 2
ld de, $1
jr PlaceHUDTiles
EnemyBattleHUDGraphicsTiles: ; 3a92d (e:692d)
; The tile numbers for specific parts of the battle display for the enemy
db $73 ; unused ($73 is hardcoded in the routine that uses these bytes)
db $74 ; lower-left corner tile of the HUD
db $78 ; lower-right triangle tile of the HUD
PlaceHUDTiles: ; 3a930 (e:6930)
ld [hl], $73
ld bc, $14
add hl, bc
ld a, [wTrainerScreenY]
ld [hl], a
ld a, $8
.asm_3a93c
add hl, de
ld [hl], $76
dec a
jr nz, .asm_3a93c
add hl, de
ld a, [wTrainerScreenX]
ld [hl], a
ret
SetupPlayerAndEnemyPokeballs: ; 3a948 (e:6948)
call LoadPartyPokeballGfx
ld hl, wPartyMon1Species ; wPartyMon1Species (aliases: wPartyMon1)
ld de, wPartyCount ; wPartyCount
call SetupPokeballs
ld hl, W_BASECOORDX ; wd081
ld a, $50
ld [hli], a
ld [hl], $40
ld a, $8
ld [wTrainerEngageDistance], a
ld hl, wOAMBuffer
call WritePokeballOAMData
ld hl, wEnemyMons ; wEnemyMon1Species
ld de, wEnemyPartyCount ; wEnemyPartyCount
call SetupPokeballs
ld hl, W_BASECOORDX ; wd081
ld a, $50
ld [hli], a
ld [hl], $68
ld hl, wOAMBuffer + $18
jp WritePokeballOAMData
; four tiles: pokeball, black pokeball (status ailment), crossed out pokeball (faited) and pokeball slot (no mon)
PokeballTileGraphics:: ; 3a97e (e:697e)
INCBIN "gfx/pokeball.2bpp"

View file

@ -0,0 +1,143 @@
TrainerPicAndMoneyPointers: ; 39914 (e:5914)
; trainer pic pointers and base money.
; money received after battle = base money × level of highest-level enemy mon
dw YoungsterPic
money 1500
dw BugCatcherPic
money 1000
dw LassPic
money 1500
dw SailorPic
money 3000
dw JrTrainerMPic
money 2000
dw JrTrainerFPic
money 2000
dw PokemaniacPic
money 5000
dw SuperNerdPic
money 2500
dw HikerPic
money 3500
dw BikerPic
money 2000
dw BurglarPic
money 9000
dw EngineerPic
money 5000
dw JugglerPic
money 3500
dw FisherPic
money 3500
dw SwimmerPic
money 500
dw CueBallPic
money 2500
dw GamblerPic
money 7000
dw BeautyPic
money 7000
dw PsychicPic
money 1000
dw RockerPic
money 2500
dw JugglerPic
money 3500
dw TamerPic
money 4000
dw BirdKeeperPic
money 2500
dw BlackbeltPic
money 2500
dw Rival1Pic
money 3500
dw ProfOakPic
money 9900
dw ChiefPic
money 3000
dw ScientistPic
money 5000
dw GiovanniPic
money 9900
dw RocketPic
money 3000
dw CooltrainerMPic
money 3500
dw CooltrainerFPic
money 3500
dw BrunoPic
money 9900
dw BrockPic
money 9900
dw MistyPic
money 9900
dw LtSurgePic
money 9900
dw ErikaPic
money 9900
dw KogaPic
money 9900
dw BlainePic
money 9900
dw SabrinaPic
money 9900
dw GentlemanPic
money 7000
dw Rival2Pic
money 6500
dw Rival3Pic
money 9900
dw LoreleiPic
money 9900
dw ChannelerPic
money 3000
dw AgathaPic
money 9900
dw LancePic
money 9900

View file

@ -0,0 +1,62 @@
; does nothing since no stats are ever selected (barring glitches)
DoubleSelectedStats: ; 39680 (e:5680)
ld a, [H_WHOSETURN]
and a
ld a, [wPlayerStatsToDouble]
ld hl, wBattleMonAttack + 1
jr z, .notEnemyTurn
ld a, [wEnemyStatsToDouble]
ld hl, wEnemyMonAttack + 1
.notEnemyTurn
ld c, 4
ld b, a
.loop
srl b
call c, .doubleStat
inc hl
inc hl
dec c
ret z
jr .loop
.doubleStat
ld a, [hl]
add a
ld [hld], a
ld a, [hl]
rl a
ld [hli], a
ret
; does nothing since no stats are ever selected (barring glitches)
HalveSelectedStats: ; 396a7 (e:56a7)
ld a, [H_WHOSETURN]
and a
ld a, [wPlayerStatsToHalve]
ld hl, wBattleMonAttack
jr z, .notEnemyTurn
ld a, [wEnemyStatsToHalve]
ld hl, wEnemyMonAttack
.notEnemyTurn
ld c, 4
ld b, a
.loop
srl b
call c, .halveStat
inc hl
inc hl
dec c
ret z
jr .loop
.halveStat
ld a, [hl]
srl a
ld [hli], a
rr [hl]
or [hl]
jr nz, .nonzeroStat
ld [hl], 1
.nonzeroStat
dec hl
ret

View file

@ -0,0 +1,118 @@
; try to initiate a wild pokemon encounter
; returns success in Z
TryDoWildEncounter: ; 13870 (4:7870)
ld a, [wNPCMovementScriptPointerTableNum]
and a
ret nz
ld a, [wd736]
and a
ret nz
callab IsPlayerStandingOnDoorTileOrWarpTile
jr nc, .notStandingOnDoorOrWarpTile
.CantEncounter
ld a, $1
and a
ret
.notStandingOnDoorOrWarpTile
callab IsPlayerJustOutsideMap
jr z, .CantEncounter
ld a, [wRepelRemainingSteps]
and a
jr z, .asm_1389e
dec a
jr z, .lastRepelStep
ld [wRepelRemainingSteps], a
.asm_1389e
; determine if wild pokémon can appear in the half-block were standing in
; is the bottom right tile (9,9) of the half-block we're standing in a grass/water tile?
hlCoord 9, 9
ld c, [hl]
ld a, [W_GRASSTILE]
cp c
ld a, [W_GRASSRATE]
jr z, .CanEncounter
ld a, $14 ; in all tilesets with a water tile, this is its id
cp c
ld a, [W_WATERRATE]
jr z, .CanEncounter
; even if not in grass/water, standing anywhere we can encounter pokémon
; so long as the map is “indoor” and has wild pokémon defined.
; …as long as its not Viridian Forest or Safari Zone.
ld a, [W_CURMAP]
cp REDS_HOUSE_1F ; is this an indoor map?
jr c, .CantEncounter2
ld a, [W_CURMAPTILESET]
cp FOREST ; Viridian Forest/Safari Zone
jr z, .CantEncounter2
ld a, [W_GRASSRATE]
.CanEncounter
; compare encounter chance with a random number to determine if there will be an encounter
ld b, a
ld a, [hRandomAdd]
cp b
jr nc, .CantEncounter2
ld a, [hRandomSub]
ld b, a
ld hl, WildMonEncounterSlotChances
.determineEncounterSlot
ld a, [hli]
cp b
jr nc, .gotEncounterSlot
inc hl
jr .determineEncounterSlot
.gotEncounterSlot
; determine which wild pokémon (grass or water) can appear in the half-block were standing in
ld c, [hl]
ld hl, W_GRASSMONS
aCoord 8, 9
cp $14 ; is the bottom left tile (8,9) of the half-block we're standing in a water tile?
jr nz, .gotWildEncounterType ; else, it's treated as a grass tile by default
ld hl, W_WATERMONS
; since the bottom right tile of a "left shore" half-block is $14 but the bottom left tile is not,
; "left shore" half-blocks (such as the one in the east coast of Cinnabar) load grass encounters.
.gotWildEncounterType
ld b, $0
add hl, bc
ld a, [hli]
ld [W_CURENEMYLVL], a
ld a, [hl]
ld [wcf91], a
ld [wEnemyMonSpecies2], a
ld a, [wRepelRemainingSteps]
and a
jr z, .willEncounter
ld a, [wPartyMon1Level]
ld b, a
ld a, [W_CURENEMYLVL]
cp b
jr c, .CantEncounter2 ; repel prevents encounters if the leading party mon's level is higher than the wild mon
jr .willEncounter
.lastRepelStep
ld [wRepelRemainingSteps], a
ld a, $d2
ld [H_DOWNARROWBLINKCNT2], a
call EnableAutoTextBoxDrawing
call DisplayTextID
.CantEncounter2
ld a, $1
and a
ret
.willEncounter
xor a
ret
WildMonEncounterSlotChances: ; 13918 (4:7918)
; There are 10 slots for wild pokemon, and this is the table that defines how common each of
; those 10 slots is. A random number is generated and then the first byte of each pair in this
; table is compared against that random number. If the random number is less than or equal
; to the first byte, then that slot is chosen. The second byte is double the slot number.
db $32, $00 ; 51/256 = 19.9% chance of slot 0
db $65, $02 ; 51/256 = 19.9% chance of slot 1
db $8C, $04 ; 39/256 = 15.2% chance of slot 2
db $A5, $06 ; 25/256 = 9.8% chance of slot 3
db $BE, $08 ; 25/256 = 9.8% chance of slot 4
db $D7, $0A ; 25/256 = 9.8% chance of slot 5
db $E4, $0C ; 13/256 = 5.1% chance of slot 6
db $F1, $0E ; 13/256 = 5.1% chance of slot 7
db $FC, $10 ; 11/256 = 4.3% chance of slot 8
db $FF, $12 ; 3/256 = 1.2% chance of slot 9

View file

@ -320,8 +320,8 @@ ItemUseBall: ; d687 (3:5687)
ld [W_ANIMATIONID],a ld [W_ANIMATIONID],a
xor a xor a
ld [$fff3],a ld [$fff3],a
ld [wcc5b],a ld [wAnimationType],a
ld [wd05b],a ld [wDamageMultipliers],a
ld a,[wWhichPokemon] ld a,[wWhichPokemon]
push af push af
ld a,[wcf91] ld a,[wcf91]

View file

@ -1,3 +1,67 @@
DrawHP: ; 128ef (4:68ef)
; Draws the HP bar in the stats screen
call GetPredefRegisters
ld a, $1
jr DrawHP_
DrawHP2: ; 128f6 (4:68f6)
; Draws the HP bar in the party screen
call GetPredefRegisters
ld a, $2
DrawHP_: ; 128fb (4:68fb)
ld [wHPBarType], a
push hl
ld a, [wLoadedMonHP]
ld b, a
ld a, [wLoadedMonHP + 1]
ld c, a
or b
jr nz, .nonzeroHP
xor a
ld c, a
ld e, a
ld a, $6
ld d, a
jp .drawHPBarAndPrintFraction
.nonzeroHP
ld a, [wLoadedMonMaxHP]
ld d, a
ld a, [wLoadedMonMaxHP + 1]
ld e, a
predef HPBarLength
ld a, $6
ld d, a
ld c, a
.drawHPBarAndPrintFraction
pop hl
push de
push hl
push hl
call DrawHPBar
pop hl
ld a, [hFlags_0xFFF6]
bit 0, a
jr z, .printFractionBelowBar
ld bc, $9 ; right of bar
jr .printFraction
.printFractionBelowBar
ld bc, SCREEN_WIDTH + 1 ; below bar
.printFraction
add hl, bc
ld de, wLoadedMonHP
ld bc, $203
call PrintNumber
ld a, "/"
ld [hli], a
ld de, wLoadedMonMaxHP
ld bc, $203
call PrintNumber
pop hl
pop de
ret
; Predef 0x37 ; Predef 0x37
StatusScreen: ; 12953 (4:6953) StatusScreen: ; 12953 (4:6953)
call LoadMonData call LoadMonData

View file

@ -0,0 +1,16 @@
; returns whether the player is one tile outside the map in Z
IsPlayerJustOutsideMap: ; 128d8 (4:68d8)
ld a, [W_YCOORD]
ld b, a
ld a, [W_CURMAPHEIGHT]
call .compareCoordWithMapDimension
ret z
ld a, [W_XCOORD]
ld b, a
ld a, [W_CURMAPWIDTH]
.compareCoordWithMapDimension
add a
cp b
ret z
inc b
ret

View file

@ -1907,7 +1907,7 @@ FieldMoveDisplayData: ; 7823 (1:7823)
db $ff ; list terminator db $ff ; list terminator
INCLUDE "engine/battle/1.asm" INCLUDE "engine/battle/moveEffects/drain_hp_effect.asm"
INCLUDE "engine/menu/players_pc.asm" INCLUDE "engine/menu/players_pc.asm"
@ -4755,7 +4755,7 @@ PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp"
SECTION "Battle (bank 4)", ROMX, BANK[$4] SECTION "Battle (bank 4)", ROMX, BANK[$4]
INCLUDE "engine/battle/4.asm" INCLUDE "engine/overworld/is_player_just_outside_map.asm"
INCLUDE "engine/menu/status_screen.asm" INCLUDE "engine/menu/status_screen.asm"
INCLUDE "engine/menu/party_menu.asm" INCLUDE "engine/menu/party_menu.asm"
@ -4766,7 +4766,12 @@ ShrinkPic2:: INCBIN "pic/trainer/shrink2.pic"
INCLUDE "engine/turn_sprite.asm" INCLUDE "engine/turn_sprite.asm"
INCLUDE "engine/menu/start_sub_menus.asm" INCLUDE "engine/menu/start_sub_menus.asm"
INCLUDE "engine/items/tms.asm" INCLUDE "engine/items/tms.asm"
INCLUDE "engine/battle/4_2.asm" INCLUDE "engine/battle/end_of_battle.asm"
INCLUDE "engine/battle/wild_encounters.asm"
INCLUDE "engine/battle/moveEffects/recoil_effect.asm"
INCLUDE "engine/battle/moveEffects/conversion_effect.asm"
INCLUDE "engine/battle/moveEffects/haze_effect.asm"
INCLUDE "engine/battle/get_trainer_name.asm"
INCLUDE "engine/random.asm" INCLUDE "engine/random.asm"
@ -4820,7 +4825,7 @@ INCLUDE "engine/load_pokedex_tiles.asm"
INCLUDE "engine/overworld/map_sprites.asm" INCLUDE "engine/overworld/map_sprites.asm"
INCLUDE "engine/overworld/emotion_bubbles.asm" INCLUDE "engine/overworld/emotion_bubbles.asm"
INCLUDE "engine/evolve_trade.asm" INCLUDE "engine/evolve_trade.asm"
INCLUDE "engine/battle/5.asm" INCLUDE "engine/battle/moveEffects/substitute_effect.asm"
INCLUDE "engine/menu/pc.asm" INCLUDE "engine/menu/pc.asm"
@ -5149,7 +5154,9 @@ TangelaPicBack:: INCBIN "pic/monback/tangelab.pic"
SECTION "Battle (bank 9)", ROMX, BANK[$9] SECTION "Battle (bank 9)", ROMX, BANK[$9]
INCLUDE "engine/battle/9.asm" INCLUDE "engine/battle/print_type.asm"
INCLUDE "engine/battle/save_trainer_name.asm"
INCLUDE "engine/battle/moveEffects/focus_energy_effect.asm"
SECTION "Pics 2", ROMX, BANK[PICS_2] SECTION "Pics 2", ROMX, BANK[PICS_2]
@ -5221,7 +5228,7 @@ MoltresPicBack:: INCBIN "pic/monback/moltresb.pic"
SECTION "Battle (bank A)", ROMX, BANK[$A] SECTION "Battle (bank A)", ROMX, BANK[$A]
INCLUDE "engine/battle/a.asm" INCLUDE "engine/battle/moveEffects/leech_seed_effect.asm"
SECTION "Pics 3", ROMX, BANK[PICS_3] SECTION "Pics 3", ROMX, BANK[PICS_3]
@ -5300,7 +5307,7 @@ FossilKabutopsPic:: INCBIN "pic/bmon/fossilkabutops.pic"
SECTION "Battle (bank B)", ROMX, BANK[$B] SECTION "Battle (bank B)", ROMX, BANK[$B]
INCLUDE "engine/battle/b.asm" INCLUDE "engine/battle/display_effectiveness.asm"
TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp" TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp"
BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp" BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp"
@ -5308,7 +5315,8 @@ CircleTile: INCBIN "gfx/circle_tile.2bpp"
BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp" BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp"
INCLUDE "engine/items/tmhm.asm" INCLUDE "engine/items/tmhm.asm"
INCLUDE "engine/battle/b_2.asm" INCLUDE "engine/battle/scale_sprites.asm"
INCLUDE "engine/battle/moveEffects/pay_day_effect.asm"
INCLUDE "engine/game_corner_slots2.asm" INCLUDE "engine/game_corner_slots2.asm"
@ -5378,7 +5386,8 @@ OldManPic:: INCBIN "pic/trainer/oldman.pic"
SECTION "Battle (bank C)", ROMX, BANK[$C] SECTION "Battle (bank C)", ROMX, BANK[$C]
INCLUDE "engine/battle/c.asm" INCLUDE "engine/battle/moveEffects/mist_effect.asm"
INCLUDE "engine/battle/moveEffects/one_hit_ko_effect.asm"
SECTION "Pics 5", ROMX, BANK[PICS_5] SECTION "Pics 5", ROMX, BANK[PICS_5]
@ -5442,7 +5451,7 @@ VictreebelPicBack:: INCBIN "pic/monback/victreebelb.pic"
SECTION "Battle (bank D)", ROMX, BANK[$D] SECTION "Battle (bank D)", ROMX, BANK[$D]
INCLUDE "engine/titlescreen2.asm" INCLUDE "engine/titlescreen2.asm"
INCLUDE "engine/battle/d.asm" INCLUDE "engine/battle/link_battle_versus_text.asm"
INCLUDE "engine/slot_machine.asm" INCLUDE "engine/slot_machine.asm"
INCLUDE "engine/overworld/pewter_guys.asm" INCLUDE "engine/overworld/pewter_guys.asm"
INCLUDE "engine/multiply_divide.asm" INCLUDE "engine/multiply_divide.asm"
@ -5454,7 +5463,10 @@ SECTION "bankE",ROMX,BANK[$E]
INCLUDE "data/moves.asm" INCLUDE "data/moves.asm"
BaseStats: INCLUDE "data/base_stats.asm" BaseStats: INCLUDE "data/base_stats.asm"
INCLUDE "data/cries.asm" INCLUDE "data/cries.asm"
INCLUDE "engine/battle/e.asm" INCLUDE "engine/battle/unused_stats_functions.asm"
INCLUDE "engine/battle/scroll_draw_trainer_pic.asm"
INCLUDE "engine/battle/trainer_ai.asm"
INCLUDE "engine/battle/draw_hud_pokeball_gfx.asm"
TradingAnimationGraphics: TradingAnimationGraphics:
INCBIN "gfx/game_boy.norepeat.2bpp" INCBIN "gfx/game_boy.norepeat.2bpp"
@ -5465,7 +5477,9 @@ TradingAnimationGraphics2:
INCBIN "gfx/trade2.2bpp" INCBIN "gfx/trade2.2bpp"
INCLUDE "engine/evos_moves.asm" INCLUDE "engine/evos_moves.asm"
INCLUDE "engine/battle/e_2.asm" INCLUDE "engine/battle/moveEffects/heal_effect.asm"
INCLUDE "engine/battle/moveEffects/transform_effect.asm"
INCLUDE "engine/battle/moveEffects/reflect_light_screen_effect.asm"
SECTION "bankF",ROMX,BANK[$F] SECTION "bankF",ROMX,BANK[$F]
@ -5938,7 +5952,8 @@ INCLUDE "scripts/mansion4.asm"
INCLUDE "data/mapObjects/mansion4.asm" INCLUDE "data/mapObjects/mansion4.asm"
Mansion4Blocks: INCBIN "maps/mansion4.blk" Mansion4Blocks: INCBIN "maps/mansion4.blk"
INCLUDE "engine/battle/14.asm" INCLUDE "engine/battle/init_battle_variables.asm"
INCLUDE "engine/battle/moveEffects/paralyze_effect.asm"
INCLUDE "engine/overworld/card_key.asm" INCLUDE "engine/overworld/card_key.asm"
@ -5999,7 +6014,7 @@ DayCareMBlocks: INCBIN "maps/daycarem.blk"
FuchsiaHouse3Blocks: INCBIN "maps/fuchsiahouse3.blk" FuchsiaHouse3Blocks: INCBIN "maps/fuchsiahouse3.blk"
INCLUDE "engine/battle/15.asm" INCLUDE "engine/battle/experience.asm"
INCLUDE "scripts/route2.asm" INCLUDE "scripts/route2.asm"
INCLUDE "scripts/route3.asm" INCLUDE "scripts/route3.asm"
@ -6079,7 +6094,7 @@ Route18Blocks: INCBIN "maps/route18.blk"
INCBIN "maps/unusedblocks58d7d.blk" INCBIN "maps/unusedblocks58d7d.blk"
INCLUDE "engine/battle/16.asm" INCLUDE "engine/battle/common_text.asm"
INCLUDE "engine/experience.asm" INCLUDE "engine/experience.asm"
@ -6436,7 +6451,7 @@ Plateau_Block: INCBIN "gfx/blocksets/plateau.bst"
SECTION "bank1A",ROMX,BANK[$1A] SECTION "bank1A",ROMX,BANK[$1A]
INCLUDE "engine/battle/1a.asm" INCLUDE "engine/battle/decrement_pp.asm"
Version_GFX: Version_GFX:
IF DEF(_RED) IF DEF(_RED)
@ -6493,7 +6508,8 @@ INCLUDE "engine/gamefreak.asm"
INCLUDE "engine/hall_of_fame.asm" INCLUDE "engine/hall_of_fame.asm"
INCLUDE "engine/overworld/healing_machine.asm" INCLUDE "engine/overworld/healing_machine.asm"
INCLUDE "engine/overworld/player_animations.asm" INCLUDE "engine/overworld/player_animations.asm"
INCLUDE "engine/battle/1c.asm" INCLUDE "engine/battle/ghost_marowak_anim.asm"
INCLUDE "engine/battle/battle_transitions.asm"
INCLUDE "engine/town_map.asm" INCLUDE "engine/town_map.asm"
INCLUDE "engine/mon_party_sprites.asm" INCLUDE "engine/mon_party_sprites.asm"
INCLUDE "engine/in_game_trades.asm" INCLUDE "engine/in_game_trades.asm"

View file

@ -351,6 +351,10 @@ wNPCMovementScriptBank:: ; cc58
ds 2 ds 2
wHallOfFame:: ; cc5b wHallOfFame:: ; cc5b
wBoostExpByExpAll:: ; cc5b
wAnimationType:: ; cc5b
; values between 0-6. Shake screen horizontally, shake screen vertically, blink Pokemon...
wcc5b:: ds 1 wcc5b:: ds 1
wcc5c:: ds 1 wcc5c:: ds 1
wcc5d:: ds 1 wcc5d:: ds 1
@ -377,7 +381,11 @@ wSimulatedJoypadStatesEnd:: ; ccd3
wccd3:: ds 1 wccd3:: ds 1
wccd4:: ds 1 wccd4:: ds 1
wccd5:: ds 2
; if [ccd5] != 1, the second AI layer is not applied
wAILayer2Encouragement:: ; ccd5
ds 1
ds 1
; current HP of player and enemy substitutes ; current HP of player and enemy substitutes
wPlayerSubstituteHP:: ; ccd7 wPlayerSubstituteHP:: ; ccd7
@ -424,14 +432,14 @@ wSafariBaitFactor:: ; cce9
wcceb:: ds 1 wcceb:: ds 1
wccec:: ds 1 wccec:: ds 1
wcced:: ds 1 wMonIsDisobedient:: ds 1
wccee:: ds 1 wccee:: ds 1
wccef:: ds 1 wccef:: ds 1
wccf0:: ds 1 wccf0:: ds 1
wPlayerUsedMove:: ds 1 wPlayerUsedMove:: ds 1
wEnemyUsedMove:: ds 1 wEnemyUsedMove:: ds 1
wccf3:: ds 1 wccf3:: ds 1
wccf4:: ds 1 wMoveDidntMiss:: ds 1
wPartyFoughtCurrentEnemyFlags:: wPartyFoughtCurrentEnemyFlags::
; flags that indicate which party members have fought the current enemy mon ; flags that indicate which party members have fought the current enemy mon
@ -783,7 +791,9 @@ wcf30:: ds 7
wcf37:: ds 20 wcf37:: ds 20
wcf4b:: ds 1 wcf4b:: ds 1
wcf4c:: ds 1 wcf4c:: ds 1
wcf4d:: ds 18 wGainBoostedExp:: ; cf4d
ds 1
ds 17
wGymCityName:: ; cf5f wGymCityName:: ; cf5f
wStringBuffer1:: ; cf5f wStringBuffer1:: ; cf5f
@ -967,7 +977,14 @@ W_BATTLETYPE:: ; d05a
; in safari battle, this is 2 ; in safari battle, this is 2
ds 1 ds 1
wd05b:: ds 1 wDamageMultipliers:: ; d05b
; bits 0-6: Effectiveness
; $0 = immune
; $5 = not very effective
; $a = neutral
; $14 = super-effective
; bit 7: STAB
ds 1
W_LONEATTACKNO:: ; d05c W_LONEATTACKNO:: ; d05c
; which entry in LoneAttacks to use ; which entry in LoneAttacks to use