pokeyellow/yellow/main.asm
luckytyphlosion 80bbf5ac91 engine/text_boxes.asm
Also remove hROMBankTemp and manually supply gfx.py
2015-11-13 13:11:05 -05:00

4606 lines
104 KiB
NASM
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

INCLUDE "charmap.asm"
INCLUDE "constants.asm"
NPC_SPRITES_1 EQU $4
NPC_SPRITES_2 EQU $5
GFX EQU $4
PICS_1 EQU $9
PICS_2 EQU $A
PICS_3 EQU $B
PICS_4 EQU $C
PICS_5 EQU $D
SECTION "home",ROM0
INCLUDE "home.asm"
SECTION "bank01",ROMX,BANK[$01]
INCLUDE "data/facing.asm"
INCLUDE "engine/battle/safari_zone.asm"
INCLUDE "engine/titlescreen.asm"
LoadMonData_: ; 442b (1:442b)
; Load monster [wWhichPokemon] from list [wMonDataLocation]:
; 0: partymon
; 1: enemymon
; 2: boxmon
; 3: daycaremon
; Return monster id at wcf91 and its data at wLoadedMon.
; Also load base stats at wMonHeader for convenience.
ld a, [wDayCareMonSpecies]
ld [wcf91], a
ld a, [wMonDataLocation]
cp DAYCARE_DATA
jr z, .GetMonHeader
ld a, [wWhichPokemon]
ld e, a
call GetMonSpecies
.GetMonHeader
ld a, [wcf91]
ld [wd0b5], a ; input for GetMonHeader
call GetMonHeader
ld hl, wPartyMons
ld bc, wPartyMon2 - wPartyMon1
ld a, [wMonDataLocation]
cp ENEMY_PARTY_DATA
jr c, .getMonEntry
ld hl, wEnemyMons
jr z, .getMonEntry
cp 2
ld hl, wBoxMons
ld bc, wBoxMon2 - wBoxMon1
jr z, .getMonEntry
ld hl, wDayCareMon
jr .copyMonData
.getMonEntry
ld a, [wWhichPokemon]
call AddNTimes
.copyMonData
ld de, wLoadedMon
ld bc, wPartyMon2 - wPartyMon1
jp CopyData
; get species of mon e in list [wMonDataLocation] for LoadMonData
GetMonSpecies: ; 4478 (1:4478)
ld hl, wPartySpecies
ld a, [wMonDataLocation]
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
INCLUDE "data/item_prices.asm"
INCLUDE "text/item_names.asm"
UnusedNames: ; 491e (1:491e)
db "かみなりバッヂ@"
db "かいがらバッヂ@"
db "おじぞうバッヂ@"
db "はやぶさバッヂ@"
db "ひんやりバッヂ@"
db "なかよしバッヂ@"
db "バラバッヂ@"
db "ひのたまバッヂ@"
db "ゴールドバッヂ@"
db "たまご@"
db "ひよこ@"
db "ブロンズ@"
db "シルバー@"
db "ゴールド@"
db "プチキャプテン@"
db "キャプテン@"
db "プチマスター@"
db "マスター@"
db "エクセレント"
INCLUDE "engine/overworld/oam.asm"
PrintWaitingText: ; 4b89 (1:4b89)
coord hl, 3, 10
lb bc, 1, 11
ld a, [wIsInBattle]
and a
jr z, .asm_4b9a
call TextBoxBorder
jr .asm_4b9d
.asm_4b9a
call CableClub_TextBoxBorder
.asm_4b9d
coord hl, 4, 11
ld de, WaitingText
call PlaceString
ld c, 50
jp DelayFrames
WaitingText: ; 4bab (1:4bab)
db "Waiting...!@"
_UpdateSprites: ; 4bb7 (1:4bb7)
ld h, wSpriteStateData1 / $100
inc h
ld a, $e ; (wSpriteStateData2 + $0e) & $ff
.spriteLoop
ld l, a
sub $e
ld c, a
ld [H_CURRENTSPRITEOFFSET], a
ld a, [hl]
and a
jr z, .skipSprite ; tests $c2Xe
push hl
push de
push bc
call .updateCurrentSprite
pop bc
pop de
pop hl
.skipSprite
ld a, l
add $10 ; move to next sprite
cp $e ; test for overflow (back at $0e)
jr nz, .spriteLoop
ret
.updateCurrentSprite ; 4bd7 (1:4bd7)
ld a, [H_CURRENTSPRITEOFFSET]
and a
jp z, UpdatePlayerSprite
cp $f0 ; pikachu
jp z, Func_1552
ld a, [hl]
UpdateNonPlayerSprite: ; 4be3 (1:4be3)
dec a
swap a
ld [$ff93], a ; $10 * sprite#
ld a, [wNPCMovementScriptSpriteOffset] ; some sprite offset?
ld b, a
ld a, [H_CURRENTSPRITEOFFSET]
cp b
jr nz, .unequal
jp DoScriptedNPCMovement
.unequal
jp UpdateNPCSprite
; This detects if the current sprite (whose offset is at H_CURRENTSPRITEOFFSET)
; is going to collide with another sprite by looping over the other sprites.
; The current sprite's offset will be labelled with i (e.g. $c1i0).
; The loop sprite's offset will labelled with j (e.g. $c1j0).
;
; Note that the Y coordinate of the sprite (in [$c1k4]) is one of the following
; 9 values when the sprite is aligned with the grid: $fc, $0c, $1c, $2c, ..., $7c.
; The reason that 4 is added below to the coordinate is to make it align with a
; multiple of $10 to make comparisons easier.
DetectCollisionBetweenSprites: ; 4bf7 (1:4bf7)
; nop
ld h, wSpriteStateData1 / $100
ld a, [H_CURRENTSPRITEOFFSET]
ld l, a
ld a, [hl] ; a = [$c1i0] (picture) (0 if slot is unused)
and a ; is this sprite slot slot used?
ret z ; return if not used
ld a, l
add 3
ld l, a
ld a, [hli] ; a = [$c1i3] (delta Y) (-1, 0, or 1)
call SetSpriteCollisionValues
ld a, [hli] ; a = [$C1i4] (Y screen coordinate)
add 4 ; align with multiple of $10
; The effect of the following 3 lines is to
; add 7 to a if moving south or
; subtract 7 from a if moving north.
add b
and $f0
or c
ld [$ff90], a ; store Y coordinate adjusted for direction of movement
ld a, [hli] ; a = [$c1i5] (delta X) (-1, 0, or 1)
call SetSpriteCollisionValues
ld a, [hl] ; a = [$C1i6] (X screen coordinate)
; The effect of the following 3 lines is to
; add 7 to a if moving east or
; subtract 7 from a if moving west.
add b
and $f0
or c
ld [$ff91], a ; store X coordinate adjusted for direction of movement
ld a, l
add 7
ld l, a
xor a
ld [hld], a ; zero [$c1id] XXX what's [$c1id] for?
ld [hld], a ; zero [$c1ic] (directions in which collisions occurred)
ld a, [$ff91]
ld [hld], a ; [$c1ib] = adjusted X coordinate
ld a, [$ff90]
ld [hl], a ; [$c1ia] = adjusted Y coordinate
xor a ; zero the loop counter
.loop
ld [$ff8f], a ; store loop counter
swap a
ld e, a
ld a, [H_CURRENTSPRITEOFFSET]
cp e ; does the loop sprite match the current sprite?
jp z, .next ; go to the next sprite if they match
ld d, h
ld a, [de] ; a = [$c1j0] (picture) (0 if slot is unused)
and a ; is this sprite slot slot used?
jp z, .next ; go the next sprite if not used
inc e
inc e
ld a, [de] ; a = [$c1j2] ($ff means the sprite is offscreen)
inc a
jp z, .next ; go the next sprite if offscreen
ld a, [H_CURRENTSPRITEOFFSET]
add 10
ld l, a
inc e
ld a, [de] ; a = [$c1j3] (delta Y)
call SetSpriteCollisionValues
inc e
ld a, [de] ; a = [$C1j4] (Y screen coordinate)
add 4 ; align with multiple of $10
; The effect of the following 3 lines is to
; add 7 to a if moving south or
; subtract 7 from a if moving north.
add b
and $f0
or c
sub [hl] ; subtract the adjusted Y coordinate of sprite i ([$c1ia]) from that of sprite j
; calculate the absolute value of the difference to get the distance
jr nc, .noCarry1
cpl
inc a
.noCarry1
ld [$ff90], a ; store the distance between the two sprites' adjusted Y values
; Use the carry flag set by the above subtraction to determine which sprite's
; Y coordinate is larger. This information is used later to set [$c1ic],
; which stores which direction the collision occurred in.
; The following 5 lines set the lowest 2 bits of c, which are later shifted left by 2.
; If sprite i's Y is larger, set lowest 2 bits of c to 10.
; If sprite j's Y is larger or both are equal, set lowest 2 bits of c to 01.
push af
rl c
pop af
ccf
rl c
; If sprite i's delta Y is 0, then b = 7, else b = 9.
ld b, 7
ld a, [hl] ; a = [$c1ia] (adjusted Y coordinate)
and $f
jr z, .next1
ld b, 9
.next1
ld a, [$ff90] ; a = distance between adjusted Y coordinates
sub b
ld [$ff92], a ; store distance adjusted using sprite i's direction
ld a, b
ld [$ff90], a ; store 7 or 9 depending on sprite i's delta Y
jr c, .checkXDistance
; If sprite j's delta Y is 0, then b = 7, else b = 9.
ld b, 7
dec e
ld a, [de] ; a = [$c1j3] (delta Y)
inc e
and a
jr z, .next2
ld b, 9
.next2
ld a, [$ff92] ; a = distance adjusted using sprite i's direction
sub b ; adjust distance using sprite j's direction
jr z, .checkXDistance
jr nc, .next ; go to next sprite if distance is still positive after both adjustments
.checkXDistance
inc e
inc l
ld a, [de] ; a = [$c1j5] (delta X)
push bc
call SetSpriteCollisionValues
inc e
ld a, [de] ; a = [$c1j6] (X screen coordinate)
; The effect of the following 3 lines is to
; add 7 to a if moving east or
; subtract 7 from a if moving west.
add b
and $f0
or c
pop bc
sub [hl] ; subtract the adjusted X coordinate of sprite i ([$c1ib]) from that of sprite j
; calculate the absolute value of the difference to get the distance
jr nc, .noCarry2
cpl
inc a
.noCarry2
ld [$ff91], a ; store the distance between the two sprites' adjusted X values
; Use the carry flag set by the above subtraction to determine which sprite's
; X coordinate is larger. This information is used later to set [$c1ic],
; which stores which direction the collision occurred in.
; The following 5 lines set the lowest 2 bits of c.
; If sprite i's X is larger, set lowest 2 bits of c to 10.
; If sprite j's X is larger or both are equal, set lowest 2 bits of c to 01.
push af
rl c
pop af
ccf
rl c
; If sprite i's delta X is 0, then b = 7, else b = 9.
ld b, 7
ld a, [hl] ; a = [$c1ib] (adjusted X coordinate)
and $f
jr z, .next3
ld b, 9
.next3
ld a, [$ff91] ; a = distance between adjusted X coordinates
sub b
ld [$ff92], a ; store distance adjusted using sprite i's direction
ld a, b
ld [$ff91], a ; store 7 or 9 depending on sprite i's delta X
jr c, .collision
; If sprite j's delta X is 0, then b = 7, else b = 9.
ld b, 7
dec e
ld a, [de] ; a = [$c1j5] (delta X)
inc e
and a
jr z, .next4
ld b, 9
.next4
ld a, [$ff92] ; a = distance adjusted using sprite i's direction
sub b ; adjust distance using sprite j's direction
jr z, .collision
jr nc, .next ; go to next sprite if distance is still positive after both adjustments
.collision
ld a, l
and $f0 ; collision with pikachu?
jr nz, .asm_4cd9
xor a
ld [wd434], a
ld a, [$ff8f]
cp $f
jr nz, .asm_4cd9
call Func_4d0a
jr .asm_4cef
.asm_4cd9
ld a, [$ff91] ; a = 7 or 9 depending on sprite i's delta X
ld b, a
ld a, [$ff90] ; a = 7 or 9 depending on sprite i's delta Y
inc l
; If delta X isn't 0 and delta Y is 0, then b = %0011, else b = %1100.
; (note that normally if delta X isn't 0, then delta Y must be 0 and vice versa)
cp b
jr c, .next5
ld b, %1100
jr .next6
.next5
ld b, %0011
.next6
ld a, c ; c has 2 bits set (one of bits 0-1 is set for the X axis and one of bits 2-3 for the Y axis)
and b ; we select either the bit in bits 0-1 or bits 2-3 based on the calculation immediately above
or [hl] ; or with existing collision direction bits in [$c1ic]
ld [hl], a ; store new value
ld a, c ; useless code because a is overwritten before being used again
; set bit in [$c1ie] or [$c1if] to indicate which sprite the collision occurred with
inc l
inc l
.asm_4cef
ld a, [$ff8f] ; a = loop counter
ld de, SpriteCollisionBitTable
add a
add e
ld e, a
jr nc, .noCarry3
inc d
.noCarry3
ld a, [de]
or [hl]
ld [hli], a
inc de
ld a, [de]
or [hl]
ld [hl], a
.next
ld a, [$ff8f] ; a = loop counter
inc a
cp $10
jp nz, .loop
ret
; takes delta X or delta Y in a
; b = delta X/Y
; c = 0 if delta X/Y is 0
; c = 7 if delta X/Y is 1
; c = 9 if delta X/Y is -1
Func_4d0a: ; 4d0a (1:4d0a)
ld a, [$ff91]
ld b, a
ld a, [$ff90]
inc l
cp b
jr c, .asm_4d17
ld b, %1100
jr .asm_4d19
.asm_4d17
ld b, %11
.asm_4d19
ld a, c
and b
ld [wd434], a
ld a, c
inc l
inc l
ret
SetSpriteCollisionValues: ; 4d22 (1:4d22)
and a
ld b, 0
ld c, 0
jr z, .done
ld c, 9
cp -1
jr z, .ok
ld c, 7
ld a, 0
.ok
ld b, a
.done
ret
SpriteCollisionBitTable: ; 4d35 (1:4d35)
db %00000000,%00000001
db %00000000,%00000010
db %00000000,%00000100
db %00000000,%00001000
db %00000000,%00010000
db %00000000,%00100000
db %00000000,%01000000
db %00000000,%10000000
db %00000001,%00000000
db %00000010,%00000000
db %00000100,%00000000
db %00001000,%00000000
db %00010000,%00000000
db %00100000,%00000000
db %01000000,%00000000
db %10000000,%00000000
INCLUDE "engine/overworld/item.asm"
INCLUDE "engine/overworld/movement.asm"
INCLUDE "engine/cable_club.asm"
LoadTrainerInfoTextBoxTiles: ; 5b9a (1:5b9a)
ld de, TrainerInfoTextBoxTileGraphics
ld hl, vChars2 + $760
lb bc, BANK(TrainerInfoTextBoxTileGraphics), (TrainerInfoTextBoxTileGraphicsEnd - TrainerInfoTextBoxTileGraphics) / $10
jp CopyVideoData
INCLUDE "engine/menu/main_menu.asm"
INCLUDE "engine/oak_speech.asm"
SpecialWarpIn: ; 6042 (1:6042)
call LoadSpecialWarpData
predef LoadTilesetHeader
ld hl,wd732
bit 2,[hl] ; dungeon warp or fly warp?
res 2,[hl]
jr z,.next
; if dungeon warp or fly warp
ld a,[wDestinationMap]
jr .next2
.next
bit 1,[hl]
jr z,.next3
call EmptyFunc
.next3
ld a,0
.next2
ld b,a
ld a,[wd72d]
and a
jr nz,.next4
ld a,b
.next4
ld hl,wd732
bit 4,[hl] ; dungeon warp?
ret nz
; if not dungeon warp
ld [wLastMap],a
ret
; gets the map ID, tile block map view pointer, tileset, and coordinates
LoadSpecialWarpData: ; 6073 (1:6073)
ld a, [wd72d]
cp TRADE_CENTER
jr nz, .notTradeCenter
ld hl, TradeCenterSpec1
ld a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK ; which gameboy is clocking determines who is on the left and who is on the right
jr z, .copyWarpData
ld hl, TradeCenterSpec2
jr .copyWarpData
.notTradeCenter
cp COLOSSEUM
jr nz, .notColosseum
ld hl, ColosseumSpec1
ld a, [hSerialConnectionStatus]
cp USING_INTERNAL_CLOCK
jr z, .copyWarpData
ld hl, ColosseumSpec2
jr .copyWarpData
.notColosseum
ld a, [wd732]
bit 1, a
jr nz, .notFirstMap
bit 2, a
jr nz, .notFirstMap
ld hl, FirstMapSpec
.copyWarpData
ld de, wCurMap
ld c, $7
.copyWarpDataLoop
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copyWarpDataLoop
ld a, [hli]
ld [wCurMapTileset], a
xor a
jr .done
.notFirstMap
ld a, [wLastMap]
ld hl, wd732
bit 4, [hl] ; used dungeon warp (jumped down hole/waterfall)?
jr nz, .usedDunegonWarp
bit 6, [hl] ; return to last pokemon center (or player's house)?
res 6, [hl]
jr z, .otherDestination
; return to last pokemon center or player's house
ld a, [wLastBlackoutMap]
jr .usedFlyWarp
.usedDunegonWarp
ld hl, wd72d
res 4, [hl]
ld a, [wDungeonWarpDestinationMap]
ld b, a
ld [wCurMap], a
ld a, [wWhichDungeonWarp]
ld c, a
ld hl, DungeonWarpList
ld de, 0
ld a, 6
ld [wDungeonWarpDataEntrySize], a
.dungeonWarpListLoop
ld a, [hli]
cp b
jr z, .matchedDungeonWarpDestinationMap
inc hl
jr .nextDungeonWarp
.matchedDungeonWarpDestinationMap
ld a, [hli]
cp c
jr z, .matchedDungeonWarpID
.nextDungeonWarp
ld a, [wDungeonWarpDataEntrySize]
add e
ld e, a
jr .dungeonWarpListLoop
.matchedDungeonWarpID
ld hl, DungeonWarpData
add hl, de
jr .copyWarpData2
.otherDestination
ld a, [wDestinationMap]
.usedFlyWarp
ld b, a
ld [wCurMap], a
ld hl, FlyWarpDataPtr
.flyWarpDataPtrLoop
ld a, [hli]
inc hl
cp b
jr z, .foundFlyWarpMatch
inc hl
inc hl
jr .flyWarpDataPtrLoop
.foundFlyWarpMatch
ld a, [hli]
ld h, [hl]
ld l, a
.copyWarpData2
ld de, wCurrentTileBlockMapViewPointer
ld c, $6
.copyWarpDataLoop2
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .copyWarpDataLoop2
xor a ; OVERWORLD
ld [wCurMapTileset], a
.done
ld [wYOffsetSinceLastSpecialWarp], a
ld [wXOffsetSinceLastSpecialWarp], a
ld a, $ff ; the player's coordinates have already been updated using a special warp, so don't use any of the normal warps
ld [wDestinationWarpID], a
ret
INCLUDE "data/special_warps.asm"
; not IshiharaTeam
SetDebugTeam: ; 623e (1:623e)
ld de, DebugTeam
.loop
ld a, [de]
cp $ff
ret z
ld [wcf91], a
inc de
ld a, [de]
ld [wCurEnemyLVL], a
inc de
call AddPartyMon
jr .loop
DebugTeam: ; 6253 (1:6253)
db SNORLAX,80
db PERSIAN,80
db JIGGLYPUFF,15
db PIKACHU,5
db $FF
EmptyFunc: ; 64ea (1:64ea)
ret
INCLUDE "engine/menu/naming_screen.asm"
INCLUDE "engine/oak_speech2.asm"
; subtracts the amount the player paid from their money
; sets carry flag if there is enough money and unsets carry flag if not
SubtractAmountPaidFromMoney_: ; 68a6 (1:68a6)
ld de, wPlayerMoney
ld hl, hMoney ; total price of items
ld c, 3 ; length of money in bytes
call StringCmp
ret c
ld de, wPlayerMoney + 2
ld hl, hMoney + 2 ; total price of items
ld c, 3 ; length of money in bytes
predef SubBCDPredef ; subtract total price from money
ld a, MONEY_BOX
ld [wTextBoxID], a
call DisplayTextBoxID ; redraw money text box
and a
ret
HandleItemListSwapping: ; 68c9 (1:68c9)
ld a,[wListMenuID]
cp a,ITEMLISTMENU
jp nz,DisplayListMenuIDLoop ; only rearrange item list menus
push hl
ld hl,wListPointer
ld a,[hli]
ld h,[hl]
ld l,a
inc hl ; hl = beginning of list entries
ld a,[wCurrentMenuItem]
ld b,a
ld a,[wListScrollOffset]
add b
add a
ld c,a
ld b,0
add hl,bc ; hl = address of currently selected item entry
ld a,[hl]
pop hl
inc a
jp z,DisplayListMenuIDLoop ; ignore attempts to swap the Cancel menu item
ld a,[wMenuItemToSwap] ; ID of item chosen for swapping (counts from 1)
and a ; has the first item to swap already been chosen?
jr nz,.swapItems
; if not, set the currently selected item as the first item
ld a,[wCurrentMenuItem]
inc a
ld b,a
ld a,[wListScrollOffset] ; index of top (visible) menu item within the list
add b
ld [wMenuItemToSwap],a ; ID of item chosen for swapping (counts from 1)
ld c,20
call DelayFrames
jp DisplayListMenuIDLoop
.swapItems
ld a,[wCurrentMenuItem]
inc a
ld b,a
ld a,[wListScrollOffset]
add b
ld b,a
ld a,[wMenuItemToSwap] ; ID of item chosen for swapping (counts from 1)
cp b ; is the currently selected item the same as the first item to swap?
jp z,DisplayListMenuIDLoop ; ignore attempts to swap an item with itself
dec a
ld [wMenuItemToSwap],a ; ID of item chosen for swapping (counts from 1)
ld c,20
call DelayFrames
push hl
push de
ld hl,wListPointer
ld a,[hli]
ld h,[hl]
ld l,a
inc hl ; hl = beginning of list entries
ld d,h
ld e,l ; de = beginning of list entries
ld a,[wCurrentMenuItem]
ld b,a
ld a,[wListScrollOffset]
add b
add a
ld c,a
ld b,0
add hl,bc ; hl = address of currently selected item entry
ld a,[wMenuItemToSwap] ; ID of item chosen for swapping (counts from 1)
add a
add e
ld e,a
jr nc,.noCarry
inc d
.noCarry ; de = address of first item to swap
ld a,[de]
ld b,a
ld a,[hli]
cp b
jr z,.swapSameItemType
.swapDifferentItems
ld [$ff95],a ; [$ff95] = second item ID
ld a,[hld]
ld [$ff96],a ; [$ff96] = second item quantity
ld a,[de]
ld [hli],a ; put first item ID in second item slot
inc de
ld a,[de]
ld [hl],a ; put first item quantity in second item slot
ld a,[$ff96]
ld [de],a ; put second item quantity in first item slot
dec de
ld a,[$ff95]
ld [de],a ; put second item ID in first item slot
xor a
ld [wMenuItemToSwap],a ; 0 means no item is currently being swapped
pop de
pop hl
jp DisplayListMenuIDLoop
.swapSameItemType
inc de
ld a,[hl]
ld b,a
ld a,[de]
add b ; a = sum of both item quantities
cp a,100 ; is the sum too big for one item slot?
jr c,.combineItemSlots
; swap enough items from the first slot to max out the second slot if they can't be combined
sub a,99
ld [de],a
ld a,99
ld [hl],a
jr .done
.combineItemSlots
ld [hl],a ; put the sum in the second item slot
ld hl,wListPointer
ld a,[hli]
ld h,[hl]
ld l,a
dec [hl] ; decrease the number of items
ld a,[hl]
ld [wListCount],a ; update number of items variable
cp a,1
jr nz,.skipSettingMaxMenuItemID
ld [wMaxMenuItem],a ; if the number of items is only one now, update the max menu item ID
.skipSettingMaxMenuItemID
dec de
ld h,d
ld l,e
inc hl
inc hl ; hl = address of item after first item to swap
.moveItemsUpLoop ; erase the first item slot and move up all the following item slots to fill the gap
ld a,[hli]
ld [de],a
inc de
inc a ; reached the $ff terminator?
jr z,.afterMovingItemsUp
ld a,[hli]
ld [de],a
inc de
jr .moveItemsUpLoop
.afterMovingItemsUp
xor a
ld [wListScrollOffset],a
ld [wCurrentMenuItem],a
.done
xor a
ld [wMenuItemToSwap],a ; 0 means no item is currently being swapped
pop de
pop hl
jp DisplayListMenuIDLoop
INCLUDE "engine/overworld/pokemart.asm"
INCLUDE "engine/learn_move.asm"
INCLUDE "engine/overworld/pokecenter.asm"
SetLastBlackoutMap: ; 6ef0 (1:6ef0)
; Set the map to return to when
; blacking out or using Teleport or Dig.
; Safari rest houses don't count.
push hl
ld hl, SafariZoneRestHouses
ld a, [wCurMap]
ld b, a
.loop
ld a, [hli]
cp -1
jr z, .notresthouse
cp b
jr nz, .loop
jr .done
.notresthouse
ld a, [wLastMap]
ld [wLastBlackoutMap], a
.done
pop hl
ret
SafariZoneRestHouses: ; 6f0a (1:6f0a)
db SAFARI_ZONE_REST_HOUSE_2
db SAFARI_ZONE_REST_HOUSE_3
db SAFARI_ZONE_REST_HOUSE_4
db -1
; function that performs initialization for DisplayTextID
DisplayTextIDInit: ; 6f0e (1:6f0e)
xor a
ld [wListMenuID],a
ld a,[wAutoTextBoxDrawingControl]
bit 0,a
jr nz,.skipDrawingTextBoxBorder
ld a,[hSpriteIndexOrTextID] ; text ID (or sprite ID)
and a
jr nz,.notStartMenu
; if text ID is 0 (i.e. the start menu)
; Note that the start menu text border is also drawn in the function directly
; below this, so this seems unnecessary.
CheckEvent EVENT_GOT_POKEDEX
; start menu with pokedex
coord hl, 10, 0
lb bc, 14, 8
jr nz,.drawTextBoxBorder
; start menu without pokedex
coord hl, 10, 0
lb bc, 12, 8
jr .drawTextBoxBorder
; if text ID is not 0 (i.e. not the start menu) then do a standard dialogue text box
.notStartMenu
coord hl, 0, 12
lb bc, 4, 18
.drawTextBoxBorder
call TextBoxBorder
.skipDrawingTextBoxBorder
ld hl,wFontLoaded
set 0,[hl]
ld hl,wFlags_0xcd60
bit 4,[hl]
res 4,[hl]
jr nz,.skipMovingSprites
call UpdateSprites
.skipMovingSprites
; loop to copy C1X9 (direction the sprite is facing) to C2X9 for each sprite
; this is done because when you talk to an NPC, they turn to look your way
; the original direction they were facing must be restored after the dialogue is over
ld hl,wSpriteStateData1 + $19
ld c,$0f
ld de,$0010
.spriteFacingDirectionCopyLoop
ld a,[hl]
inc h
ld [hl],a
dec h
add hl,de
dec c
jr nz,.spriteFacingDirectionCopyLoop
; loop to force all the sprites in the middle of animation to stand still
; (so that they don't like they're frozen mid-step during the dialogue)
ld hl,wSpriteStateData1 + 2
ld de,$0010
ld c,e
.spriteStandStillLoop
ld a,[hl]
cp a,$ff ; is the sprite visible?
jr z,.nextSprite
; if it is visible
and a,$fc
ld [hl],a
.nextSprite
add hl,de
dec c
jr nz,.spriteStandStillLoop
ld b,vBGMap1 / $100 ; window background address
call CopyScreenTileBufferToVRAM ; transfer background in WRAM to VRAM
xor a
ld [hWY],a ; put the window on the screen
call LoadFontTilePatterns
ld a,$01
ld [H_AUTOBGTRANSFERENABLED],a ; enable continuous WRAM to VRAM transfer each V-blank
ret
; function that displays the start menu
DrawStartMenu: ; 6f80 (1:6f80)
CheckEvent EVENT_GOT_POKEDEX
; menu with pokedex
coord hl, 10, 0
lb bc, 14, 8
jr nz,.drawTextBoxBorder
; shorter menu if the player doesn't have the pokedex
coord hl, 10, 0
lb bc, 12, 8
.drawTextBoxBorder
call TextBoxBorder
ld a,D_DOWN | D_UP | START | B_BUTTON | A_BUTTON
ld [wMenuWatchedKeys],a
ld a,$02
ld [wTopMenuItemY],a ; Y position of first menu choice
ld a,$0b
ld [wTopMenuItemX],a ; X position of first menu choice
ld a,[wBattleAndStartSavedMenuItem] ; remembered menu selection from last time
ld [wCurrentMenuItem],a
ld [wLastMenuItem],a
xor a
ld [wMenuWatchMovingOutOfBounds],a
ld hl,wd730
set 6,[hl] ; no pauses between printing each letter
coord hl, 12, 2
CheckEvent EVENT_GOT_POKEDEX
; case for not having pokdex
ld a,$06
jr z,.storeMenuItemCount
; case for having pokedex
ld de,StartMenuPokedexText
call PrintStartMenuItem
ld a,$07
.storeMenuItemCount
ld [wMaxMenuItem],a ; number of menu items
ld de,StartMenuPokemonText
call PrintStartMenuItem
ld de,StartMenuItemText
call PrintStartMenuItem
ld de,wPlayerName ; player's name
call PrintStartMenuItem
ld a,[wd72e]
bit 6,a ; is the player using the link feature?
; case for not using link feature
ld de,StartMenuSaveText
jr z,.printSaveOrResetText
; case for using link feature
ld de,StartMenuResetText
.printSaveOrResetText
call PrintStartMenuItem
ld de,StartMenuOptionText
call PrintStartMenuItem
ld de,StartMenuExitText
call PlaceString
ld hl,wd730
res 6,[hl] ; turn pauses between printing letters back on
ret
StartMenuPokedexText: ; 7002 (1:7002)
db "POKéDEX@"
StartMenuPokemonText: ; 700a (1:700a)
db "#MON@"
StartMenuItemText: ; 700f (1:700f)
db "ITEM@"
StartMenuSaveText: ; 7014 (1:7014)
db "SAVE@"
StartMenuResetText: ; 7019 (1:7019)
db "RESET@"
StartMenuExitText: ; 701f (1:701f)
db "EXIT@"
StartMenuOptionText: ; 7024 (1:7024)
db "OPTION@"
PrintStartMenuItem: ; 702b (1:702b)
push hl
call PlaceString
pop hl
ld de,SCREEN_WIDTH * 2
add hl,de
ret
INCLUDE "engine/overworld/cable_club_npc.asm"
INCLUDE "engine/text_boxes.asm"
dr $76e7,$778e
PlayerPC: ; 778e (1:778e)
dr $778e,$7a0f
_RemovePokemon: ; 7a0f (1:7a0f)
dr $7a0f,$7abf
_DisplayPokedex: ; 7c18 (1:7abf)
dr $7abf,$8000
SECTION "bank03",ROMX,BANK[$03]
INCLUDE "engine/joypad.asm"
ClearVariablesAfterLoadingMapData: ; c07c (3:407c)
ld a, $90
ld [hWY], a
ld [rWY], a
xor a
ld [H_AUTOBGTRANSFERENABLED], a
ld [wStepCounter], a
ld [wLoneAttackNo], a ; wGymLeaderNo
ld [hJoyPressed], a
ld [hJoyReleased], a
ld [hJoyHeld], a
ld [wActionResultOrTookBattleTurn], a
ld [wUnusedD5A3], a
ld hl, wCardKeyDoorY
ld [hli], a
ld [hl], a
ld hl, wWhichTrade
ld bc, $1e
call FillMemory
ret
; only used for setting bit 2 of wd736 upon entering a new map
IsPlayerStandingOnWarp: ; c0a6 (3:40a6)
ld a, [wNumberOfWarps]
and a
ret z
ld c, a
ld hl, wWarpEntries
.loop
ld a, [wYCoord]
cp [hl]
jr nz, .nextWarp1
inc hl
ld a, [wXCoord]
cp [hl]
jr nz, .nextWarp2
inc hl
ld a, [hli] ; target warp
ld [wDestinationWarpID], a
ld a, [hl] ; target map
ld [$ff8b], a
ld hl, wd736
set 2, [hl] ; standing on warp flag
ret
.nextWarp1
inc hl
.nextWarp2
inc hl
inc hl
inc hl
dec c
jr nz, .loop
ret
CheckForceBikeOrSurf: ; c0d2 (3:40d2)
ld hl, wd732
bit 5, [hl]
ret nz
ld hl, ForcedBikeOrSurfMaps
ld a, [wYCoord]
ld b, a
ld a, [wXCoord]
ld c, a
ld a, [wCurMap]
ld d, a
.loop
ld a, [hli]
cp $ff
ret z ;if we reach FF then it's not part of the list
cp d ;compare to current map
jr nz, .incorrectMap
ld a, [hli]
cp b ;compare y-coord
jr nz, .incorrectY
ld a, [hli]
cp c ;compare x-coord
jr nz, .loop ; incorrect x-coord, check next item
ld a, [wCurMap]
cp SEAFOAM_ISLANDS_4
ld a, $2
ld [wSeafoamIslands4CurScript], a
jr z, .forceSurfing
ld a, [wCurMap]
cp SEAFOAM_ISLANDS_5
ld a, $2
ld [wSeafoamIslands5CurScript], a
jr z, .forceSurfing
;force bike riding
ld hl, wd732
set 5, [hl]
ld a, $1
ld [wWalkBikeSurfState], a
ld [wWalkBikeSurfStateCopy], a
call ForceBikeOrSurf
ret
.incorrectMap
inc hl
.incorrectY
inc hl
jr .loop
.forceSurfing
ld a, $2
ld [wWalkBikeSurfState], a
ld [wWalkBikeSurfStateCopy], a
call ForceBikeOrSurf
ret
INCLUDE "data/force_bike_surf.asm"
IsPlayerFacingEdgeOfMap: ; c148 (3:4148)
push hl
push de
push bc
ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
srl a
ld c, a
ld b, $0
ld hl, .functionPointerTable
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wYCoord]
ld b, a
ld a, [wXCoord]
ld c, a
ld de, .returnaddress
push de
jp [hl]
.returnaddress
pop bc
pop de
pop hl
ret
.functionPointerTable
dw .facingDown
dw .facingUp
dw .facingLeft
dw .facingRight
.facingDown
ld a, [wCurMapHeight]
add a
dec a
cp b
jr z, .setCarry
jr .resetCarry
.facingUp
ld a, b
and a
jr z, .setCarry
jr .resetCarry
.facingLeft
ld a, c
and a
jr z, .setCarry
jr .resetCarry
.facingRight
ld a, [wCurMapWidth]
add a
dec a
cp c
jr z, .setCarry
jr .resetCarry
.resetCarry
and a
ret
.setCarry
scf
ret
IsWarpTileInFrontOfPlayer: ; c197 (3:4197)
push hl
push de
push bc
call _GetTileAndCoordsInFrontOfPlayer
ld a, [wCurMap]
cp SS_ANNE_5
jr z, .ssAnne5
ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction
srl a
ld c, a
ld b, 0
ld hl, .warpTileListPointers
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wTileInFrontOfPlayer]
ld de, $1
call IsInArray
.done
pop bc
pop de
pop hl
ret
.warpTileListPointers: ; c1c0 (3:41c0)
dw .facingDownWarpTiles
dw .facingUpWarpTiles
dw .facingLeftWarpTiles
dw .facingRightWarpTiles
.facingDownWarpTiles
db $01,$12,$17,$3D,$04,$18,$33,$FF
.facingUpWarpTiles
db $01,$5C,$FF
.facingLeftWarpTiles
db $1A,$4B,$FF
.facingRightWarpTiles
db $0F,$4E,$FF
.ssAnne5
ld a, [wTileInFrontOfPlayer]
cp $15
jr nz, .notSSAnne5Warp
scf
jr .done
.notSSAnne5Warp
and a
jr .done
IsPlayerStandingOnDoorTileOrWarpTile: ; c1e6 (3:41e6)
push hl
push de
push bc
callba IsPlayerStandingOnDoorTile ; 6:6785
jr c, .done
ld a, [wCurMapTileset]
add a
ld c, a
ld b, $0
ld hl, WarpTileIDPointers
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
ld de, $1
aCoord 8, 9
call IsInArray
jr nc, .done
ld hl, wd736
res 2, [hl]
.done
pop bc
pop de
pop hl
ret
INCLUDE "data/warp_tile_ids.asm"
PrintSafariZoneSteps: ; c27b (3:427b)
ld a, [wCurMap]
cp SAFARI_ZONE_EAST
ret c
cp UNKNOWN_DUNGEON_2
ret nc
coord hl, 0, 0
lb bc, 3, 7
call TextBoxBorder
coord hl, 1, 1
ld de, wSafariSteps
lb bc, 2, 3
call PrintNumber
coord hl, 4, 1
ld de, SafariSteps
call PlaceString
coord hl, 1, 3
ld de, SafariBallText
call PlaceString
ld a, [wNumSafariBalls]
cp 10
jr nc, .numSafariBallsTwoDigits
coord hl, 5, 3
ld a, " "
ld [hl], a
.numSafariBallsTwoDigits
coord hl, 6, 3
ld de, wNumSafariBalls
lb bc, 1, 2
jp PrintNumber
SafariSteps: ; c2c4 (3:42c4)
db "/500@"
SafariBallText: ; c5c9 (3:42c9)
db "BALL×× @"
GetTileAndCoordsInFrontOfPlayer: ; c2d4 (3:42d1)
call GetPredefRegisters
_GetTileAndCoordsInFrontOfPlayer: ; c2d4 (3:42d4)
ld a, [wYCoord]
ld d, a
ld a, [wXCoord]
ld e, a
ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
and a ; cp SPRITE_FACING_DOWN
jr nz, .notFacingDown
; facing down
aCoord 8, 11
inc d
jr .storeTile
.notFacingDown
cp SPRITE_FACING_UP
jr nz, .notFacingUp
; facing up
aCoord 8, 7
dec d
jr .storeTile
.notFacingUp
cp SPRITE_FACING_LEFT
jr nz, .notFacingLeft
; facing left
aCoord 6, 9
dec e
jr .storeTile
.notFacingLeft
cp SPRITE_FACING_RIGHT
jr nz, .storeTile
; facing right
aCoord 10, 9
inc e
.storeTile
ld c, a
ld [wTileInFrontOfPlayer], a
ret
GetTileTwoStepsInFrontOfPlayer: ; c309 (3:4309)
xor a
ld [$ffdb], a
ld hl, wYCoord
ld a, [hli]
ld d, a
ld e, [hl]
ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
and a ; cp SPRITE_FACING_DOWN
jr nz, .notFacingDown
; facing down
ld hl, $ffdb
set 0, [hl]
aCoord 8, 13
inc d
jr .storeTile
.notFacingDown
cp SPRITE_FACING_UP
jr nz, .notFacingUp
; facing up
ld hl, $ffdb
set 1, [hl]
aCoord 8, 5
dec d
jr .storeTile
.notFacingUp
cp SPRITE_FACING_LEFT
jr nz, .notFacingLeft
; facing left
ld hl, $ffdb
set 2, [hl]
aCoord 4, 9
dec e
jr .storeTile
.notFacingLeft
cp SPRITE_FACING_RIGHT
jr nz, .storeTile
; facing right
ld hl, $ffdb
set 3, [hl]
aCoord 12, 9
inc e
.storeTile
ld c, a
ld [wTileInFrontOfBoulderAndBoulderCollisionResult], a
ld [wTileInFrontOfPlayer], a
ret
CheckForCollisionWhenPushingBoulder: ; c356 (3:4356)
call GetTileTwoStepsInFrontOfPlayer
call IsTilePassable
jr c, .done
ld hl, TilePairCollisionsLand
call CheckForTilePairCollisions2
ld a, $ff
jr c, .done ; if there is an elevation difference between the current tile and the one two steps ahead
ld a, [wTileInFrontOfBoulderAndBoulderCollisionResult]
cp $15 ; stairs tile
ld a, $ff
jr z, .done ; if the tile two steps ahead is stairs
call CheckForBoulderCollisionWithSprites
.done
ld [wTileInFrontOfBoulderAndBoulderCollisionResult], a
ret
; sets a to $ff if there is a collision and $00 if there is no collision
CheckForBoulderCollisionWithSprites: ; c378 (3:4378)
ld a, [wBoulderSpriteIndex]
dec a
swap a
ld d, 0
ld e, a
ld hl, wSpriteStateData2 + $14
add hl, de
ld a, [hli] ; map Y position
ld [$ffdc], a
ld a, [hl] ; map X position
ld [$ffdd], a
ld a, [wNumSprites]
ld c, a
ld de, $f
ld hl, wSpriteStateData2 + $14
ld a, [$ffdb]
and $3 ; facing up or down?
jr z, .pushingHorizontallyLoop
.pushingVerticallyLoop
inc hl
ld a, [$ffdd]
cp [hl]
jr nz, .nextSprite1 ; if X coordinates don't match
dec hl
ld a, [hli]
ld b, a
ld a, [$ffdb]
rrca
jr c, .pushingDown
; pushing up
ld a, [$ffdc]
dec a
jr .compareYCoords
.pushingDown
ld a, [$ffdc]
inc a
.compareYCoords
cp b
jr z, .failure
.nextSprite1
dec c
jr z, .success
add hl, de
jr .pushingVerticallyLoop
.pushingHorizontallyLoop
ld a, [hli]
ld b, a
ld a, [$ffdc]
cp b
jr nz, .nextSprite2
ld b, [hl]
ld a, [$ffdb]
bit 2, a
jr nz, .pushingLeft
; pushing right
ld a, [$ffdd]
inc a
jr .compareXCoords
.pushingLeft
ld a, [$ffdd]
dec a
.compareXCoords
cp b
jr z, .failure
.nextSprite2
dec c
jr z, .success
add hl, de
jr .pushingHorizontallyLoop
.failure
ld a, $ff
ret
.success
xor a
ret
ApplyOutOfBattlePoisonDamage: ; c3de (3:43de)
ld a, [wd730]
add a
jp c, .noBlackOut ; no black out if joypad states are being simulated
ld a, [wd493]
bit 7, a
jp nz, .noBlackOut
ld a, [wd72e]
bit 6, a
jp nz, .noBlackOut
ld a, [wPartyCount]
and a
jp z, .noBlackOut
call IncrementDayCareMonExp
call Func_c4c7
ld a, [wStepCounter]
and $3 ; is the counter a multiple of 4?
jp nz, .skipPoisonEffectAndSound ; only apply poison damage every fourth step
ld [wWhichPokemon], a
ld hl, wPartyMon1Status
ld de, wPartySpecies
.applyDamageLoop
ld a, [hl]
and (1 << PSN)
jr z, .nextMon2 ; not poisoned
dec hl
dec hl
ld a, [hld]
ld b, a
ld a, [hli]
or b
jr z, .nextMon ; already fainted
; subtract 1 from HP
ld a, [hl]
dec a
ld [hld], a
inc a
jr nz, .noBorrow
; borrow 1 from upper byte of HP
dec [hl]
inc hl
jr .nextMon
.noBorrow
ld a, [hli]
or [hl]
jr nz, .nextMon ; didn't faint from damage
; the mon fainted from the damage
push hl
inc hl
inc hl
ld [hl], a
ld a, [de]
ld [wd11e], a
push de
ld a, [wWhichPokemon]
ld hl, wPartyMonNicks
call GetPartyMonName
xor a
ld [wJoyIgnore], a
call EnableAutoTextBoxDrawing
ld a, $d0
ld [hSpriteIndexOrTextID], a
call DisplayTextID
callab IsThisPartymonOurPikachu
jr nc, .curMonNotPlayerPikachu
ld e, $3
callab PlayPikachuSoundClip
calladb_ModifyPikachuHappiness PIKAHAPPY_PSNFNT
.curMonNotPlayerPikachu
pop de
pop hl
.nextMon
inc hl
inc hl
.nextMon2
inc de
ld a, [de]
inc a
jr z, .applyDamageLoopDone
ld bc, wPartyMon2 - wPartyMon1
add hl, bc
push hl
ld hl, wWhichPokemon
inc [hl]
pop hl
jr .applyDamageLoop
.applyDamageLoopDone
ld hl, wPartyMon1Status
ld a, [wPartyCount]
ld d, a
ld e, 0
.countPoisonedLoop
ld a, [hl]
and (1 << PSN)
or e
ld e, a
ld bc, wPartyMon2 - wPartyMon1
add hl, bc
dec d
jr nz, .countPoisonedLoop
ld a, e
and a ; are any party members poisoned?
jr z, .skipPoisonEffectAndSound
ld b, $2
predef ChangeBGPalColor0_4Frames ; change BG white to dark grey for 4 frames
ld a, SFX_POISONED
call PlaySound
.skipPoisonEffectAndSound
predef AnyPartyAlive
ld a, d
and a
jr nz, .noBlackOut
call EnableAutoTextBoxDrawing
ld a, $d1
ld [hSpriteIndexOrTextID], a
call DisplayTextID
ld hl, wd72e
set 5, [hl]
ld a, $ff
jr .done
.noBlackOut
xor a
.done
ld [wOutOfBattleBlackout], a
ret
Func_c4c7: ; c4c7 (3:44c7)
ld a, [wStepCounter]
and a
jr nz, .asm_c4de
call Random
and $1
jr z, .asm_c4de
calladb_ModifyPikachuHappiness $6
.asm_c4de
ld hl, wPikachuMood
ld a, [hl]
cp $80
jr z, .asm_c4ef
jr c, .asm_c4ea
dec a
dec a
.asm_c4ea
inc a
ld [hl], a
cp $80
ret nz
.asm_c4ef
xor a
ld [wd49c], a
ret
LoadTilesetHeader: ; c4f4 (3:44f4)
call GetPredefRegisters
push hl
ld d, 0
ld a, [wCurMapTileset]
add a
add a
ld e, a
ld hl, Tilesets
add hl, de
add hl, de
add hl, de
ld de, wTilesetBank
ld bc, $b
call CopyData
ld a, [hl]
ld [hTilesetType], a
xor a
ld [$ffd8], a
pop hl
ld a, [wCurMapTileset]
push hl
push de
ld hl, DungeonTilesets
ld de, $1
call IsInArray
pop de
pop hl
jr c, .notDungeonTileset
ld a, [wCurMapTileset]
ld b, a
ld a, [hPreviousTileset]
cp b
jr z, .done
.notDungeonTileset
ld a, [wDestinationWarpID]
cp $ff
jr z, .done
call LoadDestinationWarpPosition
ld a, [wYCoord]
and $1
ld [wYBlockCoord], a
ld a, [wXCoord]
and $1
ld [wXBlockCoord], a
.done
ret
INCLUDE "data/dungeon_tilesets.asm"
INCLUDE "data/tileset_headers.asm"
IncrementDayCareMonExp: ; c684 (3:4684)
ld a, [wDayCareInUse]
and a
ret z
ld hl, wDayCareMonExp + 2
inc [hl]
ret nz
dec hl
inc [hl]
ret nz
dec hl
inc [hl]
ld a, [hl]
cp $50
ret c
ld a, $50
ld [hl], a
ret
INCLUDE "data/hide_show_data.asm"
LoadWildData: ; cb62 (3:4b62)
ld hl,WildDataPointers
ld a,[wCurMap]
; get wild data for current map
ld c,a
ld b,0
add hl,bc
add hl,bc
ld a,[hli]
ld h,[hl]
ld l,a ; hl now points to wild data for current map
ld a,[hli]
ld [wGrassRate],a
and a
jr z,.NoGrassData ; if no grass data, skip to surfing data
push hl
ld de,wGrassMons ; otherwise, load grass data
ld bc,$0014
call CopyData
pop hl
ld bc,$0014
add hl,bc
.NoGrassData
ld a,[hli]
ld [wWaterRate],a
and a
ret z ; if no water data, we're done
ld de,wWaterMons ; otherwise, load surfing data
ld bc,$0014
jp CopyData
INCLUDE "data/wild_mons.asm"
INCLUDE "engine/items/items.asm"
DrawBadges: ; e880 (3:6880)
; Draw 4x2 gym leader faces, with the faces replaced by
; badges if they are owned. Used in the player status screen.
; In Japanese versions, names are displayed above faces.
; Instead of removing relevant code, the name graphics were erased.
; Tile ids for face/badge graphics.
ld de, wBadgeOrFaceTiles
ld hl, .FaceBadgeTiles
ld bc, 8
call CopyData
; Booleans for each badge.
ld hl, wTempObtainedBadgesBooleans
ld bc, 8
xor a
call FillMemory
; Alter these based on owned badges.
ld de, wTempObtainedBadgesBooleans
ld hl, wBadgeOrFaceTiles
ld a, [wObtainedBadges]
ld b, a
ld c, 8
.CheckBadge
srl b
jr nc, .NextBadge
ld a, [hl]
add 4 ; Badge graphics are after each face
ld [hl], a
ld a, 1
ld [de], a
.NextBadge
inc hl
inc de
dec c
jr nz, .CheckBadge
; Draw two rows of badges.
ld hl, wBadgeNumberTile
ld a, $d8 ; [1]
ld [hli], a
ld [hl], $60 ; First name
coord hl, 2, 11
ld de, wTempObtainedBadgesBooleans
call .DrawBadgeRow
coord hl, 2, 14
ld de, wTempObtainedBadgesBooleans + 4
; call .DrawBadgeRow
; ret
.DrawBadgeRow ; e8c9 (3:68c9)
; Draw 4 badges.
ld c, 4
.DrawBadge
push de
push hl
; Badge no.
ld a, [wBadgeNumberTile]
ld [hli], a
inc a
ld [wBadgeNumberTile], a
; Names aren't printed if the badge is owned.
ld a, [de]
and a
ld a, [wBadgeNameTile]
jr nz, .SkipName
call .PlaceTiles
jr .PlaceBadge
.SkipName
inc a
inc a
inc hl
.PlaceBadge
ld [wBadgeNameTile], a
ld de, SCREEN_WIDTH - 1
add hl, de
ld a, [wBadgeOrFaceTiles]
call .PlaceTiles
add hl, de
call .PlaceTiles
; Shift badge array back one byte.
push bc
ld hl, wBadgeOrFaceTiles + 1
ld de, wBadgeOrFaceTiles
ld bc, 8
call CopyData
pop bc
pop hl
ld de, 4
add hl, de
pop de
inc de
dec c
jr nz, .DrawBadge
ret
.PlaceTiles
ld [hli], a
inc a
ld [hl], a
inc a
ret
.FaceBadgeTiles
db $20, $28, $30, $38, $40, $48, $50, $58
GymLeaderFaceAndBadgeTileGraphics: ; e91b (3:691b)
INCBIN "gfx/badges.2bpp"
; replaces a tile block with the one specified in [wNewTileBlockID]
; and redraws the map view if necessary
; b = Y
; c = X
ReplaceTileBlock: ; ed1b (3:6d1b)
call GetPredefRegisters
ld hl, wOverworldMap
ld a, [wCurMapWidth]
add $6
ld e, a
ld d, $0
add hl, de
add hl, de
add hl, de
ld e, $3
add hl, de
ld e, a
ld a, b
and a
jr z, .addX
; add width * Y
.addWidthYTimesLoop
add hl, de
dec b
jr nz, .addWidthYTimesLoop
.addX
add hl, bc ; add X
ld a, [wNewTileBlockID]
ld [hl], a
ld a, [wCurrentTileBlockMapViewPointer]
ld c, a
ld a, [wCurrentTileBlockMapViewPointer + 1]
ld b, a
call CompareHLWithBC
ret c ; return if the replaced tile block is below the map view in memory
push hl
ld l, e
ld h, $0
ld e, $6
ld d, h
add hl, hl
add hl, hl
add hl, de
add hl, bc
pop bc
call CompareHLWithBC
ret c ; return if the replaced tile block is above the map view in memory
RedrawMapView: ; ed59 (3:6d59)
ld a, [wIsInBattle]
inc a
ret z
ld a, [H_AUTOBGTRANSFERENABLED]
push af
ld a, [hTilesetType]
push af
xor a
ld [H_AUTOBGTRANSFERENABLED], a
ld [hTilesetType], a ; no flower/water BG tile animations
call LoadCurrentMapView
call RunDefaultPaletteCommand
ld hl, wMapViewVRAMPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld de, -2 * 32
add hl, de
ld a, h
and $3
or $98
ld a, l
ld [wBuffer], a
ld a, h
ld [wBuffer + 1], a ; this copy of the address is not used
ld a, 2
ld [$ffbe], a
ld c, 9 ; number of rows of 2x2 tiles (this covers the whole screen)
.redrawRowLoop
push bc
push hl
push hl
ld hl, wTileMap - 2 * SCREEN_WIDTH
ld de, SCREEN_WIDTH
ld a, [$ffbe]
.calcWRAMAddrLoop
add hl, de
dec a
jr nz, .calcWRAMAddrLoop
call CopyToRedrawRowOrColumnSrcTiles
pop hl
ld de, $20
ld a, [$ffbe]
ld c, a
.calcVRAMAddrLoop
add hl, de
ld a, h
and $3
or $98
dec c
jr nz, .calcVRAMAddrLoop
ld [hRedrawRowOrColumnDest + 1], a
ld a, l
ld [hRedrawRowOrColumnDest], a
ld a, REDRAW_ROW
ld [hRedrawRowOrColumnMode], a
call DelayFrame
ld hl, $ffbe
inc [hl]
inc [hl]
pop hl
pop bc
dec c
jr nz, .redrawRowLoop
pop af
ld [hTilesetType], a
pop af
ld [H_AUTOBGTRANSFERENABLED], a
ret
CompareHLWithBC: ; edcb (3:6dcb)
ld a, h
sub b
ret nz
ld a, l
sub c
ret
INCLUDE "engine/overworld/cut.asm"
MarkTownVisitedAndLoadMissableObjects: ; ef93 (3:6f93)
ld a, [wCurMap]
cp ROUTE_1
jr nc, .notInTown
ld c, a
ld b, FLAG_SET
ld hl, wTownVisitedFlag ; mark town as visited (for flying)
predef FlagActionPredef
.notInTown
ld hl, MapHSPointers
ld a, [wCurMap]
ld b, $0
ld c, a
add hl, bc
add hl, bc
ld a, [hli] ; load missable objects pointer in hl
ld h, [hl]
; fall through
; LoadMissableObjects: ; efb2 (3:6fb2)
; seems to not exist in yellow (predef replaced with something near TryPushingBoulder)
ld l, a
push hl
ld a, l
sub MapHS00 & $ff ; calculate difference between out pointer and the base pointer
ld l, a
ld a, h
sbc MapHS00 / $100
ld h, a
ld a, h
ld [H_DIVIDEND], a
ld a, l
ld [H_DIVIDEND+1], a
xor a
ld [H_DIVIDEND+2], a
ld [H_DIVIDEND+3], a
ld a, $3
ld [H_DIVISOR], a
ld b, $2
call Divide ; divide difference by 3, resulting in the global offset (number of missable items before ours)
ld a, [wCurMap]
ld b, a
ld a, [H_DIVIDEND+3]
ld c, a ; store global offset in c
ld de, wMissableObjectList
pop hl
.writeMissableObjectsListLoop
ld a, [hli]
cp $ff
jr z, .done ; end of list
cp b
jr nz, .done ; not for current map anymore
ld a, [hli]
inc hl
ld [de], a ; write (map-local) sprite ID
inc de
ld a, c
inc c
ld [de], a ; write (global) missable object index
inc de
jr .writeMissableObjectsListLoop
.done
ld a, $ff
ld [de], a ; write sentinel
ret
InitializeMissableObjectsFlags: ; eff1 (3:6ff1)
ld hl, wMissableObjectFlags
ld bc, wMissableObjectFlagsEnd - wMissableObjectFlags
xor a
call FillMemory ; clear missable objects flags
ld hl, MapHS00
xor a
ld [wMissableObjectCounter], a
.missableObjectsLoop
ld a, [hli]
cp $ff ; end of list
ret z
push hl
inc hl
ld a, [hl]
cp Hide
jr nz, .skip
ld hl, wMissableObjectFlags
ld a, [wMissableObjectCounter]
ld c, a
ld b, FLAG_SET
call MissableObjectFlagAction ; set flag if Item is hidden
.skip
ld hl, wMissableObjectCounter
inc [hl]
pop hl
inc hl
inc hl
jr .missableObjectsLoop
; tests if current sprite is a missable object that is hidden/has been removed
IsObjectHidden: ; f022 (3:7022)
ld a, [H_CURRENTSPRITEOFFSET]
swap a
ld b, a
ld hl, wMissableObjectList
.loop
ld a, [hli]
cp $ff
jr z, .notHidden ; not missable -> not hidden
cp b
ld a, [hli]
jr nz, .loop
ld c, a
ld b, FLAG_TEST
ld hl, wMissableObjectFlags
call MissableObjectFlagAction
ld a, c
and a
jr nz, .hidden
.notHidden
xor a
.hidden
ld [$ffe5], a
ret
; adds missable object (items, leg. pokemon, etc.) to the map
; [wMissableObjectIndex]: index of the missable object to be added (global index)
ShowObject: ; f044 (3:7044)
ShowObject2:
ld hl, wMissableObjectFlags
ld a, [wMissableObjectIndex]
ld c, a
ld b, FLAG_RESET
call MissableObjectFlagAction ; reset "removed" flag
jp UpdateSprites
; removes missable object (items, leg. pokemon, etc.) from the map
; [wMissableObjectIndex]: index of the missable object to be removed (global index)
HideObject: ; f053 (3:7053)
ld hl, wMissableObjectFlags
ld a, [wMissableObjectIndex]
ld c, a
ld b, FLAG_SET
call MissableObjectFlagAction ; set "removed" flag
jp UpdateSprites
MissableObjectFlagAction: ; f062 (3:7062)
; identical to FlagAction
push hl
push de
push bc
; bit
ld a, c
ld d, a
and 7
ld e, a
; byte
ld a, d
srl a
srl a
srl a
add l
ld l, a
jr nc, .ok
inc h
.ok
; d = 1 << e (bitmask)
inc e
ld d, 1
.shift
dec e
jr z, .shifted
sla d
jr .shift
.shifted
ld a, b
and a
jr z, .reset
cp 2
jr z, .read
.set
ld a, [hl]
ld b, a
ld a, d
or b
ld [hl], a
jr .done
.reset
ld a, [hl]
ld b, a
ld a, d
xor $ff
and b
ld [hl], a
jr .done
.read
ld a, [hl]
ld b, a
ld a, d
and b
.done
pop bc
pop de
pop hl
ld c, a
ret
TryPushingBoulder: ; f0a1 (3:70a1)
ld a, [wd728]
bit 0, a ; using Strength?
ret z
; where LoadMissableObjects predef points to now
ld a, [wFlags_0xcd60]
bit 1, a ; has boulder dust animation from previous push played yet?
ret nz
xor a
ld [hSpriteIndexOrTextID], a
call IsSpriteInFrontOfPlayer
ld a, [hSpriteIndexOrTextID]
ld [wBoulderSpriteIndex], a
and a
jp z, ResetBoulderPushFlags
ld hl, wSpriteStateData1 + 1
ld d, $0
ld a, [hSpriteIndexOrTextID]
swap a
ld e, a
add hl, de
res 7, [hl]
call GetSpriteMovementByte2Pointer
ld a, [hl]
cp BOULDER_MOVEMENT_BYTE_2
jp nz, ResetBoulderPushFlags
ld hl, wFlags_0xcd60
bit 6, [hl]
set 6, [hl] ; indicate that the player has tried pushing
ret z ; the player must try pushing twice before the boulder will move
ld a, [hJoyHeld]
and D_RIGHT | D_LEFT | D_UP | D_DOWN
ret z
predef CheckForCollisionWhenPushingBoulder
ld a, [wTileInFrontOfBoulderAndBoulderCollisionResult]
and a ; was there a collision?
jp nz, ResetBoulderPushFlags
ld a, [hJoyHeld]
ld b, a
ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
cp SPRITE_FACING_UP
jr z, .pushBoulderUp
cp SPRITE_FACING_LEFT
jr z, .pushBoulderLeft
cp SPRITE_FACING_RIGHT
jr z, .pushBoulderRight
.pushBoulderDown
bit 7, b
ret z
ld de, PushBoulderDownMovementData
jr .done
.pushBoulderUp
bit 6, b
ret z
ld de, PushBoulderUpMovementData
jr .done
.pushBoulderLeft
bit 5, b
ret z
ld de, PushBoulderLeftMovementData
jr .done
.pushBoulderRight
bit 4, b
ret z
ld de, PushBoulderRightMovementData
.done
call MoveSprite
ld a, SFX_PUSH_BOULDER
call PlaySound
ld hl, wFlags_0xcd60
set 1, [hl]
ret
PushBoulderUpMovementData: ; f129 (3:7129)
db NPC_MOVEMENT_UP,$FF
PushBoulderDownMovementData: ; f12b (3:712b)
db NPC_MOVEMENT_DOWN,$FF
PushBoulderLeftMovementData: ; f12d (3:712d)
db NPC_MOVEMENT_LEFT,$FF
PushBoulderRightMovementData: ; f12f (3:712f)
db NPC_MOVEMENT_RIGHT,$FF
DoBoulderDustAnimation: ; f131 (3:7131)
ld a, [wd730]
bit 0, a
ret nz
callab AnimateBoulderDust
call DiscardButtonPresses
ld [wJoyIgnore], a
call ResetBoulderPushFlags
set 7, [hl]
ld a, [wBoulderSpriteIndex]
ld [H_SPRITEINDEX], a
call GetSpriteMovementByte2Pointer
ld [hl], $10
ld a, SFX_CUT
jp PlaySound
ResetBoulderPushFlags: ; f159 (3:7159)
ld hl, wFlags_0xcd60
res 1, [hl]
res 6, [hl]
ret
_AddPartyMon: ; f161 (3:7161)
; Adds a new mon to the player's or enemy's party.
; [wMonDataLocation] is used in an unusual way in this function.
; If the lower nybble is 0, the mon is added to the player's party, else the enemy's.
; If the entire value is 0, then the player is allowed to name the mon.
ld de, wPartyCount
ld a, [wMonDataLocation]
and $f
jr z, .next
ld de, wEnemyPartyCount
.next
ld a, [de]
inc a
cp PARTY_LENGTH + 1
ret nc ; return if the party is already full
ld [de], a
ld a, [de]
ld [hNewPartyLength], a
add e
ld e, a
jr nc, .noCarry
inc d
.noCarry
ld a, [wcf91]
ld [de], a ; write species of new mon in party list
inc de
ld a, $ff ; terminator
ld [de], a
ld hl, wPartyMonOT
ld a, [wMonDataLocation]
and $f
jr z, .next2
ld hl, wEnemyMonOT
.next2
ld a, [hNewPartyLength]
dec a
call SkipFixedLengthTextEntries
ld d, h
ld e, l
ld hl, wPlayerName
ld bc, NAME_LENGTH
call CopyData
ld a, [wMonDataLocation]
and a
jr nz, .skipNaming
ld hl, wPartyMonNicks
ld a, [hNewPartyLength]
dec a
call SkipFixedLengthTextEntries
ld a, NAME_MON_SCREEN
ld [wNamingScreenType], a
predef AskName
.skipNaming
ld hl, wPartyMons
ld a, [wMonDataLocation]
and $f
jr z, .next3
ld hl, wEnemyMons
.next3
ld a, [hNewPartyLength]
dec a
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
ld e, l
ld d, h
push hl
ld a, [wcf91]
ld [wd0b5], a
call GetMonHeader
ld hl, wMonHeader
ld a, [hli]
ld [de], a ; species
inc de
pop hl
push hl
ld a, [wMonDataLocation]
and $f
ld a, $98 ; set enemy trainer mon IVs to fixed average values
ld b, $88
jr nz, .next4
; If the mon is being added to the player's party, update the pokedex.
ld a, [wcf91]
ld [wd11e], a
push de
predef IndexToPokedex
pop de
ld a, [wd11e]
dec a
ld c, a
ld b, FLAG_TEST
ld hl, wPokedexOwned
call FlagAction
ld a, c ; whether the mon was already flagged as owned
ld [wUnusedD153], a ; not read
ld a, [wd11e]
dec a
ld c, a
ld b, FLAG_SET
push bc
call FlagAction
pop bc
ld hl, wPokedexSeen
call FlagAction
pop hl
push hl
ld a, [wIsInBattle]
and a ; is this a wild mon caught in battle?
jr nz, .copyEnemyMonData
; Not wild.
call Random ; generate random IVs
ld b, a
call Random
.next4
push bc
ld bc, wPartyMon1DVs - wPartyMon1
add hl, bc
pop bc
ld [hli], a
ld [hl], b ; write IVs
ld bc, (wPartyMon1HPExp - 1) - (wPartyMon1DVs + 1)
add hl, bc
ld a, 1
ld c, a
xor a
ld b, a
call CalcStat ; calc HP stat (set cur Hp to max HP)
ld a, [H_MULTIPLICAND+1]
ld [de], a
inc de
ld a, [H_MULTIPLICAND+2]
ld [de], a
inc de
xor a
ld [de], a ; box level
inc de
ld [de], a ; status ailments
inc de
jr .copyMonTypesAndMoves
.copyEnemyMonData
ld bc, wEnemyMon1DVs - wEnemyMon1
add hl, bc
ld a, [wEnemyMonDVs] ; copy IVs from cur enemy mon
ld [hli], a
ld a, [wEnemyMonDVs + 1]
ld [hl], a
ld a, [wEnemyMonHP] ; copy HP from cur enemy mon
ld [de], a
inc de
ld a, [wEnemyMonHP+1]
ld [de], a
inc de
xor a
ld [de], a ; box level
inc de
ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon
ld [de], a
inc de
.copyMonTypesAndMoves
ld hl, wMonHTypes
ld a, [hli] ; type 1
ld [de], a
inc de
ld a, [hli] ; type 2
ld [de], a
inc de
ld a, [hli] ; catch rate (held item in gen 2)
ld [de], a
ld a, [wcf91]
cp KADABRA
jr nz, .skipGivingTwistedSpoon
ld a, $60 ; twistedspoon in gen 2
ld [de], a
.skipGivingTwistedSpoon
ld hl, wMonHMoves
ld a, [hli]
inc de
push de
ld [de], a
ld a, [hli]
inc de
ld [de], a
ld a, [hli]
inc de
ld [de], a
ld a, [hli]
inc de
ld [de], a
push de
dec de
dec de
dec de
xor a
ld [wLearningMovesFromDayCare], a
predef WriteMonMoves
pop de
ld a, [wPlayerID] ; set trainer ID to player ID
inc de
ld [de], a
ld a, [wPlayerID + 1]
inc de
ld [de], a
push de
ld a, [wCurEnemyLVL]
ld d, a
callab CalcExperience
pop de
inc de
ld a, [hExperience] ; write experience
ld [de], a
inc de
ld a, [hExperience + 1]
ld [de], a
inc de
ld a, [hExperience + 2]
ld [de], a
xor a
ld b, NUM_STATS * 2
.writeEVsLoop ; set all EVs to 0
inc de
ld [de], a
dec b
jr nz, .writeEVsLoop
inc de
inc de
pop hl
call AddPartyMon_WriteMovePP
inc de
ld a, [wCurEnemyLVL]
ld [de], a
inc de
ld a, [wIsInBattle]
dec a
jr nz, .calcFreshStats
ld hl, wEnemyMonMaxHP
ld bc, $a
call CopyData ; copy stats of cur enemy mon
pop hl
jr .done
.calcFreshStats
pop hl
ld bc, wPartyMon1HPExp - 1 - wPartyMon1
add hl, bc
ld b, $0
call CalcStats ; calculate fresh set of stats
.done
scf
ret
LoadMovePPs: ; f2f9 (3:72f9)
call GetPredefRegisters
; fallthrough
AddPartyMon_WriteMovePP: ; f2fc (3:72fc)
ld b, NUM_MOVES
.pploop
ld a, [hli] ; read move ID
and a
jr z, .empty
dec a
push hl
push de
push bc
ld hl, Moves
ld bc, MoveEnd - Moves
call AddNTimes
ld de, wcd6d
ld a, BANK(Moves)
call FarCopyData
pop bc
pop de
pop hl
ld a, [wcd6d + 5] ; PP is byte 5 of move data
.empty
inc de
ld [de], a
dec b
jr nz, .pploop ; there are still moves to read
ret
; adds enemy mon [wcf91] (at position [wWhichPokemon] in enemy list) to own party
; used in the cable club trade center
_AddEnemyMonToPlayerParty: ; f323 (3:7323)
ld hl, wPartyCount
ld a, [hl]
cp PARTY_LENGTH
scf
ret z ; party full, return failure
inc a
ld [hl], a ; add 1 to party members
ld c, a
ld b, $0
add hl, bc
ld a, [wcf91]
ld [hli], a ; add mon as last list entry
ld [hl], $ff ; write new sentinel
ld hl, wPartyMons
ld a, [wPartyCount]
dec a
ld bc, wPartyMon2 - wPartyMon1
call AddNTimes
ld e, l
ld d, h
ld hl, wLoadedMon
call CopyData ; write new mon's data (from wLoadedMon)
ld hl, wPartyMonOT
ld a, [wPartyCount]
dec a
call SkipFixedLengthTextEntries
ld d, h
ld e, l
ld hl, wEnemyMonOT
ld a, [wWhichPokemon]
call SkipFixedLengthTextEntries
ld bc, NAME_LENGTH
call CopyData ; write new mon's OT name (from an enemy mon)
ld hl, wPartyMonNicks
ld a, [wPartyCount]
dec a
call SkipFixedLengthTextEntries
ld d, h
ld e, l
ld hl, wEnemyMonNicks
ld a, [wWhichPokemon]
call SkipFixedLengthTextEntries
ld bc, NAME_LENGTH
call CopyData ; write new mon's nickname (from an enemy mon)
ld a, [wcf91]
ld [wd11e], a
predef IndexToPokedex
ld a, [wd11e]
dec a
ld c, a
ld b, FLAG_SET
ld hl, wPokedexOwned
push bc
call FlagAction ; add to owned pokemon
pop bc
ld hl, wPokedexSeen
call FlagAction ; add to seen pokemon
and a
ret ; return success
_MoveMon: ; f3a4 (3:73a4)
ld a, [wMoveMonType]
and a
jr z, .checkPartyMonSlots
cp DAYCARE_TO_PARTY
jr z, .checkPartyMonSlots
cp PARTY_TO_DAYCARE
ld hl, wDayCareMon
jr z, .asm_f3fb
ld hl, wNumInBox
ld a, [hl]
cp MONS_PER_BOX
jr nz, .partyOrBoxNotFull
jr .boxFull
.checkPartyMonSlots
ld hl, wPartyCount
ld a, [hl]
cp PARTY_LENGTH
jr nz, .partyOrBoxNotFull
.boxFull
scf
ret
.partyOrBoxNotFull
inc a
ld [hl], a ; increment number of mons in party/box
ld c, a
ld b, 0
add hl, bc
ld a, [wMoveMonType]
cp DAYCARE_TO_PARTY
ld a, [wDayCareMon]
jr z, .asm_f3dc
ld a, [wcf91]
.asm_f3dc
ld [hli], a ; write new mon ID
ld [hl], $ff ; write new sentinel
ld a, [wMoveMonType]
dec a
ld hl, wPartyMons
ld bc, wPartyMon2 - wPartyMon1 ; $2c
ld a, [wPartyCount]
jr nz, .skipToNewMonEntry
ld hl, wBoxMons
ld bc, wBoxMon2 - wBoxMon1 ; $21
ld a, [wNumInBox]
.skipToNewMonEntry
dec a
call AddNTimes
.asm_f3fb
push hl
ld e, l
ld d, h
ld a, [wMoveMonType]
and a
ld hl, wBoxMons
ld bc, wBoxMon2 - wBoxMon1 ; $21
jr z, .asm_f417
cp DAYCARE_TO_PARTY
ld hl, wDayCareMon
jr z, .asm_f41d
ld hl, wPartyMons
ld bc, wPartyMon2 - wPartyMon1 ; $2c
.asm_f417
ld a, [wWhichPokemon]
call AddNTimes
.asm_f41d
push hl
push de
ld bc, wBoxMon2 - wBoxMon1
call CopyData
pop de
pop hl
ld a, [wMoveMonType]
and a
jr z, .asm_f43a
cp DAYCARE_TO_PARTY
jr z, .asm_f43a
ld bc, wBoxMon2 - wBoxMon1
add hl, bc
ld a, [hl]
inc de
inc de
inc de
ld [de], a
.asm_f43a
ld a, [wMoveMonType]
cp PARTY_TO_DAYCARE
ld de, wDayCareMonOT
jr z, .asm_f459
dec a
ld hl, wPartyMonOT
ld a, [wPartyCount]
jr nz, .asm_f453
ld hl, wBoxMonOT
ld a, [wNumInBox]
.asm_f453
dec a
call SkipFixedLengthTextEntries
ld d, h
ld e, l
.asm_f459
ld hl, wBoxMonOT
ld a, [wMoveMonType]
and a
jr z, .asm_f46c
ld hl, wDayCareMonOT
cp DAYCARE_TO_PARTY
jr z, .asm_f472
ld hl, wPartyMonOT
.asm_f46c
ld a, [wWhichPokemon]
call SkipFixedLengthTextEntries
.asm_f472
ld bc, NAME_LENGTH
call CopyData
ld a, [wMoveMonType]
cp PARTY_TO_DAYCARE
ld de, wDayCareMonName
jr z, .asm_f497
dec a
ld hl, wPartyMonNicks
ld a, [wPartyCount]
jr nz, .asm_f491
ld hl, wBoxMonNicks
ld a, [wNumInBox]
.asm_f491
dec a
call SkipFixedLengthTextEntries
ld d, h
ld e, l
.asm_f497
ld hl, wBoxMonNicks
ld a, [wMoveMonType]
and a
jr z, .asm_f4aa
ld hl, wDayCareMonName
cp DAYCARE_TO_PARTY
jr z, .asm_f4b0
ld hl, wPartyMonNicks
.asm_f4aa
ld a, [wWhichPokemon]
call SkipFixedLengthTextEntries
.asm_f4b0
ld bc, NAME_LENGTH
call CopyData
pop hl
ld a, [wMoveMonType]
cp PARTY_TO_BOX
jr z, .asm_f4ea
cp PARTY_TO_DAYCARE
jr z, .asm_f4ea
push hl
srl a
add $2
ld [wMonDataLocation], a
call LoadMonData
callba CalcLevelFromExperience
ld a, d
ld [wCurEnemyLVL], a
pop hl
ld bc, wBoxMon2 - wBoxMon1
add hl, bc
ld [hli], a
ld d, h
ld e, l
ld bc, -18
add hl, bc
ld b, $1
call CalcStats
.asm_f4ea
and a
ret
FlagActionPredef: ; f4ec (3:74ec)
call GetPredefRegisters
FlagAction: ; f4ef (3:74ef)
; Perform action b on bit c
; in the bitfield at hl.
; 0: reset
; 1: set
; 2: read
; Return the result in c.
push hl
push de
push bc
; bit
ld a, c
ld d, a
and 7
ld e, a
; byte
ld a, d
srl a
srl a
srl a
add l
ld l, a
jr nc, .ok
inc h
.ok
; d = 1 << e (bitmask)
inc e
ld d, 1
.shift
dec e
jr z, .shifted
sla d
jr .shift
.shifted
ld a, b
and a
jr z, .reset
cp 2
jr z, .read
.set
ld b, [hl]
ld a, d
or b
ld [hl], a
jr .done
.reset
ld b, [hl]
ld a, d
xor $ff
and b
ld [hl], a
jr .done
.read
ld b, [hl]
ld a, d
and b
.done
pop bc
pop de
pop hl
ld c, a
ret
HealParty: ; f52b (3:752b)
; Restore HP and PP.
ld hl, wPartySpecies
ld de, wPartyMon1HP
.healmon
ld a, [hli]
cp $ff
jr z, .done
push hl
push de
ld hl, wPartyMon1Status - wPartyMon1HP
add hl, de
xor a
ld [hl], a
push de
ld b, NUM_MOVES ; A Pokémon has 4 moves
.pp
ld hl, wPartyMon1Moves - wPartyMon1HP
add hl, de
ld a, [hl]
and a
jr z, .nextmove
dec a
ld hl, wPartyMon1PP - wPartyMon1HP
add hl, de
push hl
push de
push bc
ld hl, Moves
ld bc, MoveEnd - Moves
call AddNTimes
ld de, wcd6d
ld a, BANK(Moves)
call FarCopyData
ld a, [wcd6d + 5] ; PP is byte 5 of move data
pop bc
pop de
pop hl
inc de
push bc
ld b, a
ld a, [hl]
and $c0
add b
ld [hl], a
pop bc
.nextmove
dec b
jr nz, .pp
pop de
ld hl, wPartyMon1MaxHP - wPartyMon1HP
add hl, de
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
pop de
pop hl
push hl
ld bc, wPartyMon2 - wPartyMon1
ld h, d
ld l, e
add hl, bc
ld d, h
ld e, l
pop hl
jr .healmon
.done
xor a
ld [wWhichPokemon], a
ld [wd11e], a
ld a, [wPartyCount]
ld b, a
.ppup
push bc
call RestoreBonusPP
pop bc
ld hl, wWhichPokemon
inc [hl]
dec b
jr nz, .ppup
ret
INCLUDE "engine/bcd.asm"
InitPlayerData: ; f6d6 (3:76d6)
InitPlayerData2:
call Random
ld a, [hRandomSub]
ld [wPlayerID], a
call Random
ld a, [hRandomAdd]
ld [wPlayerID + 1], a
ld a, $ff
ld [wUnusedD71B], a
ld a, 90 ; initialize happiness to 90
ld [wPikachuHappiness], a
ld a, $80
ld [wPikachuMood], a ; initialize mood
ld hl, wPartyCount
call InitializeEmptyList
ld hl, wNumInBox
call InitializeEmptyList
ld hl, wNumBagItems
call InitializeEmptyList
ld hl, wNumBoxItems
call InitializeEmptyList
START_MONEY EQU $3000
ld hl, wPlayerMoney + 1
ld a, START_MONEY / $100
ld [hld], a
xor a
ld [hli], a
inc hl
ld [hl], a
ld [wMonDataLocation], a
ld hl, wObtainedBadges
ld [hli], a
ld [hl], a
ld hl, wPlayerCoins
ld [hli], a
ld [hl], a
ld hl, wGameProgressFlags
ld bc, wGameProgressFlagsEnd - wGameProgressFlags
call FillMemory ; clear all game progress flags
jp InitializeMissableObjectsFlags
InitializeEmptyList: ; f730 (3:7730)
xor a ; count
ld [hli], a
dec a ; terminator
ld [hl], a
ret
GetQuantityOfItemInBag: ; f735 (3:7735)
; In: b = item ID
; Out: b = how many of that item are in the bag
call GetPredefRegisters
ld hl, wNumBagItems
.loop
inc hl
ld a, [hli]
cp $ff
jr z, .notInBag
cp b
jr nz, .loop
ld a, [hl]
ld b, a
ret
.notInBag
ld b, 0
ret
FindPathToPlayer: ; f74a (3:774a)
xor a
ld hl, hFindPathNumSteps
ld [hli], a ; hFindPathNumSteps
ld [hli], a ; hFindPathFlags
ld [hli], a ; hFindPathYProgress
ld [hl], a ; hFindPathXProgress
ld hl, wNPCMovementDirections2
ld de, $0
.loop
ld a, [hFindPathYProgress]
ld b, a
ld a, [hNPCPlayerYDistance] ; Y distance in steps
call CalcDifference
ld d, a
and a
jr nz, .asm_f76a
ld a, [hFindPathFlags]
set 0, a ; current end of path matches the player's Y coordinate
ld [hFindPathFlags], a
.asm_f76a
ld a, [hFindPathXProgress]
ld b, a
ld a, [hNPCPlayerXDistance] ; X distance in steps
call CalcDifference
ld e, a
and a
jr nz, .asm_f77c
ld a, [hFindPathFlags]
set 1, a ; current end of path matches the player's X coordinate
ld [hFindPathFlags], a
.asm_f77c
ld a, [hFindPathFlags]
cp $3 ; has the end of the path reached the player's position?
jr z, .done
; Compare whether the X distance between the player and the current of the path
; is greater or if the Y distance is. Then, try to reduce whichever is greater.
ld a, e
cp d
jr c, .yDistanceGreater
; x distance is greater
ld a, [hNPCPlayerRelativePosFlags]
bit 1, a
jr nz, .playerIsLeftOfNPC
ld d, NPC_MOVEMENT_RIGHT
jr .next1
.playerIsLeftOfNPC
ld d, NPC_MOVEMENT_LEFT
.next1
ld a, [hFindPathXProgress]
add 1
ld [hFindPathXProgress], a
jr .storeDirection
.yDistanceGreater
ld a, [hNPCPlayerRelativePosFlags]
bit 0, a
jr nz, .playerIsAboveNPC
ld d, NPC_MOVEMENT_DOWN
jr .next2
.playerIsAboveNPC
ld d, NPC_MOVEMENT_UP
.next2
ld a, [hFindPathYProgress]
add 1
ld [hFindPathYProgress], a
.storeDirection
ld a, d
ld [hli], a
ld a, [hFindPathNumSteps]
inc a
ld [hFindPathNumSteps], a
jp .loop
.done
ld [hl], $ff
ret
CalcPositionOfPlayerRelativeToNPC: ; f7b9 (3:77b9)
xor a
ld [hNPCPlayerRelativePosFlags], a
ld a, [wSpriteStateData1 + 4] ; player's sprite screen Y position in pixels
ld d, a
ld a, [wSpriteStateData1 + 6] ; player's sprite screen X position in pixels
ld e, a
ld hl, wSpriteStateData1
ld a, [hNPCSpriteOffset]
add l
add $4
ld l, a
jr nc, .noCarry
inc h
.noCarry
ld a, d
ld b, a
ld a, [hli] ; NPC sprite screen Y position in pixels
call CalcDifference
jr nc, .NPCSouthOfOrAlignedWithPlayer
.NPCNorthOfPlayer
push hl
ld hl, hNPCPlayerRelativePosFlags
bit 0, [hl]
set 0, [hl]
pop hl
jr .divideYDistance
.NPCSouthOfOrAlignedWithPlayer
push hl
ld hl, hNPCPlayerRelativePosFlags
bit 0, [hl]
res 0, [hl]
pop hl
.divideYDistance
push hl
ld hl, hDividend2
ld [hli], a
ld a, 16
ld [hli], a
call DivideBytes ; divide Y absolute distance by 16
ld a, [hl] ; quotient
ld [hNPCPlayerYDistance], a
pop hl
inc hl
ld b, e
ld a, [hl] ; NPC sprite screen X position in pixels
call CalcDifference
jr nc, .NPCEastOfOrAlignedWithPlayer
.NPCWestOfPlayer
push hl
ld hl, hNPCPlayerRelativePosFlags
bit 1, [hl]
set 1, [hl]
pop hl
jr .divideXDistance
.NPCEastOfOrAlignedWithPlayer
push hl
ld hl, hNPCPlayerRelativePosFlags
bit 1, [hl]
res 1, [hl]
pop hl
.divideXDistance
ld [hDividend2], a
ld a, 16
ld [hDivisor2], a
call DivideBytes ; divide X absolute distance by 16
ld a, [hQuotient2]
ld [hNPCPlayerXDistance], a
ld a, [hNPCPlayerRelativePosPerspective]
and a
ret z
ld a, [hNPCPlayerRelativePosFlags]
cpl
and $3
ld [hNPCPlayerRelativePosFlags], a
ret
ConvertNPCMovementDirectionsToJoypadMasks: ; f830 (3:7830)
ld a, [hNPCMovementDirections2Index]
ld [wNPCMovementDirections2Index], a
dec a
ld de, wSimulatedJoypadStatesEnd
ld hl, wNPCMovementDirections2
add l
ld l, a
jr nc, .loop
inc h
.loop
ld a, [hld]
call ConvertNPCMovementDirectionToJoypadMask
ld [de], a
inc de
ld a, [hNPCMovementDirections2Index]
dec a
ld [hNPCMovementDirections2Index], a
jr nz, .loop
ret
ConvertNPCMovementDirectionToJoypadMask: ; f84f (3:784f)
push hl
ld b, a
ld hl, NPCMovementDirectionsToJoypadMasksTable
.loop
ld a, [hli]
cp $ff
jr z, .done
cp b
jr z, .loadJoypadMask
inc hl
jr .loop
.loadJoypadMask
ld a, [hl]
.done
pop hl
ret
NPCMovementDirectionsToJoypadMasksTable: ; f862 (3:7862)
db NPC_MOVEMENT_UP, D_UP
db NPC_MOVEMENT_DOWN, D_DOWN
db NPC_MOVEMENT_LEFT, D_LEFT
db NPC_MOVEMENT_RIGHT, D_RIGHT
db $ff
; unreferenced
ret
INCLUDE "engine/hp_bar.asm"
INCLUDE "engine/hidden_object_functions3.asm"
SECTION "Graphics", ROMX, BANK[GFX]
PokemonLogoJapanGraphics: INCBIN "gfx/pokemon_logo_japan.2bpp"
FontGraphics: INCBIN "gfx/font.1bpp"
FontGraphicsEnd:
ABTiles: INCBIN "gfx/AB.2bpp"
HpBarAndStatusGraphics: INCBIN "gfx/hp_bar_and_status.2bpp"
HpBarAndStatusGraphicsEnd:
BattleHudTiles1: INCBIN "gfx/battle_hud1.1bpp"
BattleHudTiles2: INCBIN "gfx/battle_hud2.1bpp"
BattleHudTiles3: INCBIN "gfx/battle_hud3.1bpp"
NintendoCopyrightLogoGraphics: INCBIN "gfx/copyright.2bpp"
GamefreakLogoGraphics: INCBIN "gfx/gamefreak.2bpp"
GamefreakLogoGraphicsEnd:
NineTile: INCBIN "gfx/9_tile.2bpp"
TextBoxGraphics: INCBIN "gfx/text_box.2bpp"
TextBoxGraphicsEnd:
PokedexTileGraphics: INCBIN "gfx/pokedex.2bpp"
WorldMapTileGraphics: INCBIN "gfx/town_map.2bpp"
WorldMapTileGraphicsEnd:
PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp"
dr $11468,$1168a
PrintStatsBox: ; 1168a (4:568a)
dr $1168a, $11875
DrawPartyMenu_: ; 11875 (4:5875)
dr $11875,$11886
RedrawPartyMenu_: ; 11886 (4:5886)
dr $11886,$11a97
RedPicFront: INCBIN "pic/ytrainer/red.pic"
ShrinkPic1: INCBIN "pic/trainer/shrink1.pic"
ShrinkPic2: INCBIN "pic/trainer/shrink2.pic"
StartMenu_Pokedex: ; 11c22 (4:5c22)
dr $11c22,$11c36
StartMenu_Pokemon: ; 11c36 (4:5c36)
dr $11c36,$11e98
ErasePartyMenuCursors: ; 11e98 (4:5e98)
dr $11e98,$11ead
StartMenu_Item: ; 11ead (4:5ead)
dr $11ead,$1200a
StartMenu_TrainerInfo: ; 1200a (4:600a)
dr $1200a,$12195
StartMenu_SaveReset: ; 12195 (4:6195)
dr $12195,$121a8
StartMenu_Option: ; 121a8 (4:61a8)
dr $121a8,$121c5
SwitchPartyMon: ; 121c5 (4:61c5)
dr $121c5,$12365
SECTION "NPC Sprites 1", ROMX, BANK[NPC_SPRITES_1]
OakAideSprite: INCBIN "gfx/sprites/oak_aide.2bpp"
RockerSprite: INCBIN "gfx/sprites/rocker.2bpp"
SwimmerSprite: INCBIN "gfx/sprites/swimmer.2bpp"
WhitePlayerSprite: INCBIN "gfx/sprites/white_player.2bpp"
GymHelperSprite: INCBIN "gfx/sprites/gym_helper.2bpp"
OldPersonSprite: INCBIN "gfx/sprites/old_person.2bpp"
MartGuySprite: INCBIN "gfx/sprites/mart_guy.2bpp"
FisherSprite: INCBIN "gfx/sprites/fisher.2bpp"
OldMediumWomanSprite: INCBIN "gfx/sprites/old_medium_woman.2bpp"
NurseSprite: INCBIN "gfx/sprites/nurse.2bpp"
CableClubWomanSprite: INCBIN "gfx/sprites/cable_club_woman.2bpp"
MrMasterballSprite: INCBIN "gfx/sprites/mr_masterball.2bpp"
LaprasGiverSprite: INCBIN "gfx/sprites/lapras_giver.2bpp"
WardenSprite: INCBIN "gfx/sprites/warden.2bpp"
SsCaptainSprite: INCBIN "gfx/sprites/ss_captain.2bpp"
Fisher2Sprite: INCBIN "gfx/sprites/fisher2.2bpp"
BlackbeltSprite: INCBIN "gfx/sprites/blackbelt.2bpp"
GuardSprite: INCBIN "gfx/sprites/guard.2bpp"
BallSprite: INCBIN "gfx/sprites/ball.2bpp"
OmanyteSprite: INCBIN "gfx/sprites/omanyte.2bpp"
BoulderSprite: INCBIN "gfx/sprites/boulder.2bpp"
PaperSheetSprite: INCBIN "gfx/sprites/paper_sheet.2bpp"
BookMapDexSprite: INCBIN "gfx/sprites/book_map_dex.2bpp"
ClipboardSprite: INCBIN "gfx/sprites/clipboard.2bpp"
SnorlaxSprite: INCBIN "gfx/sprites/snorlax.2bpp"
OldAmberSprite: INCBIN "gfx/sprites/old_amber.2bpp"
LyingOldManSprite: INCBIN "gfx/sprites/lying_old_man.2bpp"
QuestionMarkSprite: INCBIN "gfx/sprites/question_mark.2bpp"
EndOfBattle: ; 13765 (4:7765)
dr $13765,$1383a
TryDoWildEncounter: ; 1383a (4:783a)
dr $1383a,$14000
SECTION "NPC Sprites 2", ROMX, BANK[NPC_SPRITES_2]
dr $14000,$1401b
_InitMapSprites: ; 1401b (5:401b)
dr $1401b,$140d2
Func_140d2: ; 140d2 (5:40d2)
dr $140d2,$143f1
RedCyclingSprite: INCBIN "gfx/sprites/cycling.2bpp"
RedSprite: INCBIN "gfx/sprites/red.2bpp"
BlueSprite: INCBIN "gfx/sprites/blue.2bpp"
OakSprite: INCBIN "gfx/sprites/oak.2bpp"
BugCatcherSprite: INCBIN "gfx/sprites/bug_catcher.2bpp"
SlowbroSprite: INCBIN "gfx/sprites/slowbro.2bpp"
LassSprite: INCBIN "gfx/sprites/lass.2bpp"
BlackHairBoy1Sprite: INCBIN "gfx/sprites/black_hair_boy_1.2bpp"
LittleGirlSprite: INCBIN "gfx/sprites/little_girl.2bpp"
BirdSprite: INCBIN "gfx/sprites/bird.2bpp"
FatBaldGuySprite: INCBIN "gfx/sprites/fat_bald_guy.2bpp"
GamblerSprite: INCBIN "gfx/sprites/gambler.2bpp"
BlackHairBoy2Sprite: INCBIN "gfx/sprites/black_hair_boy_2.2bpp"
GirlSprite: INCBIN "gfx/sprites/girl.2bpp"
HikerSprite: INCBIN "gfx/sprites/hiker.2bpp"
FoulardWomanSprite: INCBIN "gfx/sprites/foulard_woman.2bpp"
GentlemanSprite: INCBIN "gfx/sprites/gentleman.2bpp"
DaisySprite: INCBIN "gfx/sprites/daisy.2bpp"
BikerSprite: INCBIN "gfx/sprites/biker.2bpp"
SailorSprite: INCBIN "gfx/sprites/sailor.2bpp"
CookSprite: INCBIN "gfx/sprites/cook.2bpp"
BikeShopGuySprite: INCBIN "gfx/sprites/bike_shop_guy.2bpp"
MrFujiSprite: INCBIN "gfx/sprites/mr_fuji.2bpp"
GiovanniSprite: INCBIN "gfx/sprites/giovanni.2bpp"
RocketSprite: INCBIN "gfx/sprites/rocket.2bpp"
MediumSprite: INCBIN "gfx/sprites/medium.2bpp"
WaiterSprite: INCBIN "gfx/sprites/waiter.2bpp"
ErikaSprite: INCBIN "gfx/sprites/erika.2bpp"
MomGeishaSprite: INCBIN "gfx/sprites/mom_geisha.2bpp"
BrunetteGirlSprite: INCBIN "gfx/sprites/brunette_girl.2bpp"
LanceSprite: INCBIN "gfx/sprites/lance.2bpp"
MomSprite: INCBIN "gfx/sprites/mom.2bpp"
BaldingGuySprite: INCBIN "gfx/sprites/balding_guy.2bpp"
YoungBoySprite: INCBIN "gfx/sprites/young_boy.2bpp"
GameboyKidSprite: INCBIN "gfx/sprites/gameboy_kid.2bpp"
ClefairySprite: INCBIN "gfx/sprites/clefairy.2bpp"
AgathaSprite: INCBIN "gfx/sprites/agatha.2bpp"
BrunoSprite: INCBIN "gfx/sprites/bruno.2bpp"
LoreleiSprite: INCBIN "gfx/sprites/lorelei.2bpp"
SeelSprite: INCBIN "gfx/sprites/seel.2bpp"
dr $17c31,$17cb0
ActivatePC: ; 17cb0 (5:7cb0)
dr $17cb0,$18000
SECTION "bank06",ROMX,BANK[$06]
dr $18000,$1a4ea
PlayerStepOutFromDoor: ; 1a4ea (6:64ea)
dr $1a4ea,$1a527
_EndNPCMovementScript: ; 1a527 (6:6527)
dr $1a527,$1a54c
ProfOakMovementScriptPointerTable: ; 1a54c (6:654c)
dr $1a54c,$1a622
PewterMuseumGuyMovementScriptPointerTable: ; 1a622 (6:6622)
dr $1a622,$1a685
PewterGymGuyMovementScriptPointerTable: ; 1a685 (6:6685)
dr $1a685,$1a785
IsPlayerStandingOnDoorTile: ; 1a785 (6:6785)
dr $1a785,$1a7f4
HandleLedges: ; 1a7f4 (6:67f4)
dr $1a7f4,$1c000
SECTION "bank07",ROMX,BANK[$07]
dr $1c000,$1c21e
DoClearSaveDialogue: ; 1c21e (7:421e)
dr $1c21e,$1e321
SafariZoneCheck: ; 1e321 (7:6e21)
dr $1e321,$1e330
SafariZoneCheckSteps: ; 1e330 (7:6330)
dr $1e330,$1e385
PrintSafariGameOverText: ; 1e385 (7:6385)
dr $1e385,$1e4bf
CinnabarGymQuiz_1eb0a: ; 1e4bf (7:64bf)
dr $1e4bf,$20000
SECTION "Pics 1", ROMX, BANK[PICS_1]
RhydonPicFront: INCBIN "pic/ymon/rhydon.pic"
RhydonPicBack: INCBIN "pic/monback/rhydonb.pic"
KangaskhanPicFront: INCBIN "pic/ymon/kangaskhan.pic"
KangaskhanPicBack: INCBIN "pic/monback/kangaskhanb.pic"
NidoranMPicFront: INCBIN "pic/ymon/nidoranm.pic"
NidoranMPicBack: INCBIN "pic/monback/nidoranmb.pic"
ClefairyPicFront: INCBIN "pic/ymon/clefairy.pic"
ClefairyPicBack: INCBIN "pic/monback/clefairyb.pic"
SpearowPicFront: INCBIN "pic/ymon/spearow.pic"
SpearowPicBack: INCBIN "pic/monback/spearowb.pic"
VoltorbPicFront: INCBIN "pic/ymon/voltorb.pic"
VoltorbPicBack: INCBIN "pic/monback/voltorbb.pic"
NidokingPicFront: INCBIN "pic/ymon/nidoking.pic"
NidokingPicBack: INCBIN "pic/monback/nidokingb.pic"
SlowbroPicFront: INCBIN "pic/ymon/slowbro.pic"
SlowbroPicBack: INCBIN "pic/monback/slowbrob.pic"
IvysaurPicFront: INCBIN "pic/ymon/ivysaur.pic"
IvysaurPicBack: INCBIN "pic/monback/ivysaurb.pic"
ExeggutorPicFront: INCBIN "pic/ymon/exeggutor.pic"
ExeggutorPicBack: INCBIN "pic/monback/exeggutorb.pic"
LickitungPicFront: INCBIN "pic/ymon/lickitung.pic"
LickitungPicBack: INCBIN "pic/monback/lickitungb.pic"
ExeggcutePicFront: INCBIN "pic/ymon/exeggcute.pic"
ExeggcutePicBack: INCBIN "pic/monback/exeggcuteb.pic"
GrimerPicFront: INCBIN "pic/ymon/grimer.pic"
GrimerPicBack: INCBIN "pic/monback/grimerb.pic"
GengarPicFront: INCBIN "pic/ymon/gengar.pic"
GengarPicBack: INCBIN "pic/monback/gengarb.pic"
NidoranFPicFront: INCBIN "pic/ymon/nidoranf.pic"
NidoranFPicBack: INCBIN "pic/monback/nidoranfb.pic"
NidoqueenPicFront: INCBIN "pic/ymon/nidoqueen.pic"
NidoqueenPicBack: INCBIN "pic/monback/nidoqueenb.pic"
CubonePicFront: INCBIN "pic/ymon/cubone.pic"
CubonePicBack: INCBIN "pic/monback/cuboneb.pic"
RhyhornPicFront: INCBIN "pic/ymon/rhyhorn.pic"
RhyhornPicBack: INCBIN "pic/monback/rhyhornb.pic"
LaprasPicFront: INCBIN "pic/ymon/lapras.pic"
LaprasPicBack: INCBIN "pic/monback/laprasb.pic"
ArcaninePicFront: INCBIN "pic/ymon/arcanine.pic"
ArcaninePicBack: INCBIN "pic/monback/arcanineb.pic"
MewPicFront: INCBIN "pic/ymon/mew.pic"
MewPicBack: INCBIN "pic/monback/mewb.pic"
GyaradosPicFront: INCBIN "pic/ymon/gyarados.pic"
GyaradosPicBack: INCBIN "pic/monback/gyaradosb.pic"
ShellderPicFront: INCBIN "pic/ymon/shellder.pic"
ShellderPicBack: INCBIN "pic/monback/shellderb.pic"
TentacoolPicFront: INCBIN "pic/ymon/tentacool.pic"
TentacoolPicBack: INCBIN "pic/monback/tentacoolb.pic"
GastlyPicFront: INCBIN "pic/ymon/gastly.pic"
GastlyPicBack: INCBIN "pic/monback/gastlyb.pic"
ScytherPicFront: INCBIN "pic/ymon/scyther.pic"
ScytherPicBack: INCBIN "pic/monback/scytherb.pic"
StaryuPicFront: INCBIN "pic/ymon/staryu.pic"
StaryuPicBack: INCBIN "pic/monback/staryub.pic"
BlastoisePicFront: INCBIN "pic/ymon/blastoise.pic"
BlastoisePicBack: INCBIN "pic/monback/blastoiseb.pic"
PinsirPicFront: INCBIN "pic/ymon/pinsir.pic"
PinsirPicBack: INCBIN "pic/monback/pinsirb.pic"
TangelaPicFront: INCBIN "pic/ymon/tangela.pic"
TangelaPicBack: INCBIN "pic/monback/tangelab.pic"
dr $27d20,$27dff
SaveTrainerName: ; 27dff (9:7dff)
dr $27dff,$28000
SECTION "Pics 2", ROMX, BANK[PICS_2]
GrowlithePicFront: INCBIN "pic/ymon/growlithe.pic"
GrowlithePicBack: INCBIN "pic/monback/growlitheb.pic"
OnixPicFront: INCBIN "pic/ymon/onix.pic"
OnixPicBack: INCBIN "pic/monback/onixb.pic"
FearowPicFront: INCBIN "pic/ymon/fearow.pic"
FearowPicBack: INCBIN "pic/monback/fearowb.pic"
PidgeyPicFront: INCBIN "pic/ymon/pidgey.pic"
PidgeyPicBack: INCBIN "pic/monback/pidgeyb.pic"
SlowpokePicFront: INCBIN "pic/ymon/slowpoke.pic"
SlowpokePicBack: INCBIN "pic/monback/slowpokeb.pic"
KadabraPicFront: INCBIN "pic/ymon/kadabra.pic"
KadabraPicBack: INCBIN "pic/monback/kadabrab.pic"
GravelerPicFront: INCBIN "pic/ymon/graveler.pic"
GravelerPicBack: INCBIN "pic/monback/gravelerb.pic"
ChanseyPicFront: INCBIN "pic/ymon/chansey.pic"
ChanseyPicBack: INCBIN "pic/monback/chanseyb.pic"
MachokePicFront: INCBIN "pic/ymon/machoke.pic"
MachokePicBack: INCBIN "pic/monback/machokeb.pic"
MrMimePicFront: INCBIN "pic/ymon/mr.mime.pic"
MrMimePicBack: INCBIN "pic/monback/mr.mimeb.pic"
HitmonleePicFront: INCBIN "pic/ymon/hitmonlee.pic"
HitmonleePicBack: INCBIN "pic/monback/hitmonleeb.pic"
HitmonchanPicFront: INCBIN "pic/ymon/hitmonchan.pic"
HitmonchanPicBack: INCBIN "pic/monback/hitmonchanb.pic"
ArbokPicFront: INCBIN "pic/ymon/arbok.pic"
ArbokPicBack: INCBIN "pic/monback/arbokb.pic"
ParasectPicFront: INCBIN "pic/ymon/parasect.pic"
ParasectPicBack: INCBIN "pic/monback/parasectb.pic"
PsyduckPicFront: INCBIN "pic/ymon/psyduck.pic"
PsyduckPicBack: INCBIN "pic/monback/psyduckb.pic"
DrowzeePicFront: INCBIN "pic/ymon/drowzee.pic"
DrowzeePicBack: INCBIN "pic/monback/drowzeeb.pic"
GolemPicFront: INCBIN "pic/ymon/golem.pic"
GolemPicBack: INCBIN "pic/monback/golemb.pic"
MagmarPicFront: INCBIN "pic/ymon/magmar.pic"
MagmarPicBack: INCBIN "pic/monback/magmarb.pic"
ElectabuzzPicFront: INCBIN "pic/ymon/electabuzz.pic"
ElectabuzzPicBack: INCBIN "pic/monback/electabuzzb.pic"
MagnetonPicFront: INCBIN "pic/ymon/magneton.pic"
MagnetonPicBack: INCBIN "pic/monback/magnetonb.pic"
KoffingPicFront: INCBIN "pic/ymon/koffing.pic"
KoffingPicBack: INCBIN "pic/monback/koffingb.pic"
MankeyPicFront: INCBIN "pic/ymon/mankey.pic"
MankeyPicBack: INCBIN "pic/monback/mankeyb.pic"
SeelPicFront: INCBIN "pic/ymon/seel.pic"
SeelPicBack: INCBIN "pic/monback/seelb.pic"
DiglettPicFront: INCBIN "pic/ymon/diglett.pic"
DiglettPicBack: INCBIN "pic/monback/diglettb.pic"
TaurosPicFront: INCBIN "pic/ymon/tauros.pic"
TaurosPicBack: INCBIN "pic/monback/taurosb.pic"
FarfetchdPicFront: INCBIN "pic/ymon/farfetchd.pic"
FarfetchdPicBack: INCBIN "pic/monback/farfetchdb.pic"
VenonatPicFront: INCBIN "pic/ymon/venonat.pic"
VenonatPicBack: INCBIN "pic/monback/venonatb.pic"
DragonitePicFront: INCBIN "pic/ymon/dragonite.pic"
DragonitePicBack: INCBIN "pic/monback/dragoniteb.pic"
DoduoPicFront: INCBIN "pic/ymon/doduo.pic"
DoduoPicBack: INCBIN "pic/monback/doduob.pic"
PoliwagPicFront: INCBIN "pic/ymon/poliwag.pic"
PoliwagPicBack: INCBIN "pic/monback/poliwagb.pic"
JynxPicFront: INCBIN "pic/ymon/jynx.pic"
JynxPicBack: INCBIN "pic/monback/jynxb.pic"
MoltresPicFront: INCBIN "pic/ymon/moltres.pic"
MoltresPicBack: INCBIN "pic/monback/moltresb.pic"
dr $2bd4c,$2c000
SECTION "Pics 3", ROMX, BANK[PICS_3]
ArticunoPicFront: INCBIN "pic/ymon/articuno.pic"
ArticunoPicBack: INCBIN "pic/monback/articunob.pic"
ZapdosPicFront: INCBIN "pic/ymon/zapdos.pic"
ZapdosPicBack: INCBIN "pic/monback/zapdosb.pic"
DittoPicFront: INCBIN "pic/ymon/ditto.pic"
DittoPicBack: INCBIN "pic/monback/dittob.pic"
MeowthPicFront: INCBIN "pic/ymon/meowth.pic"
MeowthPicBack: INCBIN "pic/monback/meowthb.pic"
KrabbyPicFront: INCBIN "pic/ymon/krabby.pic"
KrabbyPicBack: INCBIN "pic/monback/krabbyb.pic"
VulpixPicFront: INCBIN "pic/ymon/vulpix.pic"
VulpixPicBack: INCBIN "pic/monback/vulpixb.pic"
NinetalesPicFront: INCBIN "pic/ymon/ninetales.pic"
NinetalesPicBack: INCBIN "pic/monback/ninetalesb.pic"
PikachuPicFront: INCBIN "pic/ymon/pikachu.pic"
PikachuPicBack: INCBIN "pic/monback/pikachub.pic"
RaichuPicFront: INCBIN "pic/ymon/raichu.pic"
RaichuPicBack: INCBIN "pic/monback/raichub.pic"
DratiniPicFront: INCBIN "pic/ymon/dratini.pic"
DratiniPicBack: INCBIN "pic/monback/dratinib.pic"
DragonairPicFront: INCBIN "pic/ymon/dragonair.pic"
DragonairPicBack: INCBIN "pic/monback/dragonairb.pic"
KabutoPicFront: INCBIN "pic/ymon/kabuto.pic"
KabutoPicBack: INCBIN "pic/monback/kabutob.pic"
KabutopsPicFront: INCBIN "pic/ymon/kabutops.pic"
KabutopsPicBack: INCBIN "pic/monback/kabutopsb.pic"
HorseaPicFront: INCBIN "pic/ymon/horsea.pic"
HorseaPicBack: INCBIN "pic/monback/horseab.pic"
SeadraPicFront: INCBIN "pic/ymon/seadra.pic"
SeadraPicBack: INCBIN "pic/monback/seadrab.pic"
SandshrewPicFront: INCBIN "pic/ymon/sandshrew.pic"
SandshrewPicBack: INCBIN "pic/monback/sandshrewb.pic"
SandslashPicFront: INCBIN "pic/ymon/sandslash.pic"
SandslashPicBack: INCBIN "pic/monback/sandslashb.pic"
OmanytePicFront: INCBIN "pic/ymon/omanyte.pic"
OmanytePicBack: INCBIN "pic/monback/omanyteb.pic"
OmastarPicFront: INCBIN "pic/ymon/omastar.pic"
OmastarPicBack: INCBIN "pic/monback/omastarb.pic"
JigglypuffPicFront: INCBIN "pic/ymon/jigglypuff.pic"
JigglypuffPicBack: INCBIN "pic/monback/jigglypuffb.pic"
WigglytuffPicFront: INCBIN "pic/ymon/wigglytuff.pic"
WigglytuffPicBack: INCBIN "pic/monback/wigglytuffb.pic"
EeveePicFront: INCBIN "pic/ymon/eevee.pic"
EeveePicBack: INCBIN "pic/monback/eeveeb.pic"
FlareonPicFront: INCBIN "pic/ymon/flareon.pic"
FlareonPicBack: INCBIN "pic/monback/flareonb.pic"
JolteonPicFront: INCBIN "pic/ymon/jolteon.pic"
JolteonPicBack: INCBIN "pic/monback/jolteonb.pic"
VaporeonPicFront: INCBIN "pic/ymon/vaporeon.pic"
VaporeonPicBack: INCBIN "pic/monback/vaporeonb.pic"
MachopPicFront: INCBIN "pic/ymon/machop.pic"
MachopPicBack: INCBIN "pic/monback/machopb.pic"
ZubatPicFront: INCBIN "pic/ymon/zubat.pic"
ZubatPicBack: INCBIN "pic/monback/zubatb.pic"
EkansPicFront: INCBIN "pic/ymon/ekans.pic"
EkansPicBack: INCBIN "pic/monback/ekansb.pic"
ParasPicFront: INCBIN "pic/ymon/paras.pic"
ParasPicBack: INCBIN "pic/monback/parasb.pic"
PoliwhirlPicFront: INCBIN "pic/ymon/poliwhirl.pic"
PoliwhirlPicBack: INCBIN "pic/monback/poliwhirlb.pic"
PoliwrathPicFront: INCBIN "pic/ymon/poliwrath.pic"
PoliwrathPicBack: INCBIN "pic/monback/poliwrathb.pic"
WeedlePicFront: INCBIN "pic/ymon/weedle.pic"
WeedlePicBack: INCBIN "pic/monback/weedleb.pic"
KakunaPicFront: INCBIN "pic/ymon/kakuna.pic"
KakunaPicBack: INCBIN "pic/monback/kakunab.pic"
BeedrillPicFront: INCBIN "pic/ymon/beedrill.pic"
BeedrillPicBack: INCBIN "pic/monback/beedrillb.pic"
FossilKabutopsPic: INCBIN "pic/ymon/fossilkabutops.pic"
dr $2fd25,$2fd42
CheckIfMoveIsKnown: ; 2fd42 (b:7d42)
dr $2fd42,$2fd6a
Func_2fd6a: ; 2fd6a (b:7d6a)
dr $2fd6a,$30000
SECTION "Pics 4", ROMX, BANK[PICS_4]
DodrioPicFront: INCBIN "pic/ymon/dodrio.pic"
DodrioPicBack: INCBIN "pic/monback/dodriob.pic"
PrimeapePicFront: INCBIN "pic/ymon/primeape.pic"
PrimeapePicBack: INCBIN "pic/monback/primeapeb.pic"
DugtrioPicFront: INCBIN "pic/ymon/dugtrio.pic"
DugtrioPicBack: INCBIN "pic/monback/dugtriob.pic"
VenomothPicFront: INCBIN "pic/ymon/venomoth.pic"
VenomothPicBack: INCBIN "pic/monback/venomothb.pic"
DewgongPicFront: INCBIN "pic/ymon/dewgong.pic"
DewgongPicBack: INCBIN "pic/monback/dewgongb.pic"
CaterpiePicFront: INCBIN "pic/ymon/caterpie.pic"
CaterpiePicBack: INCBIN "pic/monback/caterpieb.pic"
MetapodPicFront: INCBIN "pic/ymon/metapod.pic"
MetapodPicBack: INCBIN "pic/monback/metapodb.pic"
ButterfreePicFront: INCBIN "pic/ymon/butterfree.pic"
ButterfreePicBack: INCBIN "pic/monback/butterfreeb.pic"
MachampPicFront: INCBIN "pic/ymon/machamp.pic"
MachampPicBack: INCBIN "pic/monback/machampb.pic"
GolduckPicFront: INCBIN "pic/ymon/golduck.pic"
GolduckPicBack: INCBIN "pic/monback/golduckb.pic"
HypnoPicFront: INCBIN "pic/ymon/hypno.pic"
HypnoPicBack: INCBIN "pic/monback/hypnob.pic"
GolbatPicFront: INCBIN "pic/ymon/golbat.pic"
GolbatPicBack: INCBIN "pic/monback/golbatb.pic"
MewtwoPicFront: INCBIN "pic/ymon/mewtwo.pic"
MewtwoPicBack: INCBIN "pic/monback/mewtwob.pic"
SnorlaxPicFront: INCBIN "pic/ymon/snorlax.pic"
SnorlaxPicBack: INCBIN "pic/monback/snorlaxb.pic"
MagikarpPicFront: INCBIN "pic/ymon/magikarp.pic"
MagikarpPicBack: INCBIN "pic/monback/magikarpb.pic"
MukPicFront: INCBIN "pic/ymon/muk.pic"
MukPicBack: INCBIN "pic/monback/mukb.pic"
KinglerPicFront: INCBIN "pic/ymon/kingler.pic"
KinglerPicBack: INCBIN "pic/monback/kinglerb.pic"
CloysterPicFront: INCBIN "pic/ymon/cloyster.pic"
CloysterPicBack: INCBIN "pic/monback/cloysterb.pic"
ElectrodePicFront: INCBIN "pic/ymon/electrode.pic"
ElectrodePicBack: INCBIN "pic/monback/electrodeb.pic"
ClefablePicFront: INCBIN "pic/ymon/clefable.pic"
ClefablePicBack: INCBIN "pic/monback/clefableb.pic"
WeezingPicFront: INCBIN "pic/ymon/weezing.pic"
WeezingPicBack: INCBIN "pic/monback/weezingb.pic"
PersianPicFront: INCBIN "pic/ymon/persian.pic"
PersianPicBack: INCBIN "pic/monback/persianb.pic"
MarowakPicFront: INCBIN "pic/ymon/marowak.pic"
MarowakPicBack: INCBIN "pic/monback/marowakb.pic"
HaunterPicFront: INCBIN "pic/ymon/haunter.pic"
HaunterPicBack: INCBIN "pic/monback/haunterb.pic"
AbraPicFront: INCBIN "pic/ymon/abra.pic"
AbraPicBack: INCBIN "pic/monback/abrab.pic"
AlakazamPicFront: INCBIN "pic/ymon/alakazam.pic"
AlakazamPicBack: INCBIN "pic/monback/alakazamb.pic"
PidgeottoPicFront: INCBIN "pic/ymon/pidgeotto.pic"
PidgeottoPicBack: INCBIN "pic/monback/pidgeottob.pic"
PidgeotPicFront: INCBIN "pic/ymon/pidgeot.pic"
PidgeotPicBack: INCBIN "pic/monback/pidgeotb.pic"
StarmiePicFront: INCBIN "pic/ymon/starmie.pic"
StarmiePicBack: INCBIN "pic/monback/starmieb.pic"
SECTION "Pics 5", ROMX, BANK[PICS_5]
BulbasaurPicFront: INCBIN "pic/ymon/bulbasaur.pic"
BulbasaurPicBack: INCBIN "pic/monback/bulbasaurb.pic"
VenusaurPicFront: INCBIN "pic/ymon/venusaur.pic"
VenusaurPicBack: INCBIN "pic/monback/venusaurb.pic"
TentacruelPicFront: INCBIN "pic/ymon/tentacruel.pic"
TentacruelPicBack: INCBIN "pic/monback/tentacruelb.pic"
GoldeenPicFront: INCBIN "pic/ymon/goldeen.pic"
GoldeenPicBack: INCBIN "pic/monback/goldeenb.pic"
SeakingPicFront: INCBIN "pic/ymon/seaking.pic"
SeakingPicBack: INCBIN "pic/monback/seakingb.pic"
PonytaPicFront: INCBIN "pic/ymon/ponyta.pic"
RapidashPicFront: INCBIN "pic/ymon/rapidash.pic"
PonytaPicBack: INCBIN "pic/monback/ponytab.pic"
RapidashPicBack: INCBIN "pic/monback/rapidashb.pic"
RattataPicFront: INCBIN "pic/ymon/rattata.pic"
RattataPicBack: INCBIN "pic/monback/rattatab.pic"
RaticatePicFront: INCBIN "pic/ymon/raticate.pic"
RaticatePicBack: INCBIN "pic/monback/raticateb.pic"
NidorinoPicFront: INCBIN "pic/ymon/nidorino.pic"
NidorinoPicBack: INCBIN "pic/monback/nidorinob.pic"
NidorinaPicFront: INCBIN "pic/ymon/nidorina.pic"
NidorinaPicBack: INCBIN "pic/monback/nidorinab.pic"
GeodudePicFront: INCBIN "pic/ymon/geodude.pic"
GeodudePicBack: INCBIN "pic/monback/geodudeb.pic"
PorygonPicFront: INCBIN "pic/ymon/porygon.pic"
PorygonPicBack: INCBIN "pic/monback/porygonb.pic"
AerodactylPicFront: INCBIN "pic/ymon/aerodactyl.pic"
AerodactylPicBack: INCBIN "pic/monback/aerodactylb.pic"
MagnemitePicFront: INCBIN "pic/ymon/magnemite.pic"
MagnemitePicBack: INCBIN "pic/monback/magnemiteb.pic"
CharmanderPicFront: INCBIN "pic/ymon/charmander.pic"
CharmanderPicBack: INCBIN "pic/monback/charmanderb.pic"
SquirtlePicFront: INCBIN "pic/ymon/squirtle.pic"
SquirtlePicBack: INCBIN "pic/monback/squirtleb.pic"
CharmeleonPicFront: INCBIN "pic/ymon/charmeleon.pic"
CharmeleonPicBack: INCBIN "pic/monback/charmeleonb.pic"
WartortlePicFront: INCBIN "pic/ymon/wartortle.pic"
WartortlePicBack: INCBIN "pic/monback/wartortleb.pic"
CharizardPicFront: INCBIN "pic/ymon/charizard.pic"
CharizardPicBack: INCBIN "pic/monback/charizardb.pic"
FossilAerodactylPic: INCBIN "pic/ymon/fossilaerodactyl.pic"
GhostPic: INCBIN "pic/other/ghost.pic"
OddishPicFront: INCBIN "pic/ymon/oddish.pic"
OddishPicBack: INCBIN "pic/monback/oddishb.pic"
GloomPicFront: INCBIN "pic/ymon/gloom.pic"
GloomPicBack: INCBIN "pic/monback/gloomb.pic"
VileplumePicFront: INCBIN "pic/ymon/vileplume.pic"
VileplumePicBack: INCBIN "pic/monback/vileplumeb.pic"
BellsproutPicFront: INCBIN "pic/ymon/bellsprout.pic"
BellsproutPicBack: INCBIN "pic/monback/bellsproutb.pic"
WeepinbellPicFront: INCBIN "pic/ymon/weepinbell.pic"
WeepinbellPicBack: INCBIN "pic/monback/weepinbellb.pic"
VictreebelPicFront: INCBIN "pic/ymon/victreebel.pic"
VictreebelPicBack: INCBIN "pic/monback/victreebelb.pic"
dr $3749e,$38000
SECTION "bank0E",ROMX,BANK[$0E]
INCLUDE "data/moves.asm"
BaseStats: INCLUDE "data/base_stats.asm"
INCLUDE "data/cries.asm"
dr $3969c,$39893
TrainerPicAndMoneyPointers: ; 39893 (e:5893)
dr $39893,$3997e
TrainerNames: ; 3997e (e:597e)
dr $3997e,$39b06
FormatMovesString: ; 39b06 (e:5b06)
dr $39b06,$39b54
InitList: ; 39b54 (e:5b54)
dr $39b54,$39bb6
ReadTrainer: ; 39bb6 (e:5bb6)
dr $39bb6,$3a8df
DrawAllPokeballs: ; 3a8df (e:68df)
dr $3a8df,$3a9e9
SetupPlayerAndEnemyPokeballs: ; 3a9e9 (e:69e9)
dr $3a9e9,$3aa28
PokeballTileGraphics:: ; 3aa28 (e:6a28)
; INCBIN "gfx/pokeball.2bpp"
;PokeballTileGraphicsEnd:
dr $3aa28,$3aa68
TradingAnimationGraphics:
INCBIN "gfx/game_boy.norepeat.2bpp"
INCBIN "gfx/link_cable.2bpp"
TradingAnimationGraphics2:
; Pokeball traveling through the link cable.
INCBIN "gfx/trade2.2bpp"
TryEvolvingMon:
EvolveTradeMon: ; 3adb8 (e:6db8)
dr $3adb8,$3b10f
Func_3b10f: ; 3b01f (e:710f)
dr $3b10f,$3b1e5
Pointer_3b1e5: ; 3b1e5 (e:71e5)
dr $3b1e5,$3c000
SECTION "bank0F",ROMX,BANK[$0F]
dr $3c000,$3c04c
SlidePlayerAndEnemySilhouettesOnScreen: ; 3c04c (f:404c)
dr $3c04c,$3c127
StartBattle: ; 3c127 (f:4127)
dr $3c127,$3cae8
AnyPartyAlive: ; 3cae8 (f:4ae8)
dr $3cae8,$3ce1f
DrawHUDsAndHPBars: ; 3ce1f (f:4e1f)
dr $3ce1f,$3ceb1
DrawEnemyHUDAndHPBar: ; 3ceb1 (f:4eb1)
dr $3ceb1,$3d320
MoveSelectionMenu: ; 3d320 (f:5320)
dr $3d320,$3d9ac
IsGhostBattle: ; 3d9ac (f:59ac)
dr $3d9ac,$3ddc3
PrintDoesntAffectText: ; 3ddc3 (f:5dc3)
dr $3ddc3,$3e5bb
AIGetTypeEffectiveness: ; 3e5bb (f:65bb)
ld a,[W_ENEMYMOVETYPE]
ld d,a ; d = type of enemy move
ld hl,wBattleMonType
ld b,[hl] ; b = type 1 of player's pokemon
inc hl
ld c,[hl] ; c = type 2 of player's pokemon
ld a,$10
ld [wd11e],a ; initialize [wd11e] to neutral effectiveness
ld hl,TypeEffects
.loop
ld a,[hli]
cp a,$ff
ret z
cp d ; match the type of the move
jr nz,.nextTypePair1
ld a,[hli]
cp b ; match with type 1 of pokemon
jr z,.done
cp c ; or match with type 2 of pokemon
jr z,.done
jr .nextTypePair2
.nextTypePair1
inc hl
.nextTypePair2
inc hl
jr .loop
.done
ld a, [W_TRAINERCLASS]
cp LORELEI
jr nz, .ok
ld a, [wEnemyMonSpecies]
cp DEWGONG
jr nz, .ok
call BattleRandom
cp $66 ; 40 percent
ret c
.ok
ld a,[hl]
ld [wd11e],a ; store damage multiplier
ret
INCLUDE "data/type_effects.asm"
MoveHitTest: ; 3e6f1 (f:66f1)
dr $3e6f1,$3ec87
LoadEnemyMonData: ; 3ec87 (f:6c87)
dr $3ec87,$3edb8
DoBattleTransitionAndInitBattleVariables: ; 3edb8 (f:6db8)
dr $3edb8,$3eeb3
QuarterSpeedDueToParalysis: ; 3eeb3 (f:6eb3)
dr $3eeb3,$3efe7
LoadHudTilePatterns: ; 3efe7 (f:6fe7)
dr $3efe7,$3f027
BattleRandom: ; 3f027 (f:7027)
dr $3f027,$3f3de
StatModifierUpEffect: ; 3f3de (f:73de)
dr $3f3de,$3fb2e
PrintButItFailedText_: ; 3fb2e (f:7b2e)
dr $3fb2e,$3fb39
PrintDidntAffectText: ; 3fb39 (f:7b39)
dr $3fb39,$3fb49
PrintMayNotAttackText: ; 3fb49 (f:7b49)
dr $3fb49,$3fb83
PlayCurrentMoveAnimation: ; 3fb83 (f:7b83)
dr $3fb83,$40000
SECTION "bank10",ROMX,BANK[$10]
dr $40000,$4050b
Pointer_4050b: ; 4050b (10:450b)
dr $4050b,$41c70
DisplayOptionMenu_: ; 41c70 (10:57c0)
dr $41c70,$44000
SECTION "bank11",ROMX,BANK[$11]
dr $44000,$45077
LoadSpinnerArrowTiles: ; 45077 (11:5077)
dr $45077,$48000
SECTION "bank12",ROMX,BANK[$12]
dr $48000,$4c000
SECTION "bank13",ROMX,BANK[$13]
TrainerPics:
YoungsterPic: INCBIN "pic/trainer/youngster.pic"
BugCatcherPic: INCBIN "pic/trainer/bugcatcher.pic"
LassPic: INCBIN "pic/trainer/lass.pic"
SailorPic: INCBIN "pic/trainer/sailor.pic"
JrTrainerMPic: INCBIN "pic/trainer/jr.trainerm.pic"
JrTrainerFPic: INCBIN "pic/trainer/jr.trainerf.pic"
PokemaniacPic: INCBIN "pic/trainer/pokemaniac.pic"
SuperNerdPic: INCBIN "pic/trainer/supernerd.pic"
HikerPic: INCBIN "pic/trainer/hiker.pic"
BikerPic: INCBIN "pic/trainer/biker.pic"
BurglarPic: INCBIN "pic/trainer/burglar.pic"
EngineerPic: INCBIN "pic/trainer/engineer.pic"
FisherPic: INCBIN "pic/trainer/fisher.pic"
SwimmerPic: INCBIN "pic/trainer/swimmer.pic"
CueBallPic: INCBIN "pic/trainer/cueball.pic"
GamblerPic: INCBIN "pic/trainer/gambler.pic"
BeautyPic: INCBIN "pic/trainer/beauty.pic"
PsychicPic: INCBIN "pic/trainer/psychic.pic"
RockerPic: INCBIN "pic/trainer/rocker.pic"
JugglerPic: INCBIN "pic/trainer/juggler.pic"
TamerPic: INCBIN "pic/trainer/tamer.pic"
BirdKeeperPic: INCBIN "pic/trainer/birdkeeper.pic"
BlackbeltPic: INCBIN "pic/trainer/blackbelt.pic"
Rival1Pic: INCBIN "pic/ytrainer/rival1.pic"
ProfOakPic: INCBIN "pic/trainer/prof.oak.pic"
ChiefPic:
ScientistPic: INCBIN "pic/trainer/scientist.pic"
GiovanniPic: INCBIN "pic/trainer/giovanni.pic"
RocketPic: INCBIN "pic/trainer/rocket.pic"
CooltrainerMPic: INCBIN "pic/trainer/cooltrainerm.pic"
CooltrainerFPic: INCBIN "pic/trainer/cooltrainerf.pic"
BrunoPic: INCBIN "pic/trainer/bruno.pic"
BrockPic: INCBIN "pic/ytrainer/brock.pic"
MistyPic: INCBIN "pic/ytrainer/misty.pic"
LtSurgePic: INCBIN "pic/trainer/lt.surge.pic"
ErikaPic: INCBIN "pic/ytrainer/erika.pic"
KogaPic: INCBIN "pic/trainer/koga.pic"
BlainePic: INCBIN "pic/trainer/blaine.pic"
SabrinaPic: INCBIN "pic/trainer/sabrina.pic"
GentlemanPic: INCBIN "pic/trainer/gentleman.pic"
Rival2Pic: INCBIN "pic/ytrainer/rival2.pic"
Rival3Pic: INCBIN "pic/ytrainer/rival3.pic"
LoreleiPic: INCBIN "pic/trainer/lorelei.pic"
ChannelerPic: INCBIN "pic/trainer/channeler.pic"
AgathaPic: INCBIN "pic/trainer/agatha.pic"
LancePic: INCBIN "pic/trainer/lance.pic"
JessieJamesPic: INCBIN "pic/ytrainer/jessiejames.pic"
dr $4fe79,$50000
SECTION "bank14",ROMX,BANK[$14]
dr $50000,$525d8
PrintCardKeyText: ; 525d8 (14:65d8)
dr $525d8,$5267d
CeladonPrizeMenu: ; 5267d (14:667d)
dr $5267d,$54000
SECTION "bank15",ROMX,BANK[$15]
dr $54000,$56745
_GetSpritePosition1: ; 56745 (15:6745)
dr $56745,$56765
_GetSpritePosition2: ; 56765 (15:6765)
dr $56765,$56789
_SetSpritePosition1: ; 56789 (15:6789)
dr $56789,$567a9
_SetSpritePosition2: ; 567a9 (15:67a9)
dr $567a9,$567cd
TrainerWalkUpToPlayer: ; 567cd (15:67cd)
dr $567cd,$58000
SECTION "bank16",ROMX,BANK[$16]
dr $58000,$58d99
CalcLevelFromExperience: ; 58d99 (16:4d99)
dr $58d99,$58dc0
CalcExperience: ; 58dc0 (16:4dc0)
dr $58dc0,$58e8b
PrintStatusAilment: ; 58e8b (16:4e8b)
dr $58e8b,$5c000
SECTION "bank17",ROMX,BANK[$17]
dr $5c000,$60000
SECTION "bank18",ROMX,BANK[$18]
dr $60000,$64000
SECTION "bank19",ROMX,BANK[$19]
Overworld_GFX:
dr $64000,$68000
SECTION "bank1A",ROMX,BANK[$1A]
dr $68000,$6c000
SECTION "bank1B",ROMX,BANK[$1B]
Cemetery_GFX: INCBIN "gfx/tilesets/cemetery.t4.2bpp"
Cemetery_Block: INCBIN "gfx/blocksets/cemetery.bst"
Cavern_GFX: INCBIN "gfx/tilesets/cavern.t14.2bpp"
Cavern_Block: INCBIN "gfx/blocksets/cavern.bst"
Lobby_GFX: INCBIN "gfx/tilesets/lobby.t2.2bpp"
Lobby_Block: INCBIN "gfx/blocksets/lobby.bst"
Ship_GFX: INCBIN "gfx/tilesets/ship.t6.2bpp"
Ship_Block: INCBIN "gfx/blocksets/ship.bst"
Lab_GFX: INCBIN "gfx/tilesets/lab.t4.2bpp"
Lab_Block: INCBIN "gfx/blocksets/lab.bst"
Club_GFX: INCBIN "gfx/tilesets/club.t5.2bpp"
Club_Block: INCBIN "gfx/blocksets/club.bst"
Underground_GFX: INCBIN "gfx/tilesets/underground.t7.2bpp"
Underground_Block: INCBIN "gfx/blocksets/underground.bst"
SECTION "bank1C",ROMX,BANK[$1C]
INCLUDE "engine/gamefreak.asm"
INCLUDE "engine/hall_of_fame.asm"
INCLUDE "engine/overworld/healing_machine.asm"
INCLUDE "engine/overworld/player_animations.asm"
INCLUDE "engine/battle/ghost_marowak_anim.asm"
INCLUDE "engine/battle/battle_transitions.asm"
INCLUDE "engine/town_map.asm"
INCLUDE "engine/mon_party_sprites.asm"
INCLUDE "engine/in_game_trades.asm"
INCLUDE "engine/palettes.asm"
INCLUDE "engine/save.asm"
SECTION "bank1D",ROMX,BANK[$1D]
dr $74000,$7405c
HiddenItemNear: ; 7405c (1d:405c)
dr $7405c,$74726
VendingMachineMenu: ; 74726 (1d:4726)
dr $74726,$78000
SECTION "bank1E",ROMX,BANK[$1E]
dr $78000,$78757
AnimationTileset2: ; 78757 (1e:4757)
dr $78757,$79816
HideSubstituteShowMonAnim: ; 79816 (1e:5816)
dr $79816,$798b2
ReshowSubstituteAnim: ; 798b2 (1e:58b2)
dr $798b2,$798c8
AnimationTransformMon: ; 798c8 (1e:58c8)
dr $798c8,$798d4
ChangeMonPic: ; 798d4 (1e:58d4)
dr $798d4,$7a037
AnimCut: ; 7a037 (1e:6037)
dr $7a037,$7a0fb
AnimateBoulderDust: ; 7a0fb (1e:60fb)
dr $7a0fb,$7a19a
RedFishingTilesFront: INCBIN "gfx/red_fishing_tile_front.2bpp"
RedFishingTilesBack: INCBIN "gfx/red_fishing_tile_back.2bpp"
RedFishingTilesSide: INCBIN "gfx/red_fishing_tile_side.2bpp"
RedFishingRodTiles: INCBIN "gfx/red_fishingrod_tiles.2bpp"
dr $7a22a,$7c000
SECTION "bank20",ROMX,BANK[$20]
dr $80000,$80f14
SurfingPikachu1Graphics: INCBIN "gfx/surfing_pikachu_1.t4.2bpp"
Func_82bd4: ; 82bd4 (20:6bd4)
dr $82bd4,$84000
SECTION "bank21",ROMX,BANK[$21]
PikachuCry1: ; 84000 (21:4000)
dw (PikachuCry1_End - PikachuCry1) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_1.pcm"
PikachuCry1_End:
db $77 ; unused
; Game Freak might have made a slight error, because all of
; the pcm data has one trailing byte that is never processed.
PikachuCry2: ; 8491a (21:491a)
dw (PikachuCry2_End - PikachuCry2) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_2.pcm"
PikachuCry2_End:
db $77 ; unused
PikachuCry3: ; 84fdc (21:4fdc)
dw (PikachuCry3_End - PikachuCry3) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_3.pcm"
PikachuCry3_End:
db $03 ; unused
PikachuCry4: ; 859ee (21:59ee)
dw (PikachuCry4_End - PikachuCry4) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_4.pcm"
PikachuCry4_End:
db $e0 ; unused
SECTION "bank22",ROMX,BANK[$22]
PikachuCry5: ; 88000 (22:4000)
dw (PikachuCry5_End - PikachuCry5) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_5.pcm"
PikachuCry5_End:
db $77 ; unused
PikachuCry6: ; 89042 (22:5042)
dw (PikachuCry6_End - PikachuCry6) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_6.pcm"
PikachuCry6_End:
db $77 ; unused
PikachuCry7: ; 8a254 (22:6254)
dw (PikachuCry7_End - PikachuCry7) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_7.pcm"
PikachuCry7_End:
db $ff ; unused
SECTION "bank23",ROMX,BANK[$23]
PikachuCry8: ; 8c000 (23:4000)
dw (PikachuCry8_End - PikachuCry8) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_8.pcm"
PikachuCry8_End:
db $f7 ; unused
PikachuCry9: ; 8d0ca (23:50ca)
dw (PikachuCry9_End - PikachuCry9) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_9.pcm"
PikachuCry9_End:
db $f3 ; unused
PikachuCry10: ; 8de0c (23:5e0c)
dw (PikachuCry10_End - PikachuCry10) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_10.pcm"
PikachuCry10_End:
db $ff ; unused
SECTION "bank24",ROMX,BANK[$24]
PikachuCry11: ; 90000 (24:4000)
dw (PikachuCry11_End - PikachuCry11) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_11.pcm"
PikachuCry11_End:
db $77 ; unused
PikachuCry12: ; 90722 (24:4772)
dw (PikachuCry12_End - PikachuCry12) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_12.pcm"
PikachuCry12_End:
db $ff ; unused
PikachuCry13: ; 914a4 (24:54a4)
dw (PikachuCry13_End - PikachuCry13) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_13.pcm"
PikachuCry13_End:
db $f0 ; unused
SECTION "bank25",ROMX,BANK[$25]
PikachuCry14: ; 94000 (25:4000)
dw (PikachuCry14_End - PikachuCry14) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_14.pcm"
PikachuCry14_End:
db $fc ; unused
PikachuCry15: ; 9589a (25:589a)
dw (PikachuCry15_End - PikachuCry15) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_15.pcm"
PikachuCry15_End:
db $77 ; unused
SECTION "bank2f",ROMX[$5000],BANK[$2F]
dr $bd000,$bf450
Func_bf450: ; bf450 (2f:7450)
dr $bf450,$c0000
SECTION "bank30",ROMX,BANK[$30]
dr $c0000,$c4000
SECTION "bank31",ROMX,BANK[$31]
PikachuCry16: ; c4000 (31:4000)
dw (PikachuCry16_End - PikachuCry16) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_16.pcm"
PikachuCry16_End:
db $e7 ; unused
PikachuCry18: ; c549a (31:549a)
dw (PikachuCry18_End - PikachuCry18) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_18.pcm"
PikachuCry18_End:
db $00 ; unused
PikachuCry22: ; c63a4 (31:63a4)
dw (PikachuCry22_End - PikachuCry22) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_22.pcm"
PikachuCry22_End:
db $7e ; unused
SECTION "bank32",ROMX,BANK[$32]
PikachuCry20: ; c8000 (32:4000)
dw (PikachuCry20_End - PikachuCry20) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_20.pcm"
PikachuCry20_End:
db $07 ; unused
PikachuCry21: ; ca002 (32:6002)
dw (PikachuCry21_End - PikachuCry21) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_21.pcm"
PikachuCry21_End:
db $ff ; unused
SECTION "bank33",ROMX,BANK[$33]
PikachuCry19: ; cc000 (33:4000)
dw (PikachuCry19_End - PikachuCry19) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_19.pcm"
PikachuCry19_End:
db $06 ; unused
PikachuCry24: ; cd632 (33:5632)
dw (PikachuCry24_End - PikachuCry24) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_24.pcm"
PikachuCry24_End:
db $e0 ; unused
PikachuCry26: ; cf25c (33:725c)
dw (PikachuCry26_End - PikachuCry26) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_26.pcm"
PikachuCry26_End:
SECTION "bank34",ROMX,BANK[$34]
PikachuCry17: ; d0000 (34:4000)
dw (PikachuCry17_End - PikachuCry17) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_17.pcm"
PikachuCry17_End:
db $00 ; unused
PikachuCry23: ; d0862 (34:4862)
dw (PikachuCry23_End - PikachuCry23) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_23.pcm"
PikachuCry23_End:
db $00 ; unused
PikachuCry25: ; d173c (34:573c)
dw (PikachuCry25_End - PikachuCry25) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_25.pcm"
PikachuCry25_End:
db $03 ; unused
SECTION "bank35",ROMX,BANK[$35]
PikachuCry27: ; d4000 (35:4000)
dw (PikachuCry27_End - PikachuCry27) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_27.pcm"
PikachuCry27_End:
db $ff ; unused
PikachuCry28: ; d4b5a (35:4b5a)
dw (PikachuCry28_End - PikachuCry28) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_28.pcm"
PikachuCry28_End:
db $1b ; unused
PikachuCry29: ; d5da4 (35:5da4)
dw (PikachuCry29_End - PikachuCry29) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_29.pcm"
PikachuCry29_End:
db $87 ; unused
PikachuCry30: ; d69ce (35:69ce)
dw (PikachuCry30_End - PikachuCry30) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_30.pcm"
PikachuCry30_End:
db $00 ; unused
PikachuCry31: ; d6e80 (35:6ea0)
dw (PikachuCry31_End - PikachuCry31) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_31.pcm"
PikachuCry31_End:
SECTION "bank36",ROMX,BANK[$36]
PikachuCry32: ; d8000 (36:4000)
dw (PikachuCry32_End - PikachuCry32) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_32.pcm"
PikachuCry32_End:
db $ff ; unused
PikachuCry33: ; d858a (36:458a)
dw (PikachuCry33_End - PikachuCry33) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_33.pcm"
PikachuCry33_End:
db $1f ; unused
PikachuCry34: ; d923c (36:523c)
dw (PikachuCry34_End - PikachuCry34) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_34.pcm"
PikachuCry34_End:
db $01 ; unused
PikachuCry41: ; da746 (36:6746)
dw (PikachuCry41_End - PikachuCry41) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_41.pcm"
PikachuCry41_End:
db $9b ; unused
SECTION "bank37",ROMX,BANK[$37]
PikachuCry35: ; dc000 (37:4000)
dw (PikachuCry35_End - PikachuCry35) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_35.pcm"
PikachuCry35_End:
db $00 ; unused
PikachuCry36: ; dd22a (37:5d2a)
dw (PikachuCry36_End - PikachuCry36) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_36.pcm"
PikachuCry36_End:
db $01 ; unused
PikachuCry39: ; dee0c (37:6e0c)
dw (PikachuCry39_End - PikachuCry39) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_39.pcm"
PikachuCry39_End:
db $0f ; unused
SECTION "bank38",ROMX,BANK[$38]
PikachuCry37: ; e0000 (38:4000)
dw (PikachuCry37_End - PikachuCry37) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_37.pcm"
PikachuCry37_End:
db $3f ; unused
PikachuCry38: ; e0dfa (38:4dfa)
dw (PikachuCry38_End - PikachuCry38) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_38.pcm"
PikachuCry38_End:
db $ff ; unused
PikachuCry40: ; e1a64 (38:5a64)
dw (PikachuCry40_End - PikachuCry40) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_40.pcm"
PikachuCry40_End:
db $ff ; unused
PikachuCry42: ; e2976 (38:6976)
dw (PikachuCry42_End - PikachuCry42) - 2 ; length of pcm data
INCBIN "audio/pikachu_cries/pikachu_cry_42.pcm"
PikachuCry42_End:
SECTION "bank39",ROMX,BANK[$39]
dr $e4000,$e8000
SECTION "bank3A",ROMX,BANK[$3A]
MonsterNames: ; e8000 (3a:4000)
dr $e8000,$e8a5e
Func_e8a5e: ; e8a5e (3a:4a5e)
dr $e8a5e,$e8d35
Func_e8d35:: ; e8d35 (3a:4d35)
dr $e8d35,$e8e79
Func_e8e79: ; e8e79 (3a:4e79)
dr $e8e79,$e928a
SurfingPikachu2Graphics: INCBIN "gfx/surfing_pikachu_2.2bpp"
dr $e988a,$e9bfa
SurfingPikachu3Graphics: INCBIN "gfx/surfing_pikachu_3.t1.2bpp"
dr $ea3ea,$eaa02
FreezeEnemyTrainerSprite: ; eaa02 (3a:6a02)
dr $eaa02,$ec000
SECTION "bank3C",ROMX,BANK[$3C]
INCLUDE "engine/bank3c/main.asm"
SECTION "bank3D",ROMX,BANK[$3D]
INCLUDE "engine/bank3d/main.asm"
SECTION "bank3E",ROMX,BANK[$3E]
dr $f8000,$fa35a
YellowIntroGraphics: INCBIN "gfx/yellow_intro.2bpp"
dr $fbb5a,$fc000
SECTION "bank3F",ROMX,BANK[$3F]
INCLUDE "engine/bank3f/main.asm"