ref: dbe2a3b1683caeab446ece53dce8d5e8b0fd0e07
dir: /main.asm/
INCLUDE "constants.asm" NPC_SPRITES_1 EQU $4 NPC_SPRITES_2 EQU $5 GFX EQU $4 PICS_1 EQU $9 PICS_2 EQU $A PICS_3 EQU $B PICS_4 EQU $C PICS_5 EQU $D 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 [wIsInBattle], a ld [wMapPalOffset], a ld [wNPCMovementScriptFunctionNum], a ld [hJoyHeld], a ld [wNPCMovementScriptPointerTableNum], a ld [wFlags_0xcd60], a ld [hMoney], a ld [hMoney + 1], a ld [hMoney + 2], a call HasEnoughMoney jr c, .lostmoney ; never happens ; Halve the player's money. ld a, [wPlayerMoney] ld [hMoney], a ld a, [wPlayerMoney + 1] ld [hMoney + 1], a ld a, [wPlayerMoney + 2] ld [hMoney + 2], a xor a ld [hDivideBCDDivisor], a ld [hDivideBCDDivisor + 1], a ld a, 2 ld [hDivideBCDDivisor + 2], a predef DivideBCDPredef3 ld a, [hDivideBCDQuotient] ld [wPlayerMoney], a ld a, [hDivideBCDQuotient + 1] ld [wPlayerMoney + 1], a ld a, [hDivideBCDQuotient + 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 [wMonDataLocation]: ; 0: partymon ; 1: enemymon ; 2: boxmon ; 3: daycaremon ; Return monster id at wcf91 and its data at wLoadedMon. ; Also load base stats at wMonHeader for convenience. ld a, [wDayCareMonSpecies] ld [wcf91], a ld a, [wMonDataLocation] cp DAYCARE_DATA jr z, .GetMonHeader ld a, [wWhichPokemon] ld e, a callab GetMonSpecies .GetMonHeader ld a, [wcf91] ld [wd0b5], a ; input for GetMonHeader call GetMonHeader ld hl, wPartyMons ld bc, wPartyMon2 - wPartyMon1 ld a, [wMonDataLocation] cp ENEMY_PARTY_DATA jr c, .getMonEntry ld hl, wEnemyMons jr z, .getMonEntry cp 2 ld hl, wBoxMons ld bc, wBoxMon2 - wBoxMon1 jr z, .getMonEntry ld hl, wDayCareMon jr .copyMonData .getMonEntry ld a, [wWhichPokemon] call AddNTimes .copyMonData ld de, wLoadedMon ld bc, wPartyMon2 - wPartyMon1 jp CopyData 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: coord hl, 3, 10 ld b, $1 ld c, $b ld a, [wIsInBattle] and a jr z, .asm_4c17 call TextBoxBorder jr .asm_4c1a .asm_4c17 call CableClub_TextBoxBorder .asm_4c1a coord hl, 4, 11 ld de, WaitingText call PlaceString ld c, 50 jp DelayFrames WaitingText: db "Waiting...!@" _UpdateSprites: 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 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 DoScriptedNPCMovement .unequal jp UpdateNPCSprite ; This detects if the current sprite (whose offset is at H_CURRENTSPRITEOFFSET) ; is going to collide with another sprite by looping over the other sprites. ; The current sprite's offset will be labelled with i (e.g. $c1i0). ; The loop sprite's offset will labelled with j (e.g. $c1j0). ; ; Note that the Y coordinate of the sprite (in [$c1k4]) is one of the following ; 9 values when the sprite is aligned with the grid: $fc, $0c, $1c, $2c, ..., $7c. ; The reason that 4 is added below to the coordinate is to make it align with a ; multiple of $10 to make comparisons easier. DetectCollisionBetweenSprites: 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 coordinate ld a, [$ff90] ld [hl], a ; [$c1ia] = adjusted Y coordinate xor a ; zero the loop counter .loop ld [$ff8f], a ; store loop counter swap a ld e, a ld a, [H_CURRENTSPRITEOFFSET] cp e ; does the loop sprite match the current sprite? jp z, .next ; go to the next sprite if they match ld d, h ld a, [de] ; a = [$c1j0] (picture) (0 if slot is unused) and a ; is this sprite slot slot used? jp z, .next ; go the next sprite if not used inc e inc e ld a, [de] ; a = [$c1j2] ($ff means the sprite is offscreen) inc a jp z, .next ; go the next sprite if offscreen ld a, [H_CURRENTSPRITEOFFSET] add 10 ld l, a inc e ld a, [de] ; a = [$c1j3] (delta Y) call SetSpriteCollisionValues inc e ld a, [de] ; a = [$C1j4] (Y screen coordinate) add 4 ; align with multiple of $10 ; The effect of the following 3 lines is to ; add 7 to a if moving south or ; subtract 7 from a if moving north. add b and $f0 or c sub [hl] ; subtract the adjusted Y coordinate of sprite i ([$c1ia]) from that of sprite j ; calculate the absolute value of the difference to get the distance jr nc, .noCarry1 cpl inc a .noCarry1 ld [$ff90], a ; store the distance between the two sprites' adjusted Y values ; Use the carry flag set by the above subtraction to determine which sprite's ; Y coordinate is larger. This information is used later to set [$c1ic], ; which stores which direction the collision occurred in. ; The following 5 lines set the lowest 2 bits of c, which are later shifted left by 2. ; If sprite i's Y is larger, set lowest 2 bits of c to 10. ; If sprite j's Y is larger or both are equal, set lowest 2 bits of c to 01. push af rl c pop af ccf rl c ; If sprite i's delta Y is 0, then b = 7, else b = 9. ld b, 7 ld a, [hl] ; a = [$c1ia] (adjusted Y coordinate) and $f jr z, .next1 ld b, 9 .next1 ld a, [$ff90] ; a = distance between adjusted Y coordinates sub b ld [$ff92], a ; store distance adjusted using sprite i's direction ld a, b ld [$ff90], a ; store 7 or 9 depending on sprite i's delta Y jr c, .checkXDistance ; If sprite j's delta Y is 0, then b = 7, else b = 9. ld b, 7 dec e ld a, [de] ; a = [$c1j3] (delta Y) inc e and a jr z, .next2 ld b, 9 .next2 ld a, [$ff92] ; a = distance adjusted using sprite i's direction sub b ; adjust distance using sprite j's direction jr z, .checkXDistance jr nc, .next ; go to next sprite if distance is still positive after both adjustments .checkXDistance inc e inc l ld a, [de] ; a = [$c1j5] (delta X) push bc call SetSpriteCollisionValues inc e ld a, [de] ; a = [$c1j6] (X screen coordinate) ; The effect of the following 3 lines is to ; add 7 to a if moving east or ; subtract 7 from a if moving west. add b and $f0 or c pop bc sub [hl] ; subtract the adjusted X coordinate of sprite i ([$c1ib]) from that of sprite j ; calculate the absolute value of the difference to get the distance jr nc, .noCarry2 cpl inc a .noCarry2 ld [$ff91], a ; store the distance between the two sprites' adjusted X values ; Use the carry flag set by the above subtraction to determine which sprite's ; X coordinate is larger. This information is used later to set [$c1ic], ; which stores which direction the collision occurred in. ; The following 5 lines set the lowest 2 bits of c. ; If sprite i's X is larger, set lowest 2 bits of c to 10. ; If sprite j's X is larger or both are equal, set lowest 2 bits of c to 01. push af rl c pop af ccf rl c ; If sprite i's delta X is 0, then b = 7, else b = 9. ld b, 7 ld a, [hl] ; a = [$c1ib] (adjusted X coordinate) and $f jr z, .next3 ld b, 9 .next3 ld a, [$ff91] ; a = distance between adjusted X coordinates sub b ld [$ff92], a ; store distance adjusted using sprite i's direction ld a, b ld [$ff91], a ; store 7 or 9 depending on sprite i's delta X jr c, .collision ; If sprite j's delta X is 0, then b = 7, else b = 9. ld b, 7 dec e ld a, [de] ; a = [$c1j5] (delta X) inc e and a jr z, .next4 ld b, 9 .next4 ld a, [$ff92] ; a = distance adjusted using sprite i's direction sub b ; adjust distance using sprite j's direction jr z, .collision jr nc, .next ; go to next sprite if distance is still positive after both adjustments .collision ld a, [$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 [wObtainedBadges], a ld hl, wFlags_D733 set BIT_TEST_BATTLE, [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 [wCurEnemyLVL], a xor a ld [wMonDataLocation], a ld [wCurMap], a call AddPartyMon ; Fight against a ; level 20 Rhydon. ld a, RHYDON ld [wCurOpponent], 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: ld de, TrainerInfoTextBoxTileGraphics ld hl, vChars2 + $760 lb bc, BANK(TrainerInfoTextBoxTileGraphics), (TrainerInfoTextBoxTileGraphicsEnd - TrainerInfoTextBoxTileGraphics) / $10 jp CopyVideoData INCLUDE "engine/menu/main_menu.asm" INCLUDE "engine/oak_speech.asm" SpecialWarpIn: 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: ld a, [wd72d] cp TRADE_CENTER jr nz, .notTradeCenter ld hl, TradeCenterSpec1 ld a, [hSerialConnectionStatus] cp USING_INTERNAL_CLOCK ; which gameboy is clocking determines who is on the left and who is on the right jr z, .copyWarpData ld hl, TradeCenterSpec2 jr .copyWarpData .notTradeCenter cp COLOSSEUM jr nz, .notColosseum ld hl, ColosseumSpec1 ld a, [hSerialConnectionStatus] cp USING_INTERNAL_CLOCK jr z, .copyWarpData ld hl, ColosseumSpec2 jr .copyWarpData .notColosseum ld a, [wd732] bit 1, a jr nz, .notFirstMap bit 2, a jr nz, .notFirstMap ld hl, FirstMapSpec .copyWarpData ld de, wCurMap ld c, $7 .copyWarpDataLoop ld a, [hli] ld [de], a inc de dec c jr nz, .copyWarpDataLoop ld a, [hli] ld [wCurMapTileset], a xor a jr .done .notFirstMap ld a, [wLastMap] ; this value is overwritten before it's ever read ld hl, wd732 bit 4, [hl] ; used dungeon warp (jumped down hole/waterfall)? jr nz, .usedDunegonWarp bit 6, [hl] ; return to last pokemon center (or player's house)? res 6, [hl] jr z, .otherDestination ; return to last pokemon center or player's house ld a, [wLastBlackoutMap] jr .usedFlyWarp .usedDunegonWarp ld hl, wd72d res 4, [hl] ld a, [wDungeonWarpDestinationMap] ld b, a ld [wCurMap], a ld a, [wWhichDungeonWarp] ld c, a ld hl, DungeonWarpList ld de, 0 ld a, 6 ld [wDungeonWarpDataEntrySize], a .dungeonWarpListLoop ld a, [hli] cp b jr z, .matchedDungeonWarpDestinationMap inc hl jr .nextDungeonWarp .matchedDungeonWarpDestinationMap ld a, [hli] cp c jr z, .matchedDungeonWarpID .nextDungeonWarp ld a, [wDungeonWarpDataEntrySize] add e ld e, a jr .dungeonWarpListLoop .matchedDungeonWarpID ld hl, DungeonWarpData add hl, de jr .copyWarpData2 .otherDestination ld a, [wDestinationMap] .usedFlyWarp ld b, a ld [wCurMap], a ld hl, FlyWarpDataPtr .flyWarpDataPtrLoop ld a, [hli] inc hl cp b jr z, .foundFlyWarpMatch inc hl inc hl jr .flyWarpDataPtrLoop .foundFlyWarpMatch ld a, [hli] ld h, [hl] ld l, a .copyWarpData2 ld de, wCurrentTileBlockMapViewPointer ld c, $6 .copyWarpDataLoop2 ld a, [hli] ld [de], a inc de dec c jr nz, .copyWarpDataLoop2 xor a ; OVERWORLD ld [wCurMapTileset], a .done ld [wYOffsetSinceLastSpecialWarp], a ld [wXOffsetSinceLastSpecialWarp], a ld a, $ff ; the player's coordinates have already been updated using a special warp, so don't use any of the normal warps ld [wDestinationWarpID], a ret INCLUDE "data/special_warps.asm" ; 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: ld de, IshiharaTeam .loop ld a, [de] cp $ff ret z ld [wcf91], a inc de ld a, [de] ld [wCurEnemyLVL], a inc de call AddPartyMon jr .loop IshiharaTeam: db EXEGGUTOR,90 db MEW,20 db JOLTEON,56 db DUGTRIO,56 db ARTICUNO,57 db $FF EmptyFunc: 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_: ld de,wPlayerMoney ld hl,hMoney ; total price of items ld c,3 ; length of money in bytes call StringCmp ret c ld de,wPlayerMoney + 2 ld hl,hMoney + 2 ; total price of items ld c,3 ; length of money in bytes predef SubBCDPredef ; subtract total price from money ld a,MONEY_BOX ld [wTextBoxID],a call DisplayTextBoxID ; redraw money text box and a ret HandleItemListSwapping: ld a,[wListMenuID] cp a,ITEMLISTMENU jp nz,DisplayListMenuIDLoop ; only rearrange item list menus push hl ld hl,wListPointer ld a,[hli] ld h,[hl] ld l,a inc hl ; hl = beginning of list entries ld a,[wCurrentMenuItem] ld b,a ld a,[wListScrollOffset] add b add a ld c,a ld b,0 add hl,bc ; hl = address of currently selected item entry ld a,[hl] pop hl inc a jp z,DisplayListMenuIDLoop ; ignore attempts to swap the Cancel menu item ld a,[wMenuItemToSwap] ; ID of item chosen for swapping (counts from 1) and a ; has the first item to swap already been chosen? jr nz,.swapItems ; if not, set the currently selected item as the first item ld a,[wCurrentMenuItem] inc a ld b,a ld a,[wListScrollOffset] ; index of top (visible) menu item within the list add b ld [wMenuItemToSwap],a ; ID of item chosen for swapping (counts from 1) ld c,20 call DelayFrames jp DisplayListMenuIDLoop .swapItems ld a,[wCurrentMenuItem] inc a ld b,a ld a,[wListScrollOffset] add b ld b,a ld a,[wMenuItemToSwap] ; ID of item chosen for swapping (counts from 1) cp b ; is the currently selected item the same as the first item to swap? jp z,DisplayListMenuIDLoop ; ignore attempts to swap an item with itself dec a ld [wMenuItemToSwap],a ; ID of item chosen for swapping (counts from 1) ld c,20 call DelayFrames push hl push de ld hl,wListPointer ld a,[hli] ld h,[hl] ld l,a inc hl ; hl = beginning of list entries ld d,h ld e,l ; de = beginning of list entries ld a,[wCurrentMenuItem] ld b,a ld a,[wListScrollOffset] add b add a ld c,a ld b,0 add hl,bc ; hl = address of currently selected item entry ld a,[wMenuItemToSwap] ; ID of item chosen for swapping (counts from 1) add a add e ld e,a jr nc,.noCarry inc d .noCarry ; de = address of first item to swap ld a,[de] ld b,a ld a,[hli] cp b jr z,.swapSameItemType .swapDifferentItems ld [$ff95],a ; [$ff95] = second item ID ld a,[hld] ld [$ff96],a ; [$ff96] = second item quantity ld a,[de] ld [hli],a ; put first item ID in second item slot inc de ld a,[de] ld [hl],a ; put first item quantity in second item slot ld a,[$ff96] ld [de],a ; put second item quantity in first item slot dec de ld a,[$ff95] ld [de],a ; put second item ID in first item slot xor a ld [wMenuItemToSwap],a ; 0 means no item is currently being swapped pop de pop hl jp DisplayListMenuIDLoop .swapSameItemType inc de ld a,[hl] ld b,a ld a,[de] add b ; a = sum of both item quantities cp a,100 ; is the sum too big for one item slot? jr c,.combineItemSlots ; swap enough items from the first slot to max out the second slot if they can't be combined sub a,99 ld [de],a ld a,99 ld [hl],a jr .done .combineItemSlots ld [hl],a ; put the sum in the second item slot ld hl,wListPointer ld a,[hli] ld h,[hl] ld l,a dec [hl] ; decrease the number of items ld a,[hl] ld [wListCount],a ; update number of items variable cp a,1 jr nz,.skipSettingMaxMenuItemID ld [wMaxMenuItem],a ; if the number of items is only one now, update the max menu item ID .skipSettingMaxMenuItemID dec de ld h,d ld l,e inc hl inc hl ; hl = address of item after first item to swap .moveItemsUpLoop ; erase the first item slot and move up all the following item slots to fill the gap ld a,[hli] ld [de],a inc de inc a ; reached the $ff terminator? jr z,.afterMovingItemsUp ld a,[hli] ld [de],a inc de jr .moveItemsUpLoop .afterMovingItemsUp xor a ld [wListScrollOffset],a ld [wCurrentMenuItem],a .done xor a ld [wMenuItemToSwap],a ; 0 means no item is currently being swapped pop de pop hl jp DisplayListMenuIDLoop INCLUDE "engine/overworld/pokemart.asm" INCLUDE "engine/learn_move.asm" INCLUDE "engine/overworld/pokecenter.asm" SetLastBlackoutMap: ; Set the map to return to when ; blacking out or using Teleport or Dig. ; Safari rest houses don't count. push hl ld hl, SafariZoneRestHouses ld a, [wCurMap] ld b, a .loop ld a, [hli] cp -1 jr z, .notresthouse cp b jr nz, .loop jr .done .notresthouse ld a, [wLastMap] ld [wLastBlackoutMap], a .done pop hl ret SafariZoneRestHouses: 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: xor a ld [wListMenuID],a ld a,[wAutoTextBoxDrawingControl] bit 0,a jr nz,.skipDrawingTextBoxBorder ld a,[hSpriteIndexOrTextID] ; text ID (or sprite ID) and a jr nz,.notStartMenu ; if text ID is 0 (i.e. the start menu) ; Note that the start menu text border is also drawn in the function directly ; below this, so this seems unnecessary. CheckEvent EVENT_GOT_POKEDEX ; start menu with pokedex coord hl, 10, 0 ld b,$0e ld c,$08 jr nz,.drawTextBoxBorder ; start menu without pokedex coord hl, 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 coord hl, 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 .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: CheckEvent EVENT_GOT_POKEDEX ; menu with pokedex coord hl, 10, 0 ld b,$0e ld c,$08 jr nz,.drawTextBoxBorder ; shorter menu if the player doesn't have the pokedex coord hl, 10, 0 ld b,$0c ld c,$08 .drawTextBoxBorder call TextBoxBorder ld a,D_DOWN | D_UP | START | B_BUTTON | A_BUTTON ld [wMenuWatchedKeys],a ld a,$02 ld [wTopMenuItemY],a ; Y position of first menu choice ld a,$0b ld [wTopMenuItemX],a ; X position of first menu choice ld a,[wBattleAndStartSavedMenuItem] ; remembered menu selection from last time ld [wCurrentMenuItem],a ld [wLastMenuItem],a xor a ld [wMenuWatchMovingOutOfBounds],a ld hl,wd730 set 6,[hl] ; no pauses between printing each letter coord hl, 12, 2 CheckEvent EVENT_GOT_POKEDEX ; case for not having pokdex ld a,$06 jr z,.storeMenuItemCount ; case for having pokedex ld de,StartMenuPokedexText call PrintStartMenuItem ld a,$07 .storeMenuItemCount ld [wMaxMenuItem],a ; number of menu items ld de,StartMenuPokemonText call PrintStartMenuItem ld de,StartMenuItemText call PrintStartMenuItem ld de,wPlayerName ; player's name call PrintStartMenuItem ld a,[wd72e] bit 6,a ; is the player using the link feature? ; case for not using link feature ld de,StartMenuSaveText jr z,.printSaveOrResetText ; case for using link feature ld de,StartMenuResetText .printSaveOrResetText call PrintStartMenuItem ld de,StartMenuOptionText call PrintStartMenuItem ld de,StartMenuExitText call PlaceString ld hl,wd730 res 6,[hl] ; turn pauses between printing letters back on ret StartMenuPokedexText: db "POKéDEX@" StartMenuPokemonText: db "POKéMON@" StartMenuItemText: db "ITEM@" StartMenuSaveText: db "SAVE@" StartMenuResetText: db "RESET@" StartMenuExitText: db "EXIT@" StartMenuOptionText: db "OPTION@" PrintStartMenuItem: push hl call PlaceString pop hl ld de,SCREEN_WIDTH * 2 add hl,de ret INCLUDE "engine/overworld/cable_club_npc.asm" ; function to draw various text boxes DisplayTextBoxID_: 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 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: 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: 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: 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: push bc coord hl, 0, 0 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: 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: 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: 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: db "BUY" next "SELL" next "QUIT@@" UseTossText: db "USE" next "TOSS@" JapaneseSaveMessageText: db "きろく" next "メッセージ@" JapaneseSpeedOptionsText: db "はやい" next "おそい@" MoneyText: db "MONEY@" JapaneseMochimonoText: db "もちもの@" JapaneseMainMenuText: db "つづきから" next "さいしょから@" BattleMenuText: db "FIGHT ",$E1,$E2 next "ITEM RUN@" SafariZoneBattleMenuText: db "BALL× BAIT" next "THROW ROCK RUN@" SwitchStatsCancelText: db "SWITCH" next "STATS" next "CANCEL@" JapaneseAhText: db "アッ!@" JapanesePokedexMenu: db "データをみる" next "なきごえ" next "ぶんぷをみる" next "キャンセル@" DisplayMoneyBox: ld hl, wd730 set 6, [hl] ld a, MONEY_BOX_TEMPLATE ld [wTextBoxID], a call DisplayTextBoxID coord hl, 13, 1 ld b, 1 ld c, 6 call ClearScreenArea coord hl, 12, 1 ld de, wPlayerMoney ld c, $a3 call PrintBCDNumber ld hl, wd730 res 6, [hl] ret CurrencyString: db " ¥@" DoBuySellQuitMenu: ld a, [wd730] set 6, a ; no printing delay ld [wd730], a xor a ld [wChosenMenuItem], 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 [wMenuWatchMovingOutOfBounds], 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, CANCELLED_MENU ld [wMenuExitMethod], a jr .quit .pressedA ld a, CHOSE_MENU_ITEM ld [wMenuExitMethod], a ld a, [wCurrentMenuItem] ld [wChosenMenuItem], a ld b, a ld a, [wMaxMenuItem] cp b jr z, .quit ret .quit ld a, CANCELLED_MENU ld [wMenuExitMethod], a ld a, [wCurrentMenuItem] ld [wChosenMenuItem], 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: push hl ld a, [wd730] set 6, a ; no printing delay ld [wd730], a ; pointless because both values are overwritten before they are read xor a ld [wChosenMenuItem], a ld [wMenuExitMethod], 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 [wMenuWatchMovingOutOfBounds], 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_PRESS_AB 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 [wChosenMenuItem], a and a jr nz, .choseSecondMenuItem ; chose first menu item ld a, CHOSE_FIRST_ITEM ld [wMenuExitMethod], a ld c, 15 call DelayFrames call TwoOptionMenu_RestoreScreenTiles and a ret .choseSecondMenuItem ld a, 1 ld [wCurrentMenuItem], a ld [wChosenMenuItem], a ld a, CHOSE_SECOND_ITEM ld [wMenuExitMethod], 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: ld de, wBuffer lb bc, 5, 6 .loop ld a, [hli] ld [de], a inc de dec c jr nz, .loop push bc ld bc, SCREEN_WIDTH - 6 add hl, bc pop bc ld c, $6 dec b jr nz, .loop ret TwoOptionMenu_RestoreScreenTiles: ld de, wBuffer lb bc, 5, 6 .loop ld a, [de] inc de ld [hli], a dec c jr nz, .loop push bc ld bc, SCREEN_WIDTH - 6 add hl, bc pop bc ld c, 6 dec b jr nz, .loop call UpdateSprites ret ; Format: ; 00: byte width ; 01: byte height ; 02: byte put blank line before first menu item ; 03: word text pointer TwoOptionMenuStrings: 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 db "NO" next "YES@" .YesNoMenu db "YES" next "NO@" .NorthWestMenu db "NORTH" next "WEST@" .SouthEastMenu db "SOUTH" next "EAST@" .NorthEastMenu db "NORTH" next "EAST@" .TradeCancelMenu db "TRADE" next "CANCEL@" .HealCancelMenu db "HEAL" next "CANCEL@" DisplayFieldMoveMonMenu: xor a ld hl, wFieldMoves ld [hli], a ; wFieldMoves ld [hli], a ; wFieldMoves + 1 ld [hli], a ; wFieldMoves + 2 ld [hli], a ; wFieldMoves + 3 ld [hli], a ; wNumFieldMoves ld [hl], 12 ; wFieldMovesLeftmostXCoord call GetMonFieldMoves ld a, [wNumFieldMoves] and a jr nz, .fieldMovesExist ; no field moves coord hl, 11, 11 ld b, 5 ld c, 7 call TextBoxBorder call UpdateSprites ld a, 12 ld [hFieldMoveMonMenuTopMenuItemX], a coord hl, 13, 12 ld de, PokemonMenuEntries jp PlaceString .fieldMovesExist push af ; Calculate the text box position and dimensions based on the leftmost X coord ; of the field move names before adjusting for the number of field moves. coord hl, 0, 11 ld a, [wFieldMovesLeftmostXCoord] dec a ld e, a ld d, 0 add hl, de ld b, 5 ld a, 18 sub e ld c, a pop af ; For each field move, move the top of the text box up 2 rows while the leaving ; the bottom of the text box at the bottom of the screen. ld de, -SCREEN_WIDTH * 2 .textBoxHeightLoop add hl, de inc b inc b dec a jr nz, .textBoxHeightLoop ; Make space for an extra blank row above the top field move. ld de, -SCREEN_WIDTH add hl, de inc b call TextBoxBorder call UpdateSprites ; Calculate the position of the first field move name to print. coord hl, 0, 12 ld a, [wFieldMovesLeftmostXCoord] inc a ld e, a ld d, 0 add hl, de ld de, -SCREEN_WIDTH * 2 ld a, [wNumFieldMoves] .calcFirstFieldMoveYLoop add hl, de dec a jr nz, .calcFirstFieldMoveYLoop xor a ld [wNumFieldMoves], a ld de, wFieldMoves .printNamesLoop push hl ld hl, FieldMoveNames ld a, [de] and a jr z, .donePrintingNames inc de ld b, a ; index of name .skipNamesLoop ; skip past names before the name we want dec b jr z, .reachedName .skipNameLoop ; skip past current name ld a, [hli] cp "@" jr nz, .skipNameLoop jr .skipNamesLoop .reachedName ld b, h ld c, l pop hl push de ld d, b ld e, c call PlaceString ld bc, SCREEN_WIDTH * 2 add hl, bc pop de jr .printNamesLoop .donePrintingNames pop hl ld a, [wFieldMovesLeftmostXCoord] ld [hFieldMoveMonMenuTopMenuItemX], a coord hl, 0, 12 ld a, [wFieldMovesLeftmostXCoord] inc a ld e, a ld d, 0 add hl, de ld de, PokemonMenuEntries jp PlaceString FieldMoveNames: db "CUT@" db "FLY@" db "@" db "SURF@" db "STRENGTH@" db "FLASH@" db "DIG@" db "TELEPORT@" db "SOFTBOILED@" PokemonMenuEntries: db "STATS" next "SWITCH" next "CANCEL@" GetMonFieldMoves: ld a, [wWhichPokemon] ld hl, wPartyMon1Moves ld bc, wPartyMon2 - wPartyMon1 call AddNTimes ld d, h ld e, l ld c, NUM_MOVES + 1 ld hl, wFieldMoves .loop push hl .nextMove dec c jr z, .done ld a, [de] ; move ID and a jr z, .done ld b, a inc de ld hl, FieldMoveDisplayData .fieldMoveLoop ld a, [hli] cp $ff jr z, .nextMove ; if the move is not a field move cp b jr z, .foundFieldMove inc hl inc hl jr .fieldMoveLoop .foundFieldMove ld a, b ld [wLastFieldMoveID], a ld a, [hli] ; field move name index ld b, [hl] ; field move leftmost X coordinate pop hl ld [hli], a ; store name index in wFieldMoves ld a, [wNumFieldMoves] inc a ld [wNumFieldMoves], a ld a, [wFieldMovesLeftmostXCoord] cp b jr c, .skipUpdatingLeftmostXCoord ld a, b ld [wFieldMovesLeftmostXCoord], a .skipUpdatingLeftmostXCoord ld a, [wLastFieldMoveID] ld b, a jr .loop .done pop hl ret ; Format: [Move id], [name index], [leftmost tile] ; Move id = id of move ; Name index = index of name in FieldMoveNames ; 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: 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: ld hl, wPartyCount ld a, [wRemoveMonFromBox] and a jr z, .asm_7b74 ld hl, wNumInBox .asm_7b74 ld a, [hl] dec a ld [hli], a ld a, [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 ld d, $5 ld a, [wRemoveMonFromBox] and a jr z, .asm_7b97 ld hl, wBoxMonOT ld d, $13 .asm_7b97 ld a, [wWhichPokemon] call SkipFixedLengthTextEntries ld a, [wWhichPokemon] cp d jr nz, .asm_7ba6 ld [hl], $ff ret .asm_7ba6 ld d, h ld e, l ld bc, NAME_LENGTH add hl, bc ld bc, wPartyMonNicks ld a, [wRemoveMonFromBox] and a jr z, .asm_7bb8 ld bc, wBoxMonNicks .asm_7bb8 call CopyDataUntil ld hl, wPartyMons ld bc, wPartyMon2 - wPartyMon1 ld a, [wRemoveMonFromBox] and a jr z, .asm_7bcd ld hl, wBoxMons ld bc, wBoxMon2 - wBoxMon1 .asm_7bcd ld a, [wWhichPokemon] call AddNTimes ld d, h ld e, l ld a, [wRemoveMonFromBox] 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 .asm_7beb call CopyDataUntil ld hl, wPartyMonNicks ld a, [wRemoveMonFromBox] and a jr z, .asm_7bfa ld hl, wBoxMonNicks .asm_7bfa ld bc, NAME_LENGTH ld a, [wWhichPokemon] call AddNTimes ld d, h ld e, l ld bc, NAME_LENGTH add hl, bc ld bc, wPokedexOwned ld a, [wRemoveMonFromBox] and a jr z, .asm_7c15 ld bc, wBoxMonNicksEnd .asm_7c15 jp CopyDataUntil _DisplayPokedex: ld hl, wd730 set 6, [hl] predef ShowPokedexData ld hl, wd730 res 6, [hl] call ReloadMapData ld c, 10 call DelayFrames predef IndexToPokedex ld a, [wd11e] dec a ld c, a ld b, FLAG_SET 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: ld a, SCREEN_HEIGHT_PIXELS ld [hWY], a ld [rWY], a xor a ld [H_AUTOBGTRANSFERENABLED], a ld [wStepCounter], a ld [wLoneAttackNo], a ld [hJoyPressed], a ld [hJoyReleased], a ld [hJoyHeld], a ld [wActionResultOrTookBattleTurn], a ld [wUnusedD5A3], a ld hl, wCardKeyDoorY ld [hli], a ld [hl], a ld hl, wWhichTrade ld bc, wStandingOnWarpPadOrHole - wWhichTrade call FillMemory ret ; only used for setting bit 2 of wd736 upon entering a new map IsPlayerStandingOnWarp: ld a, [wNumberOfWarps] and a ret z ld c, a ld hl, wWarpEntries .loop ld a, [wYCoord] cp [hl] jr nz, .nextWarp1 inc hl ld a, [wXCoord] cp [hl] jr nz, .nextWarp2 inc hl ld a, [hli] ; target warp ld [wDestinationWarpID], a ld a, [hl] ; target map ld [hWarpDestinationMap], 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: ld hl, wd732 bit 5, [hl] ret nz ld hl, ForcedBikeOrSurfMaps ld a, [wYCoord] ld b, a ld a, [wXCoord] ld c, a ld a, [wCurMap] ld d, a .loop ld a, [hli] cp $ff ret z ;if we reach FF then it's not part of the list cp d ;compare to current map jr nz, .incorrectMap ld a, [hli] cp b ;compare y-coord jr nz, .incorrectY ld a, [hli] cp c ;compare x-coord jr nz, .loop ; incorrect x-coord, check next item ld a, [wCurMap] cp SEAFOAM_ISLANDS_4 ld a, $2 ld [wSeafoamIslands4CurScript], a jr z, .forceSurfing ld a, [wCurMap] cp SEAFOAM_ISLANDS_5 ld a, $2 ld [wSeafoamIslands5CurScript], a jr z, .forceSurfing ;force bike riding ld hl, wd732 set 5, [hl] ld a, $1 ld [wWalkBikeSurfState], a ld [wWalkBikeSurfStateCopy], a 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: push hl push de push bc ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction srl a ld c, a ld b, $0 ld hl, .functionPointerTable add hl, bc ld a, [hli] ld h, [hl] ld l, a ld a, [wYCoord] ld b, a ld a, [wXCoord] ld c, a ld de, .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, [wCurMapHeight] add a dec a cp b jr z, .setCarry jr .resetCarry .facingUp ld a, b and a jr z, .setCarry jr .resetCarry .facingLeft ld a, c and a jr z, .setCarry jr .resetCarry .facingRight ld a, [wCurMapWidth] add a dec a cp c jr z, .setCarry jr .resetCarry .resetCarry and a ret .setCarry scf ret IsWarpTileInFrontOfPlayer: push hl push de push bc call _GetTileAndCoordsInFrontOfPlayer ld a, [wCurMap] cp SS_ANNE_5 jr z, .ssAnne5 ld a, [wSpriteStateData1 + 9] ; player sprite's facing direction srl a ld c, a ld b, 0 ld hl, .warpTileListPointers add hl, bc ld a, [hli] ld h, [hl] ld l, a ld a, [wTileInFrontOfPlayer] ld de, $1 call IsInArray .done pop bc pop de pop hl ret .warpTileListPointers: 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: push hl push de push bc callba IsPlayerStandingOnDoorTile jr c, .done ld a, [wCurMapTileset] add a ld c, a ld b, $0 ld hl, WarpTileIDPointers add hl, bc ld a, [hli] ld h, [hl] ld l, a ld de, $1 aCoord 8, 9 call IsInArray jr nc, .done ld hl, wd736 res 2, [hl] .done pop bc pop de pop hl ret INCLUDE "data/warp_tile_ids.asm" PrintSafariZoneSteps: ld a, [wCurMap] cp SAFARI_ZONE_EAST ret c cp UNKNOWN_DUNGEON_2 ret nc coord hl, 0, 0 ld b, 3 ld c, 7 call TextBoxBorder coord hl, 1, 1 ld de, wSafariSteps lb bc, 2, 3 call PrintNumber coord hl, 4, 1 ld de, SafariSteps call PlaceString coord hl, 1, 3 ld de, SafariBallText call PlaceString ld a, [wNumSafariBalls] cp 10 jr nc, .asm_c56d coord hl, 5, 3 ld a, " " ld [hl], a .asm_c56d coord hl, 6, 3 ld de, wNumSafariBalls lb bc, 1, 2 jp PrintNumber SafariSteps: db "/500@" SafariBallText: db "BALL×× @" GetTileAndCoordsInFrontOfPlayer: call GetPredefRegisters _GetTileAndCoordsInFrontOfPlayer: ld a, [wYCoord] ld d, a ld a, [wXCoord] ld e, a ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction and a ; cp SPRITE_FACING_DOWN jr nz, .notFacingDown ; facing down aCoord 8, 11 inc d jr .storeTile .notFacingDown cp SPRITE_FACING_UP jr nz, .notFacingUp ; facing up aCoord 8, 7 dec d jr .storeTile .notFacingUp cp SPRITE_FACING_LEFT jr nz, .notFacingLeft ; facing left aCoord 6, 9 dec e jr .storeTile .notFacingLeft cp SPRITE_FACING_RIGHT jr nz, .storeTile ; facing right aCoord 10, 9 inc e .storeTile ld c, a ld [wTileInFrontOfPlayer], a ret GetTileTwoStepsInFrontOfPlayer: xor a ld [$ffdb], a ld hl, wYCoord ld a, [hli] ld d, a ld e, [hl] ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction and a ; cp SPRITE_FACING_DOWN jr nz, .notFacingDown ; facing down ld hl, $ffdb set 0, [hl] aCoord 8, 13 inc d jr .storeTile .notFacingDown cp SPRITE_FACING_UP jr nz, .notFacingUp ; facing up ld hl, $ffdb set 1, [hl] aCoord 8, 5 dec d jr .storeTile .notFacingUp cp SPRITE_FACING_LEFT jr nz, .notFacingLeft ; facing left ld hl, $ffdb set 2, [hl] aCoord 4, 9 dec e jr .storeTile .notFacingLeft cp SPRITE_FACING_RIGHT jr nz, .storeTile ; facing right ld hl, $ffdb set 3, [hl] aCoord 12, 9 inc e .storeTile ld c, a ld [wTileInFrontOfBoulderAndBoulderCollisionResult], a ld [wTileInFrontOfPlayer], a ret CheckForCollisionWhenPushingBoulder: call GetTileTwoStepsInFrontOfPlayer ld hl, wTilesetCollisionPtr 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: ld a, [wBoulderSpriteIndex] dec a swap a ld d, 0 ld e, a ld hl, wSpriteStateData2 + $14 add hl, de ld a, [hli] ; map Y position ld [$ffdc], a ld a, [hl] ; map X position ld [$ffdd], a ld a, [wNumSprites] ld c, a ld de, $f ld hl, wSpriteStateData2 + $14 ld a, [$ffdb] and $3 ; facing up or down? jr z, .pushingHorizontallyLoop .pushingVerticallyLoop inc hl ld a, [$ffdd] cp [hl] jr nz, .nextSprite1 ; if X coordinates don't match dec hl ld a, [hli] ld b, a ld a, [$ffdb] rrca jr c, .pushingDown ; pushing up ld a, [$ffdc] dec a jr .compareYCoords .pushingDown ld a, [$ffdc] inc a .compareYCoords cp b jr z, .failure .nextSprite1 dec c jr z, .success add hl, de jr .pushingVerticallyLoop .pushingHorizontallyLoop ld a, [hli] ld b, a ld a, [$ffdc] cp b jr nz, .nextSprite2 ld b, [hl] ld a, [$ffdb] bit 2, a jr nz, .pushingLeft ; pushing right ld a, [$ffdd] inc a jr .compareXCoords .pushingLeft ld a, [$ffdd] dec a .compareXCoords cp b jr z, .failure .nextSprite2 dec c jr z, .success add hl, de jr .pushingHorizontallyLoop .failure ld a, $ff ret .success xor a ret ApplyOutOfBattlePoisonDamage: 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 [hSpriteIndexOrTextID], 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_POISONED call PlaySound .skipPoisonEffectAndSound predef AnyPartyAlive ld a, d and a jr nz, .noBlackOut call EnableAutoTextBoxDrawing ld a, $d1 ld [hSpriteIndexOrTextID], a call DisplayTextID ld hl, wd72e set 5, [hl] ld a, $ff jr .done .noBlackOut xor a .done ld [wOutOfBattleBlackout], a ret LoadTilesetHeader: call GetPredefRegisters push hl ld d, 0 ld a, [wCurMapTileset] 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, wTilesetBank 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, [wCurMapTileset] push hl push de ld hl, DungeonTilesets ld de, $1 call IsInArray pop de pop hl jr c, .asm_c797 ld a, [wCurMapTileset] ld b, a ld a, [hPreviousTileset] cp b jr z, .done .asm_c797 ld a, [wDestinationWarpID] cp $ff jr z, .done call LoadDestinationWarpPosition ld a, [wYCoord] and $1 ld [wYBlockCoord], a ld a, [wXCoord] and $1 ld [wXBlockCoord], a .done ret INCLUDE "data/dungeon_tilesets.asm" INCLUDE "data/tileset_headers.asm" IncrementDayCareMonExp: ld a, [wDayCareInUse] and a ret z ld hl, wDayCareMonExp + 2 inc [hl] ret nz dec hl inc [hl] ret nz dec hl inc [hl] ld a, [hl] cp $50 ret c ld a, $50 ld [hl], a ret INCLUDE "data/hide_show_data.asm" PrintStrengthTxt: ld hl, wd728 set 0, [hl] ld hl, UsedStrengthText call PrintText ld hl, CanMoveBouldersText jp PrintText UsedStrengthText: TX_FAR _UsedStrengthText TX_ASM ld a, [wcf91] call PlayCry call Delay3 jp TextScriptEnd CanMoveBouldersText: TX_FAR _CanMoveBouldersText db "@" IsSurfingAllowed: ; Returns whether surfing is allowed in bit 1 of wd728. ; Surfing isn't allowed on the Cycling Road or in the lowest level of the ; Seafoam Islands before the current has been slowed with boulders. ld hl, wd728 set 1, [hl] ld a, [wd732] bit 5, a jr nz, .forcedToRideBike ld a, [wCurMap] cp SEAFOAM_ISLANDS_5 ret nz CheckBothEventsSet EVENT_SEAFOAM4_BOULDER1_DOWN_HOLE, EVENT_SEAFOAM4_BOULDER2_DOWN_HOLE ret z ld hl, CoordsData_cdf7 call ArePlayerCoordsInArray ret nc ld hl, wd728 res 1, [hl] ld hl, CurrentTooFastText jp PrintText .forcedToRideBike ld hl, wd728 res 1, [hl] ld hl, CyclingIsFunText jp PrintText CoordsData_cdf7: db $0B,$07,$FF CurrentTooFastText: TX_FAR _CurrentTooFastText db "@" CyclingIsFunText: 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 ; [wItemQuantity] = item quantity ; sets carry flag if successful, unsets carry flag if unsuccessful AddItemToInventory_: ld a,[wItemQuantity] ; a = item quantity push af push bc push de push hl push hl ld d,PC_ITEM_CAPACITY ; how many items the PC can hold 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,BAG_ITEM_CAPACITY ; how many items the bag can hold .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,[wItemQuantity] 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,[wItemQuantity] 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 [wItemQuantity],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 [wItemQuantity],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 ; [wItemQuantity] = quantity to remove RemoveItemFromInventory_: 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,[wItemQuantity] ; quantity being removed ld e,a ld a,[hl] ; a = current quantity sub e ld [hld],a ; store new quantity ld [wMaxItemQuantity],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 [wBagSavedMenuItem],a ld [wSavedListScrollOffset],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 [wListCount],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: ld hl,WildDataPointers ld a,[wCurMap] ; get wild data for current map ld c,a ld b,0 add hl,bc add hl,bc ld a,[hli] ld h,[hl] ld l,a ; hl now points to wild data for current map ld a,[hli] ld [wGrassRate],a and a jr z,.NoGrassData ; if no grass data, skip to surfing data push hl ld de,wGrassMons ; otherwise, load grass data ld bc,$0014 call CopyData pop hl ld bc,$0014 add hl,bc .NoGrassData ld a,[hli] ld [wWaterRate],a and a ret z ; if no water data, we're done ld de,wWaterMons ; otherwise, load surfing data ld bc,$0014 jp CopyData INCLUDE "data/wild_mons.asm" INCLUDE "engine/items/items.asm" DrawBadges: ; Draw 4x2 gym leader faces, with the faces replaced by ; badges if they are owned. Used in the player status screen. ; In Japanese versions, names are displayed above faces. ; Instead of removing relevant code, the name graphics were erased. ; Tile ids for face/badge graphics. ld de, wBadgeOrFaceTiles ld hl, .FaceBadgeTiles ld bc, 8 call CopyData ; Booleans for each badge. ld hl, wTempObtainedBadgesBooleans ld bc, 8 xor a call FillMemory ; Alter these based on owned badges. ld de, wTempObtainedBadgesBooleans ld hl, wBadgeOrFaceTiles ld a, [wObtainedBadges] ld b, a ld c, 8 .CheckBadge srl b jr nc, .NextBadge ld a, [hl] add 4 ; Badge graphics are after each face ld [hl], a ld a, 1 ld [de], a .NextBadge inc hl inc de dec c jr nz, .CheckBadge ; Draw two rows of badges. ld hl, wBadgeNumberTile ld a, $d8 ; [1] ld [hli], a ld [hl], $60 ; First name coord hl, 2, 11 ld de, wTempObtainedBadgesBooleans call .DrawBadgeRow coord hl, 2, 14 ld de, wTempObtainedBadgesBooleans + 4 ; call .DrawBadgeRow ; ret .DrawBadgeRow ; Draw 4 badges. ld c, 4 .DrawBadge push de push hl ; Badge no. ld a, [wBadgeNumberTile] ld [hli], a inc a ld [wBadgeNumberTile], a ; Names aren't printed if the badge is owned. ld a, [de] and a ld a, [wBadgeNameTile] jr nz, .SkipName call .PlaceTiles jr .PlaceBadge .SkipName inc a inc a inc hl .PlaceBadge ld [wBadgeNameTile], a ld de, SCREEN_WIDTH - 1 add hl, de ld a, [wBadgeOrFaceTiles] call .PlaceTiles add hl, de call .PlaceTiles ; Shift badge array back one byte. push bc ld hl, wBadgeOrFaceTiles + 1 ld de, wBadgeOrFaceTiles ld bc, 8 call CopyData pop bc pop hl ld de, 4 add hl, de pop de inc de dec c jr nz, .DrawBadge ret .PlaceTiles ld [hli], a inc a ld [hl], a inc a ret .FaceBadgeTiles db $20, $28, $30, $38, $40, $48, $50, $58 GymLeaderFaceAndBadgeTileGraphics: 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: call GetPredefRegisters ld hl, wOverworldMap ld a, [wCurMapWidth] add $6 ld e, a ld d, $0 add hl, de add hl, de add hl, de ld e, $3 add hl, de ld e, a ld a, b and a jr z, .addX ; add width * Y .addWidthYTimesLoop add hl, de dec b jr nz, .addWidthYTimesLoop .addX add hl, bc ; add X ld a, [wNewTileBlockID] ld [hl], a ld a, [wCurrentTileBlockMapViewPointer] ld c, a ld a, [wCurrentTileBlockMapViewPointer + 1] ld b, a call CompareHLWithBC ret c ; return if the replaced tile block is below the map view in memory push hl ld l, e ld h, $0 ld e, $6 ld d, h add hl, hl add hl, hl add hl, de add hl, bc pop bc call CompareHLWithBC ret c ; return if the replaced tile block is above the map view in memory RedrawMapView: ld a, [wIsInBattle] inc a ret z ld a, [H_AUTOBGTRANSFERENABLED] push af ld a, [hTilesetType] push af xor a ld [H_AUTOBGTRANSFERENABLED], a ld [hTilesetType], a ; no flower/water BG tile animations call LoadCurrentMapView call RunDefaultPaletteCommand ld hl, wMapViewVRAMPointer ld a, [hli] ld h, [hl] ld l, a ld de, -2 * 32 add hl, de ld a, h and $3 or $98 ld a, l ld [wBuffer], a ld a, h ld [wBuffer + 1], a ; this copy of the address is not used ld a, 2 ld [$ffbe], a ld c, 9 ; number of rows of 2x2 tiles (this covers the whole screen) .redrawRowLoop push bc push hl push hl ld hl, wTileMap - 2 * SCREEN_WIDTH ld de, SCREEN_WIDTH ld a, [$ffbe] .calcWRAMAddrLoop add hl, de dec a jr nz, .calcWRAMAddrLoop call CopyToRedrawRowOrColumnSrcTiles pop hl ld de, $20 ld a, [$ffbe] ld c, a .calcVRAMAddrLoop add hl, de ld a, h and $3 or $98 dec c jr nz, .calcVRAMAddrLoop ld [hRedrawRowOrColumnDest + 1], a ld a, l ld [hRedrawRowOrColumnDest], a ld a, REDRAW_ROW ld [hRedrawRowOrColumnMode], a call DelayFrame ld hl, $ffbe inc [hl] inc [hl] pop hl pop bc dec c jr nz, .redrawRowLoop pop af ld [hTilesetType], a pop af ld [H_AUTOBGTRANSFERENABLED], a ret CompareHLWithBC: ld a, h sub b ret nz ld a, l sub c ret INCLUDE "engine/overworld/cut.asm" MarkTownVisitedAndLoadMissableObjects: ld a, [wCurMap] cp ROUTE_1 jr nc, .notInTown ld c, a ld b, FLAG_SET ld hl, wTownVisitedFlag ; mark town as visited (for flying) predef FlagActionPredef .notInTown ld hl, MapHSPointers ld a, [wCurMap] ld b, $0 ld c, a add hl, bc add hl, bc ld a, [hli] ; load missable objects pointer in hl ld h, [hl] ; fall through LoadMissableObjects: 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, [wCurMap] ld b, a ld a, [H_DIVIDEND+3] ld c, a ; store global offset in c ld de, wMissableObjectList pop hl .writeMissableObjectsListLoop ld a, [hli] cp $ff jr z, .done ; end of list cp b jr nz, .done ; not for current map anymore ld a, [hli] inc hl ld [de], a ; write (map-local) sprite ID inc de ld a, c inc c ld [de], a ; write (global) missable object index inc de jr .writeMissableObjectsListLoop .done ld a, $ff ld [de], a ; write sentinel ret InitializeMissableObjectsFlags: ld hl, wMissableObjectFlags ld bc, wMissableObjectFlagsEnd - wMissableObjectFlags xor a call FillMemory ; clear missable objects flags ld hl, MapHS00 xor a ld [wMissableObjectCounter], a .missableObjectsLoop ld a, [hli] cp $ff ; end of list ret z push hl inc hl ld a, [hl] cp Hide jr nz, .skip ld hl, wMissableObjectFlags ld a, [wMissableObjectCounter] ld c, a ld b, FLAG_SET call MissableObjectFlagAction ; set flag if Item is hidden .skip ld hl, wMissableObjectCounter inc [hl] pop hl inc hl inc hl jr .missableObjectsLoop ; tests if current sprite is a missable object that is hidden/has been removed IsObjectHidden: ld a, [H_CURRENTSPRITEOFFSET] swap a ld b, a ld hl, wMissableObjectList .loop ld a, [hli] cp $ff jr z, .notHidden ; not missable -> not hidden cp b ld a, [hli] jr nz, .loop ld c, a ld b, FLAG_TEST ld hl, wMissableObjectFlags call MissableObjectFlagAction ld a, c and a jr nz, .hidden .notHidden xor a .hidden ld [$ffe5], a ret ; adds missable object (items, leg. pokemon, etc.) to the map ; [wMissableObjectIndex]: index of the missable object to be added (global index) ShowObject: ShowObject2: ld hl, wMissableObjectFlags ld a, [wMissableObjectIndex] ld c, a ld b, FLAG_RESET call MissableObjectFlagAction ; reset "removed" flag jp UpdateSprites ; removes missable object (items, leg. pokemon, etc.) from the map ; [wMissableObjectIndex]: index of the missable object to be removed (global index) HideObject: ld hl, wMissableObjectFlags ld a, [wMissableObjectIndex] ld c, a ld b, FLAG_SET 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: 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 [hSpriteIndexOrTextID], a call IsSpriteInFrontOfPlayer ld a, [hSpriteIndexOrTextID] ld [wBoulderSpriteIndex], a and a jp z, ResetBoulderPushFlags ld hl, wSpriteStateData1 + 1 ld d, $0 ld a, [hSpriteIndexOrTextID] swap a ld e, a add hl, de res 7, [hl] call GetSpriteMovementByte2Pointer ld a, [hl] cp BOULDER_MOVEMENT_BYTE_2 jp nz, ResetBoulderPushFlags ld hl, wFlags_0xcd60 bit 6, [hl] set 6, [hl] ; indicate that the player has tried pushing ret z ; the player must try pushing twice before the boulder will move ld a, [hJoyHeld] and D_RIGHT | D_LEFT | D_UP | D_DOWN ret z predef CheckForCollisionWhenPushingBoulder ld a, [wTileInFrontOfBoulderAndBoulderCollisionResult] and a ; was there a collision? jp nz, ResetBoulderPushFlags ld a, [hJoyHeld] ld b, a ld a, [wSpriteStateData1 + 9] ; player's sprite facing direction cp SPRITE_FACING_UP jr z, .pushBoulderUp cp SPRITE_FACING_LEFT jr z, .pushBoulderLeft cp SPRITE_FACING_RIGHT jr z, .pushBoulderRight .pushBoulderDown bit 7, b ret z ld de, PushBoulderDownMovementData jr .done .pushBoulderUp bit 6, b ret z ld de, PushBoulderUpMovementData jr .done .pushBoulderLeft bit 5, b ret z ld de, PushBoulderLeftMovementData jr .done .pushBoulderRight bit 4, b ret z ld de, PushBoulderRightMovementData .done call MoveSprite ld a, SFX_PUSH_BOULDER call PlaySound ld hl, wFlags_0xcd60 set 1, [hl] ret PushBoulderUpMovementData: db NPC_MOVEMENT_UP,$FF PushBoulderDownMovementData: db NPC_MOVEMENT_DOWN,$FF PushBoulderLeftMovementData: db NPC_MOVEMENT_LEFT,$FF PushBoulderRightMovementData: db NPC_MOVEMENT_RIGHT,$FF DoBoulderDustAnimation: ld a, [wd730] bit 0, a ret nz callab AnimateBoulderDust call DiscardButtonPresses ld [wJoyIgnore], a call ResetBoulderPushFlags set 7, [hl] ld a, [wBoulderSpriteIndex] ld [H_SPRITEINDEX], a call GetSpriteMovementByte2Pointer ld [hl], $10 ld a, SFX_CUT jp PlaySound ResetBoulderPushFlags: ld hl, wFlags_0xcd60 res 1, [hl] res 6, [hl] ret _AddPartyMon: ; Adds a new mon to the player's or enemy's party. ; [wMonDataLocation] is used in an unusual way in this function. ; If the lower nybble is 0, the mon is added to the player's party, else the enemy's. ; If the entire value is 0, then the player is allowed to name the mon. ld de, wPartyCount ld a, [wMonDataLocation] and $f jr z, .next ld de, wEnemyPartyCount .next ld a, [de] inc a cp PARTY_LENGTH + 1 ret nc ; return if the party is already full ld [de], a ld a, [de] ld [hNewPartyLength], a add e ld e, a jr nc, .noCarry inc d .noCarry ld a, [wcf91] ld [de], a ; write species of new mon in party list inc de ld a, $ff ; terminator ld [de], a ld hl, wPartyMonOT ld a, [wMonDataLocation] and $f jr z, .next2 ld hl, wEnemyMonOT .next2 ld a, [hNewPartyLength] dec a call SkipFixedLengthTextEntries ld d, h ld e, l ld hl, wPlayerName ld bc, NAME_LENGTH call CopyData ld a, [wMonDataLocation] and a jr nz, .skipNaming ld hl, wPartyMonNicks ld a, [hNewPartyLength] dec a call SkipFixedLengthTextEntries ld a, NAME_MON_SCREEN ld [wNamingScreenType], a predef AskName .skipNaming ld hl, wPartyMons ld a, [wMonDataLocation] and $f jr z, .next3 ld hl, wEnemyMons .next3 ld a, [hNewPartyLength] dec a ld bc, wPartyMon2 - wPartyMon1 call AddNTimes ld e, l ld d, h push hl ld a, [wcf91] ld [wd0b5], a call GetMonHeader ld hl, wMonHeader ld a, [hli] ld [de], a ; species inc de pop hl push hl ld a, [wMonDataLocation] and $f ld a, $98 ; set enemy trainer mon IVs to fixed average values ld b, $88 jr nz, .next4 ; If the mon is being added to the player's party, update the pokedex. ld a, [wcf91] ld [wd11e], a push de predef IndexToPokedex pop de ld a, [wd11e] dec a ld c, a ld b, FLAG_TEST ld hl, wPokedexOwned call FlagAction ld a, c ; whether the mon was already flagged as owned ld [wUnusedD153], a ; not read ld a, [wd11e] dec a ld c, a ld b, FLAG_SET push bc call FlagAction pop bc ld hl, wPokedexSeen call FlagAction pop hl push hl ld a, [wIsInBattle] and a ; is this a wild mon caught in battle? jr nz, .copyEnemyMonData ; Not wild. call Random ; generate random IVs ld b, a call Random .next4 push bc ld bc, wPartyMon1DVs - wPartyMon1 add hl, bc pop bc ld [hli], a ld [hl], b ; write IVs ld bc, (wPartyMon1HPExp - 1) - (wPartyMon1DVs + 1) add hl, bc ld a, 1 ld c, a xor a ld b, a call CalcStat ; calc HP stat (set cur Hp to max HP) ld a, [H_MULTIPLICAND+1] ld [de], a inc de ld a, [H_MULTIPLICAND+2] ld [de], a inc de xor a ld [de], a ; box level inc de ld [de], a ; status ailments inc de jr .copyMonTypesAndMoves .copyEnemyMonData ld bc, wEnemyMon1DVs - wEnemyMon1 add hl, bc ld a, [wEnemyMonDVs] ; copy IVs from cur enemy mon ld [hli], a ld a, [wEnemyMonDVs + 1] ld [hl], a ld a, [wEnemyMonHP] ; copy HP from cur enemy mon ld [de], a inc de ld a, [wEnemyMonHP+1] ld [de], a inc de xor a ld [de], a ; box level inc de ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon ld [de], a inc de .copyMonTypesAndMoves ld hl, wMonHTypes ld a, [hli] ; type 1 ld [de], a inc de ld a, [hli] ; type 2 ld [de], a inc de ld a, [hli] ; catch rate (held item in gen 2) ld [de], a ld hl, wMonHMoves ld a, [hli] inc de push de ld [de], a ld a, [hli] inc de ld [de], a ld a, [hli] inc de ld [de], a ld a, [hli] inc de ld [de], a push de dec de dec de dec de xor a ld [wLearningMovesFromDayCare], a predef WriteMonMoves pop de ld a, [wPlayerID] ; set trainer ID to player ID inc de ld [de], a ld a, [wPlayerID + 1] inc de ld [de], a push de ld a, [wCurEnemyLVL] ld d, a callab CalcExperience pop de inc de ld a, [hExperience] ; write experience ld [de], a inc de ld a, [hExperience + 1] ld [de], a inc de ld a, [hExperience + 2] ld [de], a xor a ld b, NUM_STATS * 2 .writeEVsLoop ; set all EVs to 0 inc de ld [de], a dec b jr nz, .writeEVsLoop inc de inc de pop hl call AddPartyMon_WriteMovePP inc de ld a, [wCurEnemyLVL] ld [de], a inc de ld a, [wIsInBattle] dec a jr nz, .calcFreshStats ld hl, wEnemyMonMaxHP ld bc, $a call CopyData ; copy stats of cur enemy mon pop hl jr .done .calcFreshStats pop hl ld bc, wPartyMon1HPExp - 1 - wPartyMon1 add hl, bc ld b, $0 call CalcStats ; calculate fresh set of stats .done scf ret LoadMovePPs: call GetPredefRegisters ; fallthrough AddPartyMon_WriteMovePP: ld b, NUM_MOVES .pploop ld a, [hli] ; read move ID and a jr z, .empty dec a push hl push de push bc ld hl, Moves ld bc, MoveEnd - Moves call AddNTimes ld de, wcd6d ld a, BANK(Moves) call FarCopyData pop bc pop de pop hl ld a, [wcd6d + 5] ; PP is byte 5 of move data .empty inc de ld [de], a dec b jr nz, .pploop ; there are still moves to read ret ; adds enemy mon [wcf91] (at position [wWhichPokemon] in enemy list) to own party ; used in the cable club trade center _AddEnemyMonToPlayerParty: ld hl, wPartyCount ld a, [hl] cp PARTY_LENGTH scf ret z ; party full, return failure inc a ld [hl], a ; add 1 to party members ld c, a ld b, $0 add hl, bc ld a, [wcf91] ld [hli], a ; add mon as last list entry ld [hl], $ff ; write new sentinel ld hl, wPartyMons ld a, [wPartyCount] dec a ld bc, wPartyMon2 - wPartyMon1 call AddNTimes ld e, l ld d, h ld hl, wLoadedMon call CopyData ; write new mon's data (from wLoadedMon) ld hl, wPartyMonOT ld a, [wPartyCount] dec a call SkipFixedLengthTextEntries ld d, h ld e, l ld hl, wEnemyMonOT ld a, [wWhichPokemon] call SkipFixedLengthTextEntries ld bc, NAME_LENGTH call CopyData ; write new mon's OT name (from an enemy mon) ld hl, wPartyMonNicks ld a, [wPartyCount] dec a call SkipFixedLengthTextEntries ld d, h ld e, l ld hl, wEnemyMonNicks ld a, [wWhichPokemon] call SkipFixedLengthTextEntries ld bc, NAME_LENGTH call CopyData ; write new mon's nickname (from an enemy mon) ld a, [wcf91] ld [wd11e], a predef IndexToPokedex ld a, [wd11e] dec a ld c, a ld b, FLAG_SET ld hl, wPokedexOwned push bc call FlagAction ; add to owned pokemon pop bc ld hl, wPokedexSeen call FlagAction ; add to seen pokemon and a ret ; return success _MoveMon: ld a, [wMoveMonType] and a jr z, .checkPartyMonSlots cp DAYCARE_TO_PARTY jr z, .checkPartyMonSlots cp PARTY_TO_DAYCARE ld hl, wDayCareMon jr z, .asm_f575 ld hl, wNumInBox ld a, [hl] cp MONS_PER_BOX jr nz, .partyOrBoxNotFull jr .boxFull .checkPartyMonSlots ld hl, wPartyCount ld a, [hl] cp PARTY_LENGTH jr nz, .partyOrBoxNotFull .boxFull scf ret .partyOrBoxNotFull inc a ld [hl], a ; increment number of mons in party/box ld c, a ld b, 0 add hl, bc ld a, [wMoveMonType] cp DAYCARE_TO_PARTY ld a, [wDayCareMon] jr z, .asm_f556 ld a, [wcf91] .asm_f556 ld [hli], a ; write new mon ID ld [hl], $ff ; write new sentinel ld a, [wMoveMonType] dec a ld hl, wPartyMons ld bc, wPartyMon2 - wPartyMon1 ; $2c ld a, [wPartyCount] jr nz, .skipToNewMonEntry ld hl, wBoxMons ld bc, wBoxMon2 - wBoxMon1 ; $21 ld a, [wNumInBox] .skipToNewMonEntry dec a call AddNTimes .asm_f575 push hl ld e, l ld d, h ld a, [wMoveMonType] and a ld hl, wBoxMons ld bc, wBoxMon2 - wBoxMon1 ; $21 jr z, .asm_f591 cp DAYCARE_TO_PARTY ld hl, wDayCareMon jr z, .asm_f597 ld hl, wPartyMons ld bc, wPartyMon2 - wPartyMon1 ; $2c .asm_f591 ld a, [wWhichPokemon] call AddNTimes .asm_f597 push hl push de ld bc, wBoxMon2 - wBoxMon1 call CopyData pop de pop hl ld a, [wMoveMonType] and a jr z, .asm_f5b4 cp DAYCARE_TO_PARTY 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, [wMoveMonType] cp PARTY_TO_DAYCARE ld de, wDayCareMonOT jr z, .asm_f5d3 dec a ld hl, wPartyMonOT ld a, [wPartyCount] jr nz, .asm_f5cd ld hl, wBoxMonOT ld a, [wNumInBox] .asm_f5cd dec a call SkipFixedLengthTextEntries ld d, h ld e, l .asm_f5d3 ld hl, wBoxMonOT ld a, [wMoveMonType] and a jr z, .asm_f5e6 ld hl, wDayCareMonOT cp DAYCARE_TO_PARTY jr z, .asm_f5ec ld hl, wPartyMonOT .asm_f5e6 ld a, [wWhichPokemon] call SkipFixedLengthTextEntries .asm_f5ec ld bc, NAME_LENGTH call CopyData ld a, [wMoveMonType] cp PARTY_TO_DAYCARE ld de, wDayCareMonName jr z, .asm_f611 dec a ld hl, wPartyMonNicks ld a, [wPartyCount] jr nz, .asm_f60b ld hl, wBoxMonNicks ld a, [wNumInBox] .asm_f60b dec a call SkipFixedLengthTextEntries ld d, h ld e, l .asm_f611 ld hl, wBoxMonNicks ld a, [wMoveMonType] and a jr z, .asm_f624 ld hl, wDayCareMonName cp DAYCARE_TO_PARTY jr z, .asm_f62a ld hl, wPartyMonNicks .asm_f624 ld a, [wWhichPokemon] call SkipFixedLengthTextEntries .asm_f62a ld bc, NAME_LENGTH call CopyData pop hl ld a, [wMoveMonType] cp PARTY_TO_BOX jr z, .asm_f664 cp PARTY_TO_DAYCARE jr z, .asm_f664 push hl srl a add $2 ld [wMonDataLocation], a call LoadMonData callba CalcLevelFromExperience ld a, d ld [wCurEnemyLVL], a pop hl ld bc, wBoxMon2 - wBoxMon1 add hl, bc ld [hli], a ld d, h ld e, l ld bc, -18 add hl, bc ld b, $1 call CalcStats .asm_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, MoveEnd - Moves call AddNTimes ld de, wcd6d ld a, BANK(Moves) call FarCopyData ld a, [wcd6d + 5] ; PP is byte 5 of move data pop bc pop de pop hl inc de push bc ld b, a ld a, [hl] and $c0 add b ld [hl], a pop bc .nextmove dec b jr nz, .pp pop de ld hl, wPartyMon1MaxHP - wPartyMon1HP add hl, de ld a, [hli] ld [de], a inc de ld a, [hl] ld [de], a pop de pop hl push hl ld bc, wPartyMon2 - wPartyMon1 ld h, d ld l, e add hl, bc ld d, h ld e, l pop hl jr .healmon .done xor a ld [wWhichPokemon], a ld [wd11e], a ld a, [wPartyCount] ld b, a .ppup push bc call RestoreBonusPP pop bc ld hl, wWhichPokemon inc [hl] dec b jr nz, .ppup ret 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 DivideBCD_f800 pop de ld a, b swap a and $f0 ld [$ffa5], a dec d jr z, .asm_f7bc push de call DivideBCD_f7d7 call DivideBCD_f800 pop de ld a, [$ffa5] or b ld [$ffa5], a dec d jr z, .asm_f7bc push de call DivideBCD_f7d7 call DivideBCD_f800 pop de ld a, b swap a and $f0 ld [$ffa6], a dec d jr z, .asm_f7bc push de call DivideBCD_f7d7 call DivideBCD_f800 pop de ld a, [$ffa6] or b ld [$ffa6], a dec d jr z, .asm_f7bc push de call DivideBCD_f7d7 call DivideBCD_f800 pop de ld a, b swap a and $f0 ld [$ffa7], a dec d jr z, .asm_f7bc push de call DivideBCD_f7d7 call DivideBCD_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 DivideBCD_f7d7 pop af dec a jr nz, .asm_f7ce ret DivideBCD_f7d7: 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 DivideBCD_f800: 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 [wUnusedD71B], a ld hl, wPartyCount call InitializeEmptyList ld hl, wNumInBox call InitializeEmptyList ld hl, wNumBagItems call InitializeEmptyList ld hl, wNumBoxItems call InitializeEmptyList START_MONEY EQU $3000 ld hl, wPlayerMoney + 1 ld a, START_MONEY / $100 ld [hld], a xor a ld [hli], a inc hl ld [hl], a ld [wMonDataLocation], a ld hl, wObtainedBadges ld [hli], a ld [hl], a ld hl, wPlayerCoins ld [hli], a ld [hl], a ld hl, wGameProgressFlags ld bc, wGameProgressFlagsEnd - wGameProgressFlags call FillMemory ; clear all game progress flags jp InitializeMissableObjectsFlags InitializeEmptyList: xor a ; count ld [hli], a dec a ; terminator ld [hl], a ret GetQuantityOfItemInBag: ; In: b = item ID ; Out: b = how many of that item are in the bag call GetPredefRegisters ld hl, wNumBagItems .loop inc hl ld a, [hli] cp $ff jr z, .notInBag cp b jr nz, .loop ld a, [hl] ld b, a ret .notInBag ld b, 0 ret FindPathToPlayer: xor a ld hl, hFindPathNumSteps ld [hli], a ; hFindPathNumSteps ld [hli], a ; hFindPathFlags ld [hli], a ; hFindPathYProgress ld [hl], a ; hFindPathXProgress ld hl, wNPCMovementDirections2 ld de, $0 .loop ld a, [hFindPathYProgress] ld b, a ld a, [hNPCPlayerYDistance] ; Y distance in steps call CalcDifference ld d, a and a jr nz, .asm_f8da ld a, [hFindPathFlags] set 0, a ; current end of path matches the player's Y coordinate ld [hFindPathFlags], a .asm_f8da ld a, [hFindPathXProgress] ld b, a ld a, [hNPCPlayerXDistance] ; X distance in steps call CalcDifference ld e, a and a jr nz, .asm_f8ec ld a, [hFindPathFlags] set 1, a ; current end of path matches the player's X coordinate ld [hFindPathFlags], a .asm_f8ec ld a, [hFindPathFlags] cp $3 ; has the end of the path reached the player's position? jr z, .done ; Compare whether the X distance between the player and the current of the path ; is greater or if the Y distance is. Then, try to reduce whichever is greater. ld a, e cp d jr c, .yDistanceGreater ; x distance is greater ld a, [hNPCPlayerRelativePosFlags] bit 1, a jr nz, .playerIsLeftOfNPC ld d, NPC_MOVEMENT_RIGHT jr .next1 .playerIsLeftOfNPC ld d, NPC_MOVEMENT_LEFT .next1 ld a, [hFindPathXProgress] add 1 ld [hFindPathXProgress], a jr .storeDirection .yDistanceGreater ld a, [hNPCPlayerRelativePosFlags] bit 0, a jr nz, .playerIsAboveNPC ld d, NPC_MOVEMENT_DOWN jr .next2 .playerIsAboveNPC ld d, NPC_MOVEMENT_UP .next2 ld a, [hFindPathYProgress] add 1 ld [hFindPathYProgress], a .storeDirection ld a, d ld [hli], a ld a, [hFindPathNumSteps] inc a ld [hFindPathNumSteps], a jp .loop .done ld [hl], $ff ret CalcPositionOfPlayerRelativeToNPC: xor a ld [hNPCPlayerRelativePosFlags], a ld a, [wSpriteStateData1 + 4] ; player's sprite screen Y position in pixels ld d, a ld a, [wSpriteStateData1 + 6] ; player's sprite screen X position in pixels ld e, a ld hl, wSpriteStateData1 ld a, [hNPCSpriteOffset] add l add $4 ld l, a jr nc, .noCarry inc h .noCarry ld a, d ld b, a ld a, [hli] ; NPC sprite screen Y position in pixels call CalcDifference jr nc, .NPCSouthOfOrAlignedWithPlayer .NPCNorthOfPlayer push hl ld hl, hNPCPlayerRelativePosFlags bit 0, [hl] set 0, [hl] pop hl jr .divideYDistance .NPCSouthOfOrAlignedWithPlayer push hl ld hl, hNPCPlayerRelativePosFlags bit 0, [hl] res 0, [hl] pop hl .divideYDistance push hl ld hl, hDividend2 ld [hli], a ld a, 16 ld [hli], a call DivideBytes ; divide Y absolute distance by 16 ld a, [hl] ; quotient ld [hNPCPlayerYDistance], a pop hl inc hl ld b, e ld a, [hl] ; NPC sprite screen X position in pixels call CalcDifference jr nc, .NPCEastOfOrAlignedWithPlayer .NPCWestOfPlayer push hl ld hl, hNPCPlayerRelativePosFlags bit 1, [hl] set 1, [hl] pop hl jr .divideXDistance .NPCEastOfOrAlignedWithPlayer push hl ld hl, hNPCPlayerRelativePosFlags bit 1, [hl] res 1, [hl] pop hl .divideXDistance ld [hDividend2], a ld a, 16 ld [hDivisor2], a call DivideBytes ; divide X absolute distance by 16 ld a, [hQuotient2] ld [hNPCPlayerXDistance], a ld a, [hNPCPlayerRelativePosPerspective] and a ret z ld a, [hNPCPlayerRelativePosFlags] cpl and $3 ld [hNPCPlayerRelativePosFlags], a ret ConvertNPCMovementDirectionsToJoypadMasks: ld a, [hNPCMovementDirections2Index] ld [wNPCMovementDirections2Index], a dec a ld de, wSimulatedJoypadStatesEnd ld hl, wNPCMovementDirections2 add l ld l, a jr nc, .loop inc h .loop ld a, [hld] call ConvertNPCMovementDirectionToJoypadMask ld [de], a inc de ld a, [hNPCMovementDirections2Index] dec a ld [hNPCMovementDirections2Index], a jr nz, .loop ret ConvertNPCMovementDirectionToJoypadMask: 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: db NPC_MOVEMENT_UP, D_UP db NPC_MOVEMENT_DOWN, D_DOWN db NPC_MOVEMENT_LEFT, D_LEFT db NPC_MOVEMENT_RIGHT, D_RIGHT db $ff ; unreferenced ret INCLUDE "engine/hp_bar.asm" INCLUDE "engine/hidden_object_functions3.asm" SECTION "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" FontGraphicsEnd: ABTiles: INCBIN "gfx/AB.2bpp" HpBarAndStatusGraphics: INCBIN "gfx/hp_bar_and_status.2bpp" HpBarAndStatusGraphicsEnd: BattleHudTiles1: INCBIN "gfx/battle_hud1.1bpp" BattleHudTiles1End: BattleHudTiles2: INCBIN "gfx/battle_hud2.1bpp" BattleHudTiles3: INCBIN "gfx/battle_hud3.1bpp" BattleHudTiles3End: NintendoCopyrightLogoGraphics: INCBIN "gfx/copyright.2bpp" GamefreakLogoGraphics: INCBIN "gfx/gamefreak.2bpp" GamefreakLogoGraphicsEnd: TextBoxGraphics: INCBIN "gfx/text_box.2bpp" TextBoxGraphicsEnd: PokedexTileGraphics: INCBIN "gfx/pokedex.2bpp" PokedexTileGraphicsEnd: WorldMapTileGraphics: INCBIN "gfx/town_map.2bpp" WorldMapTileGraphicsEnd: PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp" PlayerCharacterTitleGraphicsEnd: 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" INCLUDE "engine/random.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" 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" TrainerInfoTextBoxTileGraphicsEnd: 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" TradingAnimationGraphicsEnd: TradingAnimationGraphics2: ; Pokeball traveling through the link cable. INCBIN "gfx/trade2.2bpp" TradingAnimationGraphics2End: 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/tradecenter.asm" INCLUDE "scripts/tradecenter.asm" INCLUDE "data/mapObjects/tradecenter.asm" TradeCenterBlocks: INCBIN "maps/tradecenter.blk" INCLUDE "data/mapHeaders/colosseum.asm" INCLUDE "scripts/colosseum.asm" INCLUDE "data/mapObjects/colosseum.asm" ColosseumBlocks: INCBIN "maps/colosseum.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" Route19Blocks: INCBIN "maps/route19.blk" 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 Version_GFXEnd: 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"