diff options
Diffstat (limited to 'main.asm')
-rwxr-xr-x | main.asm | 13366 |
1 files changed, 6683 insertions, 6683 deletions
@@ -1,6684 +1,6684 @@ -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
-
-
-INCLUDE "home.asm"
-
-
-SECTION "bank1",ROMX,BANK[$1]
-
-INCLUDE "data/facing.asm"
-
-ResetStatusAndHalveMoneyOnBlackout::
-; Reset player status on blackout.
- xor a
- ld [wBattleResult], a
- ld [wWalkBikeSurfState], a
- ld [W_ISINBATTLE], a
- ld [wMapPalOffset], a
- ld [wNPCMovementScriptFunctionNum], a
- ld [hJoyHeld], a
- ld [wNPCMovementScriptPointerTableNum], a
- ld [wFlags_0xcd60], a
-
- ld [$ff9f], a
- ld [$ff9f + 1], a
- ld [$ff9f + 2], a
- call HasEnoughMoney
- jr c, .lostmoney ; never happens
-
- ; Halve the player's money.
- ld a, [wPlayerMoney]
- ld [$ff9f], a
- ld a, [wPlayerMoney + 1]
- ld [$ff9f + 1], a
- ld a, [wPlayerMoney + 2]
- ld [$ff9f + 2], a
- xor a
- ld [$ffa2], a
- ld [$ffa3], a
- ld a, 2
- ld [$ffa4], a
- predef DivideBCDPredef3
- ld a, [$ffa2]
- ld [wPlayerMoney], a
- ld a, [$ffa2 + 1]
- ld [wPlayerMoney + 1], a
- ld a, [$ffa2 + 2]
- ld [wPlayerMoney + 2], a
-
-.lostmoney
- ld hl, wd732
- set 2, [hl]
- res 3, [hl]
- set 6, [hl]
- ld a, %11111111
- ld [wJoyIgnore], a
- predef_jump HealParty
-
-
-MewPicFront:: INCBIN "pic/bmon/mew.pic"
-MewPicBack:: INCBIN "pic/monback/mewb.pic"
-INCLUDE "data/baseStats/mew.asm"
-
-INCLUDE "engine/battle/safari_zone.asm"
-
-INCLUDE "engine/titlescreen.asm"
-
-NintenText: db "NINTEN@"
-SonyText: db "SONY@"
-
-
-LoadMonData_:
-; Load monster [wWhichPokemon] from list [wcc49]:
-; 0: partymon
-; 1: enemymon
-; 2: boxmon
-; 3: daycaremon
-; Return monster id at wcf91 and its data at wLoadedMon.
-; Also load base stats at W_MONHDEXNUM for convenience.
-
- ld a, [wDayCareMonSpecies]
- ld [wcf91], a
- ld a, [wcc49]
- cp 3
- jr z, .GetMonHeader
-
- ld a, [wWhichPokemon]
- ld e, a
- callab GetMonSpecies
-
-.GetMonHeader
- ld a, [wcf91]
- ld [wd0b5], a ; input for GetMonHeader
- call GetMonHeader
-
- ld hl, wPartyMons
- ld bc, wPartyMon2 - wPartyMon1
- ld a, [wcc49]
- cp 1
- 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
-
-
-INCLUDE "data/item_prices.asm"
-INCLUDE "text/item_names.asm"
-
-UnusedNames:
- db "かみなりバッヂ@"
- db "かいがらバッヂ@"
- db "おじぞうバッヂ@"
- db "はやぶさバッヂ@"
- db "ひんやりバッヂ@"
- db "なかよしバッヂ@"
- db "バラバッヂ@"
- db "ひのたまバッヂ@"
- db "ゴールドバッヂ@"
- db "たまご@"
- db "ひよこ@"
- db "ブロンズ@"
- db "シルバー@"
- db "ゴールド@"
- db "プチキャプテン@"
- db "キャプテン@"
- db "プチマスター@"
- db "マスター@"
- db "エクセレント"
-
-INCLUDE "engine/overworld/oam.asm"
-INCLUDE "engine/oam_dma.asm"
-
-PrintWaitingText:
- hlCoord 3, 10
- ld b, $1
- ld c, $b
- ld a, [W_ISINBATTLE]
- and a
- jr z, .asm_4c17
- call TextBoxBorder
- jr .asm_4c1a
-.asm_4c17
- call CableClub_TextBoxBorder
-.asm_4c1a
- hlCoord 4, 11
- ld de, WaitingText
- call PlaceString
- ld c, 50
- jp DelayFrames
-
-WaitingText:
- db "Waiting...!@"
-
-
-_UpdateSprites: ; 4c34 (1:4c34)
- ld h, $c1
- inc h
- ld a, $e ; wSpriteStateData2 + $0e
-.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 ; 4c54 (1:4c54)
- cp $1
- jp nz, UpdateNonPlayerSprite
- jp UpdatePlayerSprite
-
-UpdateNonPlayerSprite:
- 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 Func_5236
-.unequal
- jp Func_4ed1
-
-; 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:
- nop
-
- ld h, wSpriteStateData1 / $100
- ld a, [H_CURRENTSPRITEOFFSET]
- add wSpriteStateData1 % $100
- 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 coordiate
- 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, [$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
- 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
-SetSpriteCollisionValues:
- 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:
- 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
-
-TestBattle:
- ret
-
-.loop
- call GBPalNormal
-
- ; Don't mess around
- ; with obedience.
- ld a, %10000000 ; EARTHBADGE
- ld [W_OBTAINEDBADGES], a
-
- ld hl, W_FLAGS_D733
- set 0, [hl]
-
- ; Reset the party.
- ld hl, wPartyCount
- xor a
- ld [hli], a
- dec a
- ld [hl], a
-
- ; Give the player a
- ; level 20 Rhydon.
- ld a, RHYDON
- ld [wcf91], a
- ld a, 20
- ld [W_CURENEMYLVL], a
- xor a
- ld [wcc49], a
- ld [W_CURMAP], a
- call AddPartyMon
-
- ; Fight against a
- ; level 20 Rhydon.
- ld a, RHYDON
- ld [W_CUROPPONENT], a
-
- predef InitOpponent
-
- ; When the battle ends,
- ; do it all again.
- ld a, 1
- ld [wUpdateSpritesEnabled], a
- ld [H_AUTOBGTRANSFERENABLED], a
- jr .loop
-
-INCLUDE "engine/overworld/item.asm"
-INCLUDE "engine/overworld/movement.asm"
-
-INCLUDE "engine/cable_club.asm"
-
-LoadTrainerInfoTextBoxTiles: ; 5ae6 (1:5ae6)
- ld de, TrainerInfoTextBoxTileGraphics ; $7b98
- ld hl, vChars2 + $760
- ld bc, (BANK(TrainerInfoTextBoxTileGraphics) << 8) +$09
- jp CopyVideoData
-
-INCLUDE "engine/menu/main_menu.asm"
-
-INCLUDE "engine/oak_speech.asm"
-
-SpecialWarpIn: ; 62ce (1:62ce)
- 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: ; 62ff (1:62ff)
- ld a, [wd72d]
- cp BATTLE_CENTER
- jr nz, .notBattleCenter
- ld hl, BattleCenterSpec1
- 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, BattleCenterSpec2
- jr .copyWarpData
-.notBattleCenter
- cp TRADE_CENTER
- jr nz, .notTradeCenter
- ld hl, TradeCenterSpec1
- ld a, [hSerialConnectionStatus]
- cp USING_INTERNAL_CLOCK
- jr z, .copyWarpData
- ld hl, TradeCenterSpec2
- jr .copyWarpData
-.notTradeCenter
- ld a, [wd732]
- bit 1, a
- jr nz, .notFirstMap
- bit 2, a
- jr nz, .notFirstMap
- ld hl, FirstMapSpec
-.copyWarpData
- ld de, W_CURMAP
- ld c, $7
-.copyWarpDataLoop
- ld a, [hli]
- ld [de], a
- inc de
- dec c
- jr nz, .copyWarpDataLoop
- ld a, [hli]
- ld [W_CURMAPTILESET], 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 [W_CURMAP], a
- ld a, [wWhichDungeonWarp]
- ld c, a
- ld hl, DungeonWarpList
- ld de, $0
- ld a, $6
- ld [wd12f], 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, [wd12f]
- 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 [W_CURMAP], 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 [W_CURMAPTILESET], 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"
-
-; This function appears to never be used.
-; It is likely a debugging feature to give the player Tsunekazu Ishihara's
-; favorite Pokemon. This is indicated by the overpowered Exeggutor, which
-; Ishihara (president of Creatures Inc.) said was his favorite Pokemon in an ABC
-; interview on February 8, 2000.
-; "Exeggutor is my favorite. That's because I was always using this character
-; while I was debugging the program."
-; http://www.ign.com/articles/2000/02/09/abc-news-pokamon-chat-transcript
-
-SetIshiharaTeam: ; 64ca (1:64ca)
- ld de, IshiharaTeam
-.loop
- ld a, [de]
- cp $ff
- ret z
- ld [wcf91], a
- inc de
- ld a, [de]
- ld [W_CURENEMYLVL], a
- inc de
- call AddPartyMon
- jr .loop
-
-IshiharaTeam: ; 64df (1:64df)
- db EXEGGUTOR,90
- db MEW,20
- db JOLTEON,56
- db DUGTRIO,56
- db ARTICUNO,57
- 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_: ; 6b21 (1:6b21)
- ld de,wPlayerMoney
- ld hl,$ff9f ; total price of items
- ld c,3 ; length of money in bytes
- call StringCmp
- ret c
- ld de,wPlayerMoney + 2
- ld hl,$ffa1 ; 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: ; 6b44 (1:6b44)
- ld a,[wListMenuID]
- cp a,ITEMLISTMENU
- jp nz,DisplayListMenuIDLoop ; only rearrange item list menus
- push hl
- ld hl,wList
- 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,wList
- 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,wList
- ld a,[hli]
- ld h,[hl]
- ld l,a
- dec [hl] ; decrease the number of items
- ld a,[hl]
- ld [wd12a],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:
-; 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, [W_CURMAP]
- 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:
- 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: ; 7096 (1:7096)
- xor a
- ld [wListMenuID],a
- ld a,[wAutoTextBoxDrawingControl]
- bit 0,a
- jr nz,.skipDrawingTextBoxBorder
- ld a,[$ff8c] ; 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.
- ld a,[wd74b]
- bit 5,a ; does the player have the pokedex?
-; start menu with pokedex
- hlCoord 10, 0
- ld b,$0e
- ld c,$08
- jr nz,.drawTextBoxBorder
-; start menu without pokedex
- hlCoord 10, 0
- ld b,$0c
- ld c,$08
- jr .drawTextBoxBorder
-; if text ID is not 0 (i.e. not the start menu) then do a standard dialogue text box
-.notStartMenu
- hlCoord 0, 12
- ld b,$04
- ld c,$12
-.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 ; move sprites
-.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,$9c ; 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: ; 710b (1:710b)
- ld a,[wd74b]
- bit 5,a ; does the player have the pokedex?
-; menu with pokedex
- hlCoord 10, 0
- ld b,$0e
- ld c,$08
- jr nz,.drawTextBoxBorder
-; shorter menu if the player doesn't have the pokedex
- hlCoord 10, 0
- ld b,$0c
- ld c,$08
-.drawTextBoxBorder
- call TextBoxBorder
- ld a,%11001011 ; bit mask for down, up, start, B, and A buttons
- 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,[wcc2d] ; remembered menu selection from last time
- ld [wCurrentMenuItem],a
- ld [wLastMenuItem],a
- xor a
- ld [wcc37],a
- ld hl,wd730
- set 6,[hl] ; no pauses between printing each letter
- hlCoord 12, 2
- ld a,[wd74b]
- bit 5,a ; does the player have the 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: ; 718f (1:718f)
- db "POKéDEX@"
-
-StartMenuPokemonText: ; 7197 (1:7197)
- db "POKéMON@"
-
-StartMenuItemText: ; 719f (1:719f)
- db "ITEM@"
-
-StartMenuSaveText: ; 71a4 (1:71a4)
- db "SAVE@"
-
-StartMenuResetText: ; 71a9 (1:71a9)
- db "RESET@"
-
-StartMenuExitText: ; 71af (1:71af)
- db "EXIT@"
-
-StartMenuOptionText: ; 71b4 (1:71b4)
- db "OPTION@"
-
-PrintStartMenuItem: ; 71bb (1:71bb)
- push hl
- call PlaceString
- pop hl
- ld de,$28
- add hl,de
- ret
-
-INCLUDE "engine/overworld/cable_club_npc.asm"
-
-; function to draw various text boxes
-DisplayTextBoxID_: ; 72ea (1:72ea)
- ld a,[wTextBoxID]
- cp a,TWO_OPTION_MENU
- jp z,DisplayTwoOptionMenu
- ld c,a
- ld hl,TextBoxFunctionTable
- ld de,3
- call SearchTextBoxTable
- jr c,.functionTableMatch
- ld hl,TextBoxCoordTable
- ld de,5
- call SearchTextBoxTable
- jr c,.coordTableMatch
- ld hl,TextBoxTextAndCoordTable
- ld de,9
- call SearchTextBoxTable
- jr c,.textAndCoordTableMatch
-.done
- ret
-.functionTableMatch
- ld a,[hli]
- ld h,[hl]
- ld l,a ; hl = address of function
- ld de,.done
- push de
- jp [hl] ; jump to the function
-.coordTableMatch
- call GetTextBoxIDCoords
- call GetAddressOfScreenCoords
- call TextBoxBorder
- ret
-.textAndCoordTableMatch
- call GetTextBoxIDCoords
- push hl
- call GetAddressOfScreenCoords
- call TextBoxBorder
- pop hl
- call GetTextBoxIDText
- ld a,[wd730]
- push af
- ld a,[wd730]
- set 6,a ; no pauses between printing each letter
- ld [wd730],a
- call PlaceString
- pop af
- ld [wd730],a
- call UpdateSprites ; move sprites
- ret
-
-; function to search a table terminated with $ff for a byte matching c in increments of de
-; sets carry flag if a match is found and clears carry flag if not
-SearchTextBoxTable: ; 734c (1:734c)
- dec de
-.loop
- ld a,[hli]
- cp a,$ff
- jr z,.notFound
- cp c
- jr z,.found
- add hl,de
- jr .loop
-.found
- scf
-.notFound
- ret
-
-; function to load coordinates from the TextBoxCoordTable or the TextBoxTextAndCoordTable
-; INPUT:
-; hl = address of coordinates
-; OUTPUT:
-; b = height
-; c = width
-; d = row of upper left corner
-; e = column of upper left corner
-GetTextBoxIDCoords: ; 735a (1:735a)
- ld a,[hli] ; column of upper left corner
- ld e,a
- ld a,[hli] ; row of upper left corner
- ld d,a
- ld a,[hli] ; column of lower right corner
- sub e
- dec a
- ld c,a ; c = width
- ld a,[hli] ; row of lower right corner
- sub d
- dec a
- ld b,a ; b = height
- ret
-
-; function to load a text address and text coordinates from the TextBoxTextAndCoordTable
-GetTextBoxIDText: ; 7367 (1:7367)
- ld a,[hli]
- ld e,a
- ld a,[hli]
- ld d,a ; de = address of text
- push de ; save text address
- ld a,[hli]
- ld e,a ; column of upper left corner of text
- ld a,[hl]
- ld d,a ; row of upper left corner of text
- call GetAddressOfScreenCoords
- pop de ; restore text address
- ret
-
-; function to point hl to the screen coordinates
-; INPUT:
-; d = row
-; e = column
-; OUTPUT:
-; hl = address of upper left corner of text box
-GetAddressOfScreenCoords: ; 7375 (1:7375)
- push bc
- ld hl,wTileMap
- ld bc,20
-.loop ; loop to add d rows to the base address
- ld a,d
- and a
- jr z,.addedRows
- add hl,bc
- dec d
- jr .loop
-.addedRows
- pop bc
- add hl,de
- ret
-
-; Format:
-; 00: text box ID
-; 01-02: function address
-TextBoxFunctionTable: ; 7387 (1:7387)
- dbw MONEY_BOX, DisplayMoneyBox
- dbw BUY_SELL_QUIT_MENU, DoBuySellQuitMenu
- dbw FIELD_MOVE_MON_MENU, DisplayFieldMoveMonMenu
- db $ff ; terminator
-
-; Format:
-; 00: text box ID
-; 01: column of upper left corner
-; 02: row of upper left corner
-; 03: column of lower right corner
-; 04: row of lower right corner
-TextBoxCoordTable: ; 7391 (1:7391)
- db MESSAGE_BOX, 0, 12, 19, 17
- db $03, 0, 0, 19, 14
- db $07, 0, 0, 11, 6
- db LIST_MENU_BOX, 4, 2, 19, 12
- db $10, 7, 0, 19, 17
- db MON_SPRITE_POPUP, 6, 4, 14, 13
- db $ff ; terminator
-
-; Format:
-; 00: text box ID
-; 01: column of upper left corner
-; 02: row of upper left corner
-; 03: column of lower right corner
-; 04: row of lower right corner
-; 05-06: address of text
-; 07: column of beginning of text
-; 08: row of beginning of text
-; table of window positions and corresponding text [key, start column, start row, end column, end row, text pointer [2 bytes], text column, text row]
-TextBoxTextAndCoordTable: ; 73b0 (1:73b0)
- db JP_MOCHIMONO_MENU_TEMPLATE
- db 0,0,14,17 ; text box coordinates
- dw JapaneseMochimonoText
- db 3,0 ; text coordinates
-
- db USE_TOSS_MENU_TEMPLATE
- db 13,10,19,14 ; text box coordinates
- dw UseTossText
- db 15,11 ; text coordinates
-
- db JP_SAVE_MESSAGE_MENU_TEMPLATE
- db 0,0,7,5 ; text box coordinates
- dw JapaneseSaveMessageText
- db 2,2 ; text coordinates
-
- db JP_SPEED_OPTIONS_MENU_TEMPLATE
- db 0,6,5,10 ; text box coordinates
- dw JapaneseSpeedOptionsText
- db 2,7 ; text coordinates
-
- db BATTLE_MENU_TEMPLATE
- db 8,12,19,17 ; text box coordinates
- dw BattleMenuText
- db 10,14 ; text coordinates
-
- db SAFARI_BATTLE_MENU_TEMPLATE
- db 0,12,19,17 ; text box coordinates
- dw SafariZoneBattleMenuText
- db 2,14 ; text coordinates
-
- db SWITCH_STATS_CANCEL_MENU_TEMPLATE
- db 11,11,19,17 ; text box coordinates
- dw SwitchStatsCancelText
- db 13,12 ; text coordinates
-
- db BUY_SELL_QUIT_MENU_TEMPLATE
- db 0,0,10,6 ; text box coordinates
- dw BuySellQuitText
- db 2,1 ; text coordinates
-
- db MONEY_BOX_TEMPLATE
- db 11,0,19,2 ; text box coordinates
- dw MoneyText
- db 13,0 ; text coordinates
-
- db JP_AH_MENU_TEMPLATE
- db 7,6,11,10 ; text box coordinates
- dw JapaneseAhText
- db 8,8 ; text coordinates
-
- db JP_POKEDEX_MENU_TEMPLATE
- db 11,8,19,17 ; text box coordinates
- dw JapanesePokedexMenu
- db 12,10 ; text coordinates
-
-; note that there is no terminator
-
-BuySellQuitText: ; 7413 (1:7413)
- db "BUY"
- next "SELL"
- next "QUIT@@"
-
-UseTossText: ; 7422 (1:7422)
- db "USE"
- next "TOSS@"
-
-JapaneseSaveMessageText: ; 742b (1:742b)
- db "きろく"
- next "メッセージ@"
-
-JapaneseSpeedOptionsText: ; 7435 (1:7435)
- db "はやい"
- next "おそい@"
-
-MoneyText: ; 743d (1:743d)
- db "MONEY@"
-
-JapaneseMochimonoText: ; 7443 (1:7443)
- db "もちもの@"
-
-JapaneseMainMenuText: ; 7448 (1:7448)
- db "つづきから"
- next "さいしょから@"
-
-BattleMenuText: ; 7455 (1:7455)
- db "FIGHT ",$E1,$E2
- next "ITEM RUN@"
-
-SafariZoneBattleMenuText: ; 7468 (1:7468)
- db "BALL× BAIT"
- next "THROW ROCK RUN@"
-
-SwitchStatsCancelText: ; 7489 (1:7489)
- db "SWITCH"
- next "STATS"
- next "CANCEL@"
-
-JapaneseAhText: ; 749d (1:749d)
- db "アッ!@"
-
-JapanesePokedexMenu: ; 74a1 (1:74a1)
- db "データをみる"
- next "なきごえ"
- next "ぶんぷをみる"
- next "キャンセル@"
-
-DisplayMoneyBox: ; 74ba (1:74ba)
- ld hl, wd730
- set 6, [hl]
- ld a, MONEY_BOX_TEMPLATE
- ld [wTextBoxID], a
- call DisplayTextBoxID
- hlCoord 13, 1
- ld b, $1
- ld c, $6
- call ClearScreenArea
- hlCoord 12, 1
- ld de, wPlayerMoney
- ld c, $a3
- call PrintBCDNumber
- ld hl, wd730
- res 6, [hl]
- ret
-
-CurrencyString: ; 74e2 (1:74e2)
- db " ¥@"
-
-DoBuySellQuitMenu: ; 74ea (1:74ea)
- ld a, [wd730]
- set 6, a ; no printing delay
- ld [wd730], a
- xor a
- ld [wd12d], a
- ld a, BUY_SELL_QUIT_MENU_TEMPLATE
- ld [wTextBoxID], a
- call DisplayTextBoxID
- ld a, A_BUTTON | B_BUTTON
- ld [wMenuWatchedKeys], a
- ld a, $2
- ld [wMaxMenuItem], a
- ld a, $1
- ld [wTopMenuItemY], a
- ld a, $1
- ld [wTopMenuItemX], a
- xor a
- ld [wCurrentMenuItem], a
- ld [wLastMenuItem], a
- ld [wcc37], a
- ld a, [wd730]
- res 6, a ; turn on the printing delay
- ld [wd730], a
- call HandleMenuInput
- call PlaceUnfilledArrowMenuCursor
- bit 0, a ; was A pressed?
- jr nz, .pressedA
- bit 1, a ; was B pressed? (always true since only A/B are watched)
- jr z, .pressedA
- ld a, $2
- ld [wd12e], a
- jr .quit
-.pressedA
- ld a, $1
- ld [wd12e], a
- ld a, [wCurrentMenuItem]
- ld [wd12d], a
- ld b, a
- ld a, [wMaxMenuItem]
- cp b
- jr z, .quit
- ret
-.quit
- ld a, $2
- ld [wd12e], a
- ld a, [wCurrentMenuItem]
- ld [wd12d], a
- scf
- ret
-
-; displays a menu with two options to choose from
-; b = Y of upper left corner of text region
-; c = X of upper left corner of text region
-; hl = address where the text box border should be drawn
-DisplayTwoOptionMenu: ; 7559 (1:7559)
- push hl
- ld a, [wd730]
- set 6, a ; no printing delay
- ld [wd730], a
- xor a
- ld [wd12d], a
- ld [wd12e], a
- ld a, A_BUTTON | B_BUTTON
- ld [wMenuWatchedKeys], a
- ld a, $1
- ld [wMaxMenuItem], a
- ld a, b
- ld [wTopMenuItemY], a
- ld a, c
- ld [wTopMenuItemX], a
- xor a
- ld [wLastMenuItem], a
- ld [wcc37], a
- push hl
- ld hl, wTwoOptionMenuID
- bit 7, [hl] ; select second menu item by default?
- res 7, [hl]
- jr z, .storeCurrentMenuItem
- inc a
-.storeCurrentMenuItem
- ld [wCurrentMenuItem], a
- pop hl
- push hl
- push hl
- call TwoOptionMenu_SaveScreenTiles
- ld a, [wTwoOptionMenuID]
- ld hl, TwoOptionMenuStrings
- ld e, a
- ld d, $0
- ld a, $5
-.menuStringLoop
- add hl, de
- dec a
- jr nz, .menuStringLoop
- ld a, [hli]
- ld c, a
- ld a, [hli]
- ld b, a
- ld e, l
- ld d, h
- pop hl
- push de
- ld a, [wTwoOptionMenuID]
- cp TRADE_CANCEL_MENU
- jr nz, .notTradeCancelMenu
- call CableClub_TextBoxBorder
- jr .afterTextBoxBorder
-.notTradeCancelMenu
- call TextBoxBorder
-.afterTextBoxBorder
- call UpdateSprites
- pop hl
- ld a, [hli]
- and a ; put blank line before first menu item?
- ld bc, 20 + 2
- jr z, .noBlankLine
- ld bc, 2 * 20 + 2
-.noBlankLine
- ld a, [hli]
- ld e, a
- ld a, [hli]
- ld d, a
- pop hl
- add hl, bc
- call PlaceString
- ld hl, wd730
- res 6, [hl] ; turn on the printing delay
- ld a, [wTwoOptionMenuID]
- cp NO_YES_MENU
- jr nz, .notNoYesMenu
-; No/Yes menu
-; this menu type ignores the B button
-; it only seems to be used when confirming the deletion of a save file
- xor a
- ld [wTwoOptionMenuID], a
- ld a, [wFlags_0xcd60]
- push af
- push hl
- ld hl, wFlags_0xcd60
- bit 5, [hl]
- set 5, [hl] ; don't play sound when A or B is pressed in menu
- pop hl
-.noYesMenuInputLoop
- call HandleMenuInput
- bit 1, a ; A button pressed?
- jr nz, .noYesMenuInputLoop ; try again if A was not pressed
- pop af
- pop hl
- ld [wFlags_0xcd60], a
- ld a, (SFX_02_40 - SFX_Headers_02) / 3
- call PlaySound
- jr .pressedAButton
-.notNoYesMenu
- xor a
- ld [wTwoOptionMenuID], a
- call HandleMenuInput
- pop hl
- bit 1, a ; A button pressed?
- jr nz, .choseSecondMenuItem ; automatically choose the second option if B is pressed
-.pressedAButton
- ld a, [wCurrentMenuItem]
- ld [wd12d], a
- and a
- jr nz, .choseSecondMenuItem
-; chose first menu item
- ld a, $1
- ld [wd12e], a
- ld c, 15
- call DelayFrames
- call TwoOptionMenu_RestoreScreenTiles
- and a
- ret
-.choseSecondMenuItem
- ld a, $1
- ld [wCurrentMenuItem], a
- ld [wd12d], a
- ld a, $2
- ld [wd12e], a
- ld c, 15
- call DelayFrames
- call TwoOptionMenu_RestoreScreenTiles
- scf
- ret
-
-; Some of the wider/taller two option menus will not have the screen areas
-; they cover be fully saved/restored by the two functions below.
-; The bottom and right edges of the menu may remain after the function returns.
-
-TwoOptionMenu_SaveScreenTiles: ; 763e (1:763e)
- ld de, wHPBarMaxHP
- ld bc, $506
-.asm_7644
- ld a, [hli]
- ld [de], a
- inc de
- dec c
- jr nz, .asm_7644
- push bc
- ld bc, 14
- add hl, bc
- pop bc
- ld c, $6
- dec b
- jr nz, .asm_7644
- ret
-
-TwoOptionMenu_RestoreScreenTiles: ; 7656 (1:7656)
- ld de, wHPBarMaxHP
- ld bc, $506
-.asm_765c
- ld a, [de]
- inc de
- ld [hli], a
- dec c
- jr nz, .asm_765c
- push bc
- ld bc, $e
- add hl, bc
- pop bc
- ld c, $6
- dec b
- jr nz, .asm_765c
- call UpdateSprites
- ret
-
-; Format:
-; 00: byte width
-; 01: byte height
-; 02: byte put blank line before first menu item
-; 03: word text pointer
-TwoOptionMenuStrings: ; 7671 (1:7671)
- db 4,3,0
- dw .YesNoMenu
- db 6,3,0
- dw .NorthWestMenu
- db 6,3,0
- dw .SouthEastMenu
- db 6,3,0
- dw .YesNoMenu
- db 6,3,0
- dw .NorthEastMenu
- db 7,3,0
- dw .TradeCancelMenu
- db 7,4,1
- dw .HealCancelMenu
- db 4,3,0
- dw .NoYesMenu
-
-.NoYesMenu ; 7699 (1:3699)
- db "NO",$4E,"YES@"
-.YesNoMenu ; 76a0 (1:36a0)
- db "YES",$4E,"NO@"
-.NorthWestMenu ; 76a7 (1:36a7)
- db "NORTH",$4E,"WEST@"
-.SouthEastMenu ; 76b2 (1:36b2)
- db "SOUTH",$4E,"EAST@"
-.NorthEastMenu ; 76bd (1:36bd)
- db "NORTH",$4E,"EAST@"
-.TradeCancelMenu ; 76c8 (1:36c8)
- db "TRADE",$4E,"CANCEL@"
-.HealCancelMenu ; 76d5 (1:36d5)
- db "HEAL",$4E,"CANCEL@"
-
-DisplayFieldMoveMonMenu: ; 76e1 (1:36e1)
- xor a
- ld hl, wWhichTrade
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hl], $c
- call GetMonFieldMoves
- ld a, [wTrainerScreenX]
- and a
- jr nz, .asm_770f
- hlCoord 11, 11
- ld b, $5
- ld c, $7
- call TextBoxBorder
- call UpdateSprites
- ld a, $c
- ld [$fff7], a
- hlCoord 13, 12
- ld de, PokemonMenuEntries
- jp PlaceString
-.asm_770f
- push af
- hlCoord 0, 11
- ld a, [wcd42]
- dec a
- ld e, a
- ld d, $0
- add hl, de
- ld b, $5
- ld a, $12
- sub e
- ld c, a
- pop af
- ld de, $ffd8
-.asm_7725
- add hl, de
- inc b
- inc b
- dec a
- jr nz, .asm_7725
- ld de, $ffec
- add hl, de
- inc b
- call TextBoxBorder
- call UpdateSprites
- hlCoord 0, 12
- ld a, [wcd42]
- inc a
- ld e, a
- ld d, $0
- add hl, de
- ld de, $ffd8
- ld a, [wTrainerScreenX]
-.asm_7747
- add hl, de
- dec a
- jr nz, .asm_7747
- xor a
- ld [wTrainerScreenX], a
- ld de, wWhichTrade
-.asm_7752
- push hl
- ld hl, FieldMoveNames
- ld a, [de]
- and a
- jr z, .asm_7776
- inc de
- ld b, a
-.asm_775c
- dec b
- jr z, .asm_7766
-.asm_775f
- ld a, [hli]
- cp $50
- jr nz, .asm_775f
- jr .asm_775c
-.asm_7766
- ld b, h
- ld c, l
- pop hl
- push de
- ld d, b
- ld e, c
- call PlaceString
- ld bc, $28
- add hl, bc
- pop de
- jr .asm_7752
-.asm_7776
- pop hl
- ld a, [wcd42]
- ld [$fff7], a
- hlCoord 0, 12
- ld a, [wcd42]
- inc a
- ld e, a
- ld d, $0
- add hl, de
- ld de, PokemonMenuEntries
- jp PlaceString
-
-FieldMoveNames: ; 778d (1:778d)
- db "CUT@"
- db "FLY@"
- db "@"
- db "SURF@"
- db "STRENGTH@"
- db "FLASH@"
- db "DIG@"
- db "TELEPORT@"
- db "SOFTBOILED@"
-
-PokemonMenuEntries: ; 77c2 (1:77c2)
- db "STATS"
- next "SWITCH"
- next "CANCEL@"
-
-GetMonFieldMoves: ; 77d6 (1:77d6)
- ld a, [wWhichPokemon]
- ld hl, wPartyMon1Moves
- ld bc, $2c
- call AddNTimes
- ld d, h
- ld e, l
- ld c, $5
- ld hl, wWhichTrade
-.asm_77e9
- push hl
-.asm_77ea
- dec c
- jr z, .asm_7821
- ld a, [de] ; de is RAM address of move
- and a
- jr z, .asm_7821
- ld b, a
- inc de ; go to next move
- ld hl, FieldMoveDisplayData
-.asm_77f6
- ld a, [hli]
- cp $ff
- jr z, .asm_77ea
- cp b
- jr z, .asm_7802
- inc hl
- inc hl
- jr .asm_77f6
-.asm_7802
- ld a, b
- ld [wcd43], a
- ld a, [hli]
- ld b, [hl]
- pop hl
- ld [hli], a
- ld a, [wTrainerScreenX]
- inc a
- ld [wTrainerScreenX], a
- ld a, [wcd42]
- cp b
- jr c, .asm_781b
- ld a, b
- ld [wcd42], a
-.asm_781b
- ld a, [wcd43]
- ld b, a
- jr .asm_77e9
-.asm_7821
- pop hl
- ret
-
-; Format: [Move id], [list priority], [leftmost tile]
-; Move id = id of move
-; List priority = lower number means higher priority when field moves are displayed
-; these priorities must be unique
-; Leftmost tile = -1 + tile column in which the first letter of the move's name should be displayed
-; "SOFTBOILED" is $08 because it has 4 more letters than "SURF", for example, whose value is $0C
-FieldMoveDisplayData: ; 7823 (1:7823)
- db CUT, $01, $0C
- db FLY, $02, $0C
- db $B4, $03, $0C ; unused field move
- db SURF, $04, $0C
- db STRENGTH, $05, $0A
- db FLASH, $06, $0C
- db DIG, $07, $0C
- db TELEPORT, $08, $0A
- db SOFTBOILED, $09, $08
- db $ff ; list terminator
-
-
-INCLUDE "engine/battle/moveEffects/drain_hp_effect.asm"
-
-INCLUDE "engine/menu/players_pc.asm"
-
-_RemovePokemon: ; 7b68 (1:7b68)
- ld hl, wPartyCount ; wPartyCount
- ld a, [wcf95]
- and a
- jr z, .asm_7b74
- ld hl, W_NUMINBOX ; wda80
-.asm_7b74
- ld a, [hl]
- dec a
- ld [hli], a
- ld a, [wWhichPokemon] ; wWhichPokemon
- ld c, a
- ld b, $0
- add hl, bc
- ld e, l
- ld d, h
- inc de
-.asm_7b81
- ld a, [de]
- inc de
- ld [hli], a
- inc a
- jr nz, .asm_7b81
- ld hl, wPartyMonOT ; wd273
- ld d, $5
- ld a, [wcf95]
- and a
- jr z, .asm_7b97
- ld hl, wBoxMonOT
- ld d, $13
-.asm_7b97
- ld a, [wWhichPokemon] ; wWhichPokemon
- call SkipFixedLengthTextEntries
- ld a, [wWhichPokemon] ; wWhichPokemon
- cp d
- jr nz, .asm_7ba6
- ld [hl], $ff
- ret
-.asm_7ba6
- ld d, h
- ld e, l
- ld bc, $b
- add hl, bc
- ld bc, wPartyMonNicks ; wPartyMonNicks
- ld a, [wcf95]
- and a
- jr z, .asm_7bb8
- ld bc, wBoxMonNicks
-.asm_7bb8
- call CopyDataUntil
- ld hl, wPartyMons
- ld bc, wPartyMon2 - wPartyMon1
- ld a, [wcf95]
- and a
- jr z, .asm_7bcd
- ld hl, wBoxMons
- ld bc, wBoxMon2 - wBoxMon1
-.asm_7bcd
- ld a, [wWhichPokemon] ; wWhichPokemon
- call AddNTimes
- ld d, h
- ld e, l
- ld a, [wcf95]
- and a
- jr z, .asm_7be4
- ld bc, wBoxMon2 - wBoxMon1
- add hl, bc
- ld bc, wBoxMonOT
- jr .asm_7beb
-.asm_7be4
- ld bc, wPartyMon2 - wPartyMon1
- add hl, bc
- ld bc, wPartyMonOT ; wd273
-.asm_7beb
- call CopyDataUntil
- ld hl, wPartyMonNicks ; wPartyMonNicks
- ld a, [wcf95]
- and a
- jr z, .asm_7bfa
- ld hl, wBoxMonNicks
-.asm_7bfa
- ld bc, $b
- ld a, [wWhichPokemon] ; wWhichPokemon
- call AddNTimes
- ld d, h
- ld e, l
- ld bc, $b
- add hl, bc
- ld bc, wPokedexOwned ; wPokedexOwned
- ld a, [wcf95]
- and a
- jr z, .asm_7c15
- ld bc, wBoxMonNicksEnd
-.asm_7c15
- jp CopyDataUntil
-
-Func_7c18: ; 7c18 (1:7c18)
- ld hl, wd730
- set 6, [hl]
- predef ShowPokedexData
- ld hl, wd730
- res 6, [hl]
- call ReloadMapData
- ld c, $a
- call DelayFrames
- predef IndexToPokedex
- ld a, [wd11e]
- dec a
- ld c, a
- ld b, $1
- ld hl, wPokedexSeen
- predef FlagActionPredef
- ld a, $1
- ld [wDoNotWaitForButtonPressAfterDisplayingText], a
- ret
-
-
-SECTION "bank3",ROMX,BANK[$3]
-
-INCLUDE "engine/joypad.asm"
-
-INCLUDE "data/map_songs.asm"
-
-INCLUDE "data/map_header_banks.asm"
-
-ClearVariablesAfterLoadingMapData: ; c335 (3:4335)
- ld a, $90
- ld [hWY], a
- ld [rWY], a
- xor a
- ld [H_AUTOBGTRANSFERENABLED], a
- ld [wStepCounter], a
- ld [W_LONEATTACKNO], a ; W_GYMLEADERNO
- ld [hJoyPressed], a
- ld [hJoyReleased], a
- ld [hJoyHeld], a
- ld [wcd6a], a
- ld [wd5a3], 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: ; c35f (3:435f)
- ld a, [wNumberOfWarps]
- and a
- ret z
- ld c, a
- ld hl, wWarpEntries
-.loop
- ld a, [W_YCOORD]
- cp [hl]
- jr nz, .nextWarp1
- inc hl
- ld a, [W_XCOORD]
- 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: ; c38b (3:438b)
- ld hl, wd732
- bit 5, [hl]
- ret nz
- ld hl, ForcedBikeOrSurfMaps
- ld a, [W_YCOORD]
- ld b, a
- ld a, [W_XCOORD]
- ld c, a
- ld a, [W_CURMAP]
- 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, [W_CURMAP]
- cp SEAFOAM_ISLANDS_4
- ld a, $2
- ld [W_SEAFOAMISLANDS4CURSCRIPT], a
- jr z, .forceSurfing
- ld a, [W_CURMAP]
- cp SEAFOAM_ISLANDS_5
- ld a, $2
- ld [W_SEAFOAMISLANDS5CURSCRIPT], a
- jr z, .forceSurfing
- ;force bike riding
- ld hl, wd732
- set 5, [hl]
- ld a, $1
- ld [wWalkBikeSurfState], a
- ld [wWalkBikeSurfStateCopy], a
- jp ForceBikeOrSurf
-.incorrectMap
- inc hl
-.incorrectY
- inc hl
- jr .loop
-.forceSurfing
- ld a, $2
- ld [wWalkBikeSurfState], a
- ld [wWalkBikeSurfStateCopy], a
- jp ForceBikeOrSurf
-
-INCLUDE "data/force_bike_surf.asm"
-
-IsPlayerFacingEdgeOfMap: ; c3ff (3:43ff)
- 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, [W_YCOORD]
- ld b, a
- ld a, [W_XCOORD]
- ld c, a
- ld de, .asm_c41e
- push de
- jp [hl]
-.asm_c41e
- pop bc
- pop de
- pop hl
- ret
-
-.functionPointerTable
- dw .facingDown
- dw .facingUp
- dw .facingLeft
- dw .facingRight
-
-.facingDown
- ld a, [W_CURMAPHEIGHT]
- 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, [W_CURMAPWIDTH]
- add a
- dec a
- cp c
- jr z, .setCarry
- jr .resetCarry
-.resetCarry
- and a
- ret
-.setCarry
- scf
- ret
-
-IsWarpTileInFrontOfPlayer: ; c44e (3:444e)
- push hl
- push de
- push bc
- call _GetTileAndCoordsInFrontOfPlayer
- ld a, [W_CURMAP]
- 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: ; c477 (3:4477)
- 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: ; c49d (3:449d)
- push hl
- push de
- push bc
- callba IsPlayerStandingOnDoorTile
- jr c, .done
- ld a, [W_CURMAPTILESET]
- 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: ; c52f (3:452f)
- ld a, [W_CURMAP] ; W_CURMAP
- cp SAFARI_ZONE_EAST
- ret c
- cp UNKNOWN_DUNGEON_2
- ret nc
- ld hl, wTileMap
- ld b, $3
- ld c, $7
- call TextBoxBorder
- hlCoord 1, 1
- ld de, wSafariSteps ; wd70d
- ld bc, $203
- call PrintNumber
- hlCoord 4, 1
- ld de, SafariSteps ; $4579
- call PlaceString
- hlCoord 1, 3
- ld de, SafariBallText
- call PlaceString
- ld a, [W_NUMSAFARIBALLS] ; W_NUMSAFARIBALLS
- cp $a
- jr nc, .asm_c56d
- hlCoord 5, 3
- ld a, $7f
- ld [hl], a
-.asm_c56d
- hlCoord 6, 3
- ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS
- ld bc, $102
- jp PrintNumber
-
-SafariSteps: ; c579 (3:4579)
- db "/500@"
-
-SafariBallText: ; c57e (3:457e)
- db "BALL×× @"
-
-GetTileAndCoordsInFrontOfPlayer: ; c586 (3:4586)
- call GetPredefRegisters
-
-_GetTileAndCoordsInFrontOfPlayer: ; c589 (3:4589)
- ld a, [W_YCOORD]
- ld d, a
- ld a, [W_XCOORD]
- ld e, a
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
- and a
- 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: ; c5be (3:45be)
- xor a
- ld [$ffdb], a
- ld hl, W_YCOORD
- ld a, [hli]
- ld d, a
- ld e, [hl]
- ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction
- and a
- 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: ; c60b (3:460b)
- call GetTileTwoStepsInFrontOfPlayer
- ld hl, W_TILESETCOLLISIONPTR
- ld a, [hli]
- ld h, [hl]
- ld l, a
-.loop
- ld a, [hli]
- cp $ff
- jr z, .done ; if the tile two steps ahead is not passable
- cp c
- jr nz, .loop
- 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: ; c636 (3:4636)
- 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, [W_NUMSPRITES]
- 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: ; c69c (3:469c)
- ld a, [wd730]
- add a
- jp c, .noBlackOut ; no black out if joypad states are being simulated
- ld a, [wPartyCount]
- and a
- jp z, .noBlackOut
- call IncrementDayCareMonExp
- ld a, [wStepCounter]
- and $3 ; is the counter a multiple of 4?
- jp nz, .noBlackOut ; 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 [$ff8c], a
- call DisplayTextID
- 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_02_43 - SFX_Headers_02) / 3
- call PlaySound
-.skipPoisonEffectAndSound
- predef AnyPartyAlive
- ld a, d
- and a
- jr nz, .noBlackOut
- call EnableAutoTextBoxDrawing
- ld a, $d1
- ld [$ff8c], a
- call DisplayTextID
- ld hl, wd72e
- set 5, [hl]
- ld a, $ff
- jr .done
-.noBlackOut
- xor a
-.done
- ld [wd12d], a
- ret
-
-LoadTilesetHeader: ; c754 (3:4754)
- call GetPredefRegisters
- push hl
- ld d, 0
- ld a, [W_CURMAPTILESET]
- add a
- add a
- ld b, a
- add a
- add b ; a = tileset * 12
- jr nc, .noCarry
- inc d
-.noCarry
- ld e, a
- ld hl, Tilesets
- add hl, de
- ld de, W_TILESETBANK
- ld c, $b
-.copyTilesetHeaderLoop
- ld a, [hli]
- ld [de], a
- inc de
- dec c
- jr nz, .copyTilesetHeaderLoop
- ld a, [hl]
- ld [hTilesetType], a
- xor a
- ld [$ffd8], a
- pop hl
- ld a, [W_CURMAPTILESET]
- push hl
- push de
- ld hl, DungeonTilesets
- ld de, $1
- call IsInArray
- pop de
- pop hl
- jr c, .asm_c797
- ld a, [W_CURMAPTILESET]
- ld b, a
- ld a, [$ff8b]
- cp b
- jr z, .done
-.asm_c797
- ld a, [wDestinationWarpID]
- cp $ff
- jr z, .done
- call LoadDestinationWarpPosition
- ld a, [W_YCOORD]
- and $1
- ld [W_YBLOCKCOORD], a
- ld a, [W_XCOORD]
- and $1
- ld [W_XBLOCKCOORD], a
-.done
- ret
-
-INCLUDE "data/dungeon_tilesets.asm"
-
-INCLUDE "data/tileset_headers.asm"
-
-IncrementDayCareMonExp: ; c8de (3:48de)
- ld a, [W_DAYCARE_IN_USE]
- 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"
-
-PrintStrengthTxt: ; cd99 (3:4d99)
- ld hl, wd728
- set 0, [hl]
- ld hl, UsedStrengthText
- call PrintText
- ld hl, CanMoveBouldersText
- jp PrintText
-
-UsedStrengthText: ; cdaa (3:4daa)
- TX_FAR _UsedStrengthText
- db $08 ; asm
- ld a, [wcf91]
- call PlayCry
- call Delay3
- jp TextScriptEnd
-
-CanMoveBouldersText: ; cdbb (3:4dbb)
- TX_FAR _CanMoveBouldersText
- db "@"
-
-CheckForForcedBikeSurf: ; cdc0 (3:4dc0)
- ld hl, wd728
- set 1, [hl]
- ld a, [wd732]
- bit 5, a
- jr nz, .asm_cdec
- ld a, [W_CURMAP] ; W_CURMAP
- cp SEAFOAM_ISLANDS_5
- ret nz
- ld a, [wd881]
- and $3
- cp $3
- ret z
- ld hl, CoordsData_cdf7 ; $4df7
- call ArePlayerCoordsInArray
- ret nc
- ld hl, wd728
- res 1, [hl]
- ld hl, CurrentTooFastText
- jp PrintText
-.asm_cdec
- ld hl, wd728
- res 1, [hl]
- ld hl, CyclingIsFunText
- jp PrintText
-
-CoordsData_cdf7: ; cdf7 (3:4df7)
- db $0B,$07,$FF
-
-CurrentTooFastText: ; cdfa (3:4dfa)
- TX_FAR _CurrentTooFastText
- db "@"
-
-CyclingIsFunText: ; cdff (3:4dff)
- TX_FAR _CyclingIsFunText
- db "@"
-
-; function to add an item (in varying quantities) to the player's bag or PC box
-; INPUT:
-; hl = address of inventory (either wNumBagItems or wNumBoxItems)
-; [wcf91] = item ID
-; [wcf96] = item quantity
-; sets carry flag if successful, unsets carry flag if unsuccessful
-AddItemToInventory_: ; ce04 (3:4e04)
- ld a,[wcf96] ; a = item quantity
- push af
- push bc
- push de
- push hl
- push hl
- ld d,50 ; PC box can hold 50 items
- ld a,wNumBagItems & $FF
- cp l
- jr nz,.checkIfInventoryFull
- ld a,wNumBagItems >> 8
- cp h
- jr nz,.checkIfInventoryFull
-; if the destination is the bag
- ld d,20 ; bag can hold 20 items
-.checkIfInventoryFull
- ld a,[hl]
- sub d
- ld d,a
- ld a,[hli]
- and a
- jr z,.addNewItem
-.loop
- ld a,[hli]
- ld b,a ; b = ID of current item in table
- ld a,[wcf91] ; a = ID of item being added
- cp b ; does the current item in the table match the item being added?
- jp z,.increaseItemQuantity ; if so, increase the item's quantity
- inc hl
- ld a,[hl]
- cp a,$ff ; is it the end of the table?
- jr nz,.loop
-.addNewItem ; add an item not yet in the inventory
- pop hl
- ld a,d
- and a ; is there room for a new item slot?
- jr z,.done
-; if there is room
- inc [hl] ; increment the number of items in the inventory
- ld a,[hl] ; the number of items will be the index of the new item
- add a
- dec a
- ld c,a
- ld b,0
- add hl,bc ; hl = address to store the item
- ld a,[wcf91]
- ld [hli],a ; store item ID
- ld a,[wcf96]
- ld [hli],a ; store item quantity
- ld [hl],$ff ; store terminator
- jp .success
-.increaseItemQuantity ; increase the quantity of an item already in the inventory
- ld a,[wcf96]
- ld b,a ; b = quantity to add
- ld a,[hl] ; a = existing item quantity
- add b ; a = new item quantity
- cp a,100
- jp c,.storeNewQuantity ; if the new quantity is less than 100, store it
-; if the new quantity is greater than or equal to 100,
-; try to max out the current slot and add the rest in a new slot
- sub a,99
- ld [wcf96],a ; a = amount left over (to put in the new slot)
- ld a,d
- and a ; is there room for a new item slot?
- jr z,.increaseItemQuantityFailed
-; if so, store 99 in the current slot and store the rest in a new slot
- ld a,99
- ld [hli],a
- jp .loop
-.increaseItemQuantityFailed
- pop hl
- and a
- jr .done
-.storeNewQuantity
- ld [hl],a
- pop hl
-.success
- scf
-.done
- pop hl
- pop de
- pop bc
- pop bc
- ld a,b
- ld [wcf96],a ; restore the initial value from when the function was called
- ret
-
-; function to remove an item (in varying quantities) from the player's bag or PC box
-; INPUT:
-; hl = address of inventory (either wNumBagItems or wNumBoxItems)
-; [wWhichPokemon] = index (within the inventory) of the item to remove
-; [wcf96] = quantity to remove
-RemoveItemFromInventory_: ; ce74 (3:4e74)
- push hl
- inc hl
- ld a,[wWhichPokemon] ; index (within the inventory) of the item being removed
- sla a
- add l
- ld l,a
- jr nc,.noCarry
- inc h
-.noCarry
- inc hl
- ld a,[wcf96] ; quantity being removed
- ld e,a
- ld a,[hl] ; a = current quantity
- sub e
- ld [hld],a ; store new quantity
- ld [wcf97],a
- and a
- jr nz,.skipMovingUpSlots
-; if the remaining quantity is 0,
-; remove the emptied item slot and move up all the following item slots
-.moveSlotsUp
- ld e,l
- ld d,h
- inc de
- inc de ; de = address of the slot following the emptied one
-.loop ; loop to move up the following slots
- ld a,[de]
- inc de
- ld [hli],a
- cp a,$ff
- jr nz,.loop
-; update menu info
- xor a
- ld [wListScrollOffset],a
- ld [wCurrentMenuItem],a
- ld [wcc2c],a
- ld [wd07e],a
- pop hl
- ld a,[hl] ; a = number of items in inventory
- dec a ; decrement the number of items
- ld [hl],a ; store new number of items
- ld [wd12a],a
- cp a,2
- jr c,.done
- ld [wMaxMenuItem],a
- jr .done
-.skipMovingUpSlots
- pop hl
-.done
- ret
-
-; wild pokemon data: from 4EB8 to 55C7
-
-LoadWildData: ; ceb8 (3:4eb8)
- ld hl,WildDataPointers
- ld a,[W_CURMAP]
-
- ; 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 [W_GRASSRATE],a
- and a
- jr z,.NoGrassData ; if no grass data, skip to surfing data
- push hl
- ld de,W_GRASSMONS ; otherwise, load grass data
- ld bc,$0014
- call CopyData
- pop hl
- ld bc,$0014
- add hl,bc
-.NoGrassData
- ld a,[hli]
- ld [W_WATERRATE],a
- and a
- ret z ; if no water data, we're done
- ld de,W_WATERMONS ; otherwise, load surfing data
- ld bc,$0014
- jp CopyData
-
-INCLUDE "data/wild_mons.asm"
-
-INCLUDE "engine/items/items.asm"
-
-DrawBadges: ; ea03 (3:6a03)
-; 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, wTrainerFacingDirection
- ld hl, .FaceBadgeTiles
- ld bc, 8
- call CopyData
-
-; Booleans for each badge.
- ld hl, wcd49
- ld bc, 8
- xor a
- call FillMemory
-
-; Alter these based on owned badges.
- ld de, wcd49
- ld hl, wTrainerFacingDirection
- ld a, [W_OBTAINEDBADGES]
- 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, wWhichTrade
- ld a, $d8 ; [1]
- ld [hli], a
- ld [hl], $60 ; First name
-
- hlCoord 2, 11
- ld de, wcd49
- call .DrawBadgeRow
-
- hlCoord 2, 14
- ld de, wcd49 + 4
-; call .DrawBadgeRow
-; ret
-
-.DrawBadgeRow ; ea4c (3:6a4c)
-; Draw 4 badges.
-
- ld c, 4
-.DrawBadge
- push de
- push hl
-
-; Badge no.
- ld a, [wWhichTrade]
- ld [hli], a
- inc a
- ld [wWhichTrade], a
-
-; Names aren't printed if the badge is owned.
- ld a, [de]
- and a
- ld a, [wTrainerEngageDistance]
- jr nz, .SkipName
- call .PlaceTiles
- jr .PlaceBadge
-
-.SkipName
- inc a
- inc a
- inc hl
-
-.PlaceBadge
- ld [wTrainerEngageDistance], a
- ld de, 20 - 1
- add hl, de
- ld a, [wTrainerFacingDirection]
- call .PlaceTiles
- add hl, de
- call .PlaceTiles
-
-; Shift badge array back one byte.
- push bc
- ld hl, wTrainerFacingDirection + 1
- ld de, wTrainerFacingDirection
- 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: ; ea9e (3:6a9e)
- 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: ; ee9e (3:6e9e)
- call GetPredefRegisters
- ld hl, wOverworldMap
- ld a, [W_CURMAPWIDTH]
- 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: ; eedc (3:6edc)
- ld a, [W_ISINBATTLE] ; W_ISINBATTLE
- 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 GoPAL_SET_CF1C
- 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 [wHPBarMaxHP], a
- ld a, h
- ld [wHPBarMaxHP + 1], a
- 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 * 20
- ld de, 20
- ld a, [$ffbe]
-.asm_ef1a
- add hl, de
- dec a
- jr nz, .asm_ef1a
- call CopyToScreenEdgeTiles
- pop hl
- ld de, $20
- ld a, [$ffbe]
- ld c, a
-.asm_ef28
- add hl, de
- ld a, h
- and $3
- or $98
- dec c
- jr nz, .asm_ef28
- ld [H_SCREENEDGEREDRAWADDR + 1], a
- ld a, l
- ld [H_SCREENEDGEREDRAWADDR], a
- ld a, REDRAWROW
- ld [H_SCREENEDGEREDRAW], 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: ; ef4e (3:6f4e)
- ld a, h
- sub b
- ret nz
- ld a, l
- sub c
- ret
-
-INCLUDE "engine/overworld/cut.asm"
-
-MarkTownVisitedAndLoadMissableObjects: ; f113 (3:7113)
- ld a, [W_CURMAP]
- cp ROUTE_1
- jr nc, .notInTown
- ld c, a
- ld b, $1
- ld hl, W_TOWNVISITEDFLAG ; mark town as visited (for flying)
- predef FlagActionPredef
-.notInTown
- ld hl, MapHSPointers
- ld a, [W_CURMAP]
- 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: ; f132 (3:7132)
- ld l, a
- push hl
- ld de, MapHS00 ; calculate difference between out pointer and the base pointer
- ld a, l
- sub e
- jr nc, .asm_f13c
- dec h
-.asm_f13c
- ld l, a
- ld a, h
- sub d
- 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, [W_CURMAP] ; W_CURMAP
- ld b, a
- ld a, [H_DIVIDEND+3]
- ld c, a ; store global offset in c
- ld de, W_MISSABLEOBJECTLIST
- 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: ; f175 (3:7175)
- ld hl, W_MISSABLEOBJECTFLAGS
- ld bc, $20
- xor a
- call FillMemory ; clear missable objects flags
- ld hl, MapHS00
- xor a
- ld [wd048], a
-.missableObjectsLoop
- ld a, [hli]
- cp $ff ; end of list
- ret z
- push hl
- inc hl
- ld a, [hl]
- cp Hide
- jr nz, .asm_f19d
- ld hl, W_MISSABLEOBJECTFLAGS
- ld a, [wd048]
- ld c, a
- ld b, $1
- call MissableObjectFlagAction ; set flag iff Item is hidden
-.asm_f19d
- ld hl, wd048
- 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: ; f1a6 (3:71a6)
- ld a, [H_CURRENTSPRITEOFFSET]
- swap a
- ld b, a
- ld hl, W_MISSABLEOBJECTLIST
-.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, $2
- ld hl, W_MISSABLEOBJECTFLAGS
- 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
-; [wcc4d]: index of the missable object to be added (global index)
-ShowObject: ; f1c8 (3:71c8)
-ShowObject2:
- ld hl, W_MISSABLEOBJECTFLAGS
- ld a, [wcc4d]
- ld c, a
- ld b, $0
- call MissableObjectFlagAction ; reset "removed" flag
- jp UpdateSprites
-
-; removes missable object (items, leg. pokemon, etc.) from the map
-; [wcc4d]: index of the missable object to be removed (global index)
-HideObject: ; f1d7 (3:71d7)
- ld hl, W_MISSABLEOBJECTFLAGS
- ld a, [wcc4d]
- ld c, a
- ld b, $1
- call MissableObjectFlagAction ; set "removed" flag
- jp UpdateSprites
-
-MissableObjectFlagAction:
-; 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: ; f225 (3:7225)
- ld a, [wd728]
- bit 0, a ; using Strength?
- ret z
- ld a, [wFlags_0xcd60]
- bit 1, a ; has boulder dust animation from previous push played yet?
- ret nz
- xor a
- ld [$ff8c], a
- call IsSpriteInFrontOfPlayer
- ld a, [$ff8c]
- ld [wBoulderSpriteIndex], a
- and a
- jp z, ResetBoulderPushFlags
- ld hl, wSpriteStateData1 + 1
- ld d, $0
- ld a, [$ff8c]
- 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 $f0
- 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_02_53 - SFX_Headers_02) / 3
- call PlaySound
- ld hl, wFlags_0xcd60
- set 1, [hl]
- ret
-
-PushBoulderUpMovementData: ; f2ad (3:72ad)
- db NPC_MOVEMENT_UP,$FF
-
-PushBoulderDownMovementData: ; f2af (3:72af)
- db NPC_MOVEMENT_DOWN,$FF
-
-PushBoulderLeftMovementData: ; f2b1 (3:72b1)
- db NPC_MOVEMENT_LEFT,$FF
-
-PushBoulderRightMovementData: ; f2b3 (3:72b3)
- db NPC_MOVEMENT_RIGHT,$FF
-
-DoBoulderDustAnimation: ; f2b5 (3:72b5)
- 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_02_56 - SFX_Headers_02) / 3
- jp PlaySound
-
-ResetBoulderPushFlags: ; f2dd (3:72dd)
- ld hl, wFlags_0xcd60
- res 1, [hl]
- res 6, [hl]
- ret
-
-_AddPartyMon: ; f2e5 (3:72e5)
- ld de, wPartyCount ; wPartyCount
- ld a, [wcc49]
- and $f
- jr z, .asm_f2f2
- ld de, wEnemyPartyCount ; wEnemyPartyCount
-.asm_f2f2
- ld a, [de]
- inc a
- cp PARTY_LENGTH + 1
- ret nc
- ld [de], a
- ld a, [de]
- ld [$ffe4], a
- add e
- ld e, a
- jr nc, .asm_f300
- inc d
-.asm_f300
- ld a, [wcf91]
- ld [de], a
- inc de
- ld a, $ff
- ld [de], a
- ld hl, wPartyMonOT ; wd273
- ld a, [wcc49]
- and $f
- jr z, .asm_f315
- ld hl, wEnemyMonOT
-.asm_f315
- ld a, [$ffe4]
- dec a
- call SkipFixedLengthTextEntries
- ld d, h
- ld e, l
- ld hl, wPlayerName ; wd158
- ld bc, $b
- call CopyData
- ld a, [wcc49]
- and a
- jr nz, .asm_f33f
- ld hl, wPartyMonNicks ; wPartyMonNicks
- ld a, [$ffe4]
- dec a
- call SkipFixedLengthTextEntries
- ld a, $2
- ld [wd07d], a
- predef AskName
-.asm_f33f
- ld hl, wPartyMons
- ld a, [wcc49]
- and $f
- jr z, .asm_f34c
- ld hl, wEnemyMons
-.asm_f34c
- ld a, [$ffe4]
- 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, W_MONHEADER
- ld a, [hli]
- ld [de], a
- inc de
- pop hl
- push hl
- ld a, [wcc49]
- and $f
- ld a, $98 ; set enemy trainer mon IVs to fixed average values
- ld b, $88
- jr nz, .writeFreshMonData
- ld a, [wcf91]
- ld [wd11e], a
- push de
- predef IndexToPokedex
- pop de
- ld a, [wd11e]
- dec a
- ld c, a
- ld b, $2
- ld hl, wPokedexOwned ; wPokedexOwned
- call FlagAction
- ld a, c
- ld [wd153], a
- ld a, [wd11e]
- dec a
- ld c, a
- ld b, $1
- push bc
- call FlagAction
- pop bc
- ld hl, wPokedexSeen ; wd30a
- call FlagAction
- pop hl
- push hl
- ld a, [W_ISINBATTLE] ; W_ISINBATTLE
- and a
- jr nz, .copyEnemyMonData
- call Random ; generate random IVs
- ld b, a
- call Random
-.writeFreshMonData ; f3b3
- push bc
- ld bc, $1b
- add hl, bc
- pop bc
- ld [hli], a
- ld [hl], b ; write IVs
- ld bc, $fff4
- 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 ; level (?)
- inc de
- ld [de], a ; status ailments
- inc de
- jr .copyMonTypesAndMoves
-.copyEnemyMonData
- ld bc, $1b
- 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 ; level (?)
- inc de
- ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon
- ld [de], a
- inc de
-.copyMonTypesAndMoves
- ld hl, W_MONHTYPES
- ld a, [hli] ; type 1
- ld [de], a
- inc de
- ld a, [hli] ; type 2
- ld [de], a
- inc de
- ld a, [hli] ; unused (?)
- ld [de], a
- ld hl, W_MONHMOVES
- 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 [wHPBarMaxHP], 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, [W_CURENEMYLVL]
- ld d, a
- callab CalcExperience
- pop de
- inc de
- ld a, [H_MULTIPLICAND] ; write experience
- ld [de], a
- inc de
- ld a, [H_MULTIPLICAND+1]
- ld [de], a
- inc de
- ld a, [H_MULTIPLICAND+2]
- ld [de], a
- xor a
- ld b, $a
-.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, [W_CURENEMYLVL] ; W_CURENEMYLVL
- ld [de], a
- inc de
- ld a, [W_ISINBATTLE] ; W_ISINBATTLE
- dec a
- jr nz, .calcFreshStats
- ld hl, wEnemyMonMaxHP ; wEnemyMonMaxHP
- ld bc, $a
- call CopyData ; copy stats of cur enemy mon
- pop hl
- jr .done
-.calcFreshStats
- pop hl
- ld bc, $10
- add hl, bc
- ld b, $0
- call CalcStats ; calculate fresh set of stats
-.done
- scf
- ret
-
-LoadMovePPs: ; f473 (3:7473)
- call GetPredefRegisters
- ; fallthrough
-AddPartyMon_WriteMovePP: ; f476 (3:7476)
- ld b, $4
-.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, $6
- call AddNTimes
- ld de, wcd6d
- ld a, BANK(Moves)
- call FarCopyData
- pop bc
- pop de
- pop hl
- ld a, [wcd72] ; sixth move byte = pp
-.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: ; f49d (3:749d)
- 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, $000b
- 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, $000b
- 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, $1
- 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
-
-Func_f51e: ; f51e (3:751e)
- ld a, [wcf95]
- and a
- jr z, .checkPartyMonSlots
- cp $2
- jr z, .checkPartyMonSlots
- cp $3
- ld hl, wDayCareMon
- jr z, .asm_f575
- ld hl, W_NUMINBOX ; wda80
- ld a, [hl]
- cp MONS_PER_BOX
- jr nz, .partyOrBoxNotFull
- jr .boxFull
-.checkPartyMonSlots
- ld hl, wPartyCount ; 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, [wcf95]
- cp $2
- ld a, [wDayCareMon]
- jr z, .asm_f556
- ld a, [wcf91]
-.asm_f556
- ld [hli], a ; write new mon ID
- ld [hl], $ff ; write new sentinel
- ld a, [wcf95]
- dec a
- ld hl, wPartyMons
- ld bc, wPartyMon2 - wPartyMon1 ; $2c
- ld a, [wPartyCount] ; wPartyCount
- jr nz, .skipToNewMonEntry
- ld hl, wBoxMons
- ld bc, wBoxMon2 - wBoxMon1 ; $21
- ld a, [W_NUMINBOX] ; wda80
-.skipToNewMonEntry
- dec a
- call AddNTimes
-.asm_f575
- push hl
- ld e, l
- ld d, h
- ld a, [wcf95]
- and a
- ld hl, wBoxMons
- ld bc, wBoxMon2 - wBoxMon1 ; $21
- jr z, .asm_f591
- cp $2
- ld hl, wDayCareMon
- jr z, .asm_f597
- ld hl, wPartyMons
- ld bc, wPartyMon2 - wPartyMon1 ; $2c
-.asm_f591
- ld a, [wWhichPokemon] ; wWhichPokemon
- call AddNTimes
-.asm_f597
- push hl
- push de
- ld bc, wBoxMon2 - wBoxMon1
- call CopyData
- pop de
- pop hl
- ld a, [wcf95]
- and a
- jr z, .asm_f5b4
- cp $2
- jr z, .asm_f5b4
- ld bc, wBoxMon2 - wBoxMon1
- add hl, bc
- ld a, [hl]
- inc de
- inc de
- inc de
- ld [de], a
-.asm_f5b4
- ld a, [wcf95]
- cp $3
- ld de, W_DAYCAREMONOT
- jr z, .asm_f5d3
- dec a
- ld hl, wPartyMonOT ; wd273
- ld a, [wPartyCount] ; wPartyCount
- jr nz, .asm_f5cd
- ld hl, wBoxMonOT
- ld a, [W_NUMINBOX] ; wda80
-.asm_f5cd
- dec a
- call SkipFixedLengthTextEntries
- ld d, h
- ld e, l
-.asm_f5d3
- ld hl, wBoxMonOT
- ld a, [wcf95]
- and a
- jr z, .asm_f5e6
- ld hl, W_DAYCAREMONOT
- cp $2
- jr z, .asm_f5ec
- ld hl, wPartyMonOT ; wd273
-.asm_f5e6
- ld a, [wWhichPokemon] ; wWhichPokemon
- call SkipFixedLengthTextEntries
-.asm_f5ec
- ld bc, $b
- call CopyData
- ld a, [wcf95]
- cp $3
- ld de, W_DAYCAREMONNAME
- jr z, .asm_f611
- dec a
- ld hl, wPartyMonNicks ; wPartyMonNicks
- ld a, [wPartyCount] ; wPartyCount
- jr nz, .asm_f60b
- ld hl, wBoxMonNicks
- ld a, [W_NUMINBOX] ; wda80
-.asm_f60b
- dec a
- call SkipFixedLengthTextEntries
- ld d, h
- ld e, l
-.asm_f611
- ld hl, wBoxMonNicks
- ld a, [wcf95]
- and a
- jr z, .asm_f624
- ld hl, W_DAYCAREMONNAME
- cp $2
- jr z, .asm_f62a
- ld hl, wPartyMonNicks ; wPartyMonNicks
-.asm_f624
- ld a, [wWhichPokemon] ; wWhichPokemon
- call SkipFixedLengthTextEntries
-.asm_f62a
- ld bc, $b
- call CopyData
- pop hl
- ld a, [wcf95]
- cp $1
- jr z, .asm_f664
- cp $3
- jr z, .asm_f664
- push hl
- srl a
- add $2
- ld [wcc49], a
- call LoadMonData
- callba CalcLevelFromExperience
- ld a, d
- ld [W_CURENEMYLVL], a ; W_CURENEMYLVL
- pop hl
- ld bc, wBoxMon2 - wBoxMon1
- add hl, bc
- ld [hli], a
- ld d, h
- ld e, l
- ld bc, $ffee
- add hl, bc
- ld b, $1
- call CalcStats
-.asm_f664
- and a
- ret
-
-
-FlagActionPredef:
- call GetPredefRegisters
-
-FlagAction:
-; 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:
-; 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, $0006
- call AddNTimes
- ld de, wcd6d
- ld a, BANK(Moves)
- call FarCopyData
- ld a, [wcd72] ; default pp
-
- 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
-
-
-DivideBCDPredef::
-DivideBCDPredef2::
-DivideBCDPredef3::
-DivideBCDPredef4::
- call GetPredefRegisters
-
-DivideBCD::
- xor a
- ld [$ffa5], a
- ld [$ffa6], a
- ld [$ffa7], a
- ld d, $1
-.asm_f72a
- ld a, [$ffa2]
- and $f0
- jr nz, .asm_f75b
- inc d
- ld a, [$ffa2]
- swap a
- and $f0
- ld b, a
- ld a, [$ffa3]
- swap a
- ld [$ffa3], a
- and $f
- or b
- ld [$ffa2], a
- ld a, [$ffa3]
- and $f0
- ld b, a
- ld a, [$ffa4]
- swap a
- ld [$ffa4], a
- and $f
- or b
- ld [$ffa3], a
- ld a, [$ffa4]
- and $f0
- ld [$ffa4], a
- jr .asm_f72a
-.asm_f75b
- push de
- push de
- call Func_f800
- pop de
- ld a, b
- swap a
- and $f0
- ld [$ffa5], a
- dec d
- jr z, .asm_f7bc
- push de
- call Func_f7d7
- call Func_f800
- pop de
- ld a, [$ffa5]
- or b
- ld [$ffa5], a
- dec d
- jr z, .asm_f7bc
- push de
- call Func_f7d7
- call Func_f800
- pop de
- ld a, b
- swap a
- and $f0
- ld [$ffa6], a
- dec d
- jr z, .asm_f7bc
- push de
- call Func_f7d7
- call Func_f800
- pop de
- ld a, [$ffa6]
- or b
- ld [$ffa6], a
- dec d
- jr z, .asm_f7bc
- push de
- call Func_f7d7
- call Func_f800
- pop de
- ld a, b
- swap a
- and $f0
- ld [$ffa7], a
- dec d
- jr z, .asm_f7bc
- push de
- call Func_f7d7
- call Func_f800
- pop de
- ld a, [$ffa7]
- or b
- ld [$ffa7], a
-.asm_f7bc
- ld a, [$ffa5]
- ld [$ffa2], a
- ld a, [$ffa6]
- ld [$ffa3], a
- ld a, [$ffa7]
- ld [$ffa4], a
- pop de
- ld a, $6
- sub d
- and a
- ret z
-.asm_f7ce
- push af
- call Func_f7d7
- pop af
- dec a
- jr nz, .asm_f7ce
- ret
-
-Func_f7d7: ; f7d7 (3:77d7)
- ld a, [$ffa4]
- swap a
- and $f
- ld b, a
- ld a, [$ffa3]
- swap a
- ld [$ffa3], a
- and $f0
- or b
- ld [$ffa4], a
- ld a, [$ffa3]
- and $f
- ld b, a
- ld a, [$ffa2]
- swap a
- ld [$ffa2], a
- and $f0
- or b
- ld [$ffa3], a
- ld a, [$ffa2]
- and $f
- ld [$ffa2], a
- ret
-
-Func_f800: ; f800 (3:7800)
- ld bc, $3
-.asm_f803
- ld de, $ff9f
- ld hl, $ffa2
- push bc
- call StringCmp
- pop bc
- ret c
- inc b
- ld de, $ffa1
- ld hl, $ffa4
- push bc
- call SubBCD
- pop bc
- jr .asm_f803
-
-
-AddBCDPredef::
- call GetPredefRegisters
-
-AddBCD::
- and a
- ld b, c
-.add
- ld a, [de]
- adc [hl]
- daa
- ld [de], a
- dec de
- dec hl
- dec c
- jr nz, .add
- jr nc, .done
- ld a, $99
- inc de
-.fill
- ld [de], a
- inc de
- dec b
- jr nz, .fill
-.done
- ret
-
-
-SubBCDPredef::
- call GetPredefRegisters
-
-SubBCD::
- and a
- ld b, c
-.sub
- ld a, [de]
- sbc [hl]
- daa
- ld [de], a
- dec de
- dec hl
- dec c
- jr nz, .sub
- jr nc, .done
- ld a, $00
- inc de
-.fill
- ld [de], a
- inc de
- dec b
- jr nz, .fill
- scf
-.done
- ret
-
-
-InitPlayerData:
-InitPlayerData2:
-
- call Random
- ld a, [hRandomSub]
- ld [wPlayerID], a
-
- call Random
- ld a, [hRandomAdd]
- ld [wPlayerID + 1], a
-
- ld a, $ff
- ld [wd71b], a ; XXX what's this?
-
- ld hl, wPartyCount
- call InitializeEmptyList
- ld hl, W_NUMINBOX
- 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 [wcc49], a
-
- ld hl, W_OBTAINEDBADGES
- ld [hli], a
-
- ld [hl], a
-
- ld hl, wPlayerCoins
- ld [hli], a
- ld [hl], a
-
- ld hl, W_GAMEPROGRESSFLAGS
- ld bc, $c8
- call FillMemory ; clear all game progress flags
-
- jp InitializeMissableObjectsFlags
-
-InitializeEmptyList:
- xor a ; count
- ld [hli], a
- dec a ; terminator
- ld [hl], a
- ret
-
-
-IsItemInBag_: ; f8a5 (3:78a5)
- call GetPredefRegisters
- ld hl, wNumBagItems ; wNumBagItems
-.asm_f8ab
- inc hl
- ld a, [hli]
- cp $ff
- jr z, .asm_f8b7
- cp b
- jr nz, .asm_f8ab
- ld a, [hl]
- ld b, a
- ret
-.asm_f8b7
- ld b, $0
- ret
-
-FindPathToPlayer: ; f8ba (3:78ba)
- xor a
- ld hl, $ff97
- ld [hli], a
- ld [hli], a
- ld [hli], a
- ld [hl], a
- ld hl, wNPCMovementDirections2
- ld de, $0
-.loop
- ld a, [$ff99]
- ld b, a
- ld a, [$ff95] ; Y distance in steps
- call CalcDifference
- ld d, a
- and a
- jr nz, .asm_f8da
- ld a, [$ff98]
- set 0, a
- ld [$ff98], a
-.asm_f8da
- ld a, [$ff9a]
- ld b, a
- ld a, [$ff96] ; X distance in steps
- call CalcDifference
- ld e, a
- and a
- jr nz, .asm_f8ec
- ld a, [$ff98]
- set 1, a
- ld [$ff98], a
-.asm_f8ec
- ld a, [$ff98]
- cp $3
- jr z, .done
- ld a, e
- cp d
- jr c, .asm_f90a
- ld a, [$ff9d]
- bit 1, a
- jr nz, .asm_f900
- ld d, NPC_MOVEMENT_RIGHT
- jr .asm_f902
-.asm_f900
- ld d, NPC_MOVEMENT_LEFT
-.asm_f902
- ld a, [$ff9a]
- add $1
- ld [$ff9a], a
- jr .asm_f91c
-.asm_f90a
- ld a, [$ff9d]
- bit 0, a
- jr nz, .asm_f914
- ld d, NPC_MOVEMENT_DOWN
- jr .asm_f916
-.asm_f914
- ld d, NPC_MOVEMENT_UP
-.asm_f916
- ld a, [$ff99]
- add $1
- ld [$ff99], a
-.asm_f91c
- ld a, d
- ld [hli], a
- ld a, [$ff97]
- inc a
- ld [$ff97], a
- jp .loop
-.done
- ld [hl], $ff
- ret
-
-CalcPositionOfPlayerRelativeToNPC: ; f929 (3:7929)
- xor a
- ld [$ff9d], 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, [$ff95] ; sprite offset
- 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, $ff9d
- bit 0, [hl]
- set 0, [hl]
- pop hl
- jr .divideYDistance
-.NPCSouthOfOrAlignedWithPlayer
- push hl
- ld hl, $ff9d
- bit 0, [hl]
- res 0, [hl]
- pop hl
-.divideYDistance
- push hl
- ld hl, $ffe5
- ld [hli], a
- ld a, 16
- ld [hli], a
- call DivideBytes ; divide Y absolute distance by 16
- ld a, [hl] ; quotient
- ld [$ff95], 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, $ff9d
- bit 1, [hl]
- set 1, [hl]
- pop hl
- jr .divideXDistance
-.NPCEastOfOrAlignedWithPlayer
- push hl
- ld hl, $ff9d
- bit 1, [hl]
- res 1, [hl]
- pop hl
-.divideXDistance
- ld [$ffe5], a
- ld a, 16
- ld [$ffe6], a
- call DivideBytes ; divide X absolute distance by 16
- ld a, [$ffe7] ; quotient
- ld [$ff96], a
- ld a, [$ff9b]
- and a
- ret z
- ld a, [$ff9d]
- cpl
- and $3
- ld [$ff9d], a
- ret
-
-ConvertNPCMovementDirectionsToJoypadMasks: ; f9a0 (3:79a0)
- ld a, [$ff95]
- 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, [$ff95]
- dec a
- ld [$ff95], a
- jr nz, .loop
- ret
-
-ConvertNPCMovementDirectionToJoypadMask: ; f9bf (3:79bf)
- 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: ; f9d2 (3:79d2)
- 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
-
-Func_f9db: ; f9db (3:79db)
- ret
-
-INCLUDE "engine/hp_bar.asm"
-
-INCLUDE "engine/hidden_object_functions3.asm"
-
-
-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"
-
-
-SECTION "Graphics", ROMX, BANK[GFX]
-
-PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp"
-FontGraphics: INCBIN "gfx/font.1bpp"
-ABTiles: INCBIN "gfx/AB.2bpp"
-HpBarAndStatusGraphics: INCBIN "gfx/hp_bar_and_status.2bpp"
-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"
-TextBoxGraphics: INCBIN "gfx/text_box.2bpp"
-PokedexTileGraphics: INCBIN "gfx/pokedex.2bpp"
-WorldMapTileGraphics: INCBIN "gfx/town_map.2bpp"
-PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp"
-
-
-SECTION "Battle (bank 4)", ROMX, BANK[$4]
-
-INCLUDE "engine/overworld/is_player_just_outside_map.asm"
-INCLUDE "engine/menu/status_screen.asm"
-INCLUDE "engine/menu/party_menu.asm"
-
-RedPicFront:: INCBIN "pic/trainer/red.pic"
-ShrinkPic1:: INCBIN "pic/trainer/shrink1.pic"
-ShrinkPic2:: INCBIN "pic/trainer/shrink2.pic"
-
-INCLUDE "engine/turn_sprite.asm"
-INCLUDE "engine/menu/start_sub_menus.asm"
-INCLUDE "engine/items/tms.asm"
-INCLUDE "engine/battle/end_of_battle.asm"
-INCLUDE "engine/battle/wild_encounters.asm"
-INCLUDE "engine/battle/moveEffects/recoil_effect.asm"
-INCLUDE "engine/battle/moveEffects/conversion_effect.asm"
-INCLUDE "engine/battle/moveEffects/haze_effect.asm"
-INCLUDE "engine/battle/get_trainer_name.asm"
-
-
-SECTION "NPC Sprites 2", ROMX, BANK[NPC_SPRITES_2]
-
-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"
-
-
-SECTION "Battle (bank 5)", ROMX, BANK[$5]
-
-INCLUDE "engine/load_pokedex_tiles.asm"
-INCLUDE "engine/overworld/map_sprites.asm"
-INCLUDE "engine/overworld/emotion_bubbles.asm"
-INCLUDE "engine/evolve_trade.asm"
-INCLUDE "engine/battle/moveEffects/substitute_effect.asm"
-INCLUDE "engine/menu/pc.asm"
-
-
-SECTION "bank6",ROMX,BANK[$6]
-
-INCLUDE "data/mapHeaders/celadoncity.asm"
-INCLUDE "data/mapObjects/celadoncity.asm"
-CeladonCityBlocks: INCBIN "maps/celadoncity.blk"
-
-INCLUDE "data/mapHeaders/pallettown.asm"
-INCLUDE "data/mapObjects/pallettown.asm"
-PalletTownBlocks: INCBIN "maps/pallettown.blk"
-
-INCLUDE "data/mapHeaders/viridiancity.asm"
-INCLUDE "data/mapObjects/viridiancity.asm"
-ViridianCityBlocks: INCBIN "maps/viridiancity.blk"
-
-INCLUDE "data/mapHeaders/pewtercity.asm"
-INCLUDE "data/mapObjects/pewtercity.asm"
-PewterCityBlocks: INCBIN "maps/pewtercity.blk"
-
-INCLUDE "data/mapHeaders/ceruleancity.asm"
-INCLUDE "data/mapObjects/ceruleancity.asm"
-CeruleanCityBlocks: INCBIN "maps/ceruleancity.blk"
-
-INCLUDE "data/mapHeaders/vermilioncity.asm"
-INCLUDE "data/mapObjects/vermilioncity.asm"
-VermilionCityBlocks: INCBIN "maps/vermilioncity.blk"
-
-INCLUDE "data/mapHeaders/fuchsiacity.asm"
-INCLUDE "data/mapObjects/fuchsiacity.asm"
-FuchsiaCityBlocks: INCBIN "maps/fuchsiacity.blk"
-
-INCLUDE "engine/play_time.asm"
-
-INCLUDE "scripts/pallettown.asm"
-INCLUDE "scripts/viridiancity.asm"
-INCLUDE "scripts/pewtercity.asm"
-INCLUDE "scripts/ceruleancity.asm"
-INCLUDE "scripts/vermilioncity.asm"
-INCLUDE "scripts/celadoncity.asm"
-INCLUDE "scripts/fuchsiacity.asm"
-
-INCLUDE "data/mapHeaders/blueshouse.asm"
-INCLUDE "scripts/blueshouse.asm"
-INCLUDE "data/mapObjects/blueshouse.asm"
-BluesHouseBlocks: INCBIN "maps/blueshouse.blk"
-
-INCLUDE "data/mapHeaders/vermilionhouse3.asm"
-INCLUDE "scripts/vermilionhouse3.asm"
-INCLUDE "data/mapObjects/vermilionhouse3.asm"
-VermilionHouse3Blocks: INCBIN "maps/vermilionhouse3.blk"
-
-INCLUDE "data/mapHeaders/indigoplateaulobby.asm"
-INCLUDE "scripts/indigoplateaulobby.asm"
-INCLUDE "data/mapObjects/indigoplateaulobby.asm"
-IndigoPlateauLobbyBlocks: INCBIN "maps/indigoplateaulobby.blk"
-
-INCLUDE "data/mapHeaders/silphco4.asm"
-INCLUDE "scripts/silphco4.asm"
-INCLUDE "data/mapObjects/silphco4.asm"
-SilphCo4Blocks: INCBIN "maps/silphco4.blk"
-
-INCLUDE "data/mapHeaders/silphco5.asm"
-INCLUDE "scripts/silphco5.asm"
-INCLUDE "data/mapObjects/silphco5.asm"
-SilphCo5Blocks: INCBIN "maps/silphco5.blk"
-
-INCLUDE "data/mapHeaders/silphco6.asm"
-INCLUDE "scripts/silphco6.asm"
-INCLUDE "data/mapObjects/silphco6.asm"
-SilphCo6Blocks: INCBIN "maps/silphco6.blk"
-
-INCLUDE "engine/overworld/npc_movement.asm"
-INCLUDE "engine/overworld/doors.asm"
-INCLUDE "engine/overworld/ledges.asm"
-
-
-SECTION "bank7",ROMX,BANK[$7]
-
-INCLUDE "data/mapHeaders/cinnabarisland.asm"
-INCLUDE "data/mapObjects/cinnabarisland.asm"
-CinnabarIslandBlocks: INCBIN "maps/cinnabarisland.blk"
-
-INCLUDE "data/mapHeaders/route1.asm"
-INCLUDE "data/mapObjects/route1.asm"
-Route1Blocks: INCBIN "maps/route1.blk"
-
-UndergroundPathEntranceRoute8Blocks: INCBIN "maps/undergroundpathentranceroute8.blk"
-
-OaksLabBlocks: INCBIN "maps/oakslab.blk"
-
-Route16HouseBlocks:
-Route2HouseBlocks:
-SaffronHouse1Blocks:
-SaffronHouse2Blocks:
-VermilionHouse1Blocks:
-NameRaterBlocks:
-LavenderHouse1Blocks:
-LavenderHouse2Blocks:
-CeruleanHouse1Blocks:
-PewterHouse1Blocks:
-PewterHouse2Blocks:
-ViridianHouseBlocks: INCBIN "maps/viridianhouse.blk"
-
-CeladonMansion5Blocks:
-SchoolBlocks: INCBIN "maps/school.blk"
-
-CeruleanHouseTrashedBlocks: INCBIN "maps/ceruleanhousetrashed.blk"
-
-DiglettsCaveEntranceRoute11Blocks:
-DiglettsCaveRoute2Blocks: INCBIN "maps/diglettscaveroute2.blk"
-
-INCLUDE "text/monster_names.asm"
-
-INCLUDE "engine/clear_save.asm"
-
-INCLUDE "engine/predefs7.asm"
-
-INCLUDE "scripts/cinnabarisland.asm"
-
-INCLUDE "scripts/route1.asm"
-
-INCLUDE "data/mapHeaders/oakslab.asm"
-INCLUDE "scripts/oakslab.asm"
-INCLUDE "data/mapObjects/oakslab.asm"
-
-INCLUDE "data/mapHeaders/viridianmart.asm"
-INCLUDE "scripts/viridianmart.asm"
-INCLUDE "data/mapObjects/viridianmart.asm"
-ViridianMartBlocks: INCBIN "maps/viridianmart.blk"
-
-INCLUDE "data/mapHeaders/school.asm"
-INCLUDE "scripts/school.asm"
-INCLUDE "data/mapObjects/school.asm"
-
-INCLUDE "data/mapHeaders/viridianhouse.asm"
-INCLUDE "scripts/viridianhouse.asm"
-INCLUDE "data/mapObjects/viridianhouse.asm"
-
-INCLUDE "data/mapHeaders/pewterhouse1.asm"
-INCLUDE "scripts/pewterhouse1.asm"
-INCLUDE "data/mapObjects/pewterhouse1.asm"
-
-INCLUDE "data/mapHeaders/pewterhouse2.asm"
-INCLUDE "scripts/pewterhouse2.asm"
-INCLUDE "data/mapObjects/pewterhouse2.asm"
-
-INCLUDE "data/mapHeaders/ceruleanhousetrashed.asm"
-INCLUDE "scripts/ceruleanhousetrashed.asm"
-INCLUDE "data/mapObjects/ceruleanhousetrashed.asm"
-
-INCLUDE "data/mapHeaders/ceruleanhouse1.asm"
-INCLUDE "scripts/ceruleanhouse1.asm"
-INCLUDE "data/mapObjects/ceruleanhouse1.asm"
-
-INCLUDE "data/mapHeaders/bikeshop.asm"
-INCLUDE "scripts/bikeshop.asm"
-INCLUDE "data/mapObjects/bikeshop.asm"
-BikeShopBlocks: INCBIN "maps/bikeshop.blk"
-
-INCLUDE "data/mapHeaders/lavenderhouse1.asm"
-INCLUDE "scripts/lavenderhouse1.asm"
-INCLUDE "data/mapObjects/lavenderhouse1.asm"
-
-INCLUDE "data/mapHeaders/lavenderhouse2.asm"
-INCLUDE "scripts/lavenderhouse2.asm"
-INCLUDE "data/mapObjects/lavenderhouse2.asm"
-
-INCLUDE "data/mapHeaders/namerater.asm"
-INCLUDE "scripts/namerater.asm"
-INCLUDE "data/mapObjects/namerater.asm"
-
-INCLUDE "data/mapHeaders/vermilionhouse1.asm"
-INCLUDE "scripts/vermilionhouse1.asm"
-INCLUDE "data/mapObjects/vermilionhouse1.asm"
-
-INCLUDE "data/mapHeaders/vermiliondock.asm"
-INCLUDE "scripts/vermiliondock.asm"
-INCLUDE "data/mapObjects/vermiliondock.asm"
-VermilionDockBlocks: INCBIN "maps/vermiliondock.blk"
-
-INCLUDE "data/mapHeaders/celadonmansion5.asm"
-INCLUDE "scripts/celadonmansion5.asm"
-INCLUDE "data/mapObjects/celadonmansion5.asm"
-
-INCLUDE "data/mapHeaders/fuchsiamart.asm"
-INCLUDE "scripts/fuchsiamart.asm"
-INCLUDE "data/mapObjects/fuchsiamart.asm"
-FuchsiaMartBlocks: INCBIN "maps/fuchsiamart.blk"
-
-INCLUDE "data/mapHeaders/saffronhouse1.asm"
-INCLUDE "scripts/saffronhouse1.asm"
-INCLUDE "data/mapObjects/saffronhouse1.asm"
-
-INCLUDE "data/mapHeaders/saffronhouse2.asm"
-INCLUDE "scripts/saffronhouse2.asm"
-INCLUDE "data/mapObjects/saffronhouse2.asm"
-
-INCLUDE "data/mapHeaders/diglettscaveroute2.asm"
-INCLUDE "scripts/diglettscaveroute2.asm"
-INCLUDE "data/mapObjects/diglettscaveroute2.asm"
-
-INCLUDE "data/mapHeaders/route2house.asm"
-INCLUDE "scripts/route2house.asm"
-INCLUDE "data/mapObjects/route2house.asm"
-
-INCLUDE "data/mapHeaders/route5gate.asm"
-INCLUDE "scripts/route5gate.asm"
-INCLUDE "data/mapObjects/route5gate.asm"
-Route5GateBlocks: INCBIN "maps/route5gate.blk"
-
-INCLUDE "data/mapHeaders/route6gate.asm"
-INCLUDE "scripts/route6gate.asm"
-INCLUDE "data/mapObjects/route6gate.asm"
-Route6GateBlocks: INCBIN "maps/route6gate.blk"
-
-INCLUDE "data/mapHeaders/route7gate.asm"
-INCLUDE "scripts/route7gate.asm"
-INCLUDE "data/mapObjects/route7gate.asm"
-Route7GateBlocks: INCBIN "maps/route7gate.blk"
-
-INCLUDE "data/mapHeaders/route8gate.asm"
-INCLUDE "scripts/route8gate.asm"
-INCLUDE "data/mapObjects/route8gate.asm"
-Route8GateBlocks: INCBIN "maps/route8gate.blk"
-
-INCLUDE "data/mapHeaders/undergroundpathentranceroute8.asm"
-INCLUDE "scripts/undergroundpathentranceroute8.asm"
-INCLUDE "data/mapObjects/undergroundpathentranceroute8.asm"
-
-INCLUDE "data/mapHeaders/powerplant.asm"
-INCLUDE "scripts/powerplant.asm"
-INCLUDE "data/mapObjects/powerplant.asm"
-PowerPlantBlocks: INCBIN "maps/powerplant.blk"
-
-INCLUDE "data/mapHeaders/diglettscaveroute11.asm"
-INCLUDE "scripts/diglettscaveroute11.asm"
-INCLUDE "data/mapObjects/diglettscaveroute11.asm"
-
-INCLUDE "data/mapHeaders/route16house.asm"
-INCLUDE "scripts/route16house.asm"
-INCLUDE "data/mapObjects/route16house.asm"
-
-INCLUDE "data/mapHeaders/route22gate.asm"
-INCLUDE "scripts/route22gate.asm"
-INCLUDE "data/mapObjects/route22gate.asm"
-Route22GateBlocks: INCBIN "maps/route22gate.blk"
-
-INCLUDE "data/mapHeaders/billshouse.asm"
-INCLUDE "scripts/billshouse.asm"
-INCLUDE "data/mapObjects/billshouse.asm"
-BillsHouseBlocks: INCBIN "maps/billshouse.blk"
-IF DEF(_OPTION_BEACH_HOUSE)
-INCLUDE "data/mapHeaders/beach_house.asm"
-INCLUDE "scripts/beach_house.asm"
-BeachHouseBlockdata: INCBIN "maps/beach_house.blk"
-INCLUDE "data/mapObjects/beach_house.asm"
-ENDC
-
-INCLUDE "engine/menu/oaks_pc.asm"
-
-INCLUDE "engine/hidden_object_functions7.asm"
-
-
-SECTION "Pics 1", ROMX, BANK[PICS_1]
-
-RhydonPicFront:: INCBIN "pic/bmon/rhydon.pic"
-RhydonPicBack:: INCBIN "pic/monback/rhydonb.pic"
-KangaskhanPicFront:: INCBIN "pic/bmon/kangaskhan.pic"
-KangaskhanPicBack:: INCBIN "pic/monback/kangaskhanb.pic"
-NidoranMPicFront:: INCBIN "pic/bmon/nidoranm.pic"
-NidoranMPicBack:: INCBIN "pic/monback/nidoranmb.pic"
-ClefairyPicFront:: INCBIN "pic/bmon/clefairy.pic"
-ClefairyPicBack:: INCBIN "pic/monback/clefairyb.pic"
-SpearowPicFront:: INCBIN "pic/bmon/spearow.pic"
-SpearowPicBack:: INCBIN "pic/monback/spearowb.pic"
-VoltorbPicFront:: INCBIN "pic/bmon/voltorb.pic"
-VoltorbPicBack:: INCBIN "pic/monback/voltorbb.pic"
-NidokingPicFront:: INCBIN "pic/bmon/nidoking.pic"
-NidokingPicBack:: INCBIN "pic/monback/nidokingb.pic"
-SlowbroPicFront:: INCBIN "pic/bmon/slowbro.pic"
-SlowbroPicBack:: INCBIN "pic/monback/slowbrob.pic"
-IvysaurPicFront:: INCBIN "pic/bmon/ivysaur.pic"
-IvysaurPicBack:: INCBIN "pic/monback/ivysaurb.pic"
-ExeggutorPicFront:: INCBIN "pic/bmon/exeggutor.pic"
-ExeggutorPicBack:: INCBIN "pic/monback/exeggutorb.pic"
-LickitungPicFront:: INCBIN "pic/bmon/lickitung.pic"
-LickitungPicBack:: INCBIN "pic/monback/lickitungb.pic"
-ExeggcutePicFront:: INCBIN "pic/bmon/exeggcute.pic"
-ExeggcutePicBack:: INCBIN "pic/monback/exeggcuteb.pic"
-GrimerPicFront:: INCBIN "pic/bmon/grimer.pic"
-GrimerPicBack:: INCBIN "pic/monback/grimerb.pic"
-GengarPicFront:: INCBIN "pic/bmon/gengar.pic"
-GengarPicBack:: INCBIN "pic/monback/gengarb.pic"
-NidoranFPicFront:: INCBIN "pic/bmon/nidoranf.pic"
-NidoranFPicBack:: INCBIN "pic/monback/nidoranfb.pic"
-NidoqueenPicFront:: INCBIN "pic/bmon/nidoqueen.pic"
-NidoqueenPicBack:: INCBIN "pic/monback/nidoqueenb.pic"
-CubonePicFront:: INCBIN "pic/bmon/cubone.pic"
-CubonePicBack:: INCBIN "pic/monback/cuboneb.pic"
-RhyhornPicFront:: INCBIN "pic/bmon/rhyhorn.pic"
-RhyhornPicBack:: INCBIN "pic/monback/rhyhornb.pic"
-LaprasPicFront:: INCBIN "pic/bmon/lapras.pic"
-LaprasPicBack:: INCBIN "pic/monback/laprasb.pic"
-ArcaninePicFront:: INCBIN "pic/bmon/arcanine.pic"
-ArcaninePicBack:: INCBIN "pic/monback/arcanineb.pic"
-GyaradosPicFront:: INCBIN "pic/bmon/gyarados.pic"
-GyaradosPicBack:: INCBIN "pic/monback/gyaradosb.pic"
-ShellderPicFront:: INCBIN "pic/bmon/shellder.pic"
-ShellderPicBack:: INCBIN "pic/monback/shellderb.pic"
-TentacoolPicFront:: INCBIN "pic/bmon/tentacool.pic"
-TentacoolPicBack:: INCBIN "pic/monback/tentacoolb.pic"
-GastlyPicFront:: INCBIN "pic/bmon/gastly.pic"
-GastlyPicBack:: INCBIN "pic/monback/gastlyb.pic"
-ScytherPicFront:: INCBIN "pic/bmon/scyther.pic"
-ScytherPicBack:: INCBIN "pic/monback/scytherb.pic"
-StaryuPicFront:: INCBIN "pic/bmon/staryu.pic"
-StaryuPicBack:: INCBIN "pic/monback/staryub.pic"
-BlastoisePicFront:: INCBIN "pic/bmon/blastoise.pic"
-BlastoisePicBack:: INCBIN "pic/monback/blastoiseb.pic"
-PinsirPicFront:: INCBIN "pic/bmon/pinsir.pic"
-PinsirPicBack:: INCBIN "pic/monback/pinsirb.pic"
-TangelaPicFront:: INCBIN "pic/bmon/tangela.pic"
-TangelaPicBack:: INCBIN "pic/monback/tangelab.pic"
-
-
-SECTION "Battle (bank 9)", ROMX, BANK[$9]
-INCLUDE "engine/battle/print_type.asm"
-INCLUDE "engine/battle/save_trainer_name.asm"
-INCLUDE "engine/battle/moveEffects/focus_energy_effect.asm"
-
-
-SECTION "Pics 2", ROMX, BANK[PICS_2]
-
-GrowlithePicFront:: INCBIN "pic/bmon/growlithe.pic"
-GrowlithePicBack:: INCBIN "pic/monback/growlitheb.pic"
-OnixPicFront:: INCBIN "pic/bmon/onix.pic"
-OnixPicBack:: INCBIN "pic/monback/onixb.pic"
-FearowPicFront:: INCBIN "pic/bmon/fearow.pic"
-FearowPicBack:: INCBIN "pic/monback/fearowb.pic"
-PidgeyPicFront:: INCBIN "pic/bmon/pidgey.pic"
-PidgeyPicBack:: INCBIN "pic/monback/pidgeyb.pic"
-SlowpokePicFront:: INCBIN "pic/bmon/slowpoke.pic"
-SlowpokePicBack:: INCBIN "pic/monback/slowpokeb.pic"
-KadabraPicFront:: INCBIN "pic/bmon/kadabra.pic"
-KadabraPicBack:: INCBIN "pic/monback/kadabrab.pic"
-GravelerPicFront:: INCBIN "pic/bmon/graveler.pic"
-GravelerPicBack:: INCBIN "pic/monback/gravelerb.pic"
-ChanseyPicFront:: INCBIN "pic/bmon/chansey.pic"
-ChanseyPicBack:: INCBIN "pic/monback/chanseyb.pic"
-MachokePicFront:: INCBIN "pic/bmon/machoke.pic"
-MachokePicBack:: INCBIN "pic/monback/machokeb.pic"
-MrMimePicFront:: INCBIN "pic/bmon/mr.mime.pic"
-MrMimePicBack:: INCBIN "pic/monback/mr.mimeb.pic"
-HitmonleePicFront:: INCBIN "pic/bmon/hitmonlee.pic"
-HitmonleePicBack:: INCBIN "pic/monback/hitmonleeb.pic"
-HitmonchanPicFront:: INCBIN "pic/bmon/hitmonchan.pic"
-HitmonchanPicBack:: INCBIN "pic/monback/hitmonchanb.pic"
-ArbokPicFront:: INCBIN "pic/bmon/arbok.pic"
-ArbokPicBack:: INCBIN "pic/monback/arbokb.pic"
-ParasectPicFront:: INCBIN "pic/bmon/parasect.pic"
-ParasectPicBack:: INCBIN "pic/monback/parasectb.pic"
-PsyduckPicFront:: INCBIN "pic/bmon/psyduck.pic"
-PsyduckPicBack:: INCBIN "pic/monback/psyduckb.pic"
-DrowzeePicFront:: INCBIN "pic/bmon/drowzee.pic"
-DrowzeePicBack:: INCBIN "pic/monback/drowzeeb.pic"
-GolemPicFront:: INCBIN "pic/bmon/golem.pic"
-GolemPicBack:: INCBIN "pic/monback/golemb.pic"
-MagmarPicFront:: INCBIN "pic/bmon/magmar.pic"
-MagmarPicBack:: INCBIN "pic/monback/magmarb.pic"
-ElectabuzzPicFront:: INCBIN "pic/bmon/electabuzz.pic"
-ElectabuzzPicBack:: INCBIN "pic/monback/electabuzzb.pic"
-MagnetonPicFront:: INCBIN "pic/bmon/magneton.pic"
-MagnetonPicBack:: INCBIN "pic/monback/magnetonb.pic"
-KoffingPicFront:: INCBIN "pic/bmon/koffing.pic"
-KoffingPicBack:: INCBIN "pic/monback/koffingb.pic"
-MankeyPicFront:: INCBIN "pic/bmon/mankey.pic"
-MankeyPicBack:: INCBIN "pic/monback/mankeyb.pic"
-SeelPicFront:: INCBIN "pic/bmon/seel.pic"
-SeelPicBack:: INCBIN "pic/monback/seelb.pic"
-DiglettPicFront:: INCBIN "pic/bmon/diglett.pic"
-DiglettPicBack:: INCBIN "pic/monback/diglettb.pic"
-TaurosPicFront:: INCBIN "pic/bmon/tauros.pic"
-TaurosPicBack:: INCBIN "pic/monback/taurosb.pic"
-FarfetchdPicFront:: INCBIN "pic/bmon/farfetchd.pic"
-FarfetchdPicBack:: INCBIN "pic/monback/farfetchdb.pic"
-VenonatPicFront:: INCBIN "pic/bmon/venonat.pic"
-VenonatPicBack:: INCBIN "pic/monback/venonatb.pic"
-DragonitePicFront:: INCBIN "pic/bmon/dragonite.pic"
-DragonitePicBack:: INCBIN "pic/monback/dragoniteb.pic"
-DoduoPicFront:: INCBIN "pic/bmon/doduo.pic"
-DoduoPicBack:: INCBIN "pic/monback/doduob.pic"
-PoliwagPicFront:: INCBIN "pic/bmon/poliwag.pic"
-PoliwagPicBack:: INCBIN "pic/monback/poliwagb.pic"
-JynxPicFront:: INCBIN "pic/bmon/jynx.pic"
-JynxPicBack:: INCBIN "pic/monback/jynxb.pic"
-MoltresPicFront:: INCBIN "pic/bmon/moltres.pic"
-MoltresPicBack:: INCBIN "pic/monback/moltresb.pic"
-
-
-SECTION "Battle (bank A)", ROMX, BANK[$A]
-INCLUDE "engine/battle/moveEffects/leech_seed_effect.asm"
-
-
-SECTION "Pics 3", ROMX, BANK[PICS_3]
-
-ArticunoPicFront:: INCBIN "pic/bmon/articuno.pic"
-ArticunoPicBack:: INCBIN "pic/monback/articunob.pic"
-ZapdosPicFront:: INCBIN "pic/bmon/zapdos.pic"
-ZapdosPicBack:: INCBIN "pic/monback/zapdosb.pic"
-DittoPicFront:: INCBIN "pic/bmon/ditto.pic"
-DittoPicBack:: INCBIN "pic/monback/dittob.pic"
-MeowthPicFront:: INCBIN "pic/bmon/meowth.pic"
-MeowthPicBack:: INCBIN "pic/monback/meowthb.pic"
-KrabbyPicFront:: INCBIN "pic/bmon/krabby.pic"
-KrabbyPicBack:: INCBIN "pic/monback/krabbyb.pic"
-VulpixPicFront:: INCBIN "pic/bmon/vulpix.pic"
-VulpixPicBack:: INCBIN "pic/monback/vulpixb.pic"
-NinetalesPicFront:: INCBIN "pic/bmon/ninetales.pic"
-NinetalesPicBack:: INCBIN "pic/monback/ninetalesb.pic"
-PikachuPicFront:: INCBIN "pic/bmon/pikachu.pic"
-PikachuPicBack:: INCBIN "pic/monback/pikachub.pic"
-RaichuPicFront:: INCBIN "pic/bmon/raichu.pic"
-RaichuPicBack:: INCBIN "pic/monback/raichub.pic"
-DratiniPicFront:: INCBIN "pic/bmon/dratini.pic"
-DratiniPicBack:: INCBIN "pic/monback/dratinib.pic"
-DragonairPicFront:: INCBIN "pic/bmon/dragonair.pic"
-DragonairPicBack:: INCBIN "pic/monback/dragonairb.pic"
-KabutoPicFront:: INCBIN "pic/bmon/kabuto.pic"
-KabutoPicBack:: INCBIN "pic/monback/kabutob.pic"
-KabutopsPicFront:: INCBIN "pic/bmon/kabutops.pic"
-KabutopsPicBack:: INCBIN "pic/monback/kabutopsb.pic"
-HorseaPicFront:: INCBIN "pic/bmon/horsea.pic"
-HorseaPicBack:: INCBIN "pic/monback/horseab.pic"
-SeadraPicFront:: INCBIN "pic/bmon/seadra.pic"
-SeadraPicBack:: INCBIN "pic/monback/seadrab.pic"
-SandshrewPicFront:: INCBIN "pic/bmon/sandshrew.pic"
-SandshrewPicBack:: INCBIN "pic/monback/sandshrewb.pic"
-SandslashPicFront:: INCBIN "pic/bmon/sandslash.pic"
-SandslashPicBack:: INCBIN "pic/monback/sandslashb.pic"
-OmanytePicFront:: INCBIN "pic/bmon/omanyte.pic"
-OmanytePicBack:: INCBIN "pic/monback/omanyteb.pic"
-OmastarPicFront:: INCBIN "pic/bmon/omastar.pic"
-OmastarPicBack:: INCBIN "pic/monback/omastarb.pic"
-JigglypuffPicFront:: INCBIN "pic/bmon/jigglypuff.pic"
-JigglypuffPicBack:: INCBIN "pic/monback/jigglypuffb.pic"
-WigglytuffPicFront:: INCBIN "pic/bmon/wigglytuff.pic"
-WigglytuffPicBack:: INCBIN "pic/monback/wigglytuffb.pic"
-EeveePicFront:: INCBIN "pic/bmon/eevee.pic"
-EeveePicBack:: INCBIN "pic/monback/eeveeb.pic"
-FlareonPicFront:: INCBIN "pic/bmon/flareon.pic"
-FlareonPicBack:: INCBIN "pic/monback/flareonb.pic"
-JolteonPicFront:: INCBIN "pic/bmon/jolteon.pic"
-JolteonPicBack:: INCBIN "pic/monback/jolteonb.pic"
-VaporeonPicFront:: INCBIN "pic/bmon/vaporeon.pic"
-VaporeonPicBack:: INCBIN "pic/monback/vaporeonb.pic"
-MachopPicFront:: INCBIN "pic/bmon/machop.pic"
-MachopPicBack:: INCBIN "pic/monback/machopb.pic"
-ZubatPicFront:: INCBIN "pic/bmon/zubat.pic"
-ZubatPicBack:: INCBIN "pic/monback/zubatb.pic"
-EkansPicFront:: INCBIN "pic/bmon/ekans.pic"
-EkansPicBack:: INCBIN "pic/monback/ekansb.pic"
-ParasPicFront:: INCBIN "pic/bmon/paras.pic"
-ParasPicBack:: INCBIN "pic/monback/parasb.pic"
-PoliwhirlPicFront:: INCBIN "pic/bmon/poliwhirl.pic"
-PoliwhirlPicBack:: INCBIN "pic/monback/poliwhirlb.pic"
-PoliwrathPicFront:: INCBIN "pic/bmon/poliwrath.pic"
-PoliwrathPicBack:: INCBIN "pic/monback/poliwrathb.pic"
-WeedlePicFront:: INCBIN "pic/bmon/weedle.pic"
-WeedlePicBack:: INCBIN "pic/monback/weedleb.pic"
-KakunaPicFront:: INCBIN "pic/bmon/kakuna.pic"
-KakunaPicBack:: INCBIN "pic/monback/kakunab.pic"
-BeedrillPicFront:: INCBIN "pic/bmon/beedrill.pic"
-BeedrillPicBack:: INCBIN "pic/monback/beedrillb.pic"
-
-FossilKabutopsPic:: INCBIN "pic/bmon/fossilkabutops.pic"
-
-
-SECTION "Battle (bank B)", ROMX, BANK[$B]
-
-INCLUDE "engine/battle/display_effectiveness.asm"
-
-TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp"
-BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp"
-CircleTile: INCBIN "gfx/circle_tile.2bpp"
-BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp"
-
-INCLUDE "engine/items/tmhm.asm"
-INCLUDE "engine/battle/scale_sprites.asm"
-INCLUDE "engine/battle/moveEffects/pay_day_effect.asm"
-INCLUDE "engine/game_corner_slots2.asm"
-
-
-SECTION "Pics 4", ROMX, BANK[PICS_4]
-
-DodrioPicFront:: INCBIN "pic/bmon/dodrio.pic"
-DodrioPicBack:: INCBIN "pic/monback/dodriob.pic"
-PrimeapePicFront:: INCBIN "pic/bmon/primeape.pic"
-PrimeapePicBack:: INCBIN "pic/monback/primeapeb.pic"
-DugtrioPicFront:: INCBIN "pic/bmon/dugtrio.pic"
-DugtrioPicBack:: INCBIN "pic/monback/dugtriob.pic"
-VenomothPicFront:: INCBIN "pic/bmon/venomoth.pic"
-VenomothPicBack:: INCBIN "pic/monback/venomothb.pic"
-DewgongPicFront:: INCBIN "pic/bmon/dewgong.pic"
-DewgongPicBack:: INCBIN "pic/monback/dewgongb.pic"
-CaterpiePicFront:: INCBIN "pic/bmon/caterpie.pic"
-CaterpiePicBack:: INCBIN "pic/monback/caterpieb.pic"
-MetapodPicFront:: INCBIN "pic/bmon/metapod.pic"
-MetapodPicBack:: INCBIN "pic/monback/metapodb.pic"
-ButterfreePicFront:: INCBIN "pic/bmon/butterfree.pic"
-ButterfreePicBack:: INCBIN "pic/monback/butterfreeb.pic"
-MachampPicFront:: INCBIN "pic/bmon/machamp.pic"
-MachampPicBack:: INCBIN "pic/monback/machampb.pic"
-GolduckPicFront:: INCBIN "pic/bmon/golduck.pic"
-GolduckPicBack:: INCBIN "pic/monback/golduckb.pic"
-HypnoPicFront:: INCBIN "pic/bmon/hypno.pic"
-HypnoPicBack:: INCBIN "pic/monback/hypnob.pic"
-GolbatPicFront:: INCBIN "pic/bmon/golbat.pic"
-GolbatPicBack:: INCBIN "pic/monback/golbatb.pic"
-MewtwoPicFront:: INCBIN "pic/bmon/mewtwo.pic"
-MewtwoPicBack:: INCBIN "pic/monback/mewtwob.pic"
-SnorlaxPicFront:: INCBIN "pic/bmon/snorlax.pic"
-SnorlaxPicBack:: INCBIN "pic/monback/snorlaxb.pic"
-MagikarpPicFront:: INCBIN "pic/bmon/magikarp.pic"
-MagikarpPicBack:: INCBIN "pic/monback/magikarpb.pic"
-MukPicFront:: INCBIN "pic/bmon/muk.pic"
-MukPicBack:: INCBIN "pic/monback/mukb.pic"
-KinglerPicFront:: INCBIN "pic/bmon/kingler.pic"
-KinglerPicBack:: INCBIN "pic/monback/kinglerb.pic"
-CloysterPicFront:: INCBIN "pic/bmon/cloyster.pic"
-CloysterPicBack:: INCBIN "pic/monback/cloysterb.pic"
-ElectrodePicFront:: INCBIN "pic/bmon/electrode.pic"
-ElectrodePicBack:: INCBIN "pic/monback/electrodeb.pic"
-ClefablePicFront:: INCBIN "pic/bmon/clefable.pic"
-ClefablePicBack:: INCBIN "pic/monback/clefableb.pic"
-WeezingPicFront:: INCBIN "pic/bmon/weezing.pic"
-WeezingPicBack:: INCBIN "pic/monback/weezingb.pic"
-PersianPicFront:: INCBIN "pic/bmon/persian.pic"
-PersianPicBack:: INCBIN "pic/monback/persianb.pic"
-MarowakPicFront:: INCBIN "pic/bmon/marowak.pic"
-MarowakPicBack:: INCBIN "pic/monback/marowakb.pic"
-HaunterPicFront:: INCBIN "pic/bmon/haunter.pic"
-HaunterPicBack:: INCBIN "pic/monback/haunterb.pic"
-AbraPicFront:: INCBIN "pic/bmon/abra.pic"
-AbraPicBack:: INCBIN "pic/monback/abrab.pic"
-AlakazamPicFront:: INCBIN "pic/bmon/alakazam.pic"
-AlakazamPicBack:: INCBIN "pic/monback/alakazamb.pic"
-PidgeottoPicFront:: INCBIN "pic/bmon/pidgeotto.pic"
-PidgeottoPicBack:: INCBIN "pic/monback/pidgeottob.pic"
-PidgeotPicFront:: INCBIN "pic/bmon/pidgeot.pic"
-PidgeotPicBack:: INCBIN "pic/monback/pidgeotb.pic"
-StarmiePicFront:: INCBIN "pic/bmon/starmie.pic"
-StarmiePicBack:: INCBIN "pic/monback/starmieb.pic"
-
-RedPicBack:: INCBIN "pic/trainer/redb.pic"
-OldManPic:: INCBIN "pic/trainer/oldman.pic"
-
-
-SECTION "Battle (bank C)", ROMX, BANK[$C]
-INCLUDE "engine/battle/moveEffects/mist_effect.asm"
-INCLUDE "engine/battle/moveEffects/one_hit_ko_effect.asm"
-
-
-SECTION "Pics 5", ROMX, BANK[PICS_5]
-
-BulbasaurPicFront:: INCBIN "pic/bmon/bulbasaur.pic"
-BulbasaurPicBack:: INCBIN "pic/monback/bulbasaurb.pic"
-VenusaurPicFront:: INCBIN "pic/bmon/venusaur.pic"
-VenusaurPicBack:: INCBIN "pic/monback/venusaurb.pic"
-TentacruelPicFront:: INCBIN "pic/bmon/tentacruel.pic"
-TentacruelPicBack:: INCBIN "pic/monback/tentacruelb.pic"
-GoldeenPicFront:: INCBIN "pic/bmon/goldeen.pic"
-GoldeenPicBack:: INCBIN "pic/monback/goldeenb.pic"
-SeakingPicFront:: INCBIN "pic/bmon/seaking.pic"
-SeakingPicBack:: INCBIN "pic/monback/seakingb.pic"
-PonytaPicFront:: INCBIN "pic/bmon/ponyta.pic"
-RapidashPicFront:: INCBIN "pic/bmon/rapidash.pic"
-PonytaPicBack:: INCBIN "pic/monback/ponytab.pic"
-RapidashPicBack:: INCBIN "pic/monback/rapidashb.pic"
-RattataPicFront:: INCBIN "pic/bmon/rattata.pic"
-RattataPicBack:: INCBIN "pic/monback/rattatab.pic"
-RaticatePicFront:: INCBIN "pic/bmon/raticate.pic"
-RaticatePicBack:: INCBIN "pic/monback/raticateb.pic"
-NidorinoPicFront:: INCBIN "pic/bmon/nidorino.pic"
-NidorinoPicBack:: INCBIN "pic/monback/nidorinob.pic"
-NidorinaPicFront:: INCBIN "pic/bmon/nidorina.pic"
-NidorinaPicBack:: INCBIN "pic/monback/nidorinab.pic"
-GeodudePicFront:: INCBIN "pic/bmon/geodude.pic"
-GeodudePicBack:: INCBIN "pic/monback/geodudeb.pic"
-PorygonPicFront:: INCBIN "pic/bmon/porygon.pic"
-PorygonPicBack:: INCBIN "pic/monback/porygonb.pic"
-AerodactylPicFront:: INCBIN "pic/bmon/aerodactyl.pic"
-AerodactylPicBack:: INCBIN "pic/monback/aerodactylb.pic"
-MagnemitePicFront:: INCBIN "pic/bmon/magnemite.pic"
-MagnemitePicBack:: INCBIN "pic/monback/magnemiteb.pic"
-CharmanderPicFront:: INCBIN "pic/bmon/charmander.pic"
-CharmanderPicBack:: INCBIN "pic/monback/charmanderb.pic"
-SquirtlePicFront:: INCBIN "pic/bmon/squirtle.pic"
-SquirtlePicBack:: INCBIN "pic/monback/squirtleb.pic"
-CharmeleonPicFront:: INCBIN "pic/bmon/charmeleon.pic"
-CharmeleonPicBack:: INCBIN "pic/monback/charmeleonb.pic"
-WartortlePicFront:: INCBIN "pic/bmon/wartortle.pic"
-WartortlePicBack:: INCBIN "pic/monback/wartortleb.pic"
-CharizardPicFront:: INCBIN "pic/bmon/charizard.pic"
-CharizardPicBack:: INCBIN "pic/monback/charizardb.pic"
-FossilAerodactylPic:: INCBIN "pic/bmon/fossilaerodactyl.pic"
-GhostPic:: INCBIN "pic/other/ghost.pic"
-OddishPicFront:: INCBIN "pic/bmon/oddish.pic"
-OddishPicBack:: INCBIN "pic/monback/oddishb.pic"
-GloomPicFront:: INCBIN "pic/bmon/gloom.pic"
-GloomPicBack:: INCBIN "pic/monback/gloomb.pic"
-VileplumePicFront:: INCBIN "pic/bmon/vileplume.pic"
-VileplumePicBack:: INCBIN "pic/monback/vileplumeb.pic"
-BellsproutPicFront:: INCBIN "pic/bmon/bellsprout.pic"
-BellsproutPicBack:: INCBIN "pic/monback/bellsproutb.pic"
-WeepinbellPicFront:: INCBIN "pic/bmon/weepinbell.pic"
-WeepinbellPicBack:: INCBIN "pic/monback/weepinbellb.pic"
-VictreebelPicFront:: INCBIN "pic/bmon/victreebel.pic"
-VictreebelPicBack:: INCBIN "pic/monback/victreebelb.pic"
-
-
-SECTION "Battle (bank D)", ROMX, BANK[$D]
-
-INCLUDE "engine/titlescreen2.asm"
-INCLUDE "engine/battle/link_battle_versus_text.asm"
-INCLUDE "engine/slot_machine.asm"
-INCLUDE "engine/overworld/pewter_guys.asm"
-INCLUDE "engine/multiply_divide.asm"
-INCLUDE "engine/game_corner_slots.asm"
-
-
-SECTION "bankE",ROMX,BANK[$E]
-
-INCLUDE "data/moves.asm"
-BaseStats: INCLUDE "data/base_stats.asm"
-INCLUDE "data/cries.asm"
-INCLUDE "engine/battle/unused_stats_functions.asm"
-INCLUDE "engine/battle/scroll_draw_trainer_pic.asm"
-INCLUDE "engine/battle/trainer_ai.asm"
-INCLUDE "engine/battle/draw_hud_pokeball_gfx.asm"
-
-TradingAnimationGraphics:
- INCBIN "gfx/game_boy.norepeat.2bpp"
- INCBIN "gfx/link_cable.2bpp"
-
-TradingAnimationGraphics2:
-; Pokeball traveling through the link cable.
- INCBIN "gfx/trade2.2bpp"
-
-INCLUDE "engine/evos_moves.asm"
-INCLUDE "engine/battle/moveEffects/heal_effect.asm"
-INCLUDE "engine/battle/moveEffects/transform_effect.asm"
-INCLUDE "engine/battle/moveEffects/reflect_light_screen_effect.asm"
-
-
-SECTION "bankF",ROMX,BANK[$F]
-
-INCLUDE "engine/battle/core.asm"
-
-
-SECTION "bank10",ROMX,BANK[$10]
-
-INCLUDE "engine/menu/pokedex.asm"
-INCLUDE "engine/trade.asm"
-INCLUDE "engine/intro.asm"
-INCLUDE "engine/trade2.asm"
-
-
-SECTION "bank11",ROMX,BANK[$11]
-
-INCLUDE "data/mapHeaders/lavendertown.asm"
-INCLUDE "data/mapObjects/lavendertown.asm"
-LavenderTownBlocks: INCBIN "maps/lavendertown.blk"
-
-ViridianPokecenterBlocks: INCBIN "maps/viridianpokecenter.blk"
-
-SafariZoneRestHouse1Blocks:
-SafariZoneRestHouse2Blocks:
-SafariZoneRestHouse3Blocks:
-SafariZoneRestHouse4Blocks: INCBIN "maps/safarizoneresthouse1.blk"
-
-INCLUDE "scripts/lavendertown.asm"
-
-INCLUDE "engine/pokedex_rating.asm"
-
-INCLUDE "data/mapHeaders/viridianpokecenter.asm"
-INCLUDE "scripts/viridianpokecenter.asm"
-INCLUDE "data/mapObjects/viridianpokecenter.asm"
-
-INCLUDE "data/mapHeaders/mansion1.asm"
-INCLUDE "scripts/mansion1.asm"
-INCLUDE "data/mapObjects/mansion1.asm"
-Mansion1Blocks: INCBIN "maps/mansion1.blk"
-
-INCLUDE "data/mapHeaders/rocktunnel1.asm"
-INCLUDE "scripts/rocktunnel1.asm"
-INCLUDE "data/mapObjects/rocktunnel1.asm"
-RockTunnel1Blocks: INCBIN "maps/rocktunnel1.blk"
-
-INCLUDE "data/mapHeaders/seafoamislands1.asm"
-INCLUDE "scripts/seafoamislands1.asm"
-INCLUDE "data/mapObjects/seafoamislands1.asm"
-SeafoamIslands1Blocks: INCBIN "maps/seafoamislands1.blk"
-
-INCLUDE "data/mapHeaders/ssanne3.asm"
-INCLUDE "scripts/ssanne3.asm"
-INCLUDE "data/mapObjects/ssanne3.asm"
-SSAnne3Blocks: INCBIN "maps/ssanne3.blk"
-
-INCLUDE "data/mapHeaders/victoryroad3.asm"
-INCLUDE "scripts/victoryroad3.asm"
-INCLUDE "data/mapObjects/victoryroad3.asm"
-VictoryRoad3Blocks: INCBIN "maps/victoryroad3.blk"
-
-INCLUDE "data/mapHeaders/rockethideout1.asm"
-INCLUDE "scripts/rockethideout1.asm"
-INCLUDE "data/mapObjects/rockethideout1.asm"
-RocketHideout1Blocks: INCBIN "maps/rockethideout1.blk"
-
-INCLUDE "data/mapHeaders/rockethideout2.asm"
-INCLUDE "scripts/rockethideout2.asm"
-INCLUDE "data/mapObjects/rockethideout2.asm"
-RocketHideout2Blocks: INCBIN "maps/rockethideout2.blk"
-
-INCLUDE "data/mapHeaders/rockethideout3.asm"
-INCLUDE "scripts/rockethideout3.asm"
-INCLUDE "data/mapObjects/rockethideout3.asm"
-RocketHideout3Blocks: INCBIN "maps/rockethideout3.blk"
-
-INCLUDE "data/mapHeaders/rockethideout4.asm"
-INCLUDE "scripts/rockethideout4.asm"
-INCLUDE "data/mapObjects/rockethideout4.asm"
-RocketHideout4Blocks: INCBIN "maps/rockethideout4.blk"
-
-INCLUDE "data/mapHeaders/rockethideoutelevator.asm"
-INCLUDE "scripts/rockethideoutelevator.asm"
-INCLUDE "data/mapObjects/rockethideoutelevator.asm"
-RocketHideoutElevatorBlocks: INCBIN "maps/rockethideoutelevator.blk"
-
-INCLUDE "data/mapHeaders/silphcoelevator.asm"
-INCLUDE "scripts/silphcoelevator.asm"
-INCLUDE "data/mapObjects/silphcoelevator.asm"
-SilphCoElevatorBlocks: INCBIN "maps/silphcoelevator.blk"
-
-INCLUDE "data/mapHeaders/safarizoneeast.asm"
-INCLUDE "scripts/safarizoneeast.asm"
-INCLUDE "data/mapObjects/safarizoneeast.asm"
-SafariZoneEastBlocks: INCBIN "maps/safarizoneeast.blk"
-
-INCLUDE "data/mapHeaders/safarizonenorth.asm"
-INCLUDE "scripts/safarizonenorth.asm"
-INCLUDE "data/mapObjects/safarizonenorth.asm"
-SafariZoneNorthBlocks: INCBIN "maps/safarizonenorth.blk"
-
-INCLUDE "data/mapHeaders/safarizonecenter.asm"
-INCLUDE "scripts/safarizonecenter.asm"
-INCLUDE "data/mapObjects/safarizonecenter.asm"
-SafariZoneCenterBlocks: INCBIN "maps/safarizonecenter.blk"
-
-INCLUDE "data/mapHeaders/safarizoneresthouse1.asm"
-INCLUDE "scripts/safarizoneresthouse1.asm"
-INCLUDE "data/mapObjects/safarizoneresthouse1.asm"
-
-INCLUDE "data/mapHeaders/safarizoneresthouse2.asm"
-INCLUDE "scripts/safarizoneresthouse2.asm"
-INCLUDE "data/mapObjects/safarizoneresthouse2.asm"
-
-INCLUDE "data/mapHeaders/safarizoneresthouse3.asm"
-INCLUDE "scripts/safarizoneresthouse3.asm"
-INCLUDE "data/mapObjects/safarizoneresthouse3.asm"
-
-INCLUDE "data/mapHeaders/safarizoneresthouse4.asm"
-INCLUDE "scripts/safarizoneresthouse4.asm"
-INCLUDE "data/mapObjects/safarizoneresthouse4.asm"
-
-INCLUDE "data/mapHeaders/unknowndungeon2.asm"
-INCLUDE "scripts/unknowndungeon2.asm"
-INCLUDE "data/mapObjects/unknowndungeon2.asm"
-UnknownDungeon2Blocks: INCBIN "maps/unknowndungeon2.blk"
-
-INCLUDE "data/mapHeaders/unknowndungeon3.asm"
-INCLUDE "scripts/unknowndungeon3.asm"
-INCLUDE "data/mapObjects/unknowndungeon3.asm"
-UnknownDungeon3Blocks: INCBIN "maps/unknowndungeon3.blk"
-
-INCLUDE "data/mapHeaders/rocktunnel2.asm"
-INCLUDE "scripts/rocktunnel2.asm"
-INCLUDE "data/mapObjects/rocktunnel2.asm"
-RockTunnel2Blocks: INCBIN "maps/rocktunnel2.blk"
-
-INCLUDE "data/mapHeaders/seafoamislands2.asm"
-INCLUDE "scripts/seafoamislands2.asm"
-INCLUDE "data/mapObjects/seafoamislands2.asm"
-SeafoamIslands2Blocks: INCBIN "maps/seafoamislands2.blk"
-
-INCLUDE "data/mapHeaders/seafoamislands3.asm"
-INCLUDE "scripts/seafoamislands3.asm"
-INCLUDE "data/mapObjects/seafoamislands3.asm"
-SeafoamIslands3Blocks: INCBIN "maps/seafoamislands3.blk"
-
-INCLUDE "data/mapHeaders/seafoamislands4.asm"
-INCLUDE "scripts/seafoamislands4.asm"
-INCLUDE "data/mapObjects/seafoamislands4.asm"
-SeafoamIslands4Blocks: INCBIN "maps/seafoamislands4.blk"
-
-INCLUDE "data/mapHeaders/seafoamislands5.asm"
-INCLUDE "scripts/seafoamislands5.asm"
-INCLUDE "data/mapObjects/seafoamislands5.asm"
-SeafoamIslands5Blocks: INCBIN "maps/seafoamislands5.blk"
-
-INCLUDE "engine/overworld/hidden_objects.asm"
-
-
-SECTION "bank12",ROMX,BANK[$12]
-
-INCLUDE "data/mapHeaders/route7.asm"
-INCLUDE "data/mapObjects/route7.asm"
-Route7Blocks: INCBIN "maps/route7.blk"
-
-CeladonPokecenterBlocks:
-RockTunnelPokecenterBlocks:
-MtMoonPokecenterBlocks: INCBIN "maps/mtmoonpokecenter.blk"
-
-Route18GateBlocks:
-Route15GateBlocks:
-Route11GateBlocks: INCBIN "maps/route11gate.blk"
-
-Route18GateUpstairsBlocks:
-Route16GateUpstairsBlocks:
-Route12GateUpstairsBlocks:
-Route15GateUpstairsBlocks:
-Route11GateUpstairsBlocks: INCBIN "maps/route11gateupstairs.blk"
-
-INCLUDE "engine/predefs12.asm"
-
-INCLUDE "scripts/route7.asm"
-
-INCLUDE "data/mapHeaders/redshouse1f.asm"
-INCLUDE "scripts/redshouse1f.asm"
-INCLUDE "data/mapObjects/redshouse1f.asm"
-RedsHouse1FBlocks: INCBIN "maps/redshouse1f.blk"
-
-INCLUDE "data/mapHeaders/celadonmart3.asm"
-INCLUDE "scripts/celadonmart3.asm"
-INCLUDE "data/mapObjects/celadonmart3.asm"
-CeladonMart3Blocks: INCBIN "maps/celadonmart3.blk"
-
-INCLUDE "data/mapHeaders/celadonmart4.asm"
-INCLUDE "scripts/celadonmart4.asm"
-INCLUDE "data/mapObjects/celadonmart4.asm"
-CeladonMart4Blocks: INCBIN "maps/celadonmart4.blk"
-
-INCLUDE "data/mapHeaders/celadonmartroof.asm"
-INCLUDE "scripts/celadonmartroof.asm"
-INCLUDE "data/mapObjects/celadonmartroof.asm"
-CeladonMartRoofBlocks: INCBIN "maps/celadonmartroof.blk"
-
-INCLUDE "data/mapHeaders/celadonmartelevator.asm"
-INCLUDE "scripts/celadonmartelevator.asm"
-INCLUDE "data/mapObjects/celadonmartelevator.asm"
-CeladonMartElevatorBlocks: INCBIN "maps/celadonmartelevator.blk"
-
-INCLUDE "data/mapHeaders/celadonmansion1.asm"
-INCLUDE "scripts/celadonmansion1.asm"
-INCLUDE "data/mapObjects/celadonmansion1.asm"
-CeladonMansion1Blocks: INCBIN "maps/celadonmansion1.blk"
-
-INCLUDE "data/mapHeaders/celadonmansion2.asm"
-INCLUDE "scripts/celadonmansion2.asm"
-INCLUDE "data/mapObjects/celadonmansion2.asm"
-CeladonMansion2Blocks: INCBIN "maps/celadonmansion2.blk"
-
-INCLUDE "data/mapHeaders/celadonmansion3.asm"
-INCLUDE "scripts/celadonmansion3.asm"
-INCLUDE "data/mapObjects/celadonmansion3.asm"
-CeladonMansion3Blocks: INCBIN "maps/celadonmansion3.blk"
-
-INCLUDE "data/mapHeaders/celadonmansion4.asm"
-INCLUDE "scripts/celadonmansion4.asm"
-INCLUDE "data/mapObjects/celadonmansion4.asm"
-CeladonMansion4Blocks: INCBIN "maps/celadonmansion4.blk"
-
-INCLUDE "data/mapHeaders/celadonpokecenter.asm"
-INCLUDE "scripts/celadonpokecenter.asm"
-INCLUDE "data/mapObjects/celadonpokecenter.asm"
-
-INCLUDE "data/mapHeaders/celadongym.asm"
-INCLUDE "scripts/celadongym.asm"
-INCLUDE "data/mapObjects/celadongym.asm"
-CeladonGymBlocks: INCBIN "maps/celadongym.blk"
-
-INCLUDE "data/mapHeaders/celadongamecorner.asm"
-INCLUDE "scripts/celadongamecorner.asm"
-INCLUDE "data/mapObjects/celadongamecorner.asm"
-CeladonGameCornerBlocks: INCBIN "maps/celadongamecorner.blk"
-
-INCLUDE "data/mapHeaders/celadonmart5.asm"
-INCLUDE "scripts/celadonmart5.asm"
-INCLUDE "data/mapObjects/celadonmart5.asm"
-CeladonMart5Blocks: INCBIN "maps/celadonmart5.blk"
-
-INCLUDE "data/mapHeaders/celadonprizeroom.asm"
-INCLUDE "scripts/celadonprizeroom.asm"
-INCLUDE "data/mapObjects/celadonprizeroom.asm"
-CeladonPrizeRoomBlocks: INCBIN "maps/celadonprizeroom.blk"
-
-INCLUDE "data/mapHeaders/celadondiner.asm"
-INCLUDE "scripts/celadondiner.asm"
-INCLUDE "data/mapObjects/celadondiner.asm"
-CeladonDinerBlocks: INCBIN "maps/celadondiner.blk"
-
-INCLUDE "data/mapHeaders/celadonhouse.asm"
-INCLUDE "scripts/celadonhouse.asm"
-INCLUDE "data/mapObjects/celadonhouse.asm"
-CeladonHouseBlocks: INCBIN "maps/celadonhouse.blk"
-
-INCLUDE "data/mapHeaders/celadonhotel.asm"
-INCLUDE "scripts/celadonhotel.asm"
-INCLUDE "data/mapObjects/celadonhotel.asm"
-CeladonHotelBlocks: INCBIN "maps/celadonhotel.blk"
-
-INCLUDE "data/mapHeaders/mtmoonpokecenter.asm"
-INCLUDE "scripts/mtmoonpokecenter.asm"
-INCLUDE "data/mapObjects/mtmoonpokecenter.asm"
-
-INCLUDE "data/mapHeaders/rocktunnelpokecenter.asm"
-INCLUDE "scripts/rocktunnelpokecenter.asm"
-INCLUDE "data/mapObjects/rocktunnelpokecenter.asm"
-
-INCLUDE "data/mapHeaders/route11gate.asm"
-INCLUDE "scripts/route11gate.asm"
-INCLUDE "data/mapObjects/route11gate.asm"
-
-INCLUDE "data/mapHeaders/route11gateupstairs.asm"
-INCLUDE "scripts/route11gateupstairs.asm"
-INCLUDE "data/mapObjects/route11gateupstairs.asm"
-
-INCLUDE "data/mapHeaders/route12gate.asm"
-INCLUDE "scripts/route12gate.asm"
-INCLUDE "data/mapObjects/route12gate.asm"
-Route12GateBlocks: INCBIN "maps/route12gate.blk"
-
-INCLUDE "data/mapHeaders/route12gateupstairs.asm"
-INCLUDE "scripts/route12gateupstairs.asm"
-INCLUDE "data/mapObjects/route12gateupstairs.asm"
-
-INCLUDE "data/mapHeaders/route15gate.asm"
-INCLUDE "scripts/route15gate.asm"
-INCLUDE "data/mapObjects/route15gate.asm"
-
-INCLUDE "data/mapHeaders/route15gateupstairs.asm"
-INCLUDE "scripts/route15gateupstairs.asm"
-INCLUDE "data/mapObjects/route15gateupstairs.asm"
-
-INCLUDE "data/mapHeaders/route16gate.asm"
-INCLUDE "scripts/route16gate.asm"
-INCLUDE "data/mapObjects/route16gate.asm"
-Route16GateBlocks: INCBIN "maps/route16gate.blk"
-
-INCLUDE "data/mapHeaders/route16gateupstairs.asm"
-INCLUDE "scripts/route16gateupstairs.asm"
-INCLUDE "data/mapObjects/route16gateupstairs.asm"
-
-INCLUDE "data/mapHeaders/route18gate.asm"
-INCLUDE "scripts/route18gate.asm"
-INCLUDE "data/mapObjects/route18gate.asm"
-
-INCLUDE "data/mapHeaders/route18gateupstairs.asm"
-INCLUDE "scripts/route18gateupstairs.asm"
-INCLUDE "data/mapObjects/route18gateupstairs.asm"
-
-INCLUDE "data/mapHeaders/mtmoon1.asm"
-INCLUDE "scripts/mtmoon1.asm"
-INCLUDE "data/mapObjects/mtmoon1.asm"
-MtMoon1Blocks: INCBIN "maps/mtmoon1.blk"
-
-INCLUDE "data/mapHeaders/mtmoon3.asm"
-INCLUDE "scripts/mtmoon3.asm"
-INCLUDE "data/mapObjects/mtmoon3.asm"
-MtMoon3Blocks: INCBIN "maps/mtmoon3.blk"
-
-INCLUDE "data/mapHeaders/safarizonewest.asm"
-INCLUDE "scripts/safarizonewest.asm"
-INCLUDE "data/mapObjects/safarizonewest.asm"
-SafariZoneWestBlocks: INCBIN "maps/safarizonewest.blk"
-
-INCLUDE "data/mapHeaders/safarizonesecrethouse.asm"
-INCLUDE "scripts/safarizonesecrethouse.asm"
-INCLUDE "data/mapObjects/safarizonesecrethouse.asm"
-SafariZoneSecretHouseBlocks: INCBIN "maps/safarizonesecrethouse.blk"
-
-
-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/trainer/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/trainer/brock.pic"
-MistyPic:: INCBIN "pic/trainer/misty.pic"
-LtSurgePic:: INCBIN "pic/trainer/lt.surge.pic"
-ErikaPic:: INCBIN "pic/trainer/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/trainer/rival2.pic"
-Rival3Pic:: INCBIN "pic/trainer/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"
-
-INCLUDE "data/mapHeaders/battlecenterm.asm"
-INCLUDE "scripts/battlecenterm.asm"
-INCLUDE "data/mapObjects/battlecenterm.asm"
-BattleCenterMBlocks: INCBIN "maps/battlecenterm.blk"
-
-INCLUDE "data/mapHeaders/tradecenterm.asm"
-INCLUDE "scripts/tradecenterm.asm"
-INCLUDE "data/mapObjects/tradecenterm.asm"
-TradeCenterMBlocks: INCBIN "maps/tradecenterm.blk"
-
-INCLUDE "engine/give_pokemon.asm"
-
-INCLUDE "engine/predefs.asm"
-
-
-SECTION "bank14",ROMX,BANK[$14]
-
-INCLUDE "data/mapHeaders/route22.asm"
-INCLUDE "data/mapObjects/route22.asm"
-Route22Blocks: INCBIN "maps/route22.blk"
-
-INCLUDE "data/mapHeaders/route20.asm"
-INCLUDE "data/mapObjects/route20.asm"
-Route20Blocks: INCBIN "maps/route20.blk"
-
-INCLUDE "data/mapHeaders/route23.asm"
-INCLUDE "data/mapObjects/route23.asm"
-Route23Blocks: INCBIN "maps/route23.blk"
-
-INCLUDE "data/mapHeaders/route24.asm"
-INCLUDE "data/mapObjects/route24.asm"
-Route24Blocks: INCBIN "maps/route24.blk"
-
-INCLUDE "data/mapHeaders/route25.asm"
-INCLUDE "data/mapObjects/route25.asm"
-Route25Blocks: INCBIN "maps/route25.blk"
-
-INCLUDE "data/mapHeaders/indigoplateau.asm"
-INCLUDE "scripts/indigoplateau.asm"
-INCLUDE "data/mapObjects/indigoplateau.asm"
-IndigoPlateauBlocks: INCBIN "maps/indigoplateau.blk"
-
-INCLUDE "data/mapHeaders/saffroncity.asm"
-INCLUDE "data/mapObjects/saffroncity.asm"
-SaffronCityBlocks: INCBIN "maps/saffroncity.blk"
-INCLUDE "scripts/saffroncity.asm"
-
-INCLUDE "scripts/route20.asm"
-INCLUDE "scripts/route22.asm"
-INCLUDE "scripts/route23.asm"
-INCLUDE "scripts/route24.asm"
-INCLUDE "scripts/route25.asm"
-
-INCLUDE "data/mapHeaders/victoryroad2.asm"
-INCLUDE "scripts/victoryroad2.asm"
-INCLUDE "data/mapObjects/victoryroad2.asm"
-VictoryRoad2Blocks: INCBIN "maps/victoryroad2.blk"
-
-INCLUDE "data/mapHeaders/mtmoon2.asm"
-INCLUDE "scripts/mtmoon2.asm"
-INCLUDE "data/mapObjects/mtmoon2.asm"
-MtMoon2Blocks: INCBIN "maps/mtmoon2.blk"
-
-INCLUDE "data/mapHeaders/silphco7.asm"
-INCLUDE "scripts/silphco7.asm"
-INCLUDE "data/mapObjects/silphco7.asm"
-SilphCo7Blocks: INCBIN "maps/silphco7.blk"
-
-INCLUDE "data/mapHeaders/mansion2.asm"
-INCLUDE "scripts/mansion2.asm"
-INCLUDE "data/mapObjects/mansion2.asm"
-Mansion2Blocks: INCBIN "maps/mansion2.blk"
-
-INCLUDE "data/mapHeaders/mansion3.asm"
-INCLUDE "scripts/mansion3.asm"
-INCLUDE "data/mapObjects/mansion3.asm"
-Mansion3Blocks: INCBIN "maps/mansion3.blk"
-
-INCLUDE "data/mapHeaders/mansion4.asm"
-INCLUDE "scripts/mansion4.asm"
-INCLUDE "data/mapObjects/mansion4.asm"
-Mansion4Blocks: INCBIN "maps/mansion4.blk"
-
-INCLUDE "engine/battle/init_battle_variables.asm"
-INCLUDE "engine/battle/moveEffects/paralyze_effect.asm"
-
-INCLUDE "engine/overworld/card_key.asm"
-
-INCLUDE "engine/menu/prize_menu.asm"
-
-INCLUDE "engine/hidden_object_functions14.asm"
-
-
-SECTION "bank15",ROMX,BANK[$15]
-
-INCLUDE "data/mapHeaders/route2.asm"
-INCLUDE "data/mapObjects/route2.asm"
-Route2Blocks: INCBIN "maps/route2.blk"
-
-INCLUDE "data/mapHeaders/route3.asm"
-INCLUDE "data/mapObjects/route3.asm"
-Route3Blocks: INCBIN "maps/route3.blk"
-
-INCLUDE "data/mapHeaders/route4.asm"
-INCLUDE "data/mapObjects/route4.asm"
-Route4Blocks: INCBIN "maps/route4.blk"
-
-INCLUDE "data/mapHeaders/route5.asm"
-INCLUDE "data/mapObjects/route5.asm"
-Route5Blocks: INCBIN "maps/route5.blk"
-
-INCLUDE "data/mapHeaders/route9.asm"
-INCLUDE "data/mapObjects/route9.asm"
-Route9Blocks: INCBIN "maps/route9.blk"
-
-INCLUDE "data/mapHeaders/route13.asm"
-INCLUDE "data/mapObjects/route13.asm"
-Route13Blocks: INCBIN "maps/route13.blk"
-
-INCLUDE "data/mapHeaders/route14.asm"
-INCLUDE "data/mapObjects/route14.asm"
-Route14Blocks: INCBIN "maps/route14.blk"
-
-INCLUDE "data/mapHeaders/route17.asm"
-INCLUDE "data/mapObjects/route17.asm"
-Route17Blocks: INCBIN "maps/route17.blk"
-
-INCLUDE "data/mapHeaders/route19.asm"
-INCLUDE "data/mapObjects/route19.asm"
-IF DEF(_OPTION_BEACH_HOUSE)
-Route19Blocks: INCBIN "maps/route19-yellow.blk"
-ELSE
-Route19Blocks: INCBIN "maps/route19.blk"
-ENDC
-
-INCLUDE "data/mapHeaders/route21.asm"
-INCLUDE "data/mapObjects/route21.asm"
-Route21Blocks: INCBIN "maps/route21.blk"
-
-VermilionHouse2Blocks:
-Route12HouseBlocks:
-DayCareMBlocks: INCBIN "maps/daycarem.blk"
-
-FuchsiaHouse3Blocks: INCBIN "maps/fuchsiahouse3.blk"
-
-INCLUDE "engine/battle/experience.asm"
-
-INCLUDE "scripts/route2.asm"
-INCLUDE "scripts/route3.asm"
-INCLUDE "scripts/route4.asm"
-INCLUDE "scripts/route5.asm"
-INCLUDE "scripts/route9.asm"
-INCLUDE "scripts/route13.asm"
-INCLUDE "scripts/route14.asm"
-INCLUDE "scripts/route17.asm"
-INCLUDE "scripts/route19.asm"
-INCLUDE "scripts/route21.asm"
-
-INCLUDE "data/mapHeaders/vermilionhouse2.asm"
-INCLUDE "scripts/vermilionhouse2.asm"
-INCLUDE "data/mapObjects/vermilionhouse2.asm"
-
-INCLUDE "data/mapHeaders/celadonmart2.asm"
-INCLUDE "scripts/celadonmart2.asm"
-INCLUDE "data/mapObjects/celadonmart2.asm"
-CeladonMart2Blocks: INCBIN "maps/celadonmart2.blk"
-
-INCLUDE "data/mapHeaders/fuchsiahouse3.asm"
-INCLUDE "scripts/fuchsiahouse3.asm"
-INCLUDE "data/mapObjects/fuchsiahouse3.asm"
-
-INCLUDE "data/mapHeaders/daycarem.asm"
-INCLUDE "scripts/daycarem.asm"
-INCLUDE "data/mapObjects/daycarem.asm"
-
-INCLUDE "data/mapHeaders/route12house.asm"
-INCLUDE "scripts/route12house.asm"
-INCLUDE "data/mapObjects/route12house.asm"
-
-INCLUDE "data/mapHeaders/silphco8.asm"
-INCLUDE "scripts/silphco8.asm"
-INCLUDE "data/mapObjects/silphco8.asm"
-SilphCo8Blocks: INCBIN "maps/silphco8.blk"
-
-INCLUDE "engine/menu/diploma.asm"
-
-INCLUDE "engine/overworld/trainers.asm"
-
-
-SECTION "bank16",ROMX,BANK[$16]
-
-INCLUDE "data/mapHeaders/route6.asm"
-INCLUDE "data/mapObjects/route6.asm"
-Route6Blocks: INCBIN "maps/route6.blk"
-
-INCLUDE "data/mapHeaders/route8.asm"
-INCLUDE "data/mapObjects/route8.asm"
-Route8Blocks: INCBIN "maps/route8.blk"
-
-INCLUDE "data/mapHeaders/route10.asm"
-INCLUDE "data/mapObjects/route10.asm"
-Route10Blocks: INCBIN "maps/route10.blk"
-
-INCLUDE "data/mapHeaders/route11.asm"
-INCLUDE "data/mapObjects/route11.asm"
-Route11Blocks: INCBIN "maps/route11.blk"
-
-INCLUDE "data/mapHeaders/route12.asm"
-INCLUDE "data/mapObjects/route12.asm"
-Route12Blocks: INCBIN "maps/route12.blk"
-
-INCLUDE "data/mapHeaders/route15.asm"
-INCLUDE "data/mapObjects/route15.asm"
-Route15Blocks: INCBIN "maps/route15.blk"
-
-INCLUDE "data/mapHeaders/route16.asm"
-INCLUDE "data/mapObjects/route16.asm"
-Route16Blocks: INCBIN "maps/route16.blk"
-
-INCLUDE "data/mapHeaders/route18.asm"
-INCLUDE "data/mapObjects/route18.asm"
-Route18Blocks: INCBIN "maps/route18.blk"
-
- INCBIN "maps/unusedblocks58d7d.blk"
-
-INCLUDE "engine/battle/common_text.asm"
-
-INCLUDE "engine/experience.asm"
-
-INCLUDE "engine/overworld/oaks_aide.asm"
-
-INCLUDE "scripts/route6.asm"
-INCLUDE "scripts/route8.asm"
-INCLUDE "scripts/route10.asm"
-INCLUDE "scripts/route11.asm"
-INCLUDE "scripts/route12.asm"
-INCLUDE "scripts/route15.asm"
-INCLUDE "scripts/route16.asm"
-INCLUDE "scripts/route18.asm"
-
-INCLUDE "data/mapHeaders/fanclub.asm"
-INCLUDE "scripts/fanclub.asm"
-INCLUDE "data/mapObjects/fanclub.asm"
-FanClubBlocks:
- INCBIN "maps/fanclub.blk"
-
-INCLUDE "data/mapHeaders/silphco2.asm"
-INCLUDE "scripts/silphco2.asm"
-INCLUDE "data/mapObjects/silphco2.asm"
-SilphCo2Blocks:
- INCBIN "maps/silphco2.blk"
-
-INCLUDE "data/mapHeaders/silphco3.asm"
-INCLUDE "scripts/silphco3.asm"
-INCLUDE "data/mapObjects/silphco3.asm"
-SilphCo3Blocks:
- INCBIN "maps/silphco3.blk"
-
-INCLUDE "data/mapHeaders/silphco10.asm"
-INCLUDE "scripts/silphco10.asm"
-INCLUDE "data/mapObjects/silphco10.asm"
-SilphCo10Blocks:
- INCBIN "maps/silphco10.blk"
-
-INCLUDE "data/mapHeaders/lance.asm"
-INCLUDE "scripts/lance.asm"
-INCLUDE "data/mapObjects/lance.asm"
-LanceBlocks:
- INCBIN "maps/lance.blk"
-
-INCLUDE "data/mapHeaders/halloffameroom.asm"
-INCLUDE "scripts/halloffameroom.asm"
-INCLUDE "data/mapObjects/halloffameroom.asm"
-HallofFameRoomBlocks:
- INCBIN "maps/halloffameroom.blk"
-
-INCLUDE "engine/overworld/saffron_guards.asm"
-
-
-SECTION "bank17",ROMX,BANK[$17]
-
-SaffronMartBlocks:
-LavenderMartBlocks:
-CeruleanMartBlocks:
-VermilionMartBlocks: INCBIN "maps/vermilionmart.blk"
-
-CopycatsHouse2FBlocks:
-RedsHouse2FBlocks: INCBIN "maps/redshouse2f.blk"
-
-Museum1FBlocks: INCBIN "maps/museum1f.blk"
-
-Museum2FBlocks: INCBIN "maps/museum2f.blk"
-
-SaffronPokecenterBlocks:
-VermilionPokecenterBlocks:
-LavenderPokecenterBlocks:
-PewterPokecenterBlocks: INCBIN "maps/pewterpokecenter.blk"
-
-UndergroundPathEntranceRoute7Blocks:
-UndergroundPathEntranceRoute7CopyBlocks:
-UndergroundPathEntranceRoute6Blocks:
-UndergroundPathEntranceRoute5Blocks: INCBIN "maps/undergroundpathentranceroute5.blk"
-
-Route2GateBlocks:
-ViridianForestEntranceBlocks:
-ViridianForestExitBlocks: INCBIN "maps/viridianforestexit.blk"
-
-INCLUDE "data/mapHeaders/redshouse2f.asm"
-INCLUDE "scripts/redshouse2f.asm"
-INCLUDE "data/mapObjects/redshouse2f.asm"
-
-INCLUDE "engine/predefs17.asm"
-
-INCLUDE "data/mapHeaders/museum1f.asm"
-INCLUDE "scripts/museum1f.asm"
-INCLUDE "data/mapObjects/museum1f.asm"
-
-INCLUDE "data/mapHeaders/museum2f.asm"
-INCLUDE "scripts/museum2f.asm"
-INCLUDE "data/mapObjects/museum2f.asm"
-
-INCLUDE "data/mapHeaders/pewtergym.asm"
-INCLUDE "scripts/pewtergym.asm"
-INCLUDE "data/mapObjects/pewtergym.asm"
-PewterGymBlocks: INCBIN "maps/pewtergym.blk"
-
-INCLUDE "data/mapHeaders/pewterpokecenter.asm"
-INCLUDE "scripts/pewterpokecenter.asm"
-INCLUDE "data/mapObjects/pewterpokecenter.asm"
-
-INCLUDE "data/mapHeaders/ceruleanpokecenter.asm"
-INCLUDE "scripts/ceruleanpokecenter.asm"
-INCLUDE "data/mapObjects/ceruleanpokecenter.asm"
-CeruleanPokecenterBlocks: INCBIN "maps/ceruleanpokecenter.blk"
-
-INCLUDE "data/mapHeaders/ceruleangym.asm"
-INCLUDE "scripts/ceruleangym.asm"
-INCLUDE "data/mapObjects/ceruleangym.asm"
-CeruleanGymBlocks: INCBIN "maps/ceruleangym.blk"
-
-INCLUDE "data/mapHeaders/ceruleanmart.asm"
-INCLUDE "scripts/ceruleanmart.asm"
-INCLUDE "data/mapObjects/ceruleanmart.asm"
-
-INCLUDE "data/mapHeaders/lavenderpokecenter.asm"
-INCLUDE "scripts/lavenderpokecenter.asm"
-INCLUDE "data/mapObjects/lavenderpokecenter.asm"
-
-INCLUDE "data/mapHeaders/lavendermart.asm"
-INCLUDE "scripts/lavendermart.asm"
-INCLUDE "data/mapObjects/lavendermart.asm"
-
-INCLUDE "data/mapHeaders/vermilionpokecenter.asm"
-INCLUDE "scripts/vermilionpokecenter.asm"
-INCLUDE "data/mapObjects/vermilionpokecenter.asm"
-
-INCLUDE "data/mapHeaders/vermilionmart.asm"
-INCLUDE "scripts/vermilionmart.asm"
-INCLUDE "data/mapObjects/vermilionmart.asm"
-
-INCLUDE "data/mapHeaders/vermiliongym.asm"
-INCLUDE "scripts/vermiliongym.asm"
-INCLUDE "data/mapObjects/vermiliongym.asm"
-VermilionGymBlocks: INCBIN "maps/vermiliongym.blk"
-
-INCLUDE "data/mapHeaders/copycatshouse2f.asm"
-INCLUDE "scripts/copycatshouse2f.asm"
-INCLUDE "data/mapObjects/copycatshouse2f.asm"
-
-INCLUDE "data/mapHeaders/fightingdojo.asm"
-INCLUDE "scripts/fightingdojo.asm"
-INCLUDE "data/mapObjects/fightingdojo.asm"
-FightingDojoBlocks: INCBIN "maps/fightingdojo.blk"
-
-INCLUDE "data/mapHeaders/saffrongym.asm"
-INCLUDE "scripts/saffrongym.asm"
-INCLUDE "data/mapObjects/saffrongym.asm"
-SaffronGymBlocks: INCBIN "maps/saffrongym.blk"
-
-INCLUDE "data/mapHeaders/saffronmart.asm"
-INCLUDE "scripts/saffronmart.asm"
-INCLUDE "data/mapObjects/saffronmart.asm"
-
-INCLUDE "data/mapHeaders/silphco1.asm"
-INCLUDE "scripts/silphco1.asm"
-INCLUDE "data/mapObjects/silphco1.asm"
-SilphCo1Blocks: INCBIN "maps/silphco1.blk"
-
-INCLUDE "data/mapHeaders/saffronpokecenter.asm"
-INCLUDE "scripts/saffronpokecenter.asm"
-INCLUDE "data/mapObjects/saffronpokecenter.asm"
-
-INCLUDE "data/mapHeaders/viridianforestexit.asm"
-INCLUDE "scripts/viridianforestexit.asm"
-INCLUDE "data/mapObjects/viridianforestexit.asm"
-
-INCLUDE "data/mapHeaders/route2gate.asm"
-INCLUDE "scripts/route2gate.asm"
-INCLUDE "data/mapObjects/route2gate.asm"
-
-INCLUDE "data/mapHeaders/viridianforestentrance.asm"
-INCLUDE "scripts/viridianforestentrance.asm"
-INCLUDE "data/mapObjects/viridianforestentrance.asm"
-
-INCLUDE "data/mapHeaders/undergroundpathentranceroute5.asm"
-INCLUDE "scripts/undergroundpathentranceroute5.asm"
-INCLUDE "data/mapObjects/undergroundpathentranceroute5.asm"
-
-INCLUDE "data/mapHeaders/undergroundpathentranceroute6.asm"
-INCLUDE "scripts/undergroundpathentranceroute6.asm"
-INCLUDE "data/mapObjects/undergroundpathentranceroute6.asm"
-
-INCLUDE "data/mapHeaders/undergroundpathentranceroute7.asm"
-INCLUDE "scripts/undergroundpathentranceroute7.asm"
-INCLUDE "data/mapObjects/undergroundpathentranceroute7.asm"
-
-INCLUDE "data/mapHeaders/undergroundpathentranceroute7copy.asm"
-INCLUDE "scripts/undergroundpathentranceroute7copy.asm"
-INCLUDE "data/mapObjects/undergroundpathentranceroute7copy.asm"
-
-INCLUDE "data/mapHeaders/silphco9.asm"
-INCLUDE "scripts/silphco9.asm"
-INCLUDE "data/mapObjects/silphco9.asm"
-SilphCo9Blocks: INCBIN "maps/silphco9.blk"
-
-INCLUDE "data/mapHeaders/victoryroad1.asm"
-INCLUDE "scripts/victoryroad1.asm"
-INCLUDE "data/mapObjects/victoryroad1.asm"
-VictoryRoad1Blocks: INCBIN "maps/victoryroad1.blk"
-
-INCLUDE "engine/predefs17_2.asm"
-
-INCLUDE "engine/hidden_object_functions17.asm"
-
-
-SECTION "bank18",ROMX,BANK[$18]
-
-ViridianForestBlocks: INCBIN "maps/viridianforest.blk"
-UndergroundPathNSBlocks: INCBIN "maps/undergroundpathns.blk"
-UndergroundPathWEBlocks: INCBIN "maps/undergroundpathwe.blk"
-
- INCBIN "maps/unusedblocks60258.blk"
-
-SSAnne10Blocks:
-SSAnne9Blocks: INCBIN "maps/ssanne9.blk"
-
-INCLUDE "data/mapHeaders/pokemontower1.asm"
-INCLUDE "scripts/pokemontower1.asm"
-INCLUDE "data/mapObjects/pokemontower1.asm"
-PokemonTower1Blocks: INCBIN "maps/pokemontower1.blk"
-
-INCLUDE "data/mapHeaders/pokemontower2.asm"
-INCLUDE "scripts/pokemontower2.asm"
-INCLUDE "data/mapObjects/pokemontower2.asm"
-PokemonTower2Blocks: INCBIN "maps/pokemontower2.blk"
-
-INCLUDE "data/mapHeaders/pokemontower3.asm"
-INCLUDE "scripts/pokemontower3.asm"
-INCLUDE "data/mapObjects/pokemontower3.asm"
-PokemonTower3Blocks: INCBIN "maps/pokemontower3.blk"
-
-INCLUDE "data/mapHeaders/pokemontower4.asm"
-INCLUDE "scripts/pokemontower4.asm"
-INCLUDE "data/mapObjects/pokemontower4.asm"
-PokemonTower4Blocks: INCBIN "maps/pokemontower4.blk"
-
-INCLUDE "data/mapHeaders/pokemontower5.asm"
-INCLUDE "scripts/pokemontower5.asm"
-INCLUDE "data/mapObjects/pokemontower5.asm"
-PokemonTower5Blocks: INCBIN "maps/pokemontower5.blk"
-
-INCLUDE "data/mapHeaders/pokemontower6.asm"
-INCLUDE "scripts/pokemontower6.asm"
-INCLUDE "data/mapObjects/pokemontower6.asm"
-PokemonTower6Blocks: INCBIN "maps/pokemontower6.blk"
-
- INCBIN "maps/unusedblocks60cef.blk"
-
-INCLUDE "data/mapHeaders/pokemontower7.asm"
-INCLUDE "scripts/pokemontower7.asm"
-INCLUDE "data/mapObjects/pokemontower7.asm"
-PokemonTower7Blocks: INCBIN "maps/pokemontower7.blk"
-
-INCLUDE "data/mapHeaders/celadonmart1.asm"
-INCLUDE "scripts/celadonmart1.asm"
-INCLUDE "data/mapObjects/celadonmart1.asm"
-CeladonMart1Blocks: INCBIN "maps/celadonmart1.blk"
-
-INCLUDE "engine/overworld/cinnabar_lab.asm"
-
-INCLUDE "data/mapHeaders/viridianforest.asm"
-INCLUDE "scripts/viridianforest.asm"
-INCLUDE "data/mapObjects/viridianforest.asm"
-
-INCLUDE "data/mapHeaders/ssanne1.asm"
-INCLUDE "scripts/ssanne1.asm"
-INCLUDE "data/mapObjects/ssanne1.asm"
-SSAnne1Blocks: INCBIN "maps/ssanne1.blk"
-
-INCLUDE "data/mapHeaders/ssanne2.asm"
-INCLUDE "scripts/ssanne2.asm"
-INCLUDE "data/mapObjects/ssanne2.asm"
-SSAnne2Blocks: INCBIN "maps/ssanne2.blk"
-
-INCLUDE "data/mapHeaders/ssanne4.asm"
-INCLUDE "scripts/ssanne4.asm"
-INCLUDE "data/mapObjects/ssanne4.asm"
-SSAnne4Blocks: INCBIN "maps/ssanne4.blk"
-
-INCLUDE "data/mapHeaders/ssanne5.asm"
-INCLUDE "scripts/ssanne5.asm"
-INCLUDE "data/mapObjects/ssanne5.asm"
-SSAnne5Blocks: INCBIN "maps/ssanne5.blk"
-
-INCLUDE "data/mapHeaders/ssanne6.asm"
-INCLUDE "scripts/ssanne6.asm"
-INCLUDE "data/mapObjects/ssanne6.asm"
-SSAnne6Blocks: INCBIN "maps/ssanne6.blk"
-
-INCLUDE "data/mapHeaders/ssanne7.asm"
-INCLUDE "scripts/ssanne7.asm"
-INCLUDE "data/mapObjects/ssanne7.asm"
-SSAnne7Blocks: INCBIN "maps/ssanne7.blk"
-
-INCLUDE "data/mapHeaders/ssanne8.asm"
-INCLUDE "scripts/ssanne8.asm"
-INCLUDE "data/mapObjects/ssanne8.asm"
-SSAnne8Blocks: INCBIN "maps/ssanne8.blk"
-
-INCLUDE "data/mapHeaders/ssanne9.asm"
-INCLUDE "scripts/ssanne9.asm"
-INCLUDE "data/mapObjects/ssanne9.asm"
-
-INCLUDE "data/mapHeaders/ssanne10.asm"
-INCLUDE "scripts/ssanne10.asm"
-INCLUDE "data/mapObjects/ssanne10.asm"
-
-INCLUDE "data/mapHeaders/undergroundpathns.asm"
-INCLUDE "scripts/undergroundpathns.asm"
-INCLUDE "data/mapObjects/undergroundpathns.asm"
-
-INCLUDE "data/mapHeaders/undergroundpathwe.asm"
-INCLUDE "scripts/undergroundpathwe.asm"
-INCLUDE "data/mapObjects/undergroundpathwe.asm"
-
-INCLUDE "data/mapHeaders/diglettscave.asm"
-INCLUDE "scripts/diglettscave.asm"
-INCLUDE "data/mapObjects/diglettscave.asm"
-DiglettsCaveBlocks: INCBIN "maps/diglettscave.blk"
-
-INCLUDE "data/mapHeaders/silphco11.asm"
-INCLUDE "scripts/silphco11.asm"
-INCLUDE "data/mapObjects/silphco11.asm"
-SilphCo11Blocks: INCBIN "maps/silphco11.blk"
-
-INCLUDE "engine/hidden_object_functions18.asm"
-
-
-SECTION "bank19",ROMX,BANK[$19]
-
-Overworld_GFX: INCBIN "gfx/tilesets/overworld.t2.2bpp"
-Overworld_Block: INCBIN "gfx/blocksets/overworld.bst"
-
-RedsHouse1_GFX:
-RedsHouse2_GFX: INCBIN "gfx/tilesets/reds_house.t7.2bpp"
-RedsHouse1_Block:
-RedsHouse2_Block: INCBIN "gfx/blocksets/reds_house.bst"
-
-House_GFX: INCBIN "gfx/tilesets/house.t2.2bpp"
-House_Block: INCBIN "gfx/blocksets/house.bst"
-Mansion_GFX: INCBIN "gfx/tilesets/mansion.t2.2bpp"
-Mansion_Block: INCBIN "gfx/blocksets/mansion.bst"
-ShipPort_GFX: INCBIN "gfx/tilesets/ship_port.t2.2bpp"
-ShipPort_Block: INCBIN "gfx/blocksets/ship_port.bst"
-Interior_GFX: INCBIN "gfx/tilesets/interior.t1.2bpp"
-Interior_Block: INCBIN "gfx/blocksets/interior.bst"
-Plateau_GFX: INCBIN "gfx/tilesets/plateau.t10.2bpp"
-Plateau_Block: INCBIN "gfx/blocksets/plateau.bst"
-
-
-SECTION "bank1A",ROMX,BANK[$1A]
-
-INCLUDE "engine/battle/decrement_pp.asm"
-
-Version_GFX:
-IF DEF(_RED)
- INCBIN "gfx/red/redgreenversion.1bpp" ; 10 tiles
-ENDC
-IF DEF(_BLUE)
- INCBIN "gfx/blue/blueversion.1bpp" ; 8 tiles
-ENDC
-
-Dojo_GFX:
-Gym_GFX: INCBIN "gfx/tilesets/gym.2bpp"
-Dojo_Block:
-Gym_Block: INCBIN "gfx/blocksets/gym.bst"
-
-Mart_GFX:
-Pokecenter_GFX: INCBIN "gfx/tilesets/pokecenter.2bpp"
-Mart_Block:
-Pokecenter_Block: INCBIN "gfx/blocksets/pokecenter.bst"
-
-ForestGate_GFX:
-Museum_GFX:
-Gate_GFX: INCBIN "gfx/tilesets/gate.t1.2bpp"
-ForestGate_Block:
-Museum_Block:
-Gate_Block: INCBIN "gfx/blocksets/gate.bst"
-
-Forest_GFX: INCBIN "gfx/tilesets/forest.2bpp"
-Forest_Block: INCBIN "gfx/blocksets/forest.bst"
-Facility_GFX: INCBIN "gfx/tilesets/facility.2bpp"
-Facility_Block: INCBIN "gfx/blocksets/facility.bst"
-
-
-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]
-
-CopycatsHouse1FBlocks: INCBIN "maps/copycatshouse1f.blk"
-
-CinnabarMartBlocks:
-PewterMartBlocks: INCBIN "maps/pewtermart.blk"
-
-FuchsiaHouse1Blocks: INCBIN "maps/fuchsiahouse1.blk"
-
-CinnabarPokecenterBlocks:
-FuchsiaPokecenterBlocks: INCBIN "maps/fuchsiapokecenter.blk"
-
-CeruleanHouse2Blocks: INCBIN "maps/ceruleanhouse2.blk"
-
-INCLUDE "engine/HoF_room_pc.asm"
-
-INCLUDE "engine/status_ailments.asm"
-
-INCLUDE "engine/items/itemfinder.asm"
-
-INCLUDE "scripts/ceruleancity2.asm"
-
-INCLUDE "data/mapHeaders/viridiangym.asm"
-INCLUDE "scripts/viridiangym.asm"
-INCLUDE "data/mapObjects/viridiangym.asm"
-ViridianGymBlocks: INCBIN "maps/viridiangym.blk"
-
-INCLUDE "data/mapHeaders/pewtermart.asm"
-INCLUDE "scripts/pewtermart.asm"
-INCLUDE "data/mapObjects/pewtermart.asm"
-
-INCLUDE "data/mapHeaders/unknowndungeon1.asm"
-INCLUDE "scripts/unknowndungeon1.asm"
-INCLUDE "data/mapObjects/unknowndungeon1.asm"
-UnknownDungeon1Blocks: INCBIN "maps/unknowndungeon1.blk"
-
-INCLUDE "data/mapHeaders/ceruleanhouse2.asm"
-INCLUDE "scripts/ceruleanhouse2.asm"
-INCLUDE "data/mapObjects/ceruleanhouse2.asm"
-
-INCLUDE "engine/menu/vending_machine.asm"
-
-INCLUDE "data/mapHeaders/fuchsiahouse1.asm"
-INCLUDE "scripts/fuchsiahouse1.asm"
-INCLUDE "data/mapObjects/fuchsiahouse1.asm"
-
-INCLUDE "data/mapHeaders/fuchsiapokecenter.asm"
-INCLUDE "scripts/fuchsiapokecenter.asm"
-INCLUDE "data/mapObjects/fuchsiapokecenter.asm"
-
-INCLUDE "data/mapHeaders/fuchsiahouse2.asm"
-INCLUDE "scripts/fuchsiahouse2.asm"
-INCLUDE "data/mapObjects/fuchsiahouse2.asm"
-FuchsiaHouse2Blocks: INCBIN "maps/fuchsiahouse2.blk"
-
-INCLUDE "data/mapHeaders/safarizoneentrance.asm"
-INCLUDE "scripts/safarizoneentrance.asm"
-INCLUDE "data/mapObjects/safarizoneentrance.asm"
-SafariZoneEntranceBlocks: INCBIN "maps/safarizoneentrance.blk"
-
-INCLUDE "data/mapHeaders/fuchsiagym.asm"
-INCLUDE "scripts/fuchsiagym.asm"
-INCLUDE "data/mapObjects/fuchsiagym.asm"
-FuchsiaGymBlocks: INCBIN "maps/fuchsiagym.blk"
-
-INCLUDE "data/mapHeaders/fuchsiameetingroom.asm"
-INCLUDE "scripts/fuchsiameetingroom.asm"
-INCLUDE "data/mapObjects/fuchsiameetingroom.asm"
-FuchsiaMeetingRoomBlocks: INCBIN "maps/fuchsiameetingroom.blk"
-
-INCLUDE "data/mapHeaders/cinnabargym.asm"
-INCLUDE "scripts/cinnabargym.asm"
-INCLUDE "data/mapObjects/cinnabargym.asm"
-CinnabarGymBlocks: INCBIN "maps/cinnabargym.blk"
-
-INCLUDE "data/mapHeaders/lab1.asm"
-INCLUDE "scripts/lab1.asm"
-INCLUDE "data/mapObjects/lab1.asm"
-Lab1Blocks: INCBIN "maps/lab1.blk"
-
-INCLUDE "data/mapHeaders/lab2.asm"
-INCLUDE "scripts/lab2.asm"
-INCLUDE "data/mapObjects/lab2.asm"
-Lab2Blocks: INCBIN "maps/lab2.blk"
-
-INCLUDE "data/mapHeaders/lab3.asm"
-INCLUDE "scripts/lab3.asm"
-INCLUDE "data/mapObjects/lab3.asm"
-Lab3Blocks: INCBIN "maps/lab3.blk"
-
-INCLUDE "data/mapHeaders/lab4.asm"
-INCLUDE "scripts/lab4.asm"
-INCLUDE "data/mapObjects/lab4.asm"
-Lab4Blocks: INCBIN "maps/lab4.blk"
-
-INCLUDE "data/mapHeaders/cinnabarpokecenter.asm"
-INCLUDE "scripts/cinnabarpokecenter.asm"
-INCLUDE "data/mapObjects/cinnabarpokecenter.asm"
-
-INCLUDE "data/mapHeaders/cinnabarmart.asm"
-INCLUDE "scripts/cinnabarmart.asm"
-INCLUDE "data/mapObjects/cinnabarmart.asm"
-
-INCLUDE "data/mapHeaders/copycatshouse1f.asm"
-INCLUDE "scripts/copycatshouse1f.asm"
-INCLUDE "data/mapObjects/copycatshouse1f.asm"
-
-INCLUDE "data/mapHeaders/gary.asm"
-INCLUDE "scripts/gary.asm"
-INCLUDE "data/mapObjects/gary.asm"
-GaryBlocks: INCBIN "maps/gary.blk"
-
-INCLUDE "data/mapHeaders/lorelei.asm"
-INCLUDE "scripts/lorelei.asm"
-INCLUDE "data/mapObjects/lorelei.asm"
-LoreleiBlocks: INCBIN "maps/lorelei.blk"
-
-INCLUDE "data/mapHeaders/bruno.asm"
-INCLUDE "scripts/bruno.asm"
-INCLUDE "data/mapObjects/bruno.asm"
-BrunoBlocks: INCBIN "maps/bruno.blk"
-
-INCLUDE "data/mapHeaders/agatha.asm"
-INCLUDE "scripts/agatha.asm"
-INCLUDE "data/mapObjects/agatha.asm"
-AgathaBlocks: INCBIN "maps/agatha.blk"
-
-INCLUDE "engine/menu/league_pc.asm"
-
-INCLUDE "engine/overworld/hidden_items.asm"
-
-
-SECTION "bank1E",ROMX,BANK[$1E]
-
-INCLUDE "engine/battle/animations.asm"
-
-INCLUDE "engine/overworld/cut2.asm"
-
-INCLUDE "engine/overworld/ssanne.asm"
-
-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"
-
-INCLUDE "data/animations.asm"
-
-INCLUDE "engine/evolution.asm"
-
-INCLUDE "engine/overworld/elevator.asm"
-
-INCLUDE "engine/items/tm_prices.asm"
-
-SECTION "bank3c",ROMX,BANK[$3C]
-
-INCLUDE "yellow/bank3c/main.asm"
-
-SECTION "bank3d",ROMX,BANK[$3D]
-
-INCLUDE "yellow/bank3d/random.asm"
-
-SECTION "bank3e",ROMX,BANK[$3E]
-
-SECTION "bank3f",ROMX,BANK[$3F]
-
+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 + + +INCLUDE "home.asm" + + +SECTION "bank1",ROMX,BANK[$1] + +INCLUDE "data/facing.asm" + +ResetStatusAndHalveMoneyOnBlackout:: +; Reset player status on blackout. + xor a + ld [wBattleResult], a + ld [wWalkBikeSurfState], a + ld [W_ISINBATTLE], a + ld [wMapPalOffset], a + ld [wNPCMovementScriptFunctionNum], a + ld [hJoyHeld], a + ld [wNPCMovementScriptPointerTableNum], a + ld [wFlags_0xcd60], a + + ld [$ff9f], a + ld [$ff9f + 1], a + ld [$ff9f + 2], a + call HasEnoughMoney + jr c, .lostmoney ; never happens + + ; Halve the player's money. + ld a, [wPlayerMoney] + ld [$ff9f], a + ld a, [wPlayerMoney + 1] + ld [$ff9f + 1], a + ld a, [wPlayerMoney + 2] + ld [$ff9f + 2], a + xor a + ld [$ffa2], a + ld [$ffa3], a + ld a, 2 + ld [$ffa4], a + predef DivideBCDPredef3 + ld a, [$ffa2] + ld [wPlayerMoney], a + ld a, [$ffa2 + 1] + ld [wPlayerMoney + 1], a + ld a, [$ffa2 + 2] + ld [wPlayerMoney + 2], a + +.lostmoney + ld hl, wd732 + set 2, [hl] + res 3, [hl] + set 6, [hl] + ld a, %11111111 + ld [wJoyIgnore], a + predef_jump HealParty + + +MewPicFront:: INCBIN "pic/bmon/mew.pic" +MewPicBack:: INCBIN "pic/monback/mewb.pic" +INCLUDE "data/baseStats/mew.asm" + +INCLUDE "engine/battle/safari_zone.asm" + +INCLUDE "engine/titlescreen.asm" + +NintenText: db "NINTEN@" +SonyText: db "SONY@" + + +LoadMonData_: +; Load monster [wWhichPokemon] from list [wcc49]: +; 0: partymon +; 1: enemymon +; 2: boxmon +; 3: daycaremon +; Return monster id at wcf91 and its data at wLoadedMon. +; Also load base stats at W_MONHDEXNUM for convenience. + + ld a, [wDayCareMonSpecies] + ld [wcf91], a + ld a, [wcc49] + cp 3 + jr z, .GetMonHeader + + ld a, [wWhichPokemon] + ld e, a + callab GetMonSpecies + +.GetMonHeader + ld a, [wcf91] + ld [wd0b5], a ; input for GetMonHeader + call GetMonHeader + + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 + ld a, [wcc49] + cp 1 + 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 + + +INCLUDE "data/item_prices.asm" +INCLUDE "text/item_names.asm" + +UnusedNames: + db "かみなりバッヂ@" + db "かいがらバッヂ@" + db "おじぞうバッヂ@" + db "はやぶさバッヂ@" + db "ひんやりバッヂ@" + db "なかよしバッヂ@" + db "バラバッヂ@" + db "ひのたまバッヂ@" + db "ゴールドバッヂ@" + db "たまご@" + db "ひよこ@" + db "ブロンズ@" + db "シルバー@" + db "ゴールド@" + db "プチキャプテン@" + db "キャプテン@" + db "プチマスター@" + db "マスター@" + db "エクセレント" + +INCLUDE "engine/overworld/oam.asm" +INCLUDE "engine/oam_dma.asm" + +PrintWaitingText: + hlCoord 3, 10 + ld b, $1 + ld c, $b + ld a, [W_ISINBATTLE] + and a + jr z, .asm_4c17 + call TextBoxBorder + jr .asm_4c1a +.asm_4c17 + call CableClub_TextBoxBorder +.asm_4c1a + hlCoord 4, 11 + ld de, WaitingText + call PlaceString + ld c, 50 + jp DelayFrames + +WaitingText: + db "Waiting...!@" + + +_UpdateSprites: ; 4c34 (1:4c34) + ld h, $c1 + inc h + ld a, $e ; wSpriteStateData2 + $0e +.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 ; 4c54 (1:4c54) + cp $1 + jp nz, UpdateNonPlayerSprite + jp UpdatePlayerSprite + +UpdateNonPlayerSprite: + 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 Func_5236 +.unequal + jp Func_4ed1 + +; 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: + nop + + ld h, wSpriteStateData1 / $100 + ld a, [H_CURRENTSPRITEOFFSET] + add wSpriteStateData1 % $100 + 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 coordiate + 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, [$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 + 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 +SetSpriteCollisionValues: + 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: + 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 + +TestBattle: + ret + +.loop + call GBPalNormal + + ; Don't mess around + ; with obedience. + ld a, %10000000 ; EARTHBADGE + ld [W_OBTAINEDBADGES], a + + ld hl, W_FLAGS_D733 + set 0, [hl] + + ; Reset the party. + ld hl, wPartyCount + xor a + ld [hli], a + dec a + ld [hl], a + + ; Give the player a + ; level 20 Rhydon. + ld a, RHYDON + ld [wcf91], a + ld a, 20 + ld [W_CURENEMYLVL], a + xor a + ld [wcc49], a + ld [W_CURMAP], a + call AddPartyMon + + ; Fight against a + ; level 20 Rhydon. + ld a, RHYDON + ld [W_CUROPPONENT], a + + predef InitOpponent + + ; When the battle ends, + ; do it all again. + ld a, 1 + ld [wUpdateSpritesEnabled], a + ld [H_AUTOBGTRANSFERENABLED], a + jr .loop + +INCLUDE "engine/overworld/item.asm" +INCLUDE "engine/overworld/movement.asm" + +INCLUDE "engine/cable_club.asm" + +LoadTrainerInfoTextBoxTiles: ; 5ae6 (1:5ae6) + ld de, TrainerInfoTextBoxTileGraphics ; $7b98 + ld hl, vChars2 + $760 + ld bc, (BANK(TrainerInfoTextBoxTileGraphics) << 8) +$09 + jp CopyVideoData + +INCLUDE "engine/menu/main_menu.asm" + +INCLUDE "engine/oak_speech.asm" + +SpecialWarpIn: ; 62ce (1:62ce) + 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: ; 62ff (1:62ff) + ld a, [wd72d] + cp BATTLE_CENTER + jr nz, .notBattleCenter + ld hl, BattleCenterSpec1 + 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, BattleCenterSpec2 + jr .copyWarpData +.notBattleCenter + cp TRADE_CENTER + jr nz, .notTradeCenter + ld hl, TradeCenterSpec1 + ld a, [hSerialConnectionStatus] + cp USING_INTERNAL_CLOCK + jr z, .copyWarpData + ld hl, TradeCenterSpec2 + jr .copyWarpData +.notTradeCenter + ld a, [wd732] + bit 1, a + jr nz, .notFirstMap + bit 2, a + jr nz, .notFirstMap + ld hl, FirstMapSpec +.copyWarpData + ld de, W_CURMAP + ld c, $7 +.copyWarpDataLoop + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .copyWarpDataLoop + ld a, [hli] + ld [W_CURMAPTILESET], 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 [W_CURMAP], a + ld a, [wWhichDungeonWarp] + ld c, a + ld hl, DungeonWarpList + ld de, $0 + ld a, $6 + ld [wd12f], 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, [wd12f] + 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 [W_CURMAP], 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 [W_CURMAPTILESET], 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" + +; This function appears to never be used. +; It is likely a debugging feature to give the player Tsunekazu Ishihara's +; favorite Pokemon. This is indicated by the overpowered Exeggutor, which +; Ishihara (president of Creatures Inc.) said was his favorite Pokemon in an ABC +; interview on February 8, 2000. +; "Exeggutor is my favorite. That's because I was always using this character +; while I was debugging the program." +; http://www.ign.com/articles/2000/02/09/abc-news-pokamon-chat-transcript + +SetIshiharaTeam: ; 64ca (1:64ca) + ld de, IshiharaTeam +.loop + ld a, [de] + cp $ff + ret z + ld [wcf91], a + inc de + ld a, [de] + ld [W_CURENEMYLVL], a + inc de + call AddPartyMon + jr .loop + +IshiharaTeam: ; 64df (1:64df) + db EXEGGUTOR,90 + db MEW,20 + db JOLTEON,56 + db DUGTRIO,56 + db ARTICUNO,57 + 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_: ; 6b21 (1:6b21) + ld de,wPlayerMoney + ld hl,$ff9f ; total price of items + ld c,3 ; length of money in bytes + call StringCmp + ret c + ld de,wPlayerMoney + 2 + ld hl,$ffa1 ; 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: ; 6b44 (1:6b44) + ld a,[wListMenuID] + cp a,ITEMLISTMENU + jp nz,DisplayListMenuIDLoop ; only rearrange item list menus + push hl + ld hl,wList + 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,wList + 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,wList + ld a,[hli] + ld h,[hl] + ld l,a + dec [hl] ; decrease the number of items + ld a,[hl] + ld [wd12a],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: +; 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, [W_CURMAP] + 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: + 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: ; 7096 (1:7096) + xor a + ld [wListMenuID],a + ld a,[wAutoTextBoxDrawingControl] + bit 0,a + jr nz,.skipDrawingTextBoxBorder + ld a,[$ff8c] ; 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. + ld a,[wd74b] + bit 5,a ; does the player have the pokedex? +; start menu with pokedex + hlCoord 10, 0 + ld b,$0e + ld c,$08 + jr nz,.drawTextBoxBorder +; start menu without pokedex + hlCoord 10, 0 + ld b,$0c + ld c,$08 + jr .drawTextBoxBorder +; if text ID is not 0 (i.e. not the start menu) then do a standard dialogue text box +.notStartMenu + hlCoord 0, 12 + ld b,$04 + ld c,$12 +.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 ; move sprites +.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,$9c ; 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: ; 710b (1:710b) + ld a,[wd74b] + bit 5,a ; does the player have the pokedex? +; menu with pokedex + hlCoord 10, 0 + ld b,$0e + ld c,$08 + jr nz,.drawTextBoxBorder +; shorter menu if the player doesn't have the pokedex + hlCoord 10, 0 + ld b,$0c + ld c,$08 +.drawTextBoxBorder + call TextBoxBorder + ld a,%11001011 ; bit mask for down, up, start, B, and A buttons + 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,[wcc2d] ; remembered menu selection from last time + ld [wCurrentMenuItem],a + ld [wLastMenuItem],a + xor a + ld [wcc37],a + ld hl,wd730 + set 6,[hl] ; no pauses between printing each letter + hlCoord 12, 2 + ld a,[wd74b] + bit 5,a ; does the player have the 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: ; 718f (1:718f) + db "POKéDEX@" + +StartMenuPokemonText: ; 7197 (1:7197) + db "POKéMON@" + +StartMenuItemText: ; 719f (1:719f) + db "ITEM@" + +StartMenuSaveText: ; 71a4 (1:71a4) + db "SAVE@" + +StartMenuResetText: ; 71a9 (1:71a9) + db "RESET@" + +StartMenuExitText: ; 71af (1:71af) + db "EXIT@" + +StartMenuOptionText: ; 71b4 (1:71b4) + db "OPTION@" + +PrintStartMenuItem: ; 71bb (1:71bb) + push hl + call PlaceString + pop hl + ld de,$28 + add hl,de + ret + +INCLUDE "engine/overworld/cable_club_npc.asm" + +; function to draw various text boxes +DisplayTextBoxID_: ; 72ea (1:72ea) + ld a,[wTextBoxID] + cp a,TWO_OPTION_MENU + jp z,DisplayTwoOptionMenu + ld c,a + ld hl,TextBoxFunctionTable + ld de,3 + call SearchTextBoxTable + jr c,.functionTableMatch + ld hl,TextBoxCoordTable + ld de,5 + call SearchTextBoxTable + jr c,.coordTableMatch + ld hl,TextBoxTextAndCoordTable + ld de,9 + call SearchTextBoxTable + jr c,.textAndCoordTableMatch +.done + ret +.functionTableMatch + ld a,[hli] + ld h,[hl] + ld l,a ; hl = address of function + ld de,.done + push de + jp [hl] ; jump to the function +.coordTableMatch + call GetTextBoxIDCoords + call GetAddressOfScreenCoords + call TextBoxBorder + ret +.textAndCoordTableMatch + call GetTextBoxIDCoords + push hl + call GetAddressOfScreenCoords + call TextBoxBorder + pop hl + call GetTextBoxIDText + ld a,[wd730] + push af + ld a,[wd730] + set 6,a ; no pauses between printing each letter + ld [wd730],a + call PlaceString + pop af + ld [wd730],a + call UpdateSprites ; move sprites + ret + +; function to search a table terminated with $ff for a byte matching c in increments of de +; sets carry flag if a match is found and clears carry flag if not +SearchTextBoxTable: ; 734c (1:734c) + dec de +.loop + ld a,[hli] + cp a,$ff + jr z,.notFound + cp c + jr z,.found + add hl,de + jr .loop +.found + scf +.notFound + ret + +; function to load coordinates from the TextBoxCoordTable or the TextBoxTextAndCoordTable +; INPUT: +; hl = address of coordinates +; OUTPUT: +; b = height +; c = width +; d = row of upper left corner +; e = column of upper left corner +GetTextBoxIDCoords: ; 735a (1:735a) + ld a,[hli] ; column of upper left corner + ld e,a + ld a,[hli] ; row of upper left corner + ld d,a + ld a,[hli] ; column of lower right corner + sub e + dec a + ld c,a ; c = width + ld a,[hli] ; row of lower right corner + sub d + dec a + ld b,a ; b = height + ret + +; function to load a text address and text coordinates from the TextBoxTextAndCoordTable +GetTextBoxIDText: ; 7367 (1:7367) + ld a,[hli] + ld e,a + ld a,[hli] + ld d,a ; de = address of text + push de ; save text address + ld a,[hli] + ld e,a ; column of upper left corner of text + ld a,[hl] + ld d,a ; row of upper left corner of text + call GetAddressOfScreenCoords + pop de ; restore text address + ret + +; function to point hl to the screen coordinates +; INPUT: +; d = row +; e = column +; OUTPUT: +; hl = address of upper left corner of text box +GetAddressOfScreenCoords: ; 7375 (1:7375) + push bc + ld hl,wTileMap + ld bc,20 +.loop ; loop to add d rows to the base address + ld a,d + and a + jr z,.addedRows + add hl,bc + dec d + jr .loop +.addedRows + pop bc + add hl,de + ret + +; Format: +; 00: text box ID +; 01-02: function address +TextBoxFunctionTable: ; 7387 (1:7387) + dbw MONEY_BOX, DisplayMoneyBox + dbw BUY_SELL_QUIT_MENU, DoBuySellQuitMenu + dbw FIELD_MOVE_MON_MENU, DisplayFieldMoveMonMenu + db $ff ; terminator + +; Format: +; 00: text box ID +; 01: column of upper left corner +; 02: row of upper left corner +; 03: column of lower right corner +; 04: row of lower right corner +TextBoxCoordTable: ; 7391 (1:7391) + db MESSAGE_BOX, 0, 12, 19, 17 + db $03, 0, 0, 19, 14 + db $07, 0, 0, 11, 6 + db LIST_MENU_BOX, 4, 2, 19, 12 + db $10, 7, 0, 19, 17 + db MON_SPRITE_POPUP, 6, 4, 14, 13 + db $ff ; terminator + +; Format: +; 00: text box ID +; 01: column of upper left corner +; 02: row of upper left corner +; 03: column of lower right corner +; 04: row of lower right corner +; 05-06: address of text +; 07: column of beginning of text +; 08: row of beginning of text +; table of window positions and corresponding text [key, start column, start row, end column, end row, text pointer [2 bytes], text column, text row] +TextBoxTextAndCoordTable: ; 73b0 (1:73b0) + db JP_MOCHIMONO_MENU_TEMPLATE + db 0,0,14,17 ; text box coordinates + dw JapaneseMochimonoText + db 3,0 ; text coordinates + + db USE_TOSS_MENU_TEMPLATE + db 13,10,19,14 ; text box coordinates + dw UseTossText + db 15,11 ; text coordinates + + db JP_SAVE_MESSAGE_MENU_TEMPLATE + db 0,0,7,5 ; text box coordinates + dw JapaneseSaveMessageText + db 2,2 ; text coordinates + + db JP_SPEED_OPTIONS_MENU_TEMPLATE + db 0,6,5,10 ; text box coordinates + dw JapaneseSpeedOptionsText + db 2,7 ; text coordinates + + db BATTLE_MENU_TEMPLATE + db 8,12,19,17 ; text box coordinates + dw BattleMenuText + db 10,14 ; text coordinates + + db SAFARI_BATTLE_MENU_TEMPLATE + db 0,12,19,17 ; text box coordinates + dw SafariZoneBattleMenuText + db 2,14 ; text coordinates + + db SWITCH_STATS_CANCEL_MENU_TEMPLATE + db 11,11,19,17 ; text box coordinates + dw SwitchStatsCancelText + db 13,12 ; text coordinates + + db BUY_SELL_QUIT_MENU_TEMPLATE + db 0,0,10,6 ; text box coordinates + dw BuySellQuitText + db 2,1 ; text coordinates + + db MONEY_BOX_TEMPLATE + db 11,0,19,2 ; text box coordinates + dw MoneyText + db 13,0 ; text coordinates + + db JP_AH_MENU_TEMPLATE + db 7,6,11,10 ; text box coordinates + dw JapaneseAhText + db 8,8 ; text coordinates + + db JP_POKEDEX_MENU_TEMPLATE + db 11,8,19,17 ; text box coordinates + dw JapanesePokedexMenu + db 12,10 ; text coordinates + +; note that there is no terminator + +BuySellQuitText: ; 7413 (1:7413) + db "BUY" + next "SELL" + next "QUIT@@" + +UseTossText: ; 7422 (1:7422) + db "USE" + next "TOSS@" + +JapaneseSaveMessageText: ; 742b (1:742b) + db "きろく" + next "メッセージ@" + +JapaneseSpeedOptionsText: ; 7435 (1:7435) + db "はやい" + next "おそい@" + +MoneyText: ; 743d (1:743d) + db "MONEY@" + +JapaneseMochimonoText: ; 7443 (1:7443) + db "もちもの@" + +JapaneseMainMenuText: ; 7448 (1:7448) + db "つづきから" + next "さいしょから@" + +BattleMenuText: ; 7455 (1:7455) + db "FIGHT ",$E1,$E2 + next "ITEM RUN@" + +SafariZoneBattleMenuText: ; 7468 (1:7468) + db "BALL× BAIT" + next "THROW ROCK RUN@" + +SwitchStatsCancelText: ; 7489 (1:7489) + db "SWITCH" + next "STATS" + next "CANCEL@" + +JapaneseAhText: ; 749d (1:749d) + db "アッ!@" + +JapanesePokedexMenu: ; 74a1 (1:74a1) + db "データをみる" + next "なきごえ" + next "ぶんぷをみる" + next "キャンセル@" + +DisplayMoneyBox: ; 74ba (1:74ba) + ld hl, wd730 + set 6, [hl] + ld a, MONEY_BOX_TEMPLATE + ld [wTextBoxID], a + call DisplayTextBoxID + hlCoord 13, 1 + ld b, $1 + ld c, $6 + call ClearScreenArea + hlCoord 12, 1 + ld de, wPlayerMoney + ld c, $a3 + call PrintBCDNumber + ld hl, wd730 + res 6, [hl] + ret + +CurrencyString: ; 74e2 (1:74e2) + db " ¥@" + +DoBuySellQuitMenu: ; 74ea (1:74ea) + ld a, [wd730] + set 6, a ; no printing delay + ld [wd730], a + xor a + ld [wd12d], a + ld a, BUY_SELL_QUIT_MENU_TEMPLATE + ld [wTextBoxID], a + call DisplayTextBoxID + ld a, A_BUTTON | B_BUTTON + ld [wMenuWatchedKeys], a + ld a, $2 + ld [wMaxMenuItem], a + ld a, $1 + ld [wTopMenuItemY], a + ld a, $1 + ld [wTopMenuItemX], a + xor a + ld [wCurrentMenuItem], a + ld [wLastMenuItem], a + ld [wcc37], a + ld a, [wd730] + res 6, a ; turn on the printing delay + ld [wd730], a + call HandleMenuInput + call PlaceUnfilledArrowMenuCursor + bit 0, a ; was A pressed? + jr nz, .pressedA + bit 1, a ; was B pressed? (always true since only A/B are watched) + jr z, .pressedA + ld a, $2 + ld [wd12e], a + jr .quit +.pressedA + ld a, $1 + ld [wd12e], a + ld a, [wCurrentMenuItem] + ld [wd12d], a + ld b, a + ld a, [wMaxMenuItem] + cp b + jr z, .quit + ret +.quit + ld a, $2 + ld [wd12e], a + ld a, [wCurrentMenuItem] + ld [wd12d], a + scf + ret + +; displays a menu with two options to choose from +; b = Y of upper left corner of text region +; c = X of upper left corner of text region +; hl = address where the text box border should be drawn +DisplayTwoOptionMenu: ; 7559 (1:7559) + push hl + ld a, [wd730] + set 6, a ; no printing delay + ld [wd730], a + xor a + ld [wd12d], a + ld [wd12e], a + ld a, A_BUTTON | B_BUTTON + ld [wMenuWatchedKeys], a + ld a, $1 + ld [wMaxMenuItem], a + ld a, b + ld [wTopMenuItemY], a + ld a, c + ld [wTopMenuItemX], a + xor a + ld [wLastMenuItem], a + ld [wcc37], a + push hl + ld hl, wTwoOptionMenuID + bit 7, [hl] ; select second menu item by default? + res 7, [hl] + jr z, .storeCurrentMenuItem + inc a +.storeCurrentMenuItem + ld [wCurrentMenuItem], a + pop hl + push hl + push hl + call TwoOptionMenu_SaveScreenTiles + ld a, [wTwoOptionMenuID] + ld hl, TwoOptionMenuStrings + ld e, a + ld d, $0 + ld a, $5 +.menuStringLoop + add hl, de + dec a + jr nz, .menuStringLoop + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld e, l + ld d, h + pop hl + push de + ld a, [wTwoOptionMenuID] + cp TRADE_CANCEL_MENU + jr nz, .notTradeCancelMenu + call CableClub_TextBoxBorder + jr .afterTextBoxBorder +.notTradeCancelMenu + call TextBoxBorder +.afterTextBoxBorder + call UpdateSprites + pop hl + ld a, [hli] + and a ; put blank line before first menu item? + ld bc, 20 + 2 + jr z, .noBlankLine + ld bc, 2 * 20 + 2 +.noBlankLine + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + pop hl + add hl, bc + call PlaceString + ld hl, wd730 + res 6, [hl] ; turn on the printing delay + ld a, [wTwoOptionMenuID] + cp NO_YES_MENU + jr nz, .notNoYesMenu +; No/Yes menu +; this menu type ignores the B button +; it only seems to be used when confirming the deletion of a save file + xor a + ld [wTwoOptionMenuID], a + ld a, [wFlags_0xcd60] + push af + push hl + ld hl, wFlags_0xcd60 + bit 5, [hl] + set 5, [hl] ; don't play sound when A or B is pressed in menu + pop hl +.noYesMenuInputLoop + call HandleMenuInput + bit 1, a ; A button pressed? + jr nz, .noYesMenuInputLoop ; try again if A was not pressed + pop af + pop hl + ld [wFlags_0xcd60], a + ld a, (SFX_02_40 - SFX_Headers_02) / 3 + call PlaySound + jr .pressedAButton +.notNoYesMenu + xor a + ld [wTwoOptionMenuID], a + call HandleMenuInput + pop hl + bit 1, a ; A button pressed? + jr nz, .choseSecondMenuItem ; automatically choose the second option if B is pressed +.pressedAButton + ld a, [wCurrentMenuItem] + ld [wd12d], a + and a + jr nz, .choseSecondMenuItem +; chose first menu item + ld a, $1 + ld [wd12e], a + ld c, 15 + call DelayFrames + call TwoOptionMenu_RestoreScreenTiles + and a + ret +.choseSecondMenuItem + ld a, $1 + ld [wCurrentMenuItem], a + ld [wd12d], a + ld a, $2 + ld [wd12e], a + ld c, 15 + call DelayFrames + call TwoOptionMenu_RestoreScreenTiles + scf + ret + +; Some of the wider/taller two option menus will not have the screen areas +; they cover be fully saved/restored by the two functions below. +; The bottom and right edges of the menu may remain after the function returns. + +TwoOptionMenu_SaveScreenTiles: ; 763e (1:763e) + ld de, wHPBarMaxHP + ld bc, $506 +.asm_7644 + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .asm_7644 + push bc + ld bc, 14 + add hl, bc + pop bc + ld c, $6 + dec b + jr nz, .asm_7644 + ret + +TwoOptionMenu_RestoreScreenTiles: ; 7656 (1:7656) + ld de, wHPBarMaxHP + ld bc, $506 +.asm_765c + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .asm_765c + push bc + ld bc, $e + add hl, bc + pop bc + ld c, $6 + dec b + jr nz, .asm_765c + call UpdateSprites + ret + +; Format: +; 00: byte width +; 01: byte height +; 02: byte put blank line before first menu item +; 03: word text pointer +TwoOptionMenuStrings: ; 7671 (1:7671) + db 4,3,0 + dw .YesNoMenu + db 6,3,0 + dw .NorthWestMenu + db 6,3,0 + dw .SouthEastMenu + db 6,3,0 + dw .YesNoMenu + db 6,3,0 + dw .NorthEastMenu + db 7,3,0 + dw .TradeCancelMenu + db 7,4,1 + dw .HealCancelMenu + db 4,3,0 + dw .NoYesMenu + +.NoYesMenu ; 7699 (1:3699) + db "NO",$4E,"YES@" +.YesNoMenu ; 76a0 (1:36a0) + db "YES",$4E,"NO@" +.NorthWestMenu ; 76a7 (1:36a7) + db "NORTH",$4E,"WEST@" +.SouthEastMenu ; 76b2 (1:36b2) + db "SOUTH",$4E,"EAST@" +.NorthEastMenu ; 76bd (1:36bd) + db "NORTH",$4E,"EAST@" +.TradeCancelMenu ; 76c8 (1:36c8) + db "TRADE",$4E,"CANCEL@" +.HealCancelMenu ; 76d5 (1:36d5) + db "HEAL",$4E,"CANCEL@" + +DisplayFieldMoveMonMenu: ; 76e1 (1:36e1) + xor a + ld hl, wWhichTrade + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], $c + call GetMonFieldMoves + ld a, [wTrainerScreenX] + and a + jr nz, .asm_770f + hlCoord 11, 11 + ld b, $5 + ld c, $7 + call TextBoxBorder + call UpdateSprites + ld a, $c + ld [$fff7], a + hlCoord 13, 12 + ld de, PokemonMenuEntries + jp PlaceString +.asm_770f + push af + hlCoord 0, 11 + ld a, [wcd42] + dec a + ld e, a + ld d, $0 + add hl, de + ld b, $5 + ld a, $12 + sub e + ld c, a + pop af + ld de, $ffd8 +.asm_7725 + add hl, de + inc b + inc b + dec a + jr nz, .asm_7725 + ld de, $ffec + add hl, de + inc b + call TextBoxBorder + call UpdateSprites + hlCoord 0, 12 + ld a, [wcd42] + inc a + ld e, a + ld d, $0 + add hl, de + ld de, $ffd8 + ld a, [wTrainerScreenX] +.asm_7747 + add hl, de + dec a + jr nz, .asm_7747 + xor a + ld [wTrainerScreenX], a + ld de, wWhichTrade +.asm_7752 + push hl + ld hl, FieldMoveNames + ld a, [de] + and a + jr z, .asm_7776 + inc de + ld b, a +.asm_775c + dec b + jr z, .asm_7766 +.asm_775f + ld a, [hli] + cp $50 + jr nz, .asm_775f + jr .asm_775c +.asm_7766 + ld b, h + ld c, l + pop hl + push de + ld d, b + ld e, c + call PlaceString + ld bc, $28 + add hl, bc + pop de + jr .asm_7752 +.asm_7776 + pop hl + ld a, [wcd42] + ld [$fff7], a + hlCoord 0, 12 + ld a, [wcd42] + inc a + ld e, a + ld d, $0 + add hl, de + ld de, PokemonMenuEntries + jp PlaceString + +FieldMoveNames: ; 778d (1:778d) + db "CUT@" + db "FLY@" + db "@" + db "SURF@" + db "STRENGTH@" + db "FLASH@" + db "DIG@" + db "TELEPORT@" + db "SOFTBOILED@" + +PokemonMenuEntries: ; 77c2 (1:77c2) + db "STATS" + next "SWITCH" + next "CANCEL@" + +GetMonFieldMoves: ; 77d6 (1:77d6) + ld a, [wWhichPokemon] + ld hl, wPartyMon1Moves + ld bc, $2c + call AddNTimes + ld d, h + ld e, l + ld c, $5 + ld hl, wWhichTrade +.asm_77e9 + push hl +.asm_77ea + dec c + jr z, .asm_7821 + ld a, [de] ; de is RAM address of move + and a + jr z, .asm_7821 + ld b, a + inc de ; go to next move + ld hl, FieldMoveDisplayData +.asm_77f6 + ld a, [hli] + cp $ff + jr z, .asm_77ea + cp b + jr z, .asm_7802 + inc hl + inc hl + jr .asm_77f6 +.asm_7802 + ld a, b + ld [wcd43], a + ld a, [hli] + ld b, [hl] + pop hl + ld [hli], a + ld a, [wTrainerScreenX] + inc a + ld [wTrainerScreenX], a + ld a, [wcd42] + cp b + jr c, .asm_781b + ld a, b + ld [wcd42], a +.asm_781b + ld a, [wcd43] + ld b, a + jr .asm_77e9 +.asm_7821 + pop hl + ret + +; Format: [Move id], [list priority], [leftmost tile] +; Move id = id of move +; List priority = lower number means higher priority when field moves are displayed +; these priorities must be unique +; Leftmost tile = -1 + tile column in which the first letter of the move's name should be displayed +; "SOFTBOILED" is $08 because it has 4 more letters than "SURF", for example, whose value is $0C +FieldMoveDisplayData: ; 7823 (1:7823) + db CUT, $01, $0C + db FLY, $02, $0C + db $B4, $03, $0C ; unused field move + db SURF, $04, $0C + db STRENGTH, $05, $0A + db FLASH, $06, $0C + db DIG, $07, $0C + db TELEPORT, $08, $0A + db SOFTBOILED, $09, $08 + db $ff ; list terminator + + +INCLUDE "engine/battle/moveEffects/drain_hp_effect.asm" + +INCLUDE "engine/menu/players_pc.asm" + +_RemovePokemon: ; 7b68 (1:7b68) + ld hl, wPartyCount ; wPartyCount + ld a, [wcf95] + and a + jr z, .asm_7b74 + ld hl, W_NUMINBOX ; wda80 +.asm_7b74 + ld a, [hl] + dec a + ld [hli], a + ld a, [wWhichPokemon] ; wWhichPokemon + ld c, a + ld b, $0 + add hl, bc + ld e, l + ld d, h + inc de +.asm_7b81 + ld a, [de] + inc de + ld [hli], a + inc a + jr nz, .asm_7b81 + ld hl, wPartyMonOT ; wd273 + ld d, $5 + ld a, [wcf95] + and a + jr z, .asm_7b97 + ld hl, wBoxMonOT + ld d, $13 +.asm_7b97 + ld a, [wWhichPokemon] ; wWhichPokemon + call SkipFixedLengthTextEntries + ld a, [wWhichPokemon] ; wWhichPokemon + cp d + jr nz, .asm_7ba6 + ld [hl], $ff + ret +.asm_7ba6 + ld d, h + ld e, l + ld bc, $b + add hl, bc + ld bc, wPartyMonNicks ; wPartyMonNicks + ld a, [wcf95] + and a + jr z, .asm_7bb8 + ld bc, wBoxMonNicks +.asm_7bb8 + call CopyDataUntil + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 + ld a, [wcf95] + and a + jr z, .asm_7bcd + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 +.asm_7bcd + ld a, [wWhichPokemon] ; wWhichPokemon + call AddNTimes + ld d, h + ld e, l + ld a, [wcf95] + and a + jr z, .asm_7be4 + ld bc, wBoxMon2 - wBoxMon1 + add hl, bc + ld bc, wBoxMonOT + jr .asm_7beb +.asm_7be4 + ld bc, wPartyMon2 - wPartyMon1 + add hl, bc + ld bc, wPartyMonOT ; wd273 +.asm_7beb + call CopyDataUntil + ld hl, wPartyMonNicks ; wPartyMonNicks + ld a, [wcf95] + and a + jr z, .asm_7bfa + ld hl, wBoxMonNicks +.asm_7bfa + ld bc, $b + ld a, [wWhichPokemon] ; wWhichPokemon + call AddNTimes + ld d, h + ld e, l + ld bc, $b + add hl, bc + ld bc, wPokedexOwned ; wPokedexOwned + ld a, [wcf95] + and a + jr z, .asm_7c15 + ld bc, wBoxMonNicksEnd +.asm_7c15 + jp CopyDataUntil + +Func_7c18: ; 7c18 (1:7c18) + ld hl, wd730 + set 6, [hl] + predef ShowPokedexData + ld hl, wd730 + res 6, [hl] + call ReloadMapData + ld c, $a + call DelayFrames + predef IndexToPokedex + ld a, [wd11e] + dec a + ld c, a + ld b, $1 + ld hl, wPokedexSeen + predef FlagActionPredef + ld a, $1 + ld [wDoNotWaitForButtonPressAfterDisplayingText], a + ret + + +SECTION "bank3",ROMX,BANK[$3] + +INCLUDE "engine/joypad.asm" + +INCLUDE "data/map_songs.asm" + +INCLUDE "data/map_header_banks.asm" + +ClearVariablesAfterLoadingMapData: ; c335 (3:4335) + ld a, $90 + ld [hWY], a + ld [rWY], a + xor a + ld [H_AUTOBGTRANSFERENABLED], a + ld [wStepCounter], a + ld [W_LONEATTACKNO], a ; W_GYMLEADERNO + ld [hJoyPressed], a + ld [hJoyReleased], a + ld [hJoyHeld], a + ld [wcd6a], a + ld [wd5a3], 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: ; c35f (3:435f) + ld a, [wNumberOfWarps] + and a + ret z + ld c, a + ld hl, wWarpEntries +.loop + ld a, [W_YCOORD] + cp [hl] + jr nz, .nextWarp1 + inc hl + ld a, [W_XCOORD] + 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: ; c38b (3:438b) + ld hl, wd732 + bit 5, [hl] + ret nz + ld hl, ForcedBikeOrSurfMaps + ld a, [W_YCOORD] + ld b, a + ld a, [W_XCOORD] + ld c, a + ld a, [W_CURMAP] + 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, [W_CURMAP] + cp SEAFOAM_ISLANDS_4 + ld a, $2 + ld [W_SEAFOAMISLANDS4CURSCRIPT], a + jr z, .forceSurfing + ld a, [W_CURMAP] + cp SEAFOAM_ISLANDS_5 + ld a, $2 + ld [W_SEAFOAMISLANDS5CURSCRIPT], a + jr z, .forceSurfing + ;force bike riding + ld hl, wd732 + set 5, [hl] + ld a, $1 + ld [wWalkBikeSurfState], a + ld [wWalkBikeSurfStateCopy], a + jp ForceBikeOrSurf +.incorrectMap + inc hl +.incorrectY + inc hl + jr .loop +.forceSurfing + ld a, $2 + ld [wWalkBikeSurfState], a + ld [wWalkBikeSurfStateCopy], a + jp ForceBikeOrSurf + +INCLUDE "data/force_bike_surf.asm" + +IsPlayerFacingEdgeOfMap: ; c3ff (3:43ff) + 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, [W_YCOORD] + ld b, a + ld a, [W_XCOORD] + ld c, a + ld de, .asm_c41e + push de + jp [hl] +.asm_c41e + pop bc + pop de + pop hl + ret + +.functionPointerTable + dw .facingDown + dw .facingUp + dw .facingLeft + dw .facingRight + +.facingDown + ld a, [W_CURMAPHEIGHT] + 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, [W_CURMAPWIDTH] + add a + dec a + cp c + jr z, .setCarry + jr .resetCarry +.resetCarry + and a + ret +.setCarry + scf + ret + +IsWarpTileInFrontOfPlayer: ; c44e (3:444e) + push hl + push de + push bc + call _GetTileAndCoordsInFrontOfPlayer + ld a, [W_CURMAP] + 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: ; c477 (3:4477) + 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: ; c49d (3:449d) + push hl + push de + push bc + callba IsPlayerStandingOnDoorTile + jr c, .done + ld a, [W_CURMAPTILESET] + 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: ; c52f (3:452f) + ld a, [W_CURMAP] ; W_CURMAP + cp SAFARI_ZONE_EAST + ret c + cp UNKNOWN_DUNGEON_2 + ret nc + ld hl, wTileMap + ld b, $3 + ld c, $7 + call TextBoxBorder + hlCoord 1, 1 + ld de, wSafariSteps ; wd70d + ld bc, $203 + call PrintNumber + hlCoord 4, 1 + ld de, SafariSteps ; $4579 + call PlaceString + hlCoord 1, 3 + ld de, SafariBallText + call PlaceString + ld a, [W_NUMSAFARIBALLS] ; W_NUMSAFARIBALLS + cp $a + jr nc, .asm_c56d + hlCoord 5, 3 + ld a, $7f + ld [hl], a +.asm_c56d + hlCoord 6, 3 + ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS + ld bc, $102 + jp PrintNumber + +SafariSteps: ; c579 (3:4579) + db "/500@" + +SafariBallText: ; c57e (3:457e) + db "BALL×× @" + +GetTileAndCoordsInFrontOfPlayer: ; c586 (3:4586) + call GetPredefRegisters + +_GetTileAndCoordsInFrontOfPlayer: ; c589 (3:4589) + ld a, [W_YCOORD] + ld d, a + ld a, [W_XCOORD] + ld e, a + ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + and a + 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: ; c5be (3:45be) + xor a + ld [$ffdb], a + ld hl, W_YCOORD + ld a, [hli] + ld d, a + ld e, [hl] + ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction + and a + 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: ; c60b (3:460b) + call GetTileTwoStepsInFrontOfPlayer + ld hl, W_TILESETCOLLISIONPTR + ld a, [hli] + ld h, [hl] + ld l, a +.loop + ld a, [hli] + cp $ff + jr z, .done ; if the tile two steps ahead is not passable + cp c + jr nz, .loop + 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: ; c636 (3:4636) + 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, [W_NUMSPRITES] + 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: ; c69c (3:469c) + ld a, [wd730] + add a + jp c, .noBlackOut ; no black out if joypad states are being simulated + ld a, [wPartyCount] + and a + jp z, .noBlackOut + call IncrementDayCareMonExp + ld a, [wStepCounter] + and $3 ; is the counter a multiple of 4? + jp nz, .noBlackOut ; 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 [$ff8c], a + call DisplayTextID + 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_02_43 - SFX_Headers_02) / 3 + call PlaySound +.skipPoisonEffectAndSound + predef AnyPartyAlive + ld a, d + and a + jr nz, .noBlackOut + call EnableAutoTextBoxDrawing + ld a, $d1 + ld [$ff8c], a + call DisplayTextID + ld hl, wd72e + set 5, [hl] + ld a, $ff + jr .done +.noBlackOut + xor a +.done + ld [wd12d], a + ret + +LoadTilesetHeader: ; c754 (3:4754) + call GetPredefRegisters + push hl + ld d, 0 + ld a, [W_CURMAPTILESET] + add a + add a + ld b, a + add a + add b ; a = tileset * 12 + jr nc, .noCarry + inc d +.noCarry + ld e, a + ld hl, Tilesets + add hl, de + ld de, W_TILESETBANK + ld c, $b +.copyTilesetHeaderLoop + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .copyTilesetHeaderLoop + ld a, [hl] + ld [hTilesetType], a + xor a + ld [$ffd8], a + pop hl + ld a, [W_CURMAPTILESET] + push hl + push de + ld hl, DungeonTilesets + ld de, $1 + call IsInArray + pop de + pop hl + jr c, .asm_c797 + ld a, [W_CURMAPTILESET] + ld b, a + ld a, [$ff8b] + cp b + jr z, .done +.asm_c797 + ld a, [wDestinationWarpID] + cp $ff + jr z, .done + call LoadDestinationWarpPosition + ld a, [W_YCOORD] + and $1 + ld [W_YBLOCKCOORD], a + ld a, [W_XCOORD] + and $1 + ld [W_XBLOCKCOORD], a +.done + ret + +INCLUDE "data/dungeon_tilesets.asm" + +INCLUDE "data/tileset_headers.asm" + +IncrementDayCareMonExp: ; c8de (3:48de) + ld a, [W_DAYCARE_IN_USE] + 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" + +PrintStrengthTxt: ; cd99 (3:4d99) + ld hl, wd728 + set 0, [hl] + ld hl, UsedStrengthText + call PrintText + ld hl, CanMoveBouldersText + jp PrintText + +UsedStrengthText: ; cdaa (3:4daa) + TX_FAR _UsedStrengthText + db $08 ; asm + ld a, [wcf91] + call PlayCry + call Delay3 + jp TextScriptEnd + +CanMoveBouldersText: ; cdbb (3:4dbb) + TX_FAR _CanMoveBouldersText + db "@" + +CheckForForcedBikeSurf: ; cdc0 (3:4dc0) + ld hl, wd728 + set 1, [hl] + ld a, [wd732] + bit 5, a + jr nz, .asm_cdec + ld a, [W_CURMAP] ; W_CURMAP + cp SEAFOAM_ISLANDS_5 + ret nz + ld a, [wd881] + and $3 + cp $3 + ret z + ld hl, CoordsData_cdf7 ; $4df7 + call ArePlayerCoordsInArray + ret nc + ld hl, wd728 + res 1, [hl] + ld hl, CurrentTooFastText + jp PrintText +.asm_cdec + ld hl, wd728 + res 1, [hl] + ld hl, CyclingIsFunText + jp PrintText + +CoordsData_cdf7: ; cdf7 (3:4df7) + db $0B,$07,$FF + +CurrentTooFastText: ; cdfa (3:4dfa) + TX_FAR _CurrentTooFastText + db "@" + +CyclingIsFunText: ; cdff (3:4dff) + TX_FAR _CyclingIsFunText + db "@" + +; function to add an item (in varying quantities) to the player's bag or PC box +; INPUT: +; hl = address of inventory (either wNumBagItems or wNumBoxItems) +; [wcf91] = item ID +; [wcf96] = item quantity +; sets carry flag if successful, unsets carry flag if unsuccessful +AddItemToInventory_: ; ce04 (3:4e04) + ld a,[wcf96] ; a = item quantity + push af + push bc + push de + push hl + push hl + ld d,50 ; PC box can hold 50 items + ld a,wNumBagItems & $FF + cp l + jr nz,.checkIfInventoryFull + ld a,wNumBagItems >> 8 + cp h + jr nz,.checkIfInventoryFull +; if the destination is the bag + ld d,20 ; bag can hold 20 items +.checkIfInventoryFull + ld a,[hl] + sub d + ld d,a + ld a,[hli] + and a + jr z,.addNewItem +.loop + ld a,[hli] + ld b,a ; b = ID of current item in table + ld a,[wcf91] ; a = ID of item being added + cp b ; does the current item in the table match the item being added? + jp z,.increaseItemQuantity ; if so, increase the item's quantity + inc hl + ld a,[hl] + cp a,$ff ; is it the end of the table? + jr nz,.loop +.addNewItem ; add an item not yet in the inventory + pop hl + ld a,d + and a ; is there room for a new item slot? + jr z,.done +; if there is room + inc [hl] ; increment the number of items in the inventory + ld a,[hl] ; the number of items will be the index of the new item + add a + dec a + ld c,a + ld b,0 + add hl,bc ; hl = address to store the item + ld a,[wcf91] + ld [hli],a ; store item ID + ld a,[wcf96] + ld [hli],a ; store item quantity + ld [hl],$ff ; store terminator + jp .success +.increaseItemQuantity ; increase the quantity of an item already in the inventory + ld a,[wcf96] + ld b,a ; b = quantity to add + ld a,[hl] ; a = existing item quantity + add b ; a = new item quantity + cp a,100 + jp c,.storeNewQuantity ; if the new quantity is less than 100, store it +; if the new quantity is greater than or equal to 100, +; try to max out the current slot and add the rest in a new slot + sub a,99 + ld [wcf96],a ; a = amount left over (to put in the new slot) + ld a,d + and a ; is there room for a new item slot? + jr z,.increaseItemQuantityFailed +; if so, store 99 in the current slot and store the rest in a new slot + ld a,99 + ld [hli],a + jp .loop +.increaseItemQuantityFailed + pop hl + and a + jr .done +.storeNewQuantity + ld [hl],a + pop hl +.success + scf +.done + pop hl + pop de + pop bc + pop bc + ld a,b + ld [wcf96],a ; restore the initial value from when the function was called + ret + +; function to remove an item (in varying quantities) from the player's bag or PC box +; INPUT: +; hl = address of inventory (either wNumBagItems or wNumBoxItems) +; [wWhichPokemon] = index (within the inventory) of the item to remove +; [wcf96] = quantity to remove +RemoveItemFromInventory_: ; ce74 (3:4e74) + push hl + inc hl + ld a,[wWhichPokemon] ; index (within the inventory) of the item being removed + sla a + add l + ld l,a + jr nc,.noCarry + inc h +.noCarry + inc hl + ld a,[wcf96] ; quantity being removed + ld e,a + ld a,[hl] ; a = current quantity + sub e + ld [hld],a ; store new quantity + ld [wcf97],a + and a + jr nz,.skipMovingUpSlots +; if the remaining quantity is 0, +; remove the emptied item slot and move up all the following item slots +.moveSlotsUp + ld e,l + ld d,h + inc de + inc de ; de = address of the slot following the emptied one +.loop ; loop to move up the following slots + ld a,[de] + inc de + ld [hli],a + cp a,$ff + jr nz,.loop +; update menu info + xor a + ld [wListScrollOffset],a + ld [wCurrentMenuItem],a + ld [wcc2c],a + ld [wd07e],a + pop hl + ld a,[hl] ; a = number of items in inventory + dec a ; decrement the number of items + ld [hl],a ; store new number of items + ld [wd12a],a + cp a,2 + jr c,.done + ld [wMaxMenuItem],a + jr .done +.skipMovingUpSlots + pop hl +.done + ret + +; wild pokemon data: from 4EB8 to 55C7 + +LoadWildData: ; ceb8 (3:4eb8) + ld hl,WildDataPointers + ld a,[W_CURMAP] + + ; 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 [W_GRASSRATE],a + and a + jr z,.NoGrassData ; if no grass data, skip to surfing data + push hl + ld de,W_GRASSMONS ; otherwise, load grass data + ld bc,$0014 + call CopyData + pop hl + ld bc,$0014 + add hl,bc +.NoGrassData + ld a,[hli] + ld [W_WATERRATE],a + and a + ret z ; if no water data, we're done + ld de,W_WATERMONS ; otherwise, load surfing data + ld bc,$0014 + jp CopyData + +INCLUDE "data/wild_mons.asm" + +INCLUDE "engine/items/items.asm" + +DrawBadges: ; ea03 (3:6a03) +; 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, wTrainerFacingDirection + ld hl, .FaceBadgeTiles + ld bc, 8 + call CopyData + +; Booleans for each badge. + ld hl, wcd49 + ld bc, 8 + xor a + call FillMemory + +; Alter these based on owned badges. + ld de, wcd49 + ld hl, wTrainerFacingDirection + ld a, [W_OBTAINEDBADGES] + 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, wWhichTrade + ld a, $d8 ; [1] + ld [hli], a + ld [hl], $60 ; First name + + hlCoord 2, 11 + ld de, wcd49 + call .DrawBadgeRow + + hlCoord 2, 14 + ld de, wcd49 + 4 +; call .DrawBadgeRow +; ret + +.DrawBadgeRow ; ea4c (3:6a4c) +; Draw 4 badges. + + ld c, 4 +.DrawBadge + push de + push hl + +; Badge no. + ld a, [wWhichTrade] + ld [hli], a + inc a + ld [wWhichTrade], a + +; Names aren't printed if the badge is owned. + ld a, [de] + and a + ld a, [wTrainerEngageDistance] + jr nz, .SkipName + call .PlaceTiles + jr .PlaceBadge + +.SkipName + inc a + inc a + inc hl + +.PlaceBadge + ld [wTrainerEngageDistance], a + ld de, 20 - 1 + add hl, de + ld a, [wTrainerFacingDirection] + call .PlaceTiles + add hl, de + call .PlaceTiles + +; Shift badge array back one byte. + push bc + ld hl, wTrainerFacingDirection + 1 + ld de, wTrainerFacingDirection + 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: ; ea9e (3:6a9e) + 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: ; ee9e (3:6e9e) + call GetPredefRegisters + ld hl, wOverworldMap + ld a, [W_CURMAPWIDTH] + 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: ; eedc (3:6edc) + ld a, [W_ISINBATTLE] ; W_ISINBATTLE + 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 GoPAL_SET_CF1C + 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 [wHPBarMaxHP], a + ld a, h + ld [wHPBarMaxHP + 1], a + 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 * 20 + ld de, 20 + ld a, [$ffbe] +.asm_ef1a + add hl, de + dec a + jr nz, .asm_ef1a + call CopyToScreenEdgeTiles + pop hl + ld de, $20 + ld a, [$ffbe] + ld c, a +.asm_ef28 + add hl, de + ld a, h + and $3 + or $98 + dec c + jr nz, .asm_ef28 + ld [H_SCREENEDGEREDRAWADDR + 1], a + ld a, l + ld [H_SCREENEDGEREDRAWADDR], a + ld a, REDRAWROW + ld [H_SCREENEDGEREDRAW], 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: ; ef4e (3:6f4e) + ld a, h + sub b + ret nz + ld a, l + sub c + ret + +INCLUDE "engine/overworld/cut.asm" + +MarkTownVisitedAndLoadMissableObjects: ; f113 (3:7113) + ld a, [W_CURMAP] + cp ROUTE_1 + jr nc, .notInTown + ld c, a + ld b, $1 + ld hl, W_TOWNVISITEDFLAG ; mark town as visited (for flying) + predef FlagActionPredef +.notInTown + ld hl, MapHSPointers + ld a, [W_CURMAP] + 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: ; f132 (3:7132) + ld l, a + push hl + ld de, MapHS00 ; calculate difference between out pointer and the base pointer + ld a, l + sub e + jr nc, .asm_f13c + dec h +.asm_f13c + ld l, a + ld a, h + sub d + 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, [W_CURMAP] ; W_CURMAP + ld b, a + ld a, [H_DIVIDEND+3] + ld c, a ; store global offset in c + ld de, W_MISSABLEOBJECTLIST + 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: ; f175 (3:7175) + ld hl, W_MISSABLEOBJECTFLAGS + ld bc, $20 + xor a + call FillMemory ; clear missable objects flags + ld hl, MapHS00 + xor a + ld [wd048], a +.missableObjectsLoop + ld a, [hli] + cp $ff ; end of list + ret z + push hl + inc hl + ld a, [hl] + cp Hide + jr nz, .asm_f19d + ld hl, W_MISSABLEOBJECTFLAGS + ld a, [wd048] + ld c, a + ld b, $1 + call MissableObjectFlagAction ; set flag iff Item is hidden +.asm_f19d + ld hl, wd048 + 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: ; f1a6 (3:71a6) + ld a, [H_CURRENTSPRITEOFFSET] + swap a + ld b, a + ld hl, W_MISSABLEOBJECTLIST +.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, $2 + ld hl, W_MISSABLEOBJECTFLAGS + 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 +; [wcc4d]: index of the missable object to be added (global index) +ShowObject: ; f1c8 (3:71c8) +ShowObject2: + ld hl, W_MISSABLEOBJECTFLAGS + ld a, [wcc4d] + ld c, a + ld b, $0 + call MissableObjectFlagAction ; reset "removed" flag + jp UpdateSprites + +; removes missable object (items, leg. pokemon, etc.) from the map +; [wcc4d]: index of the missable object to be removed (global index) +HideObject: ; f1d7 (3:71d7) + ld hl, W_MISSABLEOBJECTFLAGS + ld a, [wcc4d] + ld c, a + ld b, $1 + call MissableObjectFlagAction ; set "removed" flag + jp UpdateSprites + +MissableObjectFlagAction: +; 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: ; f225 (3:7225) + ld a, [wd728] + bit 0, a ; using Strength? + ret z + ld a, [wFlags_0xcd60] + bit 1, a ; has boulder dust animation from previous push played yet? + ret nz + xor a + ld [$ff8c], a + call IsSpriteInFrontOfPlayer + ld a, [$ff8c] + ld [wBoulderSpriteIndex], a + and a + jp z, ResetBoulderPushFlags + ld hl, wSpriteStateData1 + 1 + ld d, $0 + ld a, [$ff8c] + 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 $f0 + 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_02_53 - SFX_Headers_02) / 3 + call PlaySound + ld hl, wFlags_0xcd60 + set 1, [hl] + ret + +PushBoulderUpMovementData: ; f2ad (3:72ad) + db NPC_MOVEMENT_UP,$FF + +PushBoulderDownMovementData: ; f2af (3:72af) + db NPC_MOVEMENT_DOWN,$FF + +PushBoulderLeftMovementData: ; f2b1 (3:72b1) + db NPC_MOVEMENT_LEFT,$FF + +PushBoulderRightMovementData: ; f2b3 (3:72b3) + db NPC_MOVEMENT_RIGHT,$FF + +DoBoulderDustAnimation: ; f2b5 (3:72b5) + 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_02_56 - SFX_Headers_02) / 3 + jp PlaySound + +ResetBoulderPushFlags: ; f2dd (3:72dd) + ld hl, wFlags_0xcd60 + res 1, [hl] + res 6, [hl] + ret + +_AddPartyMon: ; f2e5 (3:72e5) + ld de, wPartyCount ; wPartyCount + ld a, [wcc49] + and $f + jr z, .asm_f2f2 + ld de, wEnemyPartyCount ; wEnemyPartyCount +.asm_f2f2 + ld a, [de] + inc a + cp PARTY_LENGTH + 1 + ret nc + ld [de], a + ld a, [de] + ld [$ffe4], a + add e + ld e, a + jr nc, .asm_f300 + inc d +.asm_f300 + ld a, [wcf91] + ld [de], a + inc de + ld a, $ff + ld [de], a + ld hl, wPartyMonOT ; wd273 + ld a, [wcc49] + and $f + jr z, .asm_f315 + ld hl, wEnemyMonOT +.asm_f315 + ld a, [$ffe4] + dec a + call SkipFixedLengthTextEntries + ld d, h + ld e, l + ld hl, wPlayerName ; wd158 + ld bc, $b + call CopyData + ld a, [wcc49] + and a + jr nz, .asm_f33f + ld hl, wPartyMonNicks ; wPartyMonNicks + ld a, [$ffe4] + dec a + call SkipFixedLengthTextEntries + ld a, $2 + ld [wd07d], a + predef AskName +.asm_f33f + ld hl, wPartyMons + ld a, [wcc49] + and $f + jr z, .asm_f34c + ld hl, wEnemyMons +.asm_f34c + ld a, [$ffe4] + 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, W_MONHEADER + ld a, [hli] + ld [de], a + inc de + pop hl + push hl + ld a, [wcc49] + and $f + ld a, $98 ; set enemy trainer mon IVs to fixed average values + ld b, $88 + jr nz, .writeFreshMonData + ld a, [wcf91] + ld [wd11e], a + push de + predef IndexToPokedex + pop de + ld a, [wd11e] + dec a + ld c, a + ld b, $2 + ld hl, wPokedexOwned ; wPokedexOwned + call FlagAction + ld a, c + ld [wd153], a + ld a, [wd11e] + dec a + ld c, a + ld b, $1 + push bc + call FlagAction + pop bc + ld hl, wPokedexSeen ; wd30a + call FlagAction + pop hl + push hl + ld a, [W_ISINBATTLE] ; W_ISINBATTLE + and a + jr nz, .copyEnemyMonData + call Random ; generate random IVs + ld b, a + call Random +.writeFreshMonData ; f3b3 + push bc + ld bc, $1b + add hl, bc + pop bc + ld [hli], a + ld [hl], b ; write IVs + ld bc, $fff4 + 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 ; level (?) + inc de + ld [de], a ; status ailments + inc de + jr .copyMonTypesAndMoves +.copyEnemyMonData + ld bc, $1b + 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 ; level (?) + inc de + ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon + ld [de], a + inc de +.copyMonTypesAndMoves + ld hl, W_MONHTYPES + ld a, [hli] ; type 1 + ld [de], a + inc de + ld a, [hli] ; type 2 + ld [de], a + inc de + ld a, [hli] ; unused (?) + ld [de], a + ld hl, W_MONHMOVES + 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 [wHPBarMaxHP], 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, [W_CURENEMYLVL] + ld d, a + callab CalcExperience + pop de + inc de + ld a, [H_MULTIPLICAND] ; write experience + ld [de], a + inc de + ld a, [H_MULTIPLICAND+1] + ld [de], a + inc de + ld a, [H_MULTIPLICAND+2] + ld [de], a + xor a + ld b, $a +.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, [W_CURENEMYLVL] ; W_CURENEMYLVL + ld [de], a + inc de + ld a, [W_ISINBATTLE] ; W_ISINBATTLE + dec a + jr nz, .calcFreshStats + ld hl, wEnemyMonMaxHP ; wEnemyMonMaxHP + ld bc, $a + call CopyData ; copy stats of cur enemy mon + pop hl + jr .done +.calcFreshStats + pop hl + ld bc, $10 + add hl, bc + ld b, $0 + call CalcStats ; calculate fresh set of stats +.done + scf + ret + +LoadMovePPs: ; f473 (3:7473) + call GetPredefRegisters + ; fallthrough +AddPartyMon_WriteMovePP: ; f476 (3:7476) + ld b, $4 +.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, $6 + call AddNTimes + ld de, wcd6d + ld a, BANK(Moves) + call FarCopyData + pop bc + pop de + pop hl + ld a, [wcd72] ; sixth move byte = pp +.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: ; f49d (3:749d) + 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, $000b + 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, $000b + 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, $1 + 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 + +Func_f51e: ; f51e (3:751e) + ld a, [wcf95] + and a + jr z, .checkPartyMonSlots + cp $2 + jr z, .checkPartyMonSlots + cp $3 + ld hl, wDayCareMon + jr z, .asm_f575 + ld hl, W_NUMINBOX ; wda80 + ld a, [hl] + cp MONS_PER_BOX + jr nz, .partyOrBoxNotFull + jr .boxFull +.checkPartyMonSlots + ld hl, wPartyCount ; 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, [wcf95] + cp $2 + ld a, [wDayCareMon] + jr z, .asm_f556 + ld a, [wcf91] +.asm_f556 + ld [hli], a ; write new mon ID + ld [hl], $ff ; write new sentinel + ld a, [wcf95] + dec a + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 ; $2c + ld a, [wPartyCount] ; wPartyCount + jr nz, .skipToNewMonEntry + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 ; $21 + ld a, [W_NUMINBOX] ; wda80 +.skipToNewMonEntry + dec a + call AddNTimes +.asm_f575 + push hl + ld e, l + ld d, h + ld a, [wcf95] + and a + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 ; $21 + jr z, .asm_f591 + cp $2 + ld hl, wDayCareMon + jr z, .asm_f597 + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 ; $2c +.asm_f591 + ld a, [wWhichPokemon] ; wWhichPokemon + call AddNTimes +.asm_f597 + push hl + push de + ld bc, wBoxMon2 - wBoxMon1 + call CopyData + pop de + pop hl + ld a, [wcf95] + and a + jr z, .asm_f5b4 + cp $2 + jr z, .asm_f5b4 + ld bc, wBoxMon2 - wBoxMon1 + add hl, bc + ld a, [hl] + inc de + inc de + inc de + ld [de], a +.asm_f5b4 + ld a, [wcf95] + cp $3 + ld de, W_DAYCAREMONOT + jr z, .asm_f5d3 + dec a + ld hl, wPartyMonOT ; wd273 + ld a, [wPartyCount] ; wPartyCount + jr nz, .asm_f5cd + ld hl, wBoxMonOT + ld a, [W_NUMINBOX] ; wda80 +.asm_f5cd + dec a + call SkipFixedLengthTextEntries + ld d, h + ld e, l +.asm_f5d3 + ld hl, wBoxMonOT + ld a, [wcf95] + and a + jr z, .asm_f5e6 + ld hl, W_DAYCAREMONOT + cp $2 + jr z, .asm_f5ec + ld hl, wPartyMonOT ; wd273 +.asm_f5e6 + ld a, [wWhichPokemon] ; wWhichPokemon + call SkipFixedLengthTextEntries +.asm_f5ec + ld bc, $b + call CopyData + ld a, [wcf95] + cp $3 + ld de, W_DAYCAREMONNAME + jr z, .asm_f611 + dec a + ld hl, wPartyMonNicks ; wPartyMonNicks + ld a, [wPartyCount] ; wPartyCount + jr nz, .asm_f60b + ld hl, wBoxMonNicks + ld a, [W_NUMINBOX] ; wda80 +.asm_f60b + dec a + call SkipFixedLengthTextEntries + ld d, h + ld e, l +.asm_f611 + ld hl, wBoxMonNicks + ld a, [wcf95] + and a + jr z, .asm_f624 + ld hl, W_DAYCAREMONNAME + cp $2 + jr z, .asm_f62a + ld hl, wPartyMonNicks ; wPartyMonNicks +.asm_f624 + ld a, [wWhichPokemon] ; wWhichPokemon + call SkipFixedLengthTextEntries +.asm_f62a + ld bc, $b + call CopyData + pop hl + ld a, [wcf95] + cp $1 + jr z, .asm_f664 + cp $3 + jr z, .asm_f664 + push hl + srl a + add $2 + ld [wcc49], a + call LoadMonData + callba CalcLevelFromExperience + ld a, d + ld [W_CURENEMYLVL], a ; W_CURENEMYLVL + pop hl + ld bc, wBoxMon2 - wBoxMon1 + add hl, bc + ld [hli], a + ld d, h + ld e, l + ld bc, $ffee + add hl, bc + ld b, $1 + call CalcStats +.asm_f664 + and a + ret + + +FlagActionPredef: + call GetPredefRegisters + +FlagAction: +; 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: +; 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, $0006 + call AddNTimes + ld de, wcd6d + ld a, BANK(Moves) + call FarCopyData + ld a, [wcd72] ; default pp + + 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 + + +DivideBCDPredef:: +DivideBCDPredef2:: +DivideBCDPredef3:: +DivideBCDPredef4:: + call GetPredefRegisters + +DivideBCD:: + xor a + ld [$ffa5], a + ld [$ffa6], a + ld [$ffa7], a + ld d, $1 +.asm_f72a + ld a, [$ffa2] + and $f0 + jr nz, .asm_f75b + inc d + ld a, [$ffa2] + swap a + and $f0 + ld b, a + ld a, [$ffa3] + swap a + ld [$ffa3], a + and $f + or b + ld [$ffa2], a + ld a, [$ffa3] + and $f0 + ld b, a + ld a, [$ffa4] + swap a + ld [$ffa4], a + and $f + or b + ld [$ffa3], a + ld a, [$ffa4] + and $f0 + ld [$ffa4], a + jr .asm_f72a +.asm_f75b + push de + push de + call Func_f800 + pop de + ld a, b + swap a + and $f0 + ld [$ffa5], a + dec d + jr z, .asm_f7bc + push de + call Func_f7d7 + call Func_f800 + pop de + ld a, [$ffa5] + or b + ld [$ffa5], a + dec d + jr z, .asm_f7bc + push de + call Func_f7d7 + call Func_f800 + pop de + ld a, b + swap a + and $f0 + ld [$ffa6], a + dec d + jr z, .asm_f7bc + push de + call Func_f7d7 + call Func_f800 + pop de + ld a, [$ffa6] + or b + ld [$ffa6], a + dec d + jr z, .asm_f7bc + push de + call Func_f7d7 + call Func_f800 + pop de + ld a, b + swap a + and $f0 + ld [$ffa7], a + dec d + jr z, .asm_f7bc + push de + call Func_f7d7 + call Func_f800 + pop de + ld a, [$ffa7] + or b + ld [$ffa7], a +.asm_f7bc + ld a, [$ffa5] + ld [$ffa2], a + ld a, [$ffa6] + ld [$ffa3], a + ld a, [$ffa7] + ld [$ffa4], a + pop de + ld a, $6 + sub d + and a + ret z +.asm_f7ce + push af + call Func_f7d7 + pop af + dec a + jr nz, .asm_f7ce + ret + +Func_f7d7: ; f7d7 (3:77d7) + ld a, [$ffa4] + swap a + and $f + ld b, a + ld a, [$ffa3] + swap a + ld [$ffa3], a + and $f0 + or b + ld [$ffa4], a + ld a, [$ffa3] + and $f + ld b, a + ld a, [$ffa2] + swap a + ld [$ffa2], a + and $f0 + or b + ld [$ffa3], a + ld a, [$ffa2] + and $f + ld [$ffa2], a + ret + +Func_f800: ; f800 (3:7800) + ld bc, $3 +.asm_f803 + ld de, $ff9f + ld hl, $ffa2 + push bc + call StringCmp + pop bc + ret c + inc b + ld de, $ffa1 + ld hl, $ffa4 + push bc + call SubBCD + pop bc + jr .asm_f803 + + +AddBCDPredef:: + call GetPredefRegisters + +AddBCD:: + and a + ld b, c +.add + ld a, [de] + adc [hl] + daa + ld [de], a + dec de + dec hl + dec c + jr nz, .add + jr nc, .done + ld a, $99 + inc de +.fill + ld [de], a + inc de + dec b + jr nz, .fill +.done + ret + + +SubBCDPredef:: + call GetPredefRegisters + +SubBCD:: + and a + ld b, c +.sub + ld a, [de] + sbc [hl] + daa + ld [de], a + dec de + dec hl + dec c + jr nz, .sub + jr nc, .done + ld a, $00 + inc de +.fill + ld [de], a + inc de + dec b + jr nz, .fill + scf +.done + ret + + +InitPlayerData: +InitPlayerData2: + + call Random + ld a, [hRandomSub] + ld [wPlayerID], a + + call Random + ld a, [hRandomAdd] + ld [wPlayerID + 1], a + + ld a, $ff + ld [wd71b], a ; XXX what's this? + + ld hl, wPartyCount + call InitializeEmptyList + ld hl, W_NUMINBOX + 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 [wcc49], a + + ld hl, W_OBTAINEDBADGES + ld [hli], a + + ld [hl], a + + ld hl, wPlayerCoins + ld [hli], a + ld [hl], a + + ld hl, W_GAMEPROGRESSFLAGS + ld bc, $c8 + call FillMemory ; clear all game progress flags + + jp InitializeMissableObjectsFlags + +InitializeEmptyList: + xor a ; count + ld [hli], a + dec a ; terminator + ld [hl], a + ret + + +IsItemInBag_: ; f8a5 (3:78a5) + call GetPredefRegisters + ld hl, wNumBagItems ; wNumBagItems +.asm_f8ab + inc hl + ld a, [hli] + cp $ff + jr z, .asm_f8b7 + cp b + jr nz, .asm_f8ab + ld a, [hl] + ld b, a + ret +.asm_f8b7 + ld b, $0 + ret + +FindPathToPlayer: ; f8ba (3:78ba) + xor a + ld hl, $ff97 + ld [hli], a + ld [hli], a + ld [hli], a + ld [hl], a + ld hl, wNPCMovementDirections2 + ld de, $0 +.loop + ld a, [$ff99] + ld b, a + ld a, [$ff95] ; Y distance in steps + call CalcDifference + ld d, a + and a + jr nz, .asm_f8da + ld a, [$ff98] + set 0, a + ld [$ff98], a +.asm_f8da + ld a, [$ff9a] + ld b, a + ld a, [$ff96] ; X distance in steps + call CalcDifference + ld e, a + and a + jr nz, .asm_f8ec + ld a, [$ff98] + set 1, a + ld [$ff98], a +.asm_f8ec + ld a, [$ff98] + cp $3 + jr z, .done + ld a, e + cp d + jr c, .asm_f90a + ld a, [$ff9d] + bit 1, a + jr nz, .asm_f900 + ld d, NPC_MOVEMENT_RIGHT + jr .asm_f902 +.asm_f900 + ld d, NPC_MOVEMENT_LEFT +.asm_f902 + ld a, [$ff9a] + add $1 + ld [$ff9a], a + jr .asm_f91c +.asm_f90a + ld a, [$ff9d] + bit 0, a + jr nz, .asm_f914 + ld d, NPC_MOVEMENT_DOWN + jr .asm_f916 +.asm_f914 + ld d, NPC_MOVEMENT_UP +.asm_f916 + ld a, [$ff99] + add $1 + ld [$ff99], a +.asm_f91c + ld a, d + ld [hli], a + ld a, [$ff97] + inc a + ld [$ff97], a + jp .loop +.done + ld [hl], $ff + ret + +CalcPositionOfPlayerRelativeToNPC: ; f929 (3:7929) + xor a + ld [$ff9d], 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, [$ff95] ; sprite offset + 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, $ff9d + bit 0, [hl] + set 0, [hl] + pop hl + jr .divideYDistance +.NPCSouthOfOrAlignedWithPlayer + push hl + ld hl, $ff9d + bit 0, [hl] + res 0, [hl] + pop hl +.divideYDistance + push hl + ld hl, $ffe5 + ld [hli], a + ld a, 16 + ld [hli], a + call DivideBytes ; divide Y absolute distance by 16 + ld a, [hl] ; quotient + ld [$ff95], 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, $ff9d + bit 1, [hl] + set 1, [hl] + pop hl + jr .divideXDistance +.NPCEastOfOrAlignedWithPlayer + push hl + ld hl, $ff9d + bit 1, [hl] + res 1, [hl] + pop hl +.divideXDistance + ld [$ffe5], a + ld a, 16 + ld [$ffe6], a + call DivideBytes ; divide X absolute distance by 16 + ld a, [$ffe7] ; quotient + ld [$ff96], a + ld a, [$ff9b] + and a + ret z + ld a, [$ff9d] + cpl + and $3 + ld [$ff9d], a + ret + +ConvertNPCMovementDirectionsToJoypadMasks: ; f9a0 (3:79a0) + ld a, [$ff95] + 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, [$ff95] + dec a + ld [$ff95], a + jr nz, .loop + ret + +ConvertNPCMovementDirectionToJoypadMask: ; f9bf (3:79bf) + 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: ; f9d2 (3:79d2) + 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 + +Func_f9db: ; f9db (3:79db) + ret + +INCLUDE "engine/hp_bar.asm" + +INCLUDE "engine/hidden_object_functions3.asm" + + +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" + + +SECTION "Graphics", ROMX, BANK[GFX] + +PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp" +FontGraphics: INCBIN "gfx/font.1bpp" +ABTiles: INCBIN "gfx/AB.2bpp" +HpBarAndStatusGraphics: INCBIN "gfx/hp_bar_and_status.2bpp" +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" +TextBoxGraphics: INCBIN "gfx/text_box.2bpp" +PokedexTileGraphics: INCBIN "gfx/pokedex.2bpp" +WorldMapTileGraphics: INCBIN "gfx/town_map.2bpp" +PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp" + + +SECTION "Battle (bank 4)", ROMX, BANK[$4] + +INCLUDE "engine/overworld/is_player_just_outside_map.asm" +INCLUDE "engine/menu/status_screen.asm" +INCLUDE "engine/menu/party_menu.asm" + +RedPicFront:: INCBIN "pic/trainer/red.pic" +ShrinkPic1:: INCBIN "pic/trainer/shrink1.pic" +ShrinkPic2:: INCBIN "pic/trainer/shrink2.pic" + +INCLUDE "engine/turn_sprite.asm" +INCLUDE "engine/menu/start_sub_menus.asm" +INCLUDE "engine/items/tms.asm" +INCLUDE "engine/battle/end_of_battle.asm" +INCLUDE "engine/battle/wild_encounters.asm" +INCLUDE "engine/battle/moveEffects/recoil_effect.asm" +INCLUDE "engine/battle/moveEffects/conversion_effect.asm" +INCLUDE "engine/battle/moveEffects/haze_effect.asm" +INCLUDE "engine/battle/get_trainer_name.asm" + + +SECTION "NPC Sprites 2", ROMX, BANK[NPC_SPRITES_2] + +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" + + +SECTION "Battle (bank 5)", ROMX, BANK[$5] + +INCLUDE "engine/load_pokedex_tiles.asm" +INCLUDE "engine/overworld/map_sprites.asm" +INCLUDE "engine/overworld/emotion_bubbles.asm" +INCLUDE "engine/evolve_trade.asm" +INCLUDE "engine/battle/moveEffects/substitute_effect.asm" +INCLUDE "engine/menu/pc.asm" + + +SECTION "bank6",ROMX,BANK[$6] + +INCLUDE "data/mapHeaders/celadoncity.asm" +INCLUDE "data/mapObjects/celadoncity.asm" +CeladonCityBlocks: INCBIN "maps/celadoncity.blk" + +INCLUDE "data/mapHeaders/pallettown.asm" +INCLUDE "data/mapObjects/pallettown.asm" +PalletTownBlocks: INCBIN "maps/pallettown.blk" + +INCLUDE "data/mapHeaders/viridiancity.asm" +INCLUDE "data/mapObjects/viridiancity.asm" +ViridianCityBlocks: INCBIN "maps/viridiancity.blk" + +INCLUDE "data/mapHeaders/pewtercity.asm" +INCLUDE "data/mapObjects/pewtercity.asm" +PewterCityBlocks: INCBIN "maps/pewtercity.blk" + +INCLUDE "data/mapHeaders/ceruleancity.asm" +INCLUDE "data/mapObjects/ceruleancity.asm" +CeruleanCityBlocks: INCBIN "maps/ceruleancity.blk" + +INCLUDE "data/mapHeaders/vermilioncity.asm" +INCLUDE "data/mapObjects/vermilioncity.asm" +VermilionCityBlocks: INCBIN "maps/vermilioncity.blk" + +INCLUDE "data/mapHeaders/fuchsiacity.asm" +INCLUDE "data/mapObjects/fuchsiacity.asm" +FuchsiaCityBlocks: INCBIN "maps/fuchsiacity.blk" + +INCLUDE "engine/play_time.asm" + +INCLUDE "scripts/pallettown.asm" +INCLUDE "scripts/viridiancity.asm" +INCLUDE "scripts/pewtercity.asm" +INCLUDE "scripts/ceruleancity.asm" +INCLUDE "scripts/vermilioncity.asm" +INCLUDE "scripts/celadoncity.asm" +INCLUDE "scripts/fuchsiacity.asm" + +INCLUDE "data/mapHeaders/blueshouse.asm" +INCLUDE "scripts/blueshouse.asm" +INCLUDE "data/mapObjects/blueshouse.asm" +BluesHouseBlocks: INCBIN "maps/blueshouse.blk" + +INCLUDE "data/mapHeaders/vermilionhouse3.asm" +INCLUDE "scripts/vermilionhouse3.asm" +INCLUDE "data/mapObjects/vermilionhouse3.asm" +VermilionHouse3Blocks: INCBIN "maps/vermilionhouse3.blk" + +INCLUDE "data/mapHeaders/indigoplateaulobby.asm" +INCLUDE "scripts/indigoplateaulobby.asm" +INCLUDE "data/mapObjects/indigoplateaulobby.asm" +IndigoPlateauLobbyBlocks: INCBIN "maps/indigoplateaulobby.blk" + +INCLUDE "data/mapHeaders/silphco4.asm" +INCLUDE "scripts/silphco4.asm" +INCLUDE "data/mapObjects/silphco4.asm" +SilphCo4Blocks: INCBIN "maps/silphco4.blk" + +INCLUDE "data/mapHeaders/silphco5.asm" +INCLUDE "scripts/silphco5.asm" +INCLUDE "data/mapObjects/silphco5.asm" +SilphCo5Blocks: INCBIN "maps/silphco5.blk" + +INCLUDE "data/mapHeaders/silphco6.asm" +INCLUDE "scripts/silphco6.asm" +INCLUDE "data/mapObjects/silphco6.asm" +SilphCo6Blocks: INCBIN "maps/silphco6.blk" + +INCLUDE "engine/overworld/npc_movement.asm" +INCLUDE "engine/overworld/doors.asm" +INCLUDE "engine/overworld/ledges.asm" + + +SECTION "bank7",ROMX,BANK[$7] + +INCLUDE "data/mapHeaders/cinnabarisland.asm" +INCLUDE "data/mapObjects/cinnabarisland.asm" +CinnabarIslandBlocks: INCBIN "maps/cinnabarisland.blk" + +INCLUDE "data/mapHeaders/route1.asm" +INCLUDE "data/mapObjects/route1.asm" +Route1Blocks: INCBIN "maps/route1.blk" + +UndergroundPathEntranceRoute8Blocks: INCBIN "maps/undergroundpathentranceroute8.blk" + +OaksLabBlocks: INCBIN "maps/oakslab.blk" + +Route16HouseBlocks: +Route2HouseBlocks: +SaffronHouse1Blocks: +SaffronHouse2Blocks: +VermilionHouse1Blocks: +NameRaterBlocks: +LavenderHouse1Blocks: +LavenderHouse2Blocks: +CeruleanHouse1Blocks: +PewterHouse1Blocks: +PewterHouse2Blocks: +ViridianHouseBlocks: INCBIN "maps/viridianhouse.blk" + +CeladonMansion5Blocks: +SchoolBlocks: INCBIN "maps/school.blk" + +CeruleanHouseTrashedBlocks: INCBIN "maps/ceruleanhousetrashed.blk" + +DiglettsCaveEntranceRoute11Blocks: +DiglettsCaveRoute2Blocks: INCBIN "maps/diglettscaveroute2.blk" + +INCLUDE "text/monster_names.asm" + +INCLUDE "engine/clear_save.asm" + +INCLUDE "engine/predefs7.asm" + +INCLUDE "scripts/cinnabarisland.asm" + +INCLUDE "scripts/route1.asm" + +INCLUDE "data/mapHeaders/oakslab.asm" +INCLUDE "scripts/oakslab.asm" +INCLUDE "data/mapObjects/oakslab.asm" + +INCLUDE "data/mapHeaders/viridianmart.asm" +INCLUDE "scripts/viridianmart.asm" +INCLUDE "data/mapObjects/viridianmart.asm" +ViridianMartBlocks: INCBIN "maps/viridianmart.blk" + +INCLUDE "data/mapHeaders/school.asm" +INCLUDE "scripts/school.asm" +INCLUDE "data/mapObjects/school.asm" + +INCLUDE "data/mapHeaders/viridianhouse.asm" +INCLUDE "scripts/viridianhouse.asm" +INCLUDE "data/mapObjects/viridianhouse.asm" + +INCLUDE "data/mapHeaders/pewterhouse1.asm" +INCLUDE "scripts/pewterhouse1.asm" +INCLUDE "data/mapObjects/pewterhouse1.asm" + +INCLUDE "data/mapHeaders/pewterhouse2.asm" +INCLUDE "scripts/pewterhouse2.asm" +INCLUDE "data/mapObjects/pewterhouse2.asm" + +INCLUDE "data/mapHeaders/ceruleanhousetrashed.asm" +INCLUDE "scripts/ceruleanhousetrashed.asm" +INCLUDE "data/mapObjects/ceruleanhousetrashed.asm" + +INCLUDE "data/mapHeaders/ceruleanhouse1.asm" +INCLUDE "scripts/ceruleanhouse1.asm" +INCLUDE "data/mapObjects/ceruleanhouse1.asm" + +INCLUDE "data/mapHeaders/bikeshop.asm" +INCLUDE "scripts/bikeshop.asm" +INCLUDE "data/mapObjects/bikeshop.asm" +BikeShopBlocks: INCBIN "maps/bikeshop.blk" + +INCLUDE "data/mapHeaders/lavenderhouse1.asm" +INCLUDE "scripts/lavenderhouse1.asm" +INCLUDE "data/mapObjects/lavenderhouse1.asm" + +INCLUDE "data/mapHeaders/lavenderhouse2.asm" +INCLUDE "scripts/lavenderhouse2.asm" +INCLUDE "data/mapObjects/lavenderhouse2.asm" + +INCLUDE "data/mapHeaders/namerater.asm" +INCLUDE "scripts/namerater.asm" +INCLUDE "data/mapObjects/namerater.asm" + +INCLUDE "data/mapHeaders/vermilionhouse1.asm" +INCLUDE "scripts/vermilionhouse1.asm" +INCLUDE "data/mapObjects/vermilionhouse1.asm" + +INCLUDE "data/mapHeaders/vermiliondock.asm" +INCLUDE "scripts/vermiliondock.asm" +INCLUDE "data/mapObjects/vermiliondock.asm" +VermilionDockBlocks: INCBIN "maps/vermiliondock.blk" + +INCLUDE "data/mapHeaders/celadonmansion5.asm" +INCLUDE "scripts/celadonmansion5.asm" +INCLUDE "data/mapObjects/celadonmansion5.asm" + +INCLUDE "data/mapHeaders/fuchsiamart.asm" +INCLUDE "scripts/fuchsiamart.asm" +INCLUDE "data/mapObjects/fuchsiamart.asm" +FuchsiaMartBlocks: INCBIN "maps/fuchsiamart.blk" + +INCLUDE "data/mapHeaders/saffronhouse1.asm" +INCLUDE "scripts/saffronhouse1.asm" +INCLUDE "data/mapObjects/saffronhouse1.asm" + +INCLUDE "data/mapHeaders/saffronhouse2.asm" +INCLUDE "scripts/saffronhouse2.asm" +INCLUDE "data/mapObjects/saffronhouse2.asm" + +INCLUDE "data/mapHeaders/diglettscaveroute2.asm" +INCLUDE "scripts/diglettscaveroute2.asm" +INCLUDE "data/mapObjects/diglettscaveroute2.asm" + +INCLUDE "data/mapHeaders/route2house.asm" +INCLUDE "scripts/route2house.asm" +INCLUDE "data/mapObjects/route2house.asm" + +INCLUDE "data/mapHeaders/route5gate.asm" +INCLUDE "scripts/route5gate.asm" +INCLUDE "data/mapObjects/route5gate.asm" +Route5GateBlocks: INCBIN "maps/route5gate.blk" + +INCLUDE "data/mapHeaders/route6gate.asm" +INCLUDE "scripts/route6gate.asm" +INCLUDE "data/mapObjects/route6gate.asm" +Route6GateBlocks: INCBIN "maps/route6gate.blk" + +INCLUDE "data/mapHeaders/route7gate.asm" +INCLUDE "scripts/route7gate.asm" +INCLUDE "data/mapObjects/route7gate.asm" +Route7GateBlocks: INCBIN "maps/route7gate.blk" + +INCLUDE "data/mapHeaders/route8gate.asm" +INCLUDE "scripts/route8gate.asm" +INCLUDE "data/mapObjects/route8gate.asm" +Route8GateBlocks: INCBIN "maps/route8gate.blk" + +INCLUDE "data/mapHeaders/undergroundpathentranceroute8.asm" +INCLUDE "scripts/undergroundpathentranceroute8.asm" +INCLUDE "data/mapObjects/undergroundpathentranceroute8.asm" + +INCLUDE "data/mapHeaders/powerplant.asm" +INCLUDE "scripts/powerplant.asm" +INCLUDE "data/mapObjects/powerplant.asm" +PowerPlantBlocks: INCBIN "maps/powerplant.blk" + +INCLUDE "data/mapHeaders/diglettscaveroute11.asm" +INCLUDE "scripts/diglettscaveroute11.asm" +INCLUDE "data/mapObjects/diglettscaveroute11.asm" + +INCLUDE "data/mapHeaders/route16house.asm" +INCLUDE "scripts/route16house.asm" +INCLUDE "data/mapObjects/route16house.asm" + +INCLUDE "data/mapHeaders/route22gate.asm" +INCLUDE "scripts/route22gate.asm" +INCLUDE "data/mapObjects/route22gate.asm" +Route22GateBlocks: INCBIN "maps/route22gate.blk" + +INCLUDE "data/mapHeaders/billshouse.asm" +INCLUDE "scripts/billshouse.asm" +INCLUDE "data/mapObjects/billshouse.asm" +BillsHouseBlocks: INCBIN "maps/billshouse.blk" +IF DEF(_OPTION_BEACH_HOUSE) +INCLUDE "data/mapHeaders/beach_house.asm" +INCLUDE "scripts/beach_house.asm" +BeachHouseBlockdata: INCBIN "maps/beach_house.blk" +INCLUDE "data/mapObjects/beach_house.asm" +ENDC + +INCLUDE "engine/menu/oaks_pc.asm" + +INCLUDE "engine/hidden_object_functions7.asm" + + +SECTION "Pics 1", ROMX, BANK[PICS_1] + +RhydonPicFront:: INCBIN "pic/bmon/rhydon.pic" +RhydonPicBack:: INCBIN "pic/monback/rhydonb.pic" +KangaskhanPicFront:: INCBIN "pic/bmon/kangaskhan.pic" +KangaskhanPicBack:: INCBIN "pic/monback/kangaskhanb.pic" +NidoranMPicFront:: INCBIN "pic/bmon/nidoranm.pic" +NidoranMPicBack:: INCBIN "pic/monback/nidoranmb.pic" +ClefairyPicFront:: INCBIN "pic/bmon/clefairy.pic" +ClefairyPicBack:: INCBIN "pic/monback/clefairyb.pic" +SpearowPicFront:: INCBIN "pic/bmon/spearow.pic" +SpearowPicBack:: INCBIN "pic/monback/spearowb.pic" +VoltorbPicFront:: INCBIN "pic/bmon/voltorb.pic" +VoltorbPicBack:: INCBIN "pic/monback/voltorbb.pic" +NidokingPicFront:: INCBIN "pic/bmon/nidoking.pic" +NidokingPicBack:: INCBIN "pic/monback/nidokingb.pic" +SlowbroPicFront:: INCBIN "pic/bmon/slowbro.pic" +SlowbroPicBack:: INCBIN "pic/monback/slowbrob.pic" +IvysaurPicFront:: INCBIN "pic/bmon/ivysaur.pic" +IvysaurPicBack:: INCBIN "pic/monback/ivysaurb.pic" +ExeggutorPicFront:: INCBIN "pic/bmon/exeggutor.pic" +ExeggutorPicBack:: INCBIN "pic/monback/exeggutorb.pic" +LickitungPicFront:: INCBIN "pic/bmon/lickitung.pic" +LickitungPicBack:: INCBIN "pic/monback/lickitungb.pic" +ExeggcutePicFront:: INCBIN "pic/bmon/exeggcute.pic" +ExeggcutePicBack:: INCBIN "pic/monback/exeggcuteb.pic" +GrimerPicFront:: INCBIN "pic/bmon/grimer.pic" +GrimerPicBack:: INCBIN "pic/monback/grimerb.pic" +GengarPicFront:: INCBIN "pic/bmon/gengar.pic" +GengarPicBack:: INCBIN "pic/monback/gengarb.pic" +NidoranFPicFront:: INCBIN "pic/bmon/nidoranf.pic" +NidoranFPicBack:: INCBIN "pic/monback/nidoranfb.pic" +NidoqueenPicFront:: INCBIN "pic/bmon/nidoqueen.pic" +NidoqueenPicBack:: INCBIN "pic/monback/nidoqueenb.pic" +CubonePicFront:: INCBIN "pic/bmon/cubone.pic" +CubonePicBack:: INCBIN "pic/monback/cuboneb.pic" +RhyhornPicFront:: INCBIN "pic/bmon/rhyhorn.pic" +RhyhornPicBack:: INCBIN "pic/monback/rhyhornb.pic" +LaprasPicFront:: INCBIN "pic/bmon/lapras.pic" +LaprasPicBack:: INCBIN "pic/monback/laprasb.pic" +ArcaninePicFront:: INCBIN "pic/bmon/arcanine.pic" +ArcaninePicBack:: INCBIN "pic/monback/arcanineb.pic" +GyaradosPicFront:: INCBIN "pic/bmon/gyarados.pic" +GyaradosPicBack:: INCBIN "pic/monback/gyaradosb.pic" +ShellderPicFront:: INCBIN "pic/bmon/shellder.pic" +ShellderPicBack:: INCBIN "pic/monback/shellderb.pic" +TentacoolPicFront:: INCBIN "pic/bmon/tentacool.pic" +TentacoolPicBack:: INCBIN "pic/monback/tentacoolb.pic" +GastlyPicFront:: INCBIN "pic/bmon/gastly.pic" +GastlyPicBack:: INCBIN "pic/monback/gastlyb.pic" +ScytherPicFront:: INCBIN "pic/bmon/scyther.pic" +ScytherPicBack:: INCBIN "pic/monback/scytherb.pic" +StaryuPicFront:: INCBIN "pic/bmon/staryu.pic" +StaryuPicBack:: INCBIN "pic/monback/staryub.pic" +BlastoisePicFront:: INCBIN "pic/bmon/blastoise.pic" +BlastoisePicBack:: INCBIN "pic/monback/blastoiseb.pic" +PinsirPicFront:: INCBIN "pic/bmon/pinsir.pic" +PinsirPicBack:: INCBIN "pic/monback/pinsirb.pic" +TangelaPicFront:: INCBIN "pic/bmon/tangela.pic" +TangelaPicBack:: INCBIN "pic/monback/tangelab.pic" + + +SECTION "Battle (bank 9)", ROMX, BANK[$9] +INCLUDE "engine/battle/print_type.asm" +INCLUDE "engine/battle/save_trainer_name.asm" +INCLUDE "engine/battle/moveEffects/focus_energy_effect.asm" + + +SECTION "Pics 2", ROMX, BANK[PICS_2] + +GrowlithePicFront:: INCBIN "pic/bmon/growlithe.pic" +GrowlithePicBack:: INCBIN "pic/monback/growlitheb.pic" +OnixPicFront:: INCBIN "pic/bmon/onix.pic" +OnixPicBack:: INCBIN "pic/monback/onixb.pic" +FearowPicFront:: INCBIN "pic/bmon/fearow.pic" +FearowPicBack:: INCBIN "pic/monback/fearowb.pic" +PidgeyPicFront:: INCBIN "pic/bmon/pidgey.pic" +PidgeyPicBack:: INCBIN "pic/monback/pidgeyb.pic" +SlowpokePicFront:: INCBIN "pic/bmon/slowpoke.pic" +SlowpokePicBack:: INCBIN "pic/monback/slowpokeb.pic" +KadabraPicFront:: INCBIN "pic/bmon/kadabra.pic" +KadabraPicBack:: INCBIN "pic/monback/kadabrab.pic" +GravelerPicFront:: INCBIN "pic/bmon/graveler.pic" +GravelerPicBack:: INCBIN "pic/monback/gravelerb.pic" +ChanseyPicFront:: INCBIN "pic/bmon/chansey.pic" +ChanseyPicBack:: INCBIN "pic/monback/chanseyb.pic" +MachokePicFront:: INCBIN "pic/bmon/machoke.pic" +MachokePicBack:: INCBIN "pic/monback/machokeb.pic" +MrMimePicFront:: INCBIN "pic/bmon/mr.mime.pic" +MrMimePicBack:: INCBIN "pic/monback/mr.mimeb.pic" +HitmonleePicFront:: INCBIN "pic/bmon/hitmonlee.pic" +HitmonleePicBack:: INCBIN "pic/monback/hitmonleeb.pic" +HitmonchanPicFront:: INCBIN "pic/bmon/hitmonchan.pic" +HitmonchanPicBack:: INCBIN "pic/monback/hitmonchanb.pic" +ArbokPicFront:: INCBIN "pic/bmon/arbok.pic" +ArbokPicBack:: INCBIN "pic/monback/arbokb.pic" +ParasectPicFront:: INCBIN "pic/bmon/parasect.pic" +ParasectPicBack:: INCBIN "pic/monback/parasectb.pic" +PsyduckPicFront:: INCBIN "pic/bmon/psyduck.pic" +PsyduckPicBack:: INCBIN "pic/monback/psyduckb.pic" +DrowzeePicFront:: INCBIN "pic/bmon/drowzee.pic" +DrowzeePicBack:: INCBIN "pic/monback/drowzeeb.pic" +GolemPicFront:: INCBIN "pic/bmon/golem.pic" +GolemPicBack:: INCBIN "pic/monback/golemb.pic" +MagmarPicFront:: INCBIN "pic/bmon/magmar.pic" +MagmarPicBack:: INCBIN "pic/monback/magmarb.pic" +ElectabuzzPicFront:: INCBIN "pic/bmon/electabuzz.pic" +ElectabuzzPicBack:: INCBIN "pic/monback/electabuzzb.pic" +MagnetonPicFront:: INCBIN "pic/bmon/magneton.pic" +MagnetonPicBack:: INCBIN "pic/monback/magnetonb.pic" +KoffingPicFront:: INCBIN "pic/bmon/koffing.pic" +KoffingPicBack:: INCBIN "pic/monback/koffingb.pic" +MankeyPicFront:: INCBIN "pic/bmon/mankey.pic" +MankeyPicBack:: INCBIN "pic/monback/mankeyb.pic" +SeelPicFront:: INCBIN "pic/bmon/seel.pic" +SeelPicBack:: INCBIN "pic/monback/seelb.pic" +DiglettPicFront:: INCBIN "pic/bmon/diglett.pic" +DiglettPicBack:: INCBIN "pic/monback/diglettb.pic" +TaurosPicFront:: INCBIN "pic/bmon/tauros.pic" +TaurosPicBack:: INCBIN "pic/monback/taurosb.pic" +FarfetchdPicFront:: INCBIN "pic/bmon/farfetchd.pic" +FarfetchdPicBack:: INCBIN "pic/monback/farfetchdb.pic" +VenonatPicFront:: INCBIN "pic/bmon/venonat.pic" +VenonatPicBack:: INCBIN "pic/monback/venonatb.pic" +DragonitePicFront:: INCBIN "pic/bmon/dragonite.pic" +DragonitePicBack:: INCBIN "pic/monback/dragoniteb.pic" +DoduoPicFront:: INCBIN "pic/bmon/doduo.pic" +DoduoPicBack:: INCBIN "pic/monback/doduob.pic" +PoliwagPicFront:: INCBIN "pic/bmon/poliwag.pic" +PoliwagPicBack:: INCBIN "pic/monback/poliwagb.pic" +JynxPicFront:: INCBIN "pic/bmon/jynx.pic" +JynxPicBack:: INCBIN "pic/monback/jynxb.pic" +MoltresPicFront:: INCBIN "pic/bmon/moltres.pic" +MoltresPicBack:: INCBIN "pic/monback/moltresb.pic" + + +SECTION "Battle (bank A)", ROMX, BANK[$A] +INCLUDE "engine/battle/moveEffects/leech_seed_effect.asm" + + +SECTION "Pics 3", ROMX, BANK[PICS_3] + +ArticunoPicFront:: INCBIN "pic/bmon/articuno.pic" +ArticunoPicBack:: INCBIN "pic/monback/articunob.pic" +ZapdosPicFront:: INCBIN "pic/bmon/zapdos.pic" +ZapdosPicBack:: INCBIN "pic/monback/zapdosb.pic" +DittoPicFront:: INCBIN "pic/bmon/ditto.pic" +DittoPicBack:: INCBIN "pic/monback/dittob.pic" +MeowthPicFront:: INCBIN "pic/bmon/meowth.pic" +MeowthPicBack:: INCBIN "pic/monback/meowthb.pic" +KrabbyPicFront:: INCBIN "pic/bmon/krabby.pic" +KrabbyPicBack:: INCBIN "pic/monback/krabbyb.pic" +VulpixPicFront:: INCBIN "pic/bmon/vulpix.pic" +VulpixPicBack:: INCBIN "pic/monback/vulpixb.pic" +NinetalesPicFront:: INCBIN "pic/bmon/ninetales.pic" +NinetalesPicBack:: INCBIN "pic/monback/ninetalesb.pic" +PikachuPicFront:: INCBIN "pic/bmon/pikachu.pic" +PikachuPicBack:: INCBIN "pic/monback/pikachub.pic" +RaichuPicFront:: INCBIN "pic/bmon/raichu.pic" +RaichuPicBack:: INCBIN "pic/monback/raichub.pic" +DratiniPicFront:: INCBIN "pic/bmon/dratini.pic" +DratiniPicBack:: INCBIN "pic/monback/dratinib.pic" +DragonairPicFront:: INCBIN "pic/bmon/dragonair.pic" +DragonairPicBack:: INCBIN "pic/monback/dragonairb.pic" +KabutoPicFront:: INCBIN "pic/bmon/kabuto.pic" +KabutoPicBack:: INCBIN "pic/monback/kabutob.pic" +KabutopsPicFront:: INCBIN "pic/bmon/kabutops.pic" +KabutopsPicBack:: INCBIN "pic/monback/kabutopsb.pic" +HorseaPicFront:: INCBIN "pic/bmon/horsea.pic" +HorseaPicBack:: INCBIN "pic/monback/horseab.pic" +SeadraPicFront:: INCBIN "pic/bmon/seadra.pic" +SeadraPicBack:: INCBIN "pic/monback/seadrab.pic" +SandshrewPicFront:: INCBIN "pic/bmon/sandshrew.pic" +SandshrewPicBack:: INCBIN "pic/monback/sandshrewb.pic" +SandslashPicFront:: INCBIN "pic/bmon/sandslash.pic" +SandslashPicBack:: INCBIN "pic/monback/sandslashb.pic" +OmanytePicFront:: INCBIN "pic/bmon/omanyte.pic" +OmanytePicBack:: INCBIN "pic/monback/omanyteb.pic" +OmastarPicFront:: INCBIN "pic/bmon/omastar.pic" +OmastarPicBack:: INCBIN "pic/monback/omastarb.pic" +JigglypuffPicFront:: INCBIN "pic/bmon/jigglypuff.pic" +JigglypuffPicBack:: INCBIN "pic/monback/jigglypuffb.pic" +WigglytuffPicFront:: INCBIN "pic/bmon/wigglytuff.pic" +WigglytuffPicBack:: INCBIN "pic/monback/wigglytuffb.pic" +EeveePicFront:: INCBIN "pic/bmon/eevee.pic" +EeveePicBack:: INCBIN "pic/monback/eeveeb.pic" +FlareonPicFront:: INCBIN "pic/bmon/flareon.pic" +FlareonPicBack:: INCBIN "pic/monback/flareonb.pic" +JolteonPicFront:: INCBIN "pic/bmon/jolteon.pic" +JolteonPicBack:: INCBIN "pic/monback/jolteonb.pic" +VaporeonPicFront:: INCBIN "pic/bmon/vaporeon.pic" +VaporeonPicBack:: INCBIN "pic/monback/vaporeonb.pic" +MachopPicFront:: INCBIN "pic/bmon/machop.pic" +MachopPicBack:: INCBIN "pic/monback/machopb.pic" +ZubatPicFront:: INCBIN "pic/bmon/zubat.pic" +ZubatPicBack:: INCBIN "pic/monback/zubatb.pic" +EkansPicFront:: INCBIN "pic/bmon/ekans.pic" +EkansPicBack:: INCBIN "pic/monback/ekansb.pic" +ParasPicFront:: INCBIN "pic/bmon/paras.pic" +ParasPicBack:: INCBIN "pic/monback/parasb.pic" +PoliwhirlPicFront:: INCBIN "pic/bmon/poliwhirl.pic" +PoliwhirlPicBack:: INCBIN "pic/monback/poliwhirlb.pic" +PoliwrathPicFront:: INCBIN "pic/bmon/poliwrath.pic" +PoliwrathPicBack:: INCBIN "pic/monback/poliwrathb.pic" +WeedlePicFront:: INCBIN "pic/bmon/weedle.pic" +WeedlePicBack:: INCBIN "pic/monback/weedleb.pic" +KakunaPicFront:: INCBIN "pic/bmon/kakuna.pic" +KakunaPicBack:: INCBIN "pic/monback/kakunab.pic" +BeedrillPicFront:: INCBIN "pic/bmon/beedrill.pic" +BeedrillPicBack:: INCBIN "pic/monback/beedrillb.pic" + +FossilKabutopsPic:: INCBIN "pic/bmon/fossilkabutops.pic" + + +SECTION "Battle (bank B)", ROMX, BANK[$B] + +INCLUDE "engine/battle/display_effectiveness.asm" + +TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp" +BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp" +CircleTile: INCBIN "gfx/circle_tile.2bpp" +BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp" + +INCLUDE "engine/items/tmhm.asm" +INCLUDE "engine/battle/scale_sprites.asm" +INCLUDE "engine/battle/moveEffects/pay_day_effect.asm" +INCLUDE "engine/game_corner_slots2.asm" + + +SECTION "Pics 4", ROMX, BANK[PICS_4] + +DodrioPicFront:: INCBIN "pic/bmon/dodrio.pic" +DodrioPicBack:: INCBIN "pic/monback/dodriob.pic" +PrimeapePicFront:: INCBIN "pic/bmon/primeape.pic" +PrimeapePicBack:: INCBIN "pic/monback/primeapeb.pic" +DugtrioPicFront:: INCBIN "pic/bmon/dugtrio.pic" +DugtrioPicBack:: INCBIN "pic/monback/dugtriob.pic" +VenomothPicFront:: INCBIN "pic/bmon/venomoth.pic" +VenomothPicBack:: INCBIN "pic/monback/venomothb.pic" +DewgongPicFront:: INCBIN "pic/bmon/dewgong.pic" +DewgongPicBack:: INCBIN "pic/monback/dewgongb.pic" +CaterpiePicFront:: INCBIN "pic/bmon/caterpie.pic" +CaterpiePicBack:: INCBIN "pic/monback/caterpieb.pic" +MetapodPicFront:: INCBIN "pic/bmon/metapod.pic" +MetapodPicBack:: INCBIN "pic/monback/metapodb.pic" +ButterfreePicFront:: INCBIN "pic/bmon/butterfree.pic" +ButterfreePicBack:: INCBIN "pic/monback/butterfreeb.pic" +MachampPicFront:: INCBIN "pic/bmon/machamp.pic" +MachampPicBack:: INCBIN "pic/monback/machampb.pic" +GolduckPicFront:: INCBIN "pic/bmon/golduck.pic" +GolduckPicBack:: INCBIN "pic/monback/golduckb.pic" +HypnoPicFront:: INCBIN "pic/bmon/hypno.pic" +HypnoPicBack:: INCBIN "pic/monback/hypnob.pic" +GolbatPicFront:: INCBIN "pic/bmon/golbat.pic" +GolbatPicBack:: INCBIN "pic/monback/golbatb.pic" +MewtwoPicFront:: INCBIN "pic/bmon/mewtwo.pic" +MewtwoPicBack:: INCBIN "pic/monback/mewtwob.pic" +SnorlaxPicFront:: INCBIN "pic/bmon/snorlax.pic" +SnorlaxPicBack:: INCBIN "pic/monback/snorlaxb.pic" +MagikarpPicFront:: INCBIN "pic/bmon/magikarp.pic" +MagikarpPicBack:: INCBIN "pic/monback/magikarpb.pic" +MukPicFront:: INCBIN "pic/bmon/muk.pic" +MukPicBack:: INCBIN "pic/monback/mukb.pic" +KinglerPicFront:: INCBIN "pic/bmon/kingler.pic" +KinglerPicBack:: INCBIN "pic/monback/kinglerb.pic" +CloysterPicFront:: INCBIN "pic/bmon/cloyster.pic" +CloysterPicBack:: INCBIN "pic/monback/cloysterb.pic" +ElectrodePicFront:: INCBIN "pic/bmon/electrode.pic" +ElectrodePicBack:: INCBIN "pic/monback/electrodeb.pic" +ClefablePicFront:: INCBIN "pic/bmon/clefable.pic" +ClefablePicBack:: INCBIN "pic/monback/clefableb.pic" +WeezingPicFront:: INCBIN "pic/bmon/weezing.pic" +WeezingPicBack:: INCBIN "pic/monback/weezingb.pic" +PersianPicFront:: INCBIN "pic/bmon/persian.pic" +PersianPicBack:: INCBIN "pic/monback/persianb.pic" +MarowakPicFront:: INCBIN "pic/bmon/marowak.pic" +MarowakPicBack:: INCBIN "pic/monback/marowakb.pic" +HaunterPicFront:: INCBIN "pic/bmon/haunter.pic" +HaunterPicBack:: INCBIN "pic/monback/haunterb.pic" +AbraPicFront:: INCBIN "pic/bmon/abra.pic" +AbraPicBack:: INCBIN "pic/monback/abrab.pic" +AlakazamPicFront:: INCBIN "pic/bmon/alakazam.pic" +AlakazamPicBack:: INCBIN "pic/monback/alakazamb.pic" +PidgeottoPicFront:: INCBIN "pic/bmon/pidgeotto.pic" +PidgeottoPicBack:: INCBIN "pic/monback/pidgeottob.pic" +PidgeotPicFront:: INCBIN "pic/bmon/pidgeot.pic" +PidgeotPicBack:: INCBIN "pic/monback/pidgeotb.pic" +StarmiePicFront:: INCBIN "pic/bmon/starmie.pic" +StarmiePicBack:: INCBIN "pic/monback/starmieb.pic" + +RedPicBack:: INCBIN "pic/trainer/redb.pic" +OldManPic:: INCBIN "pic/trainer/oldman.pic" + + +SECTION "Battle (bank C)", ROMX, BANK[$C] +INCLUDE "engine/battle/moveEffects/mist_effect.asm" +INCLUDE "engine/battle/moveEffects/one_hit_ko_effect.asm" + + +SECTION "Pics 5", ROMX, BANK[PICS_5] + +BulbasaurPicFront:: INCBIN "pic/bmon/bulbasaur.pic" +BulbasaurPicBack:: INCBIN "pic/monback/bulbasaurb.pic" +VenusaurPicFront:: INCBIN "pic/bmon/venusaur.pic" +VenusaurPicBack:: INCBIN "pic/monback/venusaurb.pic" +TentacruelPicFront:: INCBIN "pic/bmon/tentacruel.pic" +TentacruelPicBack:: INCBIN "pic/monback/tentacruelb.pic" +GoldeenPicFront:: INCBIN "pic/bmon/goldeen.pic" +GoldeenPicBack:: INCBIN "pic/monback/goldeenb.pic" +SeakingPicFront:: INCBIN "pic/bmon/seaking.pic" +SeakingPicBack:: INCBIN "pic/monback/seakingb.pic" +PonytaPicFront:: INCBIN "pic/bmon/ponyta.pic" +RapidashPicFront:: INCBIN "pic/bmon/rapidash.pic" +PonytaPicBack:: INCBIN "pic/monback/ponytab.pic" +RapidashPicBack:: INCBIN "pic/monback/rapidashb.pic" +RattataPicFront:: INCBIN "pic/bmon/rattata.pic" +RattataPicBack:: INCBIN "pic/monback/rattatab.pic" +RaticatePicFront:: INCBIN "pic/bmon/raticate.pic" +RaticatePicBack:: INCBIN "pic/monback/raticateb.pic" +NidorinoPicFront:: INCBIN "pic/bmon/nidorino.pic" +NidorinoPicBack:: INCBIN "pic/monback/nidorinob.pic" +NidorinaPicFront:: INCBIN "pic/bmon/nidorina.pic" +NidorinaPicBack:: INCBIN "pic/monback/nidorinab.pic" +GeodudePicFront:: INCBIN "pic/bmon/geodude.pic" +GeodudePicBack:: INCBIN "pic/monback/geodudeb.pic" +PorygonPicFront:: INCBIN "pic/bmon/porygon.pic" +PorygonPicBack:: INCBIN "pic/monback/porygonb.pic" +AerodactylPicFront:: INCBIN "pic/bmon/aerodactyl.pic" +AerodactylPicBack:: INCBIN "pic/monback/aerodactylb.pic" +MagnemitePicFront:: INCBIN "pic/bmon/magnemite.pic" +MagnemitePicBack:: INCBIN "pic/monback/magnemiteb.pic" +CharmanderPicFront:: INCBIN "pic/bmon/charmander.pic" +CharmanderPicBack:: INCBIN "pic/monback/charmanderb.pic" +SquirtlePicFront:: INCBIN "pic/bmon/squirtle.pic" +SquirtlePicBack:: INCBIN "pic/monback/squirtleb.pic" +CharmeleonPicFront:: INCBIN "pic/bmon/charmeleon.pic" +CharmeleonPicBack:: INCBIN "pic/monback/charmeleonb.pic" +WartortlePicFront:: INCBIN "pic/bmon/wartortle.pic" +WartortlePicBack:: INCBIN "pic/monback/wartortleb.pic" +CharizardPicFront:: INCBIN "pic/bmon/charizard.pic" +CharizardPicBack:: INCBIN "pic/monback/charizardb.pic" +FossilAerodactylPic:: INCBIN "pic/bmon/fossilaerodactyl.pic" +GhostPic:: INCBIN "pic/other/ghost.pic" +OddishPicFront:: INCBIN "pic/bmon/oddish.pic" +OddishPicBack:: INCBIN "pic/monback/oddishb.pic" +GloomPicFront:: INCBIN "pic/bmon/gloom.pic" +GloomPicBack:: INCBIN "pic/monback/gloomb.pic" +VileplumePicFront:: INCBIN "pic/bmon/vileplume.pic" +VileplumePicBack:: INCBIN "pic/monback/vileplumeb.pic" +BellsproutPicFront:: INCBIN "pic/bmon/bellsprout.pic" +BellsproutPicBack:: INCBIN "pic/monback/bellsproutb.pic" +WeepinbellPicFront:: INCBIN "pic/bmon/weepinbell.pic" +WeepinbellPicBack:: INCBIN "pic/monback/weepinbellb.pic" +VictreebelPicFront:: INCBIN "pic/bmon/victreebel.pic" +VictreebelPicBack:: INCBIN "pic/monback/victreebelb.pic" + + +SECTION "Battle (bank D)", ROMX, BANK[$D] + +INCLUDE "engine/titlescreen2.asm" +INCLUDE "engine/battle/link_battle_versus_text.asm" +INCLUDE "engine/slot_machine.asm" +INCLUDE "engine/overworld/pewter_guys.asm" +INCLUDE "engine/multiply_divide.asm" +INCLUDE "engine/game_corner_slots.asm" + + +SECTION "bankE",ROMX,BANK[$E] + +INCLUDE "data/moves.asm" +BaseStats: INCLUDE "data/base_stats.asm" +INCLUDE "data/cries.asm" +INCLUDE "engine/battle/unused_stats_functions.asm" +INCLUDE "engine/battle/scroll_draw_trainer_pic.asm" +INCLUDE "engine/battle/trainer_ai.asm" +INCLUDE "engine/battle/draw_hud_pokeball_gfx.asm" + +TradingAnimationGraphics: + INCBIN "gfx/game_boy.norepeat.2bpp" + INCBIN "gfx/link_cable.2bpp" + +TradingAnimationGraphics2: +; Pokeball traveling through the link cable. + INCBIN "gfx/trade2.2bpp" + +INCLUDE "engine/evos_moves.asm" +INCLUDE "engine/battle/moveEffects/heal_effect.asm" +INCLUDE "engine/battle/moveEffects/transform_effect.asm" +INCLUDE "engine/battle/moveEffects/reflect_light_screen_effect.asm" + + +SECTION "bankF",ROMX,BANK[$F] + +INCLUDE "engine/battle/core.asm" + + +SECTION "bank10",ROMX,BANK[$10] + +INCLUDE "engine/menu/pokedex.asm" +INCLUDE "engine/trade.asm" +INCLUDE "engine/intro.asm" +INCLUDE "engine/trade2.asm" + + +SECTION "bank11",ROMX,BANK[$11] + +INCLUDE "data/mapHeaders/lavendertown.asm" +INCLUDE "data/mapObjects/lavendertown.asm" +LavenderTownBlocks: INCBIN "maps/lavendertown.blk" + +ViridianPokecenterBlocks: INCBIN "maps/viridianpokecenter.blk" + +SafariZoneRestHouse1Blocks: +SafariZoneRestHouse2Blocks: +SafariZoneRestHouse3Blocks: +SafariZoneRestHouse4Blocks: INCBIN "maps/safarizoneresthouse1.blk" + +INCLUDE "scripts/lavendertown.asm" + +INCLUDE "engine/pokedex_rating.asm" + +INCLUDE "data/mapHeaders/viridianpokecenter.asm" +INCLUDE "scripts/viridianpokecenter.asm" +INCLUDE "data/mapObjects/viridianpokecenter.asm" + +INCLUDE "data/mapHeaders/mansion1.asm" +INCLUDE "scripts/mansion1.asm" +INCLUDE "data/mapObjects/mansion1.asm" +Mansion1Blocks: INCBIN "maps/mansion1.blk" + +INCLUDE "data/mapHeaders/rocktunnel1.asm" +INCLUDE "scripts/rocktunnel1.asm" +INCLUDE "data/mapObjects/rocktunnel1.asm" +RockTunnel1Blocks: INCBIN "maps/rocktunnel1.blk" + +INCLUDE "data/mapHeaders/seafoamislands1.asm" +INCLUDE "scripts/seafoamislands1.asm" +INCLUDE "data/mapObjects/seafoamislands1.asm" +SeafoamIslands1Blocks: INCBIN "maps/seafoamislands1.blk" + +INCLUDE "data/mapHeaders/ssanne3.asm" +INCLUDE "scripts/ssanne3.asm" +INCLUDE "data/mapObjects/ssanne3.asm" +SSAnne3Blocks: INCBIN "maps/ssanne3.blk" + +INCLUDE "data/mapHeaders/victoryroad3.asm" +INCLUDE "scripts/victoryroad3.asm" +INCLUDE "data/mapObjects/victoryroad3.asm" +VictoryRoad3Blocks: INCBIN "maps/victoryroad3.blk" + +INCLUDE "data/mapHeaders/rockethideout1.asm" +INCLUDE "scripts/rockethideout1.asm" +INCLUDE "data/mapObjects/rockethideout1.asm" +RocketHideout1Blocks: INCBIN "maps/rockethideout1.blk" + +INCLUDE "data/mapHeaders/rockethideout2.asm" +INCLUDE "scripts/rockethideout2.asm" +INCLUDE "data/mapObjects/rockethideout2.asm" +RocketHideout2Blocks: INCBIN "maps/rockethideout2.blk" + +INCLUDE "data/mapHeaders/rockethideout3.asm" +INCLUDE "scripts/rockethideout3.asm" +INCLUDE "data/mapObjects/rockethideout3.asm" +RocketHideout3Blocks: INCBIN "maps/rockethideout3.blk" + +INCLUDE "data/mapHeaders/rockethideout4.asm" +INCLUDE "scripts/rockethideout4.asm" +INCLUDE "data/mapObjects/rockethideout4.asm" +RocketHideout4Blocks: INCBIN "maps/rockethideout4.blk" + +INCLUDE "data/mapHeaders/rockethideoutelevator.asm" +INCLUDE "scripts/rockethideoutelevator.asm" +INCLUDE "data/mapObjects/rockethideoutelevator.asm" +RocketHideoutElevatorBlocks: INCBIN "maps/rockethideoutelevator.blk" + +INCLUDE "data/mapHeaders/silphcoelevator.asm" +INCLUDE "scripts/silphcoelevator.asm" +INCLUDE "data/mapObjects/silphcoelevator.asm" +SilphCoElevatorBlocks: INCBIN "maps/silphcoelevator.blk" + +INCLUDE "data/mapHeaders/safarizoneeast.asm" +INCLUDE "scripts/safarizoneeast.asm" +INCLUDE "data/mapObjects/safarizoneeast.asm" +SafariZoneEastBlocks: INCBIN "maps/safarizoneeast.blk" + +INCLUDE "data/mapHeaders/safarizonenorth.asm" +INCLUDE "scripts/safarizonenorth.asm" +INCLUDE "data/mapObjects/safarizonenorth.asm" +SafariZoneNorthBlocks: INCBIN "maps/safarizonenorth.blk" + +INCLUDE "data/mapHeaders/safarizonecenter.asm" +INCLUDE "scripts/safarizonecenter.asm" +INCLUDE "data/mapObjects/safarizonecenter.asm" +SafariZoneCenterBlocks: INCBIN "maps/safarizonecenter.blk" + +INCLUDE "data/mapHeaders/safarizoneresthouse1.asm" +INCLUDE "scripts/safarizoneresthouse1.asm" +INCLUDE "data/mapObjects/safarizoneresthouse1.asm" + +INCLUDE "data/mapHeaders/safarizoneresthouse2.asm" +INCLUDE "scripts/safarizoneresthouse2.asm" +INCLUDE "data/mapObjects/safarizoneresthouse2.asm" + +INCLUDE "data/mapHeaders/safarizoneresthouse3.asm" +INCLUDE "scripts/safarizoneresthouse3.asm" +INCLUDE "data/mapObjects/safarizoneresthouse3.asm" + +INCLUDE "data/mapHeaders/safarizoneresthouse4.asm" +INCLUDE "scripts/safarizoneresthouse4.asm" +INCLUDE "data/mapObjects/safarizoneresthouse4.asm" + +INCLUDE "data/mapHeaders/unknowndungeon2.asm" +INCLUDE "scripts/unknowndungeon2.asm" +INCLUDE "data/mapObjects/unknowndungeon2.asm" +UnknownDungeon2Blocks: INCBIN "maps/unknowndungeon2.blk" + +INCLUDE "data/mapHeaders/unknowndungeon3.asm" +INCLUDE "scripts/unknowndungeon3.asm" +INCLUDE "data/mapObjects/unknowndungeon3.asm" +UnknownDungeon3Blocks: INCBIN "maps/unknowndungeon3.blk" + +INCLUDE "data/mapHeaders/rocktunnel2.asm" +INCLUDE "scripts/rocktunnel2.asm" +INCLUDE "data/mapObjects/rocktunnel2.asm" +RockTunnel2Blocks: INCBIN "maps/rocktunnel2.blk" + +INCLUDE "data/mapHeaders/seafoamislands2.asm" +INCLUDE "scripts/seafoamislands2.asm" +INCLUDE "data/mapObjects/seafoamislands2.asm" +SeafoamIslands2Blocks: INCBIN "maps/seafoamislands2.blk" + +INCLUDE "data/mapHeaders/seafoamislands3.asm" +INCLUDE "scripts/seafoamislands3.asm" +INCLUDE "data/mapObjects/seafoamislands3.asm" +SeafoamIslands3Blocks: INCBIN "maps/seafoamislands3.blk" + +INCLUDE "data/mapHeaders/seafoamislands4.asm" +INCLUDE "scripts/seafoamislands4.asm" +INCLUDE "data/mapObjects/seafoamislands4.asm" +SeafoamIslands4Blocks: INCBIN "maps/seafoamislands4.blk" + +INCLUDE "data/mapHeaders/seafoamislands5.asm" +INCLUDE "scripts/seafoamislands5.asm" +INCLUDE "data/mapObjects/seafoamislands5.asm" +SeafoamIslands5Blocks: INCBIN "maps/seafoamislands5.blk" + +INCLUDE "engine/overworld/hidden_objects.asm" + + +SECTION "bank12",ROMX,BANK[$12] + +INCLUDE "data/mapHeaders/route7.asm" +INCLUDE "data/mapObjects/route7.asm" +Route7Blocks: INCBIN "maps/route7.blk" + +CeladonPokecenterBlocks: +RockTunnelPokecenterBlocks: +MtMoonPokecenterBlocks: INCBIN "maps/mtmoonpokecenter.blk" + +Route18GateBlocks: +Route15GateBlocks: +Route11GateBlocks: INCBIN "maps/route11gate.blk" + +Route18GateUpstairsBlocks: +Route16GateUpstairsBlocks: +Route12GateUpstairsBlocks: +Route15GateUpstairsBlocks: +Route11GateUpstairsBlocks: INCBIN "maps/route11gateupstairs.blk" + +INCLUDE "engine/predefs12.asm" + +INCLUDE "scripts/route7.asm" + +INCLUDE "data/mapHeaders/redshouse1f.asm" +INCLUDE "scripts/redshouse1f.asm" +INCLUDE "data/mapObjects/redshouse1f.asm" +RedsHouse1FBlocks: INCBIN "maps/redshouse1f.blk" + +INCLUDE "data/mapHeaders/celadonmart3.asm" +INCLUDE "scripts/celadonmart3.asm" +INCLUDE "data/mapObjects/celadonmart3.asm" +CeladonMart3Blocks: INCBIN "maps/celadonmart3.blk" + +INCLUDE "data/mapHeaders/celadonmart4.asm" +INCLUDE "scripts/celadonmart4.asm" +INCLUDE "data/mapObjects/celadonmart4.asm" +CeladonMart4Blocks: INCBIN "maps/celadonmart4.blk" + +INCLUDE "data/mapHeaders/celadonmartroof.asm" +INCLUDE "scripts/celadonmartroof.asm" +INCLUDE "data/mapObjects/celadonmartroof.asm" +CeladonMartRoofBlocks: INCBIN "maps/celadonmartroof.blk" + +INCLUDE "data/mapHeaders/celadonmartelevator.asm" +INCLUDE "scripts/celadonmartelevator.asm" +INCLUDE "data/mapObjects/celadonmartelevator.asm" +CeladonMartElevatorBlocks: INCBIN "maps/celadonmartelevator.blk" + +INCLUDE "data/mapHeaders/celadonmansion1.asm" +INCLUDE "scripts/celadonmansion1.asm" +INCLUDE "data/mapObjects/celadonmansion1.asm" +CeladonMansion1Blocks: INCBIN "maps/celadonmansion1.blk" + +INCLUDE "data/mapHeaders/celadonmansion2.asm" +INCLUDE "scripts/celadonmansion2.asm" +INCLUDE "data/mapObjects/celadonmansion2.asm" +CeladonMansion2Blocks: INCBIN "maps/celadonmansion2.blk" + +INCLUDE "data/mapHeaders/celadonmansion3.asm" +INCLUDE "scripts/celadonmansion3.asm" +INCLUDE "data/mapObjects/celadonmansion3.asm" +CeladonMansion3Blocks: INCBIN "maps/celadonmansion3.blk" + +INCLUDE "data/mapHeaders/celadonmansion4.asm" +INCLUDE "scripts/celadonmansion4.asm" +INCLUDE "data/mapObjects/celadonmansion4.asm" +CeladonMansion4Blocks: INCBIN "maps/celadonmansion4.blk" + +INCLUDE "data/mapHeaders/celadonpokecenter.asm" +INCLUDE "scripts/celadonpokecenter.asm" +INCLUDE "data/mapObjects/celadonpokecenter.asm" + +INCLUDE "data/mapHeaders/celadongym.asm" +INCLUDE "scripts/celadongym.asm" +INCLUDE "data/mapObjects/celadongym.asm" +CeladonGymBlocks: INCBIN "maps/celadongym.blk" + +INCLUDE "data/mapHeaders/celadongamecorner.asm" +INCLUDE "scripts/celadongamecorner.asm" +INCLUDE "data/mapObjects/celadongamecorner.asm" +CeladonGameCornerBlocks: INCBIN "maps/celadongamecorner.blk" + +INCLUDE "data/mapHeaders/celadonmart5.asm" +INCLUDE "scripts/celadonmart5.asm" +INCLUDE "data/mapObjects/celadonmart5.asm" +CeladonMart5Blocks: INCBIN "maps/celadonmart5.blk" + +INCLUDE "data/mapHeaders/celadonprizeroom.asm" +INCLUDE "scripts/celadonprizeroom.asm" +INCLUDE "data/mapObjects/celadonprizeroom.asm" +CeladonPrizeRoomBlocks: INCBIN "maps/celadonprizeroom.blk" + +INCLUDE "data/mapHeaders/celadondiner.asm" +INCLUDE "scripts/celadondiner.asm" +INCLUDE "data/mapObjects/celadondiner.asm" +CeladonDinerBlocks: INCBIN "maps/celadondiner.blk" + +INCLUDE "data/mapHeaders/celadonhouse.asm" +INCLUDE "scripts/celadonhouse.asm" +INCLUDE "data/mapObjects/celadonhouse.asm" +CeladonHouseBlocks: INCBIN "maps/celadonhouse.blk" + +INCLUDE "data/mapHeaders/celadonhotel.asm" +INCLUDE "scripts/celadonhotel.asm" +INCLUDE "data/mapObjects/celadonhotel.asm" +CeladonHotelBlocks: INCBIN "maps/celadonhotel.blk" + +INCLUDE "data/mapHeaders/mtmoonpokecenter.asm" +INCLUDE "scripts/mtmoonpokecenter.asm" +INCLUDE "data/mapObjects/mtmoonpokecenter.asm" + +INCLUDE "data/mapHeaders/rocktunnelpokecenter.asm" +INCLUDE "scripts/rocktunnelpokecenter.asm" +INCLUDE "data/mapObjects/rocktunnelpokecenter.asm" + +INCLUDE "data/mapHeaders/route11gate.asm" +INCLUDE "scripts/route11gate.asm" +INCLUDE "data/mapObjects/route11gate.asm" + +INCLUDE "data/mapHeaders/route11gateupstairs.asm" +INCLUDE "scripts/route11gateupstairs.asm" +INCLUDE "data/mapObjects/route11gateupstairs.asm" + +INCLUDE "data/mapHeaders/route12gate.asm" +INCLUDE "scripts/route12gate.asm" +INCLUDE "data/mapObjects/route12gate.asm" +Route12GateBlocks: INCBIN "maps/route12gate.blk" + +INCLUDE "data/mapHeaders/route12gateupstairs.asm" +INCLUDE "scripts/route12gateupstairs.asm" +INCLUDE "data/mapObjects/route12gateupstairs.asm" + +INCLUDE "data/mapHeaders/route15gate.asm" +INCLUDE "scripts/route15gate.asm" +INCLUDE "data/mapObjects/route15gate.asm" + +INCLUDE "data/mapHeaders/route15gateupstairs.asm" +INCLUDE "scripts/route15gateupstairs.asm" +INCLUDE "data/mapObjects/route15gateupstairs.asm" + +INCLUDE "data/mapHeaders/route16gate.asm" +INCLUDE "scripts/route16gate.asm" +INCLUDE "data/mapObjects/route16gate.asm" +Route16GateBlocks: INCBIN "maps/route16gate.blk" + +INCLUDE "data/mapHeaders/route16gateupstairs.asm" +INCLUDE "scripts/route16gateupstairs.asm" +INCLUDE "data/mapObjects/route16gateupstairs.asm" + +INCLUDE "data/mapHeaders/route18gate.asm" +INCLUDE "scripts/route18gate.asm" +INCLUDE "data/mapObjects/route18gate.asm" + +INCLUDE "data/mapHeaders/route18gateupstairs.asm" +INCLUDE "scripts/route18gateupstairs.asm" +INCLUDE "data/mapObjects/route18gateupstairs.asm" + +INCLUDE "data/mapHeaders/mtmoon1.asm" +INCLUDE "scripts/mtmoon1.asm" +INCLUDE "data/mapObjects/mtmoon1.asm" +MtMoon1Blocks: INCBIN "maps/mtmoon1.blk" + +INCLUDE "data/mapHeaders/mtmoon3.asm" +INCLUDE "scripts/mtmoon3.asm" +INCLUDE "data/mapObjects/mtmoon3.asm" +MtMoon3Blocks: INCBIN "maps/mtmoon3.blk" + +INCLUDE "data/mapHeaders/safarizonewest.asm" +INCLUDE "scripts/safarizonewest.asm" +INCLUDE "data/mapObjects/safarizonewest.asm" +SafariZoneWestBlocks: INCBIN "maps/safarizonewest.blk" + +INCLUDE "data/mapHeaders/safarizonesecrethouse.asm" +INCLUDE "scripts/safarizonesecrethouse.asm" +INCLUDE "data/mapObjects/safarizonesecrethouse.asm" +SafariZoneSecretHouseBlocks: INCBIN "maps/safarizonesecrethouse.blk" + + +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/trainer/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/trainer/brock.pic" +MistyPic:: INCBIN "pic/trainer/misty.pic" +LtSurgePic:: INCBIN "pic/trainer/lt.surge.pic" +ErikaPic:: INCBIN "pic/trainer/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/trainer/rival2.pic" +Rival3Pic:: INCBIN "pic/trainer/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" + +INCLUDE "data/mapHeaders/battlecenterm.asm" +INCLUDE "scripts/battlecenterm.asm" +INCLUDE "data/mapObjects/battlecenterm.asm" +BattleCenterMBlocks: INCBIN "maps/battlecenterm.blk" + +INCLUDE "data/mapHeaders/tradecenterm.asm" +INCLUDE "scripts/tradecenterm.asm" +INCLUDE "data/mapObjects/tradecenterm.asm" +TradeCenterMBlocks: INCBIN "maps/tradecenterm.blk" + +INCLUDE "engine/give_pokemon.asm" + +INCLUDE "engine/predefs.asm" + + +SECTION "bank14",ROMX,BANK[$14] + +INCLUDE "data/mapHeaders/route22.asm" +INCLUDE "data/mapObjects/route22.asm" +Route22Blocks: INCBIN "maps/route22.blk" + +INCLUDE "data/mapHeaders/route20.asm" +INCLUDE "data/mapObjects/route20.asm" +Route20Blocks: INCBIN "maps/route20.blk" + +INCLUDE "data/mapHeaders/route23.asm" +INCLUDE "data/mapObjects/route23.asm" +Route23Blocks: INCBIN "maps/route23.blk" + +INCLUDE "data/mapHeaders/route24.asm" +INCLUDE "data/mapObjects/route24.asm" +Route24Blocks: INCBIN "maps/route24.blk" + +INCLUDE "data/mapHeaders/route25.asm" +INCLUDE "data/mapObjects/route25.asm" +Route25Blocks: INCBIN "maps/route25.blk" + +INCLUDE "data/mapHeaders/indigoplateau.asm" +INCLUDE "scripts/indigoplateau.asm" +INCLUDE "data/mapObjects/indigoplateau.asm" +IndigoPlateauBlocks: INCBIN "maps/indigoplateau.blk" + +INCLUDE "data/mapHeaders/saffroncity.asm" +INCLUDE "data/mapObjects/saffroncity.asm" +SaffronCityBlocks: INCBIN "maps/saffroncity.blk" +INCLUDE "scripts/saffroncity.asm" + +INCLUDE "scripts/route20.asm" +INCLUDE "scripts/route22.asm" +INCLUDE "scripts/route23.asm" +INCLUDE "scripts/route24.asm" +INCLUDE "scripts/route25.asm" + +INCLUDE "data/mapHeaders/victoryroad2.asm" +INCLUDE "scripts/victoryroad2.asm" +INCLUDE "data/mapObjects/victoryroad2.asm" +VictoryRoad2Blocks: INCBIN "maps/victoryroad2.blk" + +INCLUDE "data/mapHeaders/mtmoon2.asm" +INCLUDE "scripts/mtmoon2.asm" +INCLUDE "data/mapObjects/mtmoon2.asm" +MtMoon2Blocks: INCBIN "maps/mtmoon2.blk" + +INCLUDE "data/mapHeaders/silphco7.asm" +INCLUDE "scripts/silphco7.asm" +INCLUDE "data/mapObjects/silphco7.asm" +SilphCo7Blocks: INCBIN "maps/silphco7.blk" + +INCLUDE "data/mapHeaders/mansion2.asm" +INCLUDE "scripts/mansion2.asm" +INCLUDE "data/mapObjects/mansion2.asm" +Mansion2Blocks: INCBIN "maps/mansion2.blk" + +INCLUDE "data/mapHeaders/mansion3.asm" +INCLUDE "scripts/mansion3.asm" +INCLUDE "data/mapObjects/mansion3.asm" +Mansion3Blocks: INCBIN "maps/mansion3.blk" + +INCLUDE "data/mapHeaders/mansion4.asm" +INCLUDE "scripts/mansion4.asm" +INCLUDE "data/mapObjects/mansion4.asm" +Mansion4Blocks: INCBIN "maps/mansion4.blk" + +INCLUDE "engine/battle/init_battle_variables.asm" +INCLUDE "engine/battle/moveEffects/paralyze_effect.asm" + +INCLUDE "engine/overworld/card_key.asm" + +INCLUDE "engine/menu/prize_menu.asm" + +INCLUDE "engine/hidden_object_functions14.asm" + + +SECTION "bank15",ROMX,BANK[$15] + +INCLUDE "data/mapHeaders/route2.asm" +INCLUDE "data/mapObjects/route2.asm" +Route2Blocks: INCBIN "maps/route2.blk" + +INCLUDE "data/mapHeaders/route3.asm" +INCLUDE "data/mapObjects/route3.asm" +Route3Blocks: INCBIN "maps/route3.blk" + +INCLUDE "data/mapHeaders/route4.asm" +INCLUDE "data/mapObjects/route4.asm" +Route4Blocks: INCBIN "maps/route4.blk" + +INCLUDE "data/mapHeaders/route5.asm" +INCLUDE "data/mapObjects/route5.asm" +Route5Blocks: INCBIN "maps/route5.blk" + +INCLUDE "data/mapHeaders/route9.asm" +INCLUDE "data/mapObjects/route9.asm" +Route9Blocks: INCBIN "maps/route9.blk" + +INCLUDE "data/mapHeaders/route13.asm" +INCLUDE "data/mapObjects/route13.asm" +Route13Blocks: INCBIN "maps/route13.blk" + +INCLUDE "data/mapHeaders/route14.asm" +INCLUDE "data/mapObjects/route14.asm" +Route14Blocks: INCBIN "maps/route14.blk" + +INCLUDE "data/mapHeaders/route17.asm" +INCLUDE "data/mapObjects/route17.asm" +Route17Blocks: INCBIN "maps/route17.blk" + +INCLUDE "data/mapHeaders/route19.asm" +INCLUDE "data/mapObjects/route19.asm" +IF DEF(_OPTION_BEACH_HOUSE) +Route19Blocks: INCBIN "maps/route19-yellow.blk" +ELSE +Route19Blocks: INCBIN "maps/route19.blk" +ENDC + +INCLUDE "data/mapHeaders/route21.asm" +INCLUDE "data/mapObjects/route21.asm" +Route21Blocks: INCBIN "maps/route21.blk" + +VermilionHouse2Blocks: +Route12HouseBlocks: +DayCareMBlocks: INCBIN "maps/daycarem.blk" + +FuchsiaHouse3Blocks: INCBIN "maps/fuchsiahouse3.blk" + +INCLUDE "engine/battle/experience.asm" + +INCLUDE "scripts/route2.asm" +INCLUDE "scripts/route3.asm" +INCLUDE "scripts/route4.asm" +INCLUDE "scripts/route5.asm" +INCLUDE "scripts/route9.asm" +INCLUDE "scripts/route13.asm" +INCLUDE "scripts/route14.asm" +INCLUDE "scripts/route17.asm" +INCLUDE "scripts/route19.asm" +INCLUDE "scripts/route21.asm" + +INCLUDE "data/mapHeaders/vermilionhouse2.asm" +INCLUDE "scripts/vermilionhouse2.asm" +INCLUDE "data/mapObjects/vermilionhouse2.asm" + +INCLUDE "data/mapHeaders/celadonmart2.asm" +INCLUDE "scripts/celadonmart2.asm" +INCLUDE "data/mapObjects/celadonmart2.asm" +CeladonMart2Blocks: INCBIN "maps/celadonmart2.blk" + +INCLUDE "data/mapHeaders/fuchsiahouse3.asm" +INCLUDE "scripts/fuchsiahouse3.asm" +INCLUDE "data/mapObjects/fuchsiahouse3.asm" + +INCLUDE "data/mapHeaders/daycarem.asm" +INCLUDE "scripts/daycarem.asm" +INCLUDE "data/mapObjects/daycarem.asm" + +INCLUDE "data/mapHeaders/route12house.asm" +INCLUDE "scripts/route12house.asm" +INCLUDE "data/mapObjects/route12house.asm" + +INCLUDE "data/mapHeaders/silphco8.asm" +INCLUDE "scripts/silphco8.asm" +INCLUDE "data/mapObjects/silphco8.asm" +SilphCo8Blocks: INCBIN "maps/silphco8.blk" + +INCLUDE "engine/menu/diploma.asm" + +INCLUDE "engine/overworld/trainers.asm" + + +SECTION "bank16",ROMX,BANK[$16] + +INCLUDE "data/mapHeaders/route6.asm" +INCLUDE "data/mapObjects/route6.asm" +Route6Blocks: INCBIN "maps/route6.blk" + +INCLUDE "data/mapHeaders/route8.asm" +INCLUDE "data/mapObjects/route8.asm" +Route8Blocks: INCBIN "maps/route8.blk" + +INCLUDE "data/mapHeaders/route10.asm" +INCLUDE "data/mapObjects/route10.asm" +Route10Blocks: INCBIN "maps/route10.blk" + +INCLUDE "data/mapHeaders/route11.asm" +INCLUDE "data/mapObjects/route11.asm" +Route11Blocks: INCBIN "maps/route11.blk" + +INCLUDE "data/mapHeaders/route12.asm" +INCLUDE "data/mapObjects/route12.asm" +Route12Blocks: INCBIN "maps/route12.blk" + +INCLUDE "data/mapHeaders/route15.asm" +INCLUDE "data/mapObjects/route15.asm" +Route15Blocks: INCBIN "maps/route15.blk" + +INCLUDE "data/mapHeaders/route16.asm" +INCLUDE "data/mapObjects/route16.asm" +Route16Blocks: INCBIN "maps/route16.blk" + +INCLUDE "data/mapHeaders/route18.asm" +INCLUDE "data/mapObjects/route18.asm" +Route18Blocks: INCBIN "maps/route18.blk" + + INCBIN "maps/unusedblocks58d7d.blk" + +INCLUDE "engine/battle/common_text.asm" + +INCLUDE "engine/experience.asm" + +INCLUDE "engine/overworld/oaks_aide.asm" + +INCLUDE "scripts/route6.asm" +INCLUDE "scripts/route8.asm" +INCLUDE "scripts/route10.asm" +INCLUDE "scripts/route11.asm" +INCLUDE "scripts/route12.asm" +INCLUDE "scripts/route15.asm" +INCLUDE "scripts/route16.asm" +INCLUDE "scripts/route18.asm" + +INCLUDE "data/mapHeaders/fanclub.asm" +INCLUDE "scripts/fanclub.asm" +INCLUDE "data/mapObjects/fanclub.asm" +FanClubBlocks: + INCBIN "maps/fanclub.blk" + +INCLUDE "data/mapHeaders/silphco2.asm" +INCLUDE "scripts/silphco2.asm" +INCLUDE "data/mapObjects/silphco2.asm" +SilphCo2Blocks: + INCBIN "maps/silphco2.blk" + +INCLUDE "data/mapHeaders/silphco3.asm" +INCLUDE "scripts/silphco3.asm" +INCLUDE "data/mapObjects/silphco3.asm" +SilphCo3Blocks: + INCBIN "maps/silphco3.blk" + +INCLUDE "data/mapHeaders/silphco10.asm" +INCLUDE "scripts/silphco10.asm" +INCLUDE "data/mapObjects/silphco10.asm" +SilphCo10Blocks: + INCBIN "maps/silphco10.blk" + +INCLUDE "data/mapHeaders/lance.asm" +INCLUDE "scripts/lance.asm" +INCLUDE "data/mapObjects/lance.asm" +LanceBlocks: + INCBIN "maps/lance.blk" + +INCLUDE "data/mapHeaders/halloffameroom.asm" +INCLUDE "scripts/halloffameroom.asm" +INCLUDE "data/mapObjects/halloffameroom.asm" +HallofFameRoomBlocks: + INCBIN "maps/halloffameroom.blk" + +INCLUDE "engine/overworld/saffron_guards.asm" + + +SECTION "bank17",ROMX,BANK[$17] + +SaffronMartBlocks: +LavenderMartBlocks: +CeruleanMartBlocks: +VermilionMartBlocks: INCBIN "maps/vermilionmart.blk" + +CopycatsHouse2FBlocks: +RedsHouse2FBlocks: INCBIN "maps/redshouse2f.blk" + +Museum1FBlocks: INCBIN "maps/museum1f.blk" + +Museum2FBlocks: INCBIN "maps/museum2f.blk" + +SaffronPokecenterBlocks: +VermilionPokecenterBlocks: +LavenderPokecenterBlocks: +PewterPokecenterBlocks: INCBIN "maps/pewterpokecenter.blk" + +UndergroundPathEntranceRoute7Blocks: +UndergroundPathEntranceRoute7CopyBlocks: +UndergroundPathEntranceRoute6Blocks: +UndergroundPathEntranceRoute5Blocks: INCBIN "maps/undergroundpathentranceroute5.blk" + +Route2GateBlocks: +ViridianForestEntranceBlocks: +ViridianForestExitBlocks: INCBIN "maps/viridianforestexit.blk" + +INCLUDE "data/mapHeaders/redshouse2f.asm" +INCLUDE "scripts/redshouse2f.asm" +INCLUDE "data/mapObjects/redshouse2f.asm" + +INCLUDE "engine/predefs17.asm" + +INCLUDE "data/mapHeaders/museum1f.asm" +INCLUDE "scripts/museum1f.asm" +INCLUDE "data/mapObjects/museum1f.asm" + +INCLUDE "data/mapHeaders/museum2f.asm" +INCLUDE "scripts/museum2f.asm" +INCLUDE "data/mapObjects/museum2f.asm" + +INCLUDE "data/mapHeaders/pewtergym.asm" +INCLUDE "scripts/pewtergym.asm" +INCLUDE "data/mapObjects/pewtergym.asm" +PewterGymBlocks: INCBIN "maps/pewtergym.blk" + +INCLUDE "data/mapHeaders/pewterpokecenter.asm" +INCLUDE "scripts/pewterpokecenter.asm" +INCLUDE "data/mapObjects/pewterpokecenter.asm" + +INCLUDE "data/mapHeaders/ceruleanpokecenter.asm" +INCLUDE "scripts/ceruleanpokecenter.asm" +INCLUDE "data/mapObjects/ceruleanpokecenter.asm" +CeruleanPokecenterBlocks: INCBIN "maps/ceruleanpokecenter.blk" + +INCLUDE "data/mapHeaders/ceruleangym.asm" +INCLUDE "scripts/ceruleangym.asm" +INCLUDE "data/mapObjects/ceruleangym.asm" +CeruleanGymBlocks: INCBIN "maps/ceruleangym.blk" + +INCLUDE "data/mapHeaders/ceruleanmart.asm" +INCLUDE "scripts/ceruleanmart.asm" +INCLUDE "data/mapObjects/ceruleanmart.asm" + +INCLUDE "data/mapHeaders/lavenderpokecenter.asm" +INCLUDE "scripts/lavenderpokecenter.asm" +INCLUDE "data/mapObjects/lavenderpokecenter.asm" + +INCLUDE "data/mapHeaders/lavendermart.asm" +INCLUDE "scripts/lavendermart.asm" +INCLUDE "data/mapObjects/lavendermart.asm" + +INCLUDE "data/mapHeaders/vermilionpokecenter.asm" +INCLUDE "scripts/vermilionpokecenter.asm" +INCLUDE "data/mapObjects/vermilionpokecenter.asm" + +INCLUDE "data/mapHeaders/vermilionmart.asm" +INCLUDE "scripts/vermilionmart.asm" +INCLUDE "data/mapObjects/vermilionmart.asm" + +INCLUDE "data/mapHeaders/vermiliongym.asm" +INCLUDE "scripts/vermiliongym.asm" +INCLUDE "data/mapObjects/vermiliongym.asm" +VermilionGymBlocks: INCBIN "maps/vermiliongym.blk" + +INCLUDE "data/mapHeaders/copycatshouse2f.asm" +INCLUDE "scripts/copycatshouse2f.asm" +INCLUDE "data/mapObjects/copycatshouse2f.asm" + +INCLUDE "data/mapHeaders/fightingdojo.asm" +INCLUDE "scripts/fightingdojo.asm" +INCLUDE "data/mapObjects/fightingdojo.asm" +FightingDojoBlocks: INCBIN "maps/fightingdojo.blk" + +INCLUDE "data/mapHeaders/saffrongym.asm" +INCLUDE "scripts/saffrongym.asm" +INCLUDE "data/mapObjects/saffrongym.asm" +SaffronGymBlocks: INCBIN "maps/saffrongym.blk" + +INCLUDE "data/mapHeaders/saffronmart.asm" +INCLUDE "scripts/saffronmart.asm" +INCLUDE "data/mapObjects/saffronmart.asm" + +INCLUDE "data/mapHeaders/silphco1.asm" +INCLUDE "scripts/silphco1.asm" +INCLUDE "data/mapObjects/silphco1.asm" +SilphCo1Blocks: INCBIN "maps/silphco1.blk" + +INCLUDE "data/mapHeaders/saffronpokecenter.asm" +INCLUDE "scripts/saffronpokecenter.asm" +INCLUDE "data/mapObjects/saffronpokecenter.asm" + +INCLUDE "data/mapHeaders/viridianforestexit.asm" +INCLUDE "scripts/viridianforestexit.asm" +INCLUDE "data/mapObjects/viridianforestexit.asm" + +INCLUDE "data/mapHeaders/route2gate.asm" +INCLUDE "scripts/route2gate.asm" +INCLUDE "data/mapObjects/route2gate.asm" + +INCLUDE "data/mapHeaders/viridianforestentrance.asm" +INCLUDE "scripts/viridianforestentrance.asm" +INCLUDE "data/mapObjects/viridianforestentrance.asm" + +INCLUDE "data/mapHeaders/undergroundpathentranceroute5.asm" +INCLUDE "scripts/undergroundpathentranceroute5.asm" +INCLUDE "data/mapObjects/undergroundpathentranceroute5.asm" + +INCLUDE "data/mapHeaders/undergroundpathentranceroute6.asm" +INCLUDE "scripts/undergroundpathentranceroute6.asm" +INCLUDE "data/mapObjects/undergroundpathentranceroute6.asm" + +INCLUDE "data/mapHeaders/undergroundpathentranceroute7.asm" +INCLUDE "scripts/undergroundpathentranceroute7.asm" +INCLUDE "data/mapObjects/undergroundpathentranceroute7.asm" + +INCLUDE "data/mapHeaders/undergroundpathentranceroute7copy.asm" +INCLUDE "scripts/undergroundpathentranceroute7copy.asm" +INCLUDE "data/mapObjects/undergroundpathentranceroute7copy.asm" + +INCLUDE "data/mapHeaders/silphco9.asm" +INCLUDE "scripts/silphco9.asm" +INCLUDE "data/mapObjects/silphco9.asm" +SilphCo9Blocks: INCBIN "maps/silphco9.blk" + +INCLUDE "data/mapHeaders/victoryroad1.asm" +INCLUDE "scripts/victoryroad1.asm" +INCLUDE "data/mapObjects/victoryroad1.asm" +VictoryRoad1Blocks: INCBIN "maps/victoryroad1.blk" + +INCLUDE "engine/predefs17_2.asm" + +INCLUDE "engine/hidden_object_functions17.asm" + + +SECTION "bank18",ROMX,BANK[$18] + +ViridianForestBlocks: INCBIN "maps/viridianforest.blk" +UndergroundPathNSBlocks: INCBIN "maps/undergroundpathns.blk" +UndergroundPathWEBlocks: INCBIN "maps/undergroundpathwe.blk" + + INCBIN "maps/unusedblocks60258.blk" + +SSAnne10Blocks: +SSAnne9Blocks: INCBIN "maps/ssanne9.blk" + +INCLUDE "data/mapHeaders/pokemontower1.asm" +INCLUDE "scripts/pokemontower1.asm" +INCLUDE "data/mapObjects/pokemontower1.asm" +PokemonTower1Blocks: INCBIN "maps/pokemontower1.blk" + +INCLUDE "data/mapHeaders/pokemontower2.asm" +INCLUDE "scripts/pokemontower2.asm" +INCLUDE "data/mapObjects/pokemontower2.asm" +PokemonTower2Blocks: INCBIN "maps/pokemontower2.blk" + +INCLUDE "data/mapHeaders/pokemontower3.asm" +INCLUDE "scripts/pokemontower3.asm" +INCLUDE "data/mapObjects/pokemontower3.asm" +PokemonTower3Blocks: INCBIN "maps/pokemontower3.blk" + +INCLUDE "data/mapHeaders/pokemontower4.asm" +INCLUDE "scripts/pokemontower4.asm" +INCLUDE "data/mapObjects/pokemontower4.asm" +PokemonTower4Blocks: INCBIN "maps/pokemontower4.blk" + +INCLUDE "data/mapHeaders/pokemontower5.asm" +INCLUDE "scripts/pokemontower5.asm" +INCLUDE "data/mapObjects/pokemontower5.asm" +PokemonTower5Blocks: INCBIN "maps/pokemontower5.blk" + +INCLUDE "data/mapHeaders/pokemontower6.asm" +INCLUDE "scripts/pokemontower6.asm" +INCLUDE "data/mapObjects/pokemontower6.asm" +PokemonTower6Blocks: INCBIN "maps/pokemontower6.blk" + + INCBIN "maps/unusedblocks60cef.blk" + +INCLUDE "data/mapHeaders/pokemontower7.asm" +INCLUDE "scripts/pokemontower7.asm" +INCLUDE "data/mapObjects/pokemontower7.asm" +PokemonTower7Blocks: INCBIN "maps/pokemontower7.blk" + +INCLUDE "data/mapHeaders/celadonmart1.asm" +INCLUDE "scripts/celadonmart1.asm" +INCLUDE "data/mapObjects/celadonmart1.asm" +CeladonMart1Blocks: INCBIN "maps/celadonmart1.blk" + +INCLUDE "engine/overworld/cinnabar_lab.asm" + +INCLUDE "data/mapHeaders/viridianforest.asm" +INCLUDE "scripts/viridianforest.asm" +INCLUDE "data/mapObjects/viridianforest.asm" + +INCLUDE "data/mapHeaders/ssanne1.asm" +INCLUDE "scripts/ssanne1.asm" +INCLUDE "data/mapObjects/ssanne1.asm" +SSAnne1Blocks: INCBIN "maps/ssanne1.blk" + +INCLUDE "data/mapHeaders/ssanne2.asm" +INCLUDE "scripts/ssanne2.asm" +INCLUDE "data/mapObjects/ssanne2.asm" +SSAnne2Blocks: INCBIN "maps/ssanne2.blk" + +INCLUDE "data/mapHeaders/ssanne4.asm" +INCLUDE "scripts/ssanne4.asm" +INCLUDE "data/mapObjects/ssanne4.asm" +SSAnne4Blocks: INCBIN "maps/ssanne4.blk" + +INCLUDE "data/mapHeaders/ssanne5.asm" +INCLUDE "scripts/ssanne5.asm" +INCLUDE "data/mapObjects/ssanne5.asm" +SSAnne5Blocks: INCBIN "maps/ssanne5.blk" + +INCLUDE "data/mapHeaders/ssanne6.asm" +INCLUDE "scripts/ssanne6.asm" +INCLUDE "data/mapObjects/ssanne6.asm" +SSAnne6Blocks: INCBIN "maps/ssanne6.blk" + +INCLUDE "data/mapHeaders/ssanne7.asm" +INCLUDE "scripts/ssanne7.asm" +INCLUDE "data/mapObjects/ssanne7.asm" +SSAnne7Blocks: INCBIN "maps/ssanne7.blk" + +INCLUDE "data/mapHeaders/ssanne8.asm" +INCLUDE "scripts/ssanne8.asm" +INCLUDE "data/mapObjects/ssanne8.asm" +SSAnne8Blocks: INCBIN "maps/ssanne8.blk" + +INCLUDE "data/mapHeaders/ssanne9.asm" +INCLUDE "scripts/ssanne9.asm" +INCLUDE "data/mapObjects/ssanne9.asm" + +INCLUDE "data/mapHeaders/ssanne10.asm" +INCLUDE "scripts/ssanne10.asm" +INCLUDE "data/mapObjects/ssanne10.asm" + +INCLUDE "data/mapHeaders/undergroundpathns.asm" +INCLUDE "scripts/undergroundpathns.asm" +INCLUDE "data/mapObjects/undergroundpathns.asm" + +INCLUDE "data/mapHeaders/undergroundpathwe.asm" +INCLUDE "scripts/undergroundpathwe.asm" +INCLUDE "data/mapObjects/undergroundpathwe.asm" + +INCLUDE "data/mapHeaders/diglettscave.asm" +INCLUDE "scripts/diglettscave.asm" +INCLUDE "data/mapObjects/diglettscave.asm" +DiglettsCaveBlocks: INCBIN "maps/diglettscave.blk" + +INCLUDE "data/mapHeaders/silphco11.asm" +INCLUDE "scripts/silphco11.asm" +INCLUDE "data/mapObjects/silphco11.asm" +SilphCo11Blocks: INCBIN "maps/silphco11.blk" + +INCLUDE "engine/hidden_object_functions18.asm" + + +SECTION "bank19",ROMX,BANK[$19] + +Overworld_GFX: INCBIN "gfx/tilesets/overworld.t2.2bpp" +Overworld_Block: INCBIN "gfx/blocksets/overworld.bst" + +RedsHouse1_GFX: +RedsHouse2_GFX: INCBIN "gfx/tilesets/reds_house.t7.2bpp" +RedsHouse1_Block: +RedsHouse2_Block: INCBIN "gfx/blocksets/reds_house.bst" + +House_GFX: INCBIN "gfx/tilesets/house.t2.2bpp" +House_Block: INCBIN "gfx/blocksets/house.bst" +Mansion_GFX: INCBIN "gfx/tilesets/mansion.t2.2bpp" +Mansion_Block: INCBIN "gfx/blocksets/mansion.bst" +ShipPort_GFX: INCBIN "gfx/tilesets/ship_port.t2.2bpp" +ShipPort_Block: INCBIN "gfx/blocksets/ship_port.bst" +Interior_GFX: INCBIN "gfx/tilesets/interior.t1.2bpp" +Interior_Block: INCBIN "gfx/blocksets/interior.bst" +Plateau_GFX: INCBIN "gfx/tilesets/plateau.t10.2bpp" +Plateau_Block: INCBIN "gfx/blocksets/plateau.bst" + + +SECTION "bank1A",ROMX,BANK[$1A] + +INCLUDE "engine/battle/decrement_pp.asm" + +Version_GFX: +IF DEF(_RED) + INCBIN "gfx/red/redgreenversion.1bpp" ; 10 tiles +ENDC +IF DEF(_BLUE) + INCBIN "gfx/blue/blueversion.1bpp" ; 8 tiles +ENDC + +Dojo_GFX: +Gym_GFX: INCBIN "gfx/tilesets/gym.2bpp" +Dojo_Block: +Gym_Block: INCBIN "gfx/blocksets/gym.bst" + +Mart_GFX: +Pokecenter_GFX: INCBIN "gfx/tilesets/pokecenter.2bpp" +Mart_Block: +Pokecenter_Block: INCBIN "gfx/blocksets/pokecenter.bst" + +ForestGate_GFX: +Museum_GFX: +Gate_GFX: INCBIN "gfx/tilesets/gate.t1.2bpp" +ForestGate_Block: +Museum_Block: +Gate_Block: INCBIN "gfx/blocksets/gate.bst" + +Forest_GFX: INCBIN "gfx/tilesets/forest.2bpp" +Forest_Block: INCBIN "gfx/blocksets/forest.bst" +Facility_GFX: INCBIN "gfx/tilesets/facility.2bpp" +Facility_Block: INCBIN "gfx/blocksets/facility.bst" + + +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] + +CopycatsHouse1FBlocks: INCBIN "maps/copycatshouse1f.blk" + +CinnabarMartBlocks: +PewterMartBlocks: INCBIN "maps/pewtermart.blk" + +FuchsiaHouse1Blocks: INCBIN "maps/fuchsiahouse1.blk" + +CinnabarPokecenterBlocks: +FuchsiaPokecenterBlocks: INCBIN "maps/fuchsiapokecenter.blk" + +CeruleanHouse2Blocks: INCBIN "maps/ceruleanhouse2.blk" + +INCLUDE "engine/HoF_room_pc.asm" + +INCLUDE "engine/status_ailments.asm" + +INCLUDE "engine/items/itemfinder.asm" + +INCLUDE "scripts/ceruleancity2.asm" + +INCLUDE "data/mapHeaders/viridiangym.asm" +INCLUDE "scripts/viridiangym.asm" +INCLUDE "data/mapObjects/viridiangym.asm" +ViridianGymBlocks: INCBIN "maps/viridiangym.blk" + +INCLUDE "data/mapHeaders/pewtermart.asm" +INCLUDE "scripts/pewtermart.asm" +INCLUDE "data/mapObjects/pewtermart.asm" + +INCLUDE "data/mapHeaders/unknowndungeon1.asm" +INCLUDE "scripts/unknowndungeon1.asm" +INCLUDE "data/mapObjects/unknowndungeon1.asm" +UnknownDungeon1Blocks: INCBIN "maps/unknowndungeon1.blk" + +INCLUDE "data/mapHeaders/ceruleanhouse2.asm" +INCLUDE "scripts/ceruleanhouse2.asm" +INCLUDE "data/mapObjects/ceruleanhouse2.asm" + +INCLUDE "engine/menu/vending_machine.asm" + +INCLUDE "data/mapHeaders/fuchsiahouse1.asm" +INCLUDE "scripts/fuchsiahouse1.asm" +INCLUDE "data/mapObjects/fuchsiahouse1.asm" + +INCLUDE "data/mapHeaders/fuchsiapokecenter.asm" +INCLUDE "scripts/fuchsiapokecenter.asm" +INCLUDE "data/mapObjects/fuchsiapokecenter.asm" + +INCLUDE "data/mapHeaders/fuchsiahouse2.asm" +INCLUDE "scripts/fuchsiahouse2.asm" +INCLUDE "data/mapObjects/fuchsiahouse2.asm" +FuchsiaHouse2Blocks: INCBIN "maps/fuchsiahouse2.blk" + +INCLUDE "data/mapHeaders/safarizoneentrance.asm" +INCLUDE "scripts/safarizoneentrance.asm" +INCLUDE "data/mapObjects/safarizoneentrance.asm" +SafariZoneEntranceBlocks: INCBIN "maps/safarizoneentrance.blk" + +INCLUDE "data/mapHeaders/fuchsiagym.asm" +INCLUDE "scripts/fuchsiagym.asm" +INCLUDE "data/mapObjects/fuchsiagym.asm" +FuchsiaGymBlocks: INCBIN "maps/fuchsiagym.blk" + +INCLUDE "data/mapHeaders/fuchsiameetingroom.asm" +INCLUDE "scripts/fuchsiameetingroom.asm" +INCLUDE "data/mapObjects/fuchsiameetingroom.asm" +FuchsiaMeetingRoomBlocks: INCBIN "maps/fuchsiameetingroom.blk" + +INCLUDE "data/mapHeaders/cinnabargym.asm" +INCLUDE "scripts/cinnabargym.asm" +INCLUDE "data/mapObjects/cinnabargym.asm" +CinnabarGymBlocks: INCBIN "maps/cinnabargym.blk" + +INCLUDE "data/mapHeaders/lab1.asm" +INCLUDE "scripts/lab1.asm" +INCLUDE "data/mapObjects/lab1.asm" +Lab1Blocks: INCBIN "maps/lab1.blk" + +INCLUDE "data/mapHeaders/lab2.asm" +INCLUDE "scripts/lab2.asm" +INCLUDE "data/mapObjects/lab2.asm" +Lab2Blocks: INCBIN "maps/lab2.blk" + +INCLUDE "data/mapHeaders/lab3.asm" +INCLUDE "scripts/lab3.asm" +INCLUDE "data/mapObjects/lab3.asm" +Lab3Blocks: INCBIN "maps/lab3.blk" + +INCLUDE "data/mapHeaders/lab4.asm" +INCLUDE "scripts/lab4.asm" +INCLUDE "data/mapObjects/lab4.asm" +Lab4Blocks: INCBIN "maps/lab4.blk" + +INCLUDE "data/mapHeaders/cinnabarpokecenter.asm" +INCLUDE "scripts/cinnabarpokecenter.asm" +INCLUDE "data/mapObjects/cinnabarpokecenter.asm" + +INCLUDE "data/mapHeaders/cinnabarmart.asm" +INCLUDE "scripts/cinnabarmart.asm" +INCLUDE "data/mapObjects/cinnabarmart.asm" + +INCLUDE "data/mapHeaders/copycatshouse1f.asm" +INCLUDE "scripts/copycatshouse1f.asm" +INCLUDE "data/mapObjects/copycatshouse1f.asm" + +INCLUDE "data/mapHeaders/gary.asm" +INCLUDE "scripts/gary.asm" +INCLUDE "data/mapObjects/gary.asm" +GaryBlocks: INCBIN "maps/gary.blk" + +INCLUDE "data/mapHeaders/lorelei.asm" +INCLUDE "scripts/lorelei.asm" +INCLUDE "data/mapObjects/lorelei.asm" +LoreleiBlocks: INCBIN "maps/lorelei.blk" + +INCLUDE "data/mapHeaders/bruno.asm" +INCLUDE "scripts/bruno.asm" +INCLUDE "data/mapObjects/bruno.asm" +BrunoBlocks: INCBIN "maps/bruno.blk" + +INCLUDE "data/mapHeaders/agatha.asm" +INCLUDE "scripts/agatha.asm" +INCLUDE "data/mapObjects/agatha.asm" +AgathaBlocks: INCBIN "maps/agatha.blk" + +INCLUDE "engine/menu/league_pc.asm" + +INCLUDE "engine/overworld/hidden_items.asm" + + +SECTION "bank1E",ROMX,BANK[$1E] + +INCLUDE "engine/battle/animations.asm" + +INCLUDE "engine/overworld/cut2.asm" + +INCLUDE "engine/overworld/ssanne.asm" + +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" + +INCLUDE "data/animations.asm" + +INCLUDE "engine/evolution.asm" + +INCLUDE "engine/overworld/elevator.asm" + +INCLUDE "engine/items/tm_prices.asm" + +SECTION "bank3c",ROMX,BANK[$3C] + +INCLUDE "yellow/bank3c/main.asm" + +SECTION "bank3d",ROMX,BANK[$3D] + +INCLUDE "yellow/bank3d/random.asm" + +SECTION "bank3e",ROMX,BANK[$3E] + +SECTION "bank3f",ROMX,BANK[$3F] + INCLUDE "yellow/bank3f/main.asm"
\ No newline at end of file |