diff options
Diffstat (limited to 'main.asm')
-rwxr-xr-x | main.asm | 15794 |
1 files changed, 1650 insertions, 14144 deletions
@@ -1,10307 +1,139 @@ INCLUDE "constants.asm" -; The rst vectors are unused. -SECTION "rst00",ROM0[$00] - rst $38 -SECTION "rst08",ROM0[$08] - rst $38 -SECTION "rst10",ROM0[$10] - rst $38 -SECTION "rst18",ROM0[$18] - rst $38 -SECTION "rst20",ROM0[$20] - rst $38 -SECTION "rst28",ROM0[$28] - rst $38 -SECTION "rst30",ROM0[$30] - rst $38 -SECTION "rst38",ROM0[$38] - rst $38 - -; interrupts -SECTION "vblank",ROM0[$40] - jp VBlank -SECTION "lcdc",ROM0[$48] - db $FF -SECTION "timer",ROM0[$50] - jp Timer -SECTION "serial",ROM0[$58] - jp Serial -SECTION "joypad",ROM0[$60] - reti - -SECTION "bank0",ROM0[$61] - -DisableLCD:: ; 0061 (0:0061) - xor a - ld [$ff0f],a - ld a,[$ffff] - ld b,a - res 0,a - ld [$ffff],a -.waitVBlank - ld a,[$ff44] - cp a,$91 - jr nz,.waitVBlank - ld a,[$ff40] - and a,$7f ; res 7,a - ld [$ff40],a - ld a,b - ld [$ffff],a - ret - -EnableLCD:: ; 007b (0:007b) - ld a,[$ff40] - set 7,a - ld [$ff40],a - ret - -CleanLCD_OAM:: ; 0082 (0:0082) - xor a - ld hl,wOAMBuffer - ld b,$a0 -.loop - ld [hli],a - dec b - jr nz,.loop - ret - -ResetLCD_OAM:: ; 008d (0:008d) - ld a,$a0 - ld hl,wOAMBuffer - ld de,$0004 - ld b,$28 -.loop - ld [hl],a - add hl,de - dec b - jr nz,.loop - ret - -FarCopyData:: ; 009d (0:009d) -; copy bc bytes of data from a:hl to de - ld [$CEE9],a ; save future bank # for later - ld a,[H_LOADEDROMBANK] ; get current bank # - push af - ld a,[$CEE9] ; get future bank #, switch - ld [H_LOADEDROMBANK],a - ld [$2000],a - call CopyData - pop af ; okay, done, time to switch back - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret -CopyData:: ; 00b5 (0:00b5) -; copy bc bytes of data from hl to de - ld a,[hli] - ld [de],a - inc de - dec bc - ld a,c - or b - jr nz,CopyData - ret - -SECTION "romheader",ROM0[$100] - nop - jp Start - -SECTION "start",ROM0[$150] -Start:: ; 0150 (0:0150) - cp $11 ; value that indicates Gameboy Color - jr z,.gbcDetected - xor a - jr .storeValue -.gbcDetected - ld a,$00 -.storeValue - ld [$cf1a],a ; same value ($00) either way - jp InitGame - -; this function directly reads the joypad I/O register -; it reads many times in order to give the joypad a chance to stabilize -; it saves a result in [$fff8] in the following format -; (set bit indicates pressed button) -; bit 0 - A button -; bit 1 - B button -; bit 2 - Select button -; bit 3 - Start button -; bit 4 - Right -; bit 5 - Left -; bit 6 - Up -; bit 7 - Down -ReadJoypadRegister:: ; 015f (0:015f) - ld a,%00100000 ; select direction keys - ld c,$00 - ld [rJOYP],a - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - cpl ; complement the result so that a set bit indicates a pressed key - and a,%00001111 - swap a ; put direction keys in upper nibble - ld b,a - ld a,%00010000 ; select button keys - ld [rJOYP],a - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - ld a,[rJOYP] - cpl ; complement the result so that a set bit indicates a pressed key - and a,%00001111 - or b ; put button keys in lower nibble - ld [H_JOYPADSTATE],a ; save joypad state - ld a,%00110000 ; unselect all keys - ld [rJOYP],a - ret - -; function to update the joypad state variables -; output: -; [H_NEWLYRELEASEDBUTTONS] = keys released since last time -; [H_NEWLYPRESSEDBUTTONS] = keys pressed since last time -; [H_CURRENTPRESSEDBUTTONS] = currently pressed keys -GetJoypadState:: ; 019a (0:019a) - ld a, [H_LOADEDROMBANK] - push af - ld a,Bank(_GetJoypadState) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call _GetJoypadState - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -INCLUDE "data/map_header_pointers.asm" - -; this function calls a function that takes necessary actions -; at the beginning of each overworld loop iteration as the player jumps -; down a ledge -; it also ends the jump when it's completed -HandleMidJump:: ; 039e (0:039e) - ld b, BANK(_HandleMidJump) - ld hl, _HandleMidJump - jp Bankswitch - -; this is jumped to immediately after loading a save / starting a new game / loading a new map -EnterMap:: ; 03a6 (0:03a6) - ld a,$ff - ld [wJoypadForbiddenButtonsMask],a - call LoadMapData ; load map data - callba Func_c335 ; initialize some variables - ld hl,$d72c - bit 0,[hl] - jr z,.doNotCountSteps - ld a,$03 - ld [$d13c],a ; some kind of step counter (counts up to 3 steps?) -.doNotCountSteps - ld hl,$d72e - bit 5,[hl] ; did a battle happen immediately before this? - res 5,[hl] ; unset the "battle just happened" flag - call z,Func_12e7 - call nz,MapEntryAfterBattle - ld hl,$d732 - ld a,[hl] - and a,$18 - jr z,.didNotFlyOrTeleportIn - res 3,[hl] - callba Func_70510 ; display fly/teleport in graphical effect - call UpdateSprites ; move sprites -.didNotFlyOrTeleportIn - callba CheckForceBikeOrSurf ; handle currents in SF islands and forced bike riding in cycling road - ld hl,$d72d - res 5,[hl] - call UpdateSprites ; move sprites - ld hl,$d126 - set 5,[hl] - set 6,[hl] - xor a - ld [wJoypadForbiddenButtonsMask],a - -OverworldLoop:: ; 03ff (0:03ff) - call DelayFrame -OverworldLoopLessDelay:: ; 0402 (0:0402) - call DelayFrame - call LoadGBPal - ld a,[$d736] - bit 6,a ; jumping down a ledge? - call nz, HandleMidJump - ld a,[wWalkCounter] - and a - jp nz,.moveAhead ; if the player sprite has not yet completed the walking animation - call GetJoypadStateOverworld ; get joypad state (which is possibly simulated) - callba SafariZoneCheck - ld a,[$da46] - and a - jp nz,WarpFound2 - ld hl,$d72d - bit 3,[hl] - res 3,[hl] - jp nz,WarpFound2 - ld a,[$d732] - and a,$18 - jp nz,HandleFlyOrTeleportAway - ld a,[W_CUROPPONENT] - and a - jp nz,.newBattle - ld a,[$d730] - bit 7,a ; are we simulating button presses? - jr z,.notSimulating - ld a,[H_CURRENTPRESSEDBUTTONS] - jr .checkIfStartIsPressed -.notSimulating - ld a,[H_NEWLYPRESSEDBUTTONS] -.checkIfStartIsPressed - bit 3,a ; start button - jr z,.startButtonNotPressed -; if START is pressed - xor a - ld [$ff8c],a ; the $2920 ID for the start menu is 0 - jp .displayDialogue -.startButtonNotPressed - bit 0,a ; A button - jp z,.checkIfDownButtonIsPressed -; if A is pressed - ld a,[$d730] - bit 2,a - jp nz,.noDirectionButtonsPressed - call Func_30fd - jr nz,.checkForOpponent - call Func_3eb5 ; check for hidden items, PC's, etc. - ld a,[$ffeb] - and a - jp z,OverworldLoop - call IsSpriteOrSignInFrontOfPlayer ; check for sign or sprite in front of the player - ld a,[$ff8c] ; $2920 ID for NPC/sign text, if any - and a - jp z,OverworldLoop -.displayDialogue - ld a,$35 - call Predef ; check what is in front of the player - call UpdateSprites ; move sprites - ld a,[wFlags_0xcd60] - bit 2,a - jr nz,.checkForOpponent - bit 0,a - jr nz,.checkForOpponent - FuncCoord 8, 9 ; $c45c - ld a,[Coord] - ld [$cf0e],a - call DisplayTextID ; display either the start menu or the NPC/sign text - ld a,[$cc47] - and a - jr z,.checkForOpponent - dec a - ld a,$00 - ld [$cc47],a - jr z,.changeMap - ld a,$52 - call Predef - ld a,[W_CURMAP] - ld [$d71a],a - call Func_62ce - ld a,[W_CURMAP] - call SwitchToMapRomBank ; switch to the ROM bank of the current map - ld hl,$d367 - set 7,[hl] -.changeMap - jp EnterMap -.checkForOpponent - ld a,[W_CUROPPONENT] - and a - jp nz,.newBattle - jp OverworldLoop -.noDirectionButtonsPressed - ld hl,wFlags_0xcd60 - res 2,[hl] - call UpdateSprites ; move sprites - ld a,$01 - ld [$cc4b],a - ld a,[$d528] ; the direction that was pressed last time - and a - jp z,OverworldLoop -; if a direction was pressed last time - ld [$d529],a ; save the last direction - xor a - ld [$d528],a ; zero the direction - jp OverworldLoop -.checkIfDownButtonIsPressed - ld a,[H_CURRENTPRESSEDBUTTONS] ; current joypad state - bit 7,a ; down button - jr z,.checkIfUpButtonIsPressed - ld a,$01 - ld [$c103],a - ld a,$04 - jr .handleDirectionButtonPress -.checkIfUpButtonIsPressed - bit 6,a ; up button - jr z,.checkIfLeftButtonIsPressed - ld a,$ff - ld [$c103],a - ld a,$08 - jr .handleDirectionButtonPress -.checkIfLeftButtonIsPressed - bit 5,a ; left button - jr z,.checkIfRightButtonIsPressed - ld a,$ff - ld [$c105],a - ld a,$02 - jr .handleDirectionButtonPress -.checkIfRightButtonIsPressed - bit 4,a ; right button - jr z,.noDirectionButtonsPressed - ld a,$01 - ld [$c105],a -.handleDirectionButtonPress - ld [$d52a],a ; new direction - ld a,[$d730] - bit 7,a ; are we simulating button presses? - jr nz,.noDirectionChange ; ignore direction changes if we are - ld a,[$cc4b] - and a - jr z,.noDirectionChange - ld a,[$d52a] ; new direction - ld b,a - ld a,[$d529] ; old direction - cp b - jr z,.noDirectionChange -; the code below is strange -; it computes whether or not the player did a 180 degree turn, but then overwrites the result -; also, it does a seemingly pointless loop afterwards - swap a ; put old direction in upper half - or b ; put new direction in lower half - cp a,$48 ; change dir from down to up - jr nz,.notDownToUp - ld a,$02 - ld [$d528],a - jr .oddLoop -.notDownToUp - cp a,$84 ; change dir from up to down - jr nz,.notUpToDown - ld a,$01 - ld [$d528],a - jr .oddLoop -.notUpToDown - cp a,$12 ; change dir from right to left - jr nz,.notRightToLeft - ld a,$04 - ld [$d528],a - jr .oddLoop -.notRightToLeft - cp a,$21 ; change dir from left to right - jr nz,.oddLoop - ld a,$08 - ld [$d528],a -.oddLoop - ld hl,wFlags_0xcd60 - set 2,[hl] - ld hl,$cc4b - dec [hl] - jr nz,.oddLoop - ld a,[$d52a] - ld [$d528],a - call NewBattle - jp c,.battleOccurred - jp OverworldLoop -.noDirectionChange - ld a,[$d52a] ; current direction - ld [$d528],a ; save direction - call UpdateSprites ; move sprites - ld a,[$d700] - cp a,$02 ; surfing - jr z,.surfing -; not surfing - call CollisionCheckOnLand - jr nc,.noCollision - push hl - ld hl,$d736 - bit 2,[hl] - pop hl - jp z,OverworldLoop - push hl - call ExtraWarpCheck ; sets carry if there is a potential to warp - pop hl - jp c,CheckWarpsCollision - jp OverworldLoop -.surfing - call CollisionCheckOnWater - jp c,OverworldLoop -.noCollision - ld a,$08 - ld [wWalkCounter],a - jr .moveAhead2 -.moveAhead - ld a,[$d736] - bit 7,a - jr z,.noSpinning - callba LoadSpinnerArrowTiles ; spin while moving -.noSpinning - call UpdateSprites ; move sprites -.moveAhead2 - ld hl,wFlags_0xcd60 - res 2,[hl] - ld a,[$d700] - dec a ; riding a bike? - jr nz,.normalPlayerSpriteAdvancement - ld a,[$d736] - bit 6,a ; jumping a ledge? - jr nz,.normalPlayerSpriteAdvancement - call BikeSpeedup ; if riding a bike and not jumping a ledge -.normalPlayerSpriteAdvancement - call AdvancePlayerSprite - ld a,[wWalkCounter] - and a - jp nz,CheckMapConnections ; it seems like this check will never succeed (the other place where CheckMapConnections is run works) -; walking animation finished - ld a,[$d730] - bit 7,a - jr nz,.doneStepCounting ; if button presses are being simulated, don't count steps -; step counting - ld hl,$d13b ; step counter - dec [hl] - ld a,[$d72c] - bit 0,a - jr z,.doneStepCounting - ld hl,$d13c - dec [hl] - jr nz,.doneStepCounting - ld hl,$d72c - res 0,[hl] -.doneStepCounting - ld a,[$d790] - bit 7,a ; in the safari zone? - jr z,.notSafariZone - callba SafariZoneCheckSteps - ld a,[$da46] - and a - jp nz,WarpFound2 -.notSafariZone - ld a,[W_ISINBATTLE] - and a - jp nz,CheckWarpsNoCollision - ld a,$13 - call Predef ; decrement HP of poisoned pokemon - ld a,[$d12d] - and a - jp nz,HandleBlackOut ; if all pokemon fainted -.newBattle - call NewBattle - ld hl,$d736 - res 2,[hl] - jp nc,CheckWarpsNoCollision ; check for warps if there was no battle -.battleOccurred - ld hl,$d72d - res 6,[hl] - ld hl,W_FLAGS_D733 - res 3,[hl] - ld hl,$d126 - set 5,[hl] - set 6,[hl] - xor a - ld [H_CURRENTPRESSEDBUTTONS],a ; clear joypad state - ld a,[W_CURMAP] - cp a,CINNABAR_GYM - jr nz,.notCinnabarGym - ld hl,$d79b - set 7,[hl] -.notCinnabarGym - ld hl,$d72e - set 5,[hl] - ld a,[W_CURMAP] - cp a,OAKS_LAB - jp z,.noFaintCheck - callab AnyPlayerPokemonAliveCheck ; check if all the player's pokemon fainted - ld a,d - and a - jr z,.allPokemonFainted -.noFaintCheck - ld c,$0a - call DelayFrames - jp EnterMap -.allPokemonFainted - ld a,$ff - ld [$d057],a - call RunMapScript - jp HandleBlackOut - -; function to determine if there will be a battle and execute it (either a trainer battle or wild battle) -; sets carry if a battle occurred and unsets carry if not -NewBattle:: ; 0683 (0:0683) - ld a,[$d72d] - bit 4,a - jr nz,.noBattle - call Func_30fd - jr nz,.noBattle - ld a,[$d72e] - bit 4,a - jr nz,.noBattle - ld b, BANK(InitBattle) - ld hl, InitBattle - jp Bankswitch ; determines if a battle will occur and runs the battle if so -.noBattle - and a - ret - -; function to make bikes twice as fast as walking -BikeSpeedup:: ; 06a0 (0:06a0) - ld a,[$cc57] - and a - ret nz - ld a,[W_CURMAP] - cp a,ROUTE_17 ; Cycling Road - jr nz,.goFaster - ld a,[H_CURRENTPRESSEDBUTTONS] ; current joypad state - and a,%01110000 ; bit mask for up, left, right buttons - ret nz -.goFaster - jp AdvancePlayerSprite - -; check if the player has stepped onto a warp after having not collided -CheckWarpsNoCollision:: ; 06b4 (0:06b4) - ld a,[$d3ae] ; number of warps - and a - jp z,CheckMapConnections - ld a,[$d3ae] ; number of warps - ld b,$00 - ld c,a - ld a,[W_YCOORD] - ld d,a - ld a,[W_XCOORD] - ld e,a - ld hl,$d3af ; start of warp entries -CheckWarpsNoCollisionLoop:: ; 06cc (0:06cc) - ld a,[hli] ; check if the warp's Y position matches - cp d - jr nz,CheckWarpsNoCollisionRetry1 - ld a,[hli] ; check if the warp's X position matches - cp e - jr nz,CheckWarpsNoCollisionRetry2 -; if a match was found - push hl - push bc - ld hl,$d736 - set 2,[hl] - callba Func_c49d ; check if the player sprite is standing on a "door" tile - pop bc - pop hl - jr c,WarpFound1 ; if it is, go to 0735 - push hl - push bc - call ExtraWarpCheck ; sets carry if the warp is confirmed - pop bc - pop hl - jr nc,CheckWarpsNoCollisionRetry2 -; if the extra check passed - ld a,[W_FLAGS_D733] - bit 2,a - jr nz,WarpFound1 - push de - push bc - call GetJoypadState - pop bc - pop de - ld a,[H_CURRENTPRESSEDBUTTONS] ; current joypad state - and a,%11110000 ; bit mask for directional buttons - jr z,CheckWarpsNoCollisionRetry2 ; if directional buttons aren't being pressed, do not pass through the warp - jr WarpFound1 - -; check if the player has stepped onto a warp after having collided -CheckWarpsCollision:: ; 0706 (0:0706) - ld a,[$d3ae] ; number of warps - ld c,a - ld hl,$d3af ; start of warp entries -.loop - ld a,[hli] ; Y coordinate of warp - ld b,a - ld a,[W_YCOORD] - cp b - jr nz,.retry1 - ld a,[hli] ; X coordinate of warp - ld b,a - ld a,[W_XCOORD] - cp b - jr nz,.retry2 - ld a,[hli] - ld [$d42f],a ; save target warp ID - ld a,[hl] - ld [$ff8b],a ; save target map - jr WarpFound2 -.retry1 - inc hl -.retry2 - inc hl - inc hl - dec c - jr nz,.loop - jp OverworldLoop - -CheckWarpsNoCollisionRetry1:: ; 072f (0:072f) - inc hl -CheckWarpsNoCollisionRetry2:: ; 0730 (0:0730) - inc hl - inc hl - jp ContinueCheckWarpsNoCollisionLoop - -WarpFound1:: ; 0735 (0:0735) - ld a,[hli] - ld [$d42f],a ; save target warp ID - ld a,[hli] - ld [$ff8b],a ; save target map - -WarpFound2:: ; 073c (0:073c) - ld a,[$d3ae] ; number of warps - sub c - ld [$d73b],a ; save ID of used warp - ld a,[W_CURMAP] - ld [$d73c],a - call CheckIfInOutsideMap - jr nz,.indoorMaps -; this is for handling "outside" maps that can't have the 0xFF destination map - ld a,[W_CURMAP] - ld [wLastMap],a - ld a,[W_CURMAPWIDTH] - ld [$d366],a - ld a,[$ff8b] ; destination map number - ld [W_CURMAP],a ; change current map to destination map - cp a,ROCK_TUNNEL_1 - jr nz,.notRockTunnel - ld a,$06 - ld [$d35d],a - call GBFadeIn1 -.notRockTunnel - call PlayMapChangeSound - jr .done -; for maps that can have the 0xFF destination map, which means to return to the outside map; not all these maps are necessarily indoors, though -.indoorMaps - ld a,[$ff8b] ; destination map - cp a,$ff - jr z,.goBackOutside -; if not going back to the previous map - ld [W_CURMAP],a ; current map number - callba Func_70787 ; check if the warp was a Silph Co. teleporter - ld a,[$cd5b] - dec a - jr nz,.notTeleporter -; if it's a Silph Co. teleporter - ld hl,$d732 - set 3,[hl] - call DoFlyOrTeleportAwayGraphics - jr .skipMapChangeSound -.notTeleporter - call PlayMapChangeSound -.skipMapChangeSound - ld hl,$d736 - res 0,[hl] - res 1,[hl] - jr .done -.goBackOutside - ld a,[wLastMap] - ld [W_CURMAP],a - call PlayMapChangeSound - xor a - ld [$d35d],a -.done - ld hl,$d736 - set 0,[hl] - call Func_12da - jp EnterMap - -ContinueCheckWarpsNoCollisionLoop:: ; 07b5 (0:07b5) - inc b ; increment warp number - dec c ; decrement number of warps - jp nz,CheckWarpsNoCollisionLoop - -; if no matching warp was found -CheckMapConnections:: ; 07ba (0:07ba) -.checkWestMap - ld a,[W_XCOORD] - cp a,$ff - jr nz,.checkEastMap - ld a,[$d387] - ld [W_CURMAP],a - ld a,[$d38f] ; new X coordinate upon entering west map - ld [W_XCOORD],a - ld a,[W_YCOORD] - ld c,a - ld a,[$d38e] ; Y adjustment upon entering west map - add c - ld c,a - ld [W_YCOORD],a - ld a,[$d390] ; pointer to upper left corner of map without adjustment for Y position - ld l,a - ld a,[$d391] - ld h,a - srl c - jr z,.savePointer1 -.pointerAdjustmentLoop1 - ld a,[$d38d] ; width of connected map - add a,$06 - ld e,a - ld d,$00 - ld b,$00 - add hl,de - dec c - jr nz,.pointerAdjustmentLoop1 -.savePointer1 - ld a,l - ld [$d35f],a ; pointer to upper left corner of current tile block map section - ld a,h - ld [$d360],a - jp .loadNewMap -.checkEastMap - ld b,a - ld a,[$d525] ; map width - cp b - jr nz,.checkNorthMap - ld a,[$d392] - ld [W_CURMAP],a - ld a,[$d39a] ; new X coordinate upon entering east map - ld [W_XCOORD],a - ld a,[W_YCOORD] - ld c,a - ld a,[$d399] ; Y adjustment upon entering east map - add c - ld c,a - ld [W_YCOORD],a - ld a,[$d39b] ; pointer to upper left corner of map without adjustment for Y position - ld l,a - ld a,[$d39c] - ld h,a - srl c - jr z,.savePointer2 -.pointerAdjustmentLoop2 - ld a,[$d398] - add a,$06 - ld e,a - ld d,$00 - ld b,$00 - add hl,de - dec c - jr nz,.pointerAdjustmentLoop2 -.savePointer2 - ld a,l - ld [$d35f],a ; pointer to upper left corner of current tile block map section - ld a,h - ld [$d360],a - jp .loadNewMap -.checkNorthMap - ld a,[W_YCOORD] - cp a,$ff - jr nz,.checkSouthMap - ld a,[$d371] - ld [W_CURMAP],a - ld a,[$d378] ; new Y coordinate upon entering north map - ld [W_YCOORD],a - ld a,[W_XCOORD] - ld c,a - ld a,[$d379] ; X adjustment upon entering north map - add c - ld c,a - ld [W_XCOORD],a - ld a,[$d37a] ; pointer to upper left corner of map without adjustment for X position - ld l,a - ld a,[$d37b] - ld h,a - ld b,$00 - srl c - add hl,bc - ld a,l - ld [$d35f],a ; pointer to upper left corner of current tile block map section - ld a,h - ld [$d360],a - jp .loadNewMap -.checkSouthMap - ld b,a - ld a,[$d524] - cp b - jr nz,.didNotEnterConnectedMap - ld a,[$d37c] - ld [W_CURMAP],a - ld a,[$d383] ; new Y coordinate upon entering south map - ld [W_YCOORD],a - ld a,[W_XCOORD] - ld c,a - ld a,[$d384] ; X adjustment upon entering south map - add c - ld c,a - ld [W_XCOORD],a - ld a,[$d385] ; pointer to upper left corner of map without adjustment for X position - ld l,a - ld a,[$d386] - ld h,a - ld b,$00 - srl c - add hl,bc - ld a,l - ld [$d35f],a ; pointer to upper left corner of current tile block map section - ld a,h - ld [$d360],a -.loadNewMap ; load the connected map that was entered - call LoadMapHeader - call Func_2312 ; music - ld b,$09 - call GoPAL_SET -; Since the sprite set shouldn't change, this will just update VRAM slots at -; $C2XE without loading any tile patterns. - callba InitMapSprites - call LoadTileBlockMap - jp OverworldLoopLessDelay -.didNotEnterConnectedMap - jp OverworldLoop - -; function to play a sound when changing maps -PlayMapChangeSound:: ; 08c9 (0:08c9) - FuncCoord 8, 8 ; $c448 - ld a,[Coord] ; upper left tile of the 4x4 square the player's sprite is standing on - cp a,$0b ; door tile in tileset 0 - jr nz,.didNotGoThroughDoor - ld a,(SFX_02_57 - SFX_Headers_02) / 3 - jr .playSound -.didNotGoThroughDoor - ld a,(SFX_02_5c - SFX_Headers_02) / 3 -.playSound - call PlaySound - ld a,[$d35d] - and a - ret nz - jp GBFadeIn1 - -CheckIfInOutsideMap:: ; 08e1 (0:08e1) -; If the player is in an outside map (a town or route), set the z flag - ld a, [W_CURMAPTILESET] - and a ; most towns/routes have tileset 0 (OVERWORLD) - ret z - cp PLATEAU ; Route 23 / Indigo Plateau - ret - -; this function is an extra check that sometimes has to pass in order to warp, beyond just standing on a warp -; the "sometimes" qualification is necessary because of CheckWarpsNoCollision's behavior -; depending on the map, either "function 1" or "function 2" is used for the check -; "function 1" passes when the player is at the edge of the map and is facing towards the outside of the map -; "function 2" passes when the the tile in front of the player is among a certain set -; sets carry if the check passes, otherwise clears carry -ExtraWarpCheck:: ; 08e9 (0:08e9) - ld a, [W_CURMAP] - cp SS_ANNE_3 - jr z, .useFunction1 - cp ROCKET_HIDEOUT_1 - jr z, .useFunction2 - cp ROCKET_HIDEOUT_2 - jr z, .useFunction2 - cp ROCKET_HIDEOUT_4 - jr z, .useFunction2 - cp ROCK_TUNNEL_1 - jr z, .useFunction2 - ld a, [W_CURMAPTILESET] - and a ; outside tileset (OVERWORLD) - jr z, .useFunction2 - cp SHIP ; S.S. Anne tileset - jr z, .useFunction2 - cp SHIP_PORT ; Vermilion Port tileset - jr z, .useFunction2 - cp PLATEAU ; Indigo Plateau tileset - jr z, .useFunction2 -.useFunction1 - ld hl, Func_c3ff - jr .doBankswitch -.useFunction2 - ld hl, Func_c44e -.doBankswitch - ld b, BANK(Func_c44e) - jp Bankswitch - -MapEntryAfterBattle:: ; 091f (0:091f) - callba Func_c35f ; function that appears to disable warp testing after collisions if the player is standing on a warp - ld a,[$d35d] - and a - jp z,GBFadeIn2 - jp LoadGBPal - -; for when all the player's pokemon faint -; other code prints the "you blacked out" message before this is called -HandleBlackOut:: ; 0931 (0:0931) - call GBFadeIn1 - ld a,$08 - call StopMusic - ld hl,$d72e - res 5,[hl] - ld a,Bank(Func_40b0) ; Bank(Func_40b0) and Bank(Func_62ce) need to be equal. - ld [H_LOADEDROMBANK],a - ld [$2000],a - call Func_40b0 - call Func_62ce - call Func_2312 - jp Func_5d5f - -StopMusic:: ; 0951 (0:0951) - ld [wMusicHeaderPointer],a - ld a,$ff - ld [$c0ee],a - call PlaySound -.waitLoop - ld a,[wMusicHeaderPointer] - and a - jr nz,.waitLoop - jp StopAllSounds - -HandleFlyOrTeleportAway:: ; 0965 (0:0965) - call UpdateSprites ; move sprites - call Delay3 - xor a - ld [$cf0b],a - ld [$d700],a - ld [$d057],a - ld [$d35d],a - ld hl,$d732 - set 2,[hl] - res 5,[hl] - call DoFlyOrTeleportAwayGraphics - ld a,Bank(Func_62ce) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call Func_62ce - jp Func_5d5f - -; function that calls a function to do fly away or teleport away graphics -DoFlyOrTeleportAwayGraphics:: ; 098f (0:098f) - ld b, BANK(_DoFlyOrTeleportAwayGraphics) - ld hl, _DoFlyOrTeleportAwayGraphics - jp Bankswitch - -; load sprite graphics based on whether the player is standing, biking, or surfing -LoadPlayerSpriteGraphics:: ; 0997 (0:0997) - ld a,[$d700] - dec a - jr z,.ridingBike - ld a,[$ffd7] - and a - jr nz,.determineGraphics - jr .startWalking -.ridingBike - call IsBikeRidingAllowed - jr c,.determineGraphics ; don't start walking if bike riding is allowed -.startWalking - xor a - ld [$d700],a - ld [$d11a],a - jp LoadWalkingPlayerSpriteGraphics -.determineGraphics - ld a,[$d700] - and a - jp z,LoadWalkingPlayerSpriteGraphics - dec a - jp z,LoadBikePlayerSpriteGraphics - dec a - jp z,LoadSurfingPlayerSpriteGraphics - jp LoadWalkingPlayerSpriteGraphics - -; function to check if bike riding is allowed on the current map -; sets carry if bike is allowed, clears carry otherwise -IsBikeRidingAllowed:: ; 09c5 (0:09c5) - ld a,[W_CURMAP] - cp a,ROUTE_23 - jr z,.allowed - cp a,INDIGO_PLATEAU - jr z,.allowed - ld a,[W_CURMAPTILESET] - ld b,a - ld hl,BikeRidingTilesets -.loop - ld a,[hli] - cp b - jr z,.allowed - inc a - jr nz,.loop - and a - ret -.allowed - scf - ret - -INCLUDE "data/bike_riding_tilesets.asm" - -; load the tile pattern data of the current tileset into VRAM -LoadTilesetTilePatternData:: ; 09e8 (0:09e8) - ld a,[$d52e] - ld l,a - ld a,[$d52f] - ld h,a - ld de,$9000 - ld bc,$0600 - ld a,[$d52b] - jp FarCopyData2 - -; this loads the current maps complete tile map (which references blocks, not individual tiles) to C6E8 -; it can also load partial tile maps of connected maps into a border of length 3 around the current map -LoadTileBlockMap:: ; 09fc (0:09fc) -; fill C6E8-CBFB with the background tile - ld hl,$c6e8 - ld a,[$d3ad] ; background tile number - ld d,a - ld bc,$0514 -.backgroundTileLoop - ld a,d - ld [hli],a - dec bc - ld a,c - or b - jr nz,.backgroundTileLoop -; load tile map of current map (made of tile block IDs) -; a 3-byte border at the edges of the map is kept so that there is space for map connections - ld hl,$c6e8 - ld a,[W_CURMAPWIDTH] - ld [$ff8c],a - add a,$06 ; border (east and west) - ld [$ff8b],a ; map width + border - ld b,$00 - ld c,a -; make space for north border (next 3 lines) - add hl,bc - add hl,bc - add hl,bc - ld c,$03 - add hl,bc ; this puts us past the (west) border - ld a,[$d36a] ; tile map pointer - ld e,a - ld a,[$d36b] - ld d,a ; de = tile map pointer - ld a,[W_CURMAPHEIGHT] - ld b,a -.rowLoop ; copy one row each iteration - push hl - ld a,[$ff8c] ; map width (without border) - ld c,a -.rowInnerLoop - ld a,[de] - inc de - ld [hli],a - dec c - jr nz,.rowInnerLoop -; add the map width plus the border to the base address of the current row to get the next row's address - pop hl - ld a,[$ff8b] ; map width + border - add l - ld l,a - jr nc,.noCarry - inc h -.noCarry - dec b - jr nz,.rowLoop -.northConnection - ld a,[$d371] - cp a,$ff - jr z,.southConnection - call SwitchToMapRomBank - ld a,[$d372] - ld l,a - ld a,[$d373] - ld h,a - ld a,[$d374] - ld e,a - ld a,[$d375] - ld d,a - ld a,[$d376] - ld [$ff8b],a - ld a,[$d377] - ld [$ff8c],a - call LoadNorthSouthConnectionsTileMap -.southConnection - ld a,[$d37c] - cp a,$ff - jr z,.westConnection - call SwitchToMapRomBank - ld a,[$d37d] - ld l,a - ld a,[$d37e] - ld h,a - ld a,[$d37f] - ld e,a - ld a,[$d380] - ld d,a - ld a,[$d381] - ld [$ff8b],a - ld a,[$d382] - ld [$ff8c],a - call LoadNorthSouthConnectionsTileMap -.westConnection - ld a,[$d387] - cp a,$ff - jr z,.eastConnection - call SwitchToMapRomBank - ld a,[$d388] - ld l,a - ld a,[$d389] - ld h,a - ld a,[$d38a] - ld e,a - ld a,[$d38b] - ld d,a - ld a,[$d38c] - ld b,a - ld a,[$d38d] - ld [$ff8b],a - call LoadEastWestConnectionsTileMap -.eastConnection - ld a,[$d392] - cp a,$ff - jr z,.done - call SwitchToMapRomBank - ld a,[$d393] - ld l,a - ld a,[$d394] - ld h,a - ld a,[$d395] - ld e,a - ld a,[$d396] - ld d,a - ld a,[$d397] - ld b,a - ld a,[$d398] - ld [$ff8b],a - call LoadEastWestConnectionsTileMap -.done - ret - -LoadNorthSouthConnectionsTileMap:: ; 0ade (0:0ade) - ld c,$03 -.loop - push de - push hl - ld a,[$ff8b] ; width of connection - ld b,a -.innerLoop - ld a,[hli] - ld [de],a - inc de - dec b - jr nz,.innerLoop - pop hl - pop de - ld a,[$ff8c] ; width of connected map - add l - ld l,a - jr nc,.noCarry1 - inc h -.noCarry1 - ld a,[W_CURMAPWIDTH] - add a,$06 - add e - ld e,a - jr nc,.noCarry2 - inc d -.noCarry2 - dec c - jr nz,.loop - ret - -LoadEastWestConnectionsTileMap:: ; 0b02 (0:0b02) - push hl - push de - ld c,$03 -.innerLoop - ld a,[hli] - ld [de],a - inc de - dec c - jr nz,.innerLoop - pop de - pop hl - ld a,[$ff8b] ; width of connected map - add l - ld l,a - jr nc,.noCarry1 - inc h -.noCarry1 - ld a,[W_CURMAPWIDTH] - add a,$06 - add e - ld e,a - jr nc,.noCarry2 - inc d -.noCarry2 - dec b - jr nz,LoadEastWestConnectionsTileMap - ret - -; function to check if there is a sign or sprite in front of the player -; if so, it is stored in [$FF8C] -; if not, [$FF8C] is set to 0 -IsSpriteOrSignInFrontOfPlayer:: ; 0b23 (0:0b23) - xor a - ld [$ff8c],a - ld a,[$d4b0] ; number of signs in the map - and a - jr z,.extendRangeOverCounter -; if there are signs - ld a,$35 - call Predef ; get the coordinates in front of the player in de - ld hl,$d4b1 ; start of sign coordinates - ld a,[$d4b0] ; number of signs in the map - ld b,a - ld c,$00 -.signLoop - inc c - ld a,[hli] ; sign Y - cp d - jr z,.yCoordMatched - inc hl - jr .retry -.yCoordMatched - ld a,[hli] ; sign X - cp e - jr nz,.retry -.xCoordMatched -; found sign - push hl - push bc - ld hl,$d4d1 ; start of sign text ID's - ld b,$00 - dec c - add hl,bc - ld a,[hl] - ld [$ff8c],a ; store sign text ID - pop bc - pop hl - ret -.retry - dec b - jr nz,.signLoop -; check if the player is front of a counter in a pokemon center, pokemart, etc. and if so, extend the range at which he can talk to the NPC -.extendRangeOverCounter - ld a,$35 - call Predef ; get the tile in front of the player in c - ld hl,$d532 ; list of tiles that extend talking range (counter tiles) - ld b,$03 - ld d,$20 ; talking range in pixels (long range) -.counterTilesLoop - ld a,[hli] - cp c - jr z,IsSpriteInFrontOfPlayer2 ; jumps if the tile in front of the player is a counter tile - dec b - jr nz,.counterTilesLoop - -; part of the above function, but sometimes its called on its own, when signs are irrelevant -; the caller must zero [$FF8C] -IsSpriteInFrontOfPlayer:: ; 0b6b (0:0b6b) - ld d,$10 ; talking range in pixels (normal range) -IsSpriteInFrontOfPlayer2:: ; 0b6d (0:0b6d) - ld bc,$3c40 ; Y and X position of player sprite - ld a,[$c109] ; direction the player is facing -.checkIfPlayerFacingUp - cp a,$04 - jr nz,.checkIfPlayerFacingDown -; facing up - ld a,b - sub d - ld b,a - ld a,$08 - jr .doneCheckingDirection -.checkIfPlayerFacingDown - cp a,$00 - jr nz,.checkIfPlayerFacingRight -; facing down - ld a,b - add d - ld b,a - ld a,$04 - jr .doneCheckingDirection -.checkIfPlayerFacingRight - cp a,$0c - jr nz,.playerFacingLeft -; facing right - ld a,c - add d - ld c,a - ld a,$01 - jr .doneCheckingDirection -.playerFacingLeft -; facing left - ld a,c - sub d - ld c,a - ld a,$02 -.doneCheckingDirection - ld [$d52a],a - ld a,[$d4e1] ; number of sprites - and a - ret z -; if there are sprites - ld hl,$c110 - ld d,a - ld e,$01 -.spriteLoop - push hl - ld a,[hli] ; image (0 if no sprite) - and a - jr z,.nextSprite - inc l - ld a,[hli] ; sprite visibility - inc a - jr z,.nextSprite - inc l - ld a,[hli] ; Y location - cp b - jr nz,.nextSprite - inc l - ld a,[hl] ; X location - cp c - jr z,.foundSpriteInFrontOfPlayer -.nextSprite - pop hl - ld a,l - add a,$10 - ld l,a - inc e - dec d - jr nz,.spriteLoop - ret -.foundSpriteInFrontOfPlayer - pop hl - ld a,l - and a,$f0 - inc a - ld l,a - set 7,[hl] - ld a,e - ld [$ff8c],a ; store sprite ID - ret - -; function to check if the player will jump down a ledge and check if the tile ahead is passable (when not surfing) -; sets the carry flag if there is a collision, and unsets it if there isn't a collision -CollisionCheckOnLand:: ; 0bd1 (0:0bd1) - ld a,[$d736] - bit 6,a ; is the player jumping? - jr nz,.noCollision -; if not jumping a ledge - ld a,[$cd38] - and a - jr nz,.noCollision - ld a,[$d52a] ; the direction that the player is trying to go in - ld d,a - ld a,[$c10c] ; the player sprite's collision data (bit field) (set in the sprite movement code) - and d ; check if a sprite is in the direction the player is trying to go - jr nz,.collision - xor a - ld [$ff8c],a - call IsSpriteInFrontOfPlayer ; check for sprite collisions again? when does the above check fail to detect a sprite collision? - ld a,[$ff8c] - and a ; was there a sprite collision? - jr nz,.collision -; if no sprite collision - ld hl,TilePairCollisionsLand - call CheckForJumpingAndTilePairCollisions - jr c,.collision - call CheckTilePassable - jr nc,.noCollision -.collision - ld a,[$c02a] - cp a,(SFX_02_5b - SFX_Headers_02) / 3 ; check if collision sound is already playing - jr z,.setCarry - ld a,(SFX_02_5b - SFX_Headers_02) / 3 - call PlaySound ; play collision sound (if it's not already playing) -.setCarry - scf - ret -.noCollision - and a - ret - -; function that checks if the tile in front of the player is passable -; clears carry if it is, sets carry if not -CheckTilePassable:: ; 0c10 (0:0c10) - ld a,$35 - call Predef ; get tile in front of player - ld a,[$cfc6] ; tile in front of player - ld c,a - ld hl,$d530 ; pointer to list of passable tiles - ld a,[hli] - ld h,[hl] - ld l,a ; hl now points to passable tiles -.loop - ld a,[hli] - cp a,$ff - jr z,.tileNotPassable - cp c - ret z - jr .loop -.tileNotPassable - scf - ret - -; check if the player is going to jump down a small ledge -; and check for collisions that only occur between certain pairs of tiles -; Input: hl - address of directional collision data -; sets carry if there is a collision and unsets carry if not -CheckForJumpingAndTilePairCollisions:: ; 0c2a (0:0c2a) - push hl - ld a,$35 - call Predef ; get the tile in front of the player - push de - push bc - callba HandleLedges ; check if the player is trying to jump a ledge - pop bc - pop de - pop hl - and a - ld a,[$d736] - bit 6,a ; is the player jumping? - ret nz -; if not jumping - -Func_c44:: ; 0c44 (0:0c44) - FuncCoord 8, 9 ; $c45c - ld a,[Coord] ; tile the player is on - ld [$cf0e],a - -CheckForTilePairCollisions:: ; 0c4a (0:0c4a) - ld a,[$cfc6] ; tile in front of the player - ld c,a -.tilePairCollisionLoop - ld a,[W_CURMAPTILESET] ; tileset number - ld b,a - ld a,[hli] - cp a,$ff - jr z,.noMatch - cp b - jr z,.tilesetMatches - inc hl -.retry - inc hl - jr .tilePairCollisionLoop -.tilesetMatches - ld a,[$cf0e] ; tile the player is on - ld b,a - ld a,[hl] - cp b - jr z,.currentTileMatchesFirstInPair - inc hl - ld a,[hl] - cp b - jr z,.currentTileMatchesSecondInPair - jr .retry -.currentTileMatchesFirstInPair - inc hl - ld a,[hl] - cp c - jr z,.foundMatch - jr .tilePairCollisionLoop -.currentTileMatchesSecondInPair - dec hl - ld a,[hli] - cp c - inc hl - jr nz,.tilePairCollisionLoop -.foundMatch - scf - ret -.noMatch - and a - ret - -; FORMAT: tileset number, tile 1, tile 2 -; terminated by 0xFF -; these entries indicate that the player may not cross between tile 1 and tile 2 -; it's mainly used to simulate differences in elevation - -TilePairCollisionsLand:: ; 0c7e (0:0c7e) - db CAVERN, $20, $05 - db CAVERN, $41, $05 - db FOREST, $30, $2E - db CAVERN, $2A, $05 - db CAVERN, $05, $21 - db FOREST, $52, $2E - db FOREST, $55, $2E - db FOREST, $56, $2E - db FOREST, $20, $2E - db FOREST, $5E, $2E - db FOREST, $5F, $2E - db $FF - -TilePairCollisionsWater:: ; 0ca0 (0:0ca0) - db FOREST, $14, $2E - db FOREST, $48, $2E - db CAVERN, $14, $05 - db $FF - -; this builds a tile map from the tile block map based on the current X/Y coordinates of the player's character -LoadCurrentMapView:: ; 0caa (0:0caa) - ld a,[H_LOADEDROMBANK] - push af - ld a,[$d52b] ; tile data ROM bank - ld [H_LOADEDROMBANK],a - ld [$2000],a ; switch to ROM bank that contains tile data - ld a,[$d35f] ; address of upper left corner of current map view - ld e,a - ld a,[$d360] - ld d,a - ld hl,wTileMapBackup - ld b,$05 -.rowLoop ; each loop iteration fills in one row of tile blocks - push hl - push de - ld c,$06 -.rowInnerLoop ; loop to draw each tile block of the current row - push bc - push de - push hl - ld a,[de] - ld c,a ; tile block number - call DrawTileBlock - pop hl - pop de - pop bc - inc hl - inc hl - inc hl - inc hl - inc de - dec c - jr nz,.rowInnerLoop -; update tile block map pointer to next row's address - pop de - ld a,[W_CURMAPWIDTH] - add a,$06 - add e - ld e,a - jr nc,.noCarry - inc d -.noCarry -; update tile map pointer to next row's address - pop hl - ld a,$60 - add l - ld l,a - jr nc,.noCarry2 - inc h -.noCarry2 - dec b - jr nz,.rowLoop - ld hl,wTileMapBackup - ld bc,$0000 -.adjustForYCoordWithinTileBlock - ld a,[W_YBLOCKCOORD] - and a - jr z,.adjustForXCoordWithinTileBlock - ld bc,$0030 - add hl,bc -.adjustForXCoordWithinTileBlock - ld a,[W_XBLOCKCOORD] - and a - jr z,.copyToVisibleAreaBuffer - ld bc,$0002 - add hl,bc -.copyToVisibleAreaBuffer - ld de,wTileMap ; base address for the tiles that are directly transfered to VRAM during V-blank - ld b,$12 -.rowLoop2 - ld c,$14 -.rowInnerLoop2 - ld a,[hli] - ld [de],a - inc de - dec c - jr nz,.rowInnerLoop2 - ld a,$04 - add l - ld l,a - jr nc,.noCarry3 - inc h -.noCarry3 - dec b - jr nz,.rowLoop2 - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a ; restore previous ROM bank - ret - -AdvancePlayerSprite:: ; 0d27 (0:0d27) - ld a,[$c103] ; delta Y - ld b,a - ld a,[$c105] ; delta X - ld c,a - ld hl,wWalkCounter ; walking animation counter - dec [hl] - jr nz,.afterUpdateMapCoords -; if it's the end of the animation, update the player's map coordinates - ld a,[W_YCOORD] - add b - ld [W_YCOORD],a - ld a,[W_XCOORD] - add c - ld [W_XCOORD],a -.afterUpdateMapCoords - ld a,[wWalkCounter] ; walking animation counter - cp a,$07 - jp nz,.scrollBackgroundAndSprites -; if this is the first iteration of the animation - ld a,c - cp a,$01 - jr nz,.checkIfMovingWest -; moving east - ld a,[$d526] - ld e,a - and a,$e0 - ld d,a - ld a,e - add a,$02 - and a,$1f - or d - ld [$d526],a - jr .adjustXCoordWithinBlock -.checkIfMovingWest - cp a,$ff - jr nz,.checkIfMovingSouth -; moving west - ld a,[$d526] - ld e,a - and a,$e0 - ld d,a - ld a,e - sub a,$02 - and a,$1f - or d - ld [$d526],a - jr .adjustXCoordWithinBlock -.checkIfMovingSouth - ld a,b - cp a,$01 - jr nz,.checkIfMovingNorth -; moving south - ld a,[$d526] - add a,$40 - ld [$d526],a - jr nc,.adjustXCoordWithinBlock - ld a,[$d527] - inc a - and a,$03 - or a,$98 - ld [$d527],a - jr .adjustXCoordWithinBlock -.checkIfMovingNorth - cp a,$ff - jr nz,.adjustXCoordWithinBlock -; moving north - ld a,[$d526] - sub a,$40 - ld [$d526],a - jr nc,.adjustXCoordWithinBlock - ld a,[$d527] - dec a - and a,$03 - or a,$98 - ld [$d527],a -.adjustXCoordWithinBlock - ld a,c - and a - jr z,.pointlessJump ; mistake? -.pointlessJump - ld hl,W_XBLOCKCOORD - ld a,[hl] - add c - ld [hl],a - cp a,$02 - jr nz,.checkForMoveToWestBlock -; moved into the tile block to the east - xor a - ld [hl],a - ld hl,$d4e3 - inc [hl] - ld de,$d35f - call MoveTileBlockMapPointerEast - jr .updateMapView -.checkForMoveToWestBlock - cp a,$ff - jr nz,.adjustYCoordWithinBlock -; moved into the tile block to the west - ld a,$01 - ld [hl],a - ld hl,$d4e3 - dec [hl] - ld de,$d35f - call MoveTileBlockMapPointerWest - jr .updateMapView -.adjustYCoordWithinBlock - ld hl,W_YBLOCKCOORD - ld a,[hl] - add b - ld [hl],a - cp a,$02 - jr nz,.checkForMoveToNorthBlock -; moved into the tile block to the south - xor a - ld [hl],a - ld hl,$d4e2 - inc [hl] - ld de,$d35f - ld a,[W_CURMAPWIDTH] - call MoveTileBlockMapPointerSouth - jr .updateMapView -.checkForMoveToNorthBlock - cp a,$ff - jr nz,.updateMapView -; moved into the tile block to the north - ld a,$01 - ld [hl],a - ld hl,$d4e2 - dec [hl] - ld de,$d35f - ld a,[W_CURMAPWIDTH] - call MoveTileBlockMapPointerNorth -.updateMapView - call LoadCurrentMapView - ld a,[$c103] ; delta Y - cp a,$01 - jr nz,.checkIfMovingNorth2 -; if moving south - call ScheduleSouthRowRedraw - jr .scrollBackgroundAndSprites -.checkIfMovingNorth2 - cp a,$ff - jr nz,.checkIfMovingEast2 -; if moving north - call ScheduleNorthRowRedraw - jr .scrollBackgroundAndSprites -.checkIfMovingEast2 - ld a,[$c105] ; delta X - cp a,$01 - jr nz,.checkIfMovingWest2 -; if moving east - call ScheduleEastColumnRedraw - jr .scrollBackgroundAndSprites -.checkIfMovingWest2 - cp a,$ff - jr nz,.scrollBackgroundAndSprites -; if moving west - call ScheduleWestColumnRedraw -.scrollBackgroundAndSprites - ld a,[$c103] ; delta Y - ld b,a - ld a,[$c105] ; delta X - ld c,a - sla b - sla c - ld a,[$ffaf] - add b - ld [$ffaf],a ; update background scroll Y - ld a,[$ffae] - add c - ld [$ffae],a ; update background scroll X -; shift all the sprites in the direction opposite of the player's motion -; so that the player appears to move relative to them - ld hl,$c114 - ld a,[$d4e1] ; number of sprites - and a ; are there any sprites? - jr z,.done - ld e,a -.spriteShiftLoop - ld a,[hl] - sub b - ld [hli],a - inc l - ld a,[hl] - sub c - ld [hl],a - ld a,$0e - add l - ld l,a - dec e - jr nz,.spriteShiftLoop -.done - ret - -; the following four functions are used to move the pointer to the upper left -; corner of the tile block map in the direction of motion - -MoveTileBlockMapPointerEast:: ; 0e65 (0:0e65) - ld a,[de] - add a,$01 - ld [de],a - ret nc - inc de - ld a,[de] - inc a - ld [de],a - ret - -MoveTileBlockMapPointerWest:: ; 0e6f (0:0e6f) - ld a,[de] - sub a,$01 - ld [de],a - ret nc - inc de - ld a,[de] - dec a - ld [de],a - ret - -MoveTileBlockMapPointerSouth:: ; 0e79 (0:0e79) - add a,$06 - ld b,a - ld a,[de] - add b - ld [de],a - ret nc - inc de - ld a,[de] - inc a - ld [de],a - ret - -MoveTileBlockMapPointerNorth:: ; 0e85 (0:0e85) - add a,$06 - ld b,a - ld a,[de] - sub b - ld [de],a - ret nc - inc de - ld a,[de] - dec a - ld [de],a - ret - -; the following 6 functions are used to tell the V-blank handler to redraw -; the portion of the map that was newly exposed due to the player's movement - -ScheduleNorthRowRedraw:: ; 0e91 (0:0e91) - FuncCoord 0, 0 - ld hl,Coord - call ScheduleRowRedrawHelper - ld a,[$d526] - ld [H_SCREENEDGEREDRAWADDR],a - ld a,[$d527] - ld [H_SCREENEDGEREDRAWADDR + 1],a - ld a,REDRAWROW - ld [H_SCREENEDGEREDRAW],a - ret - -ScheduleRowRedrawHelper:: ; 0ea6 (0:0ea6) - ld de,wScreenEdgeTiles - ld c,$28 -.loop - ld a,[hli] - ld [de],a - inc de - dec c - jr nz,.loop - ret - -ScheduleSouthRowRedraw:: ; 0eb2 (0:0eb2) - FuncCoord 0,16 - ld hl,Coord - call ScheduleRowRedrawHelper - ld a,[$d526] - ld l,a - ld a,[$d527] - ld h,a - ld bc,$0200 - add hl,bc - ld a,h - and a,$03 - or a,$98 - ld [H_SCREENEDGEREDRAWADDR + 1],a - ld a,l - ld [H_SCREENEDGEREDRAWADDR],a - ld a,REDRAWROW - ld [H_SCREENEDGEREDRAW],a - ret - -ScheduleEastColumnRedraw:: ; 0ed3 (0:0ed3) - FuncCoord 18,0 - ld hl,Coord - call ScheduleColumnRedrawHelper - ld a,[$d526] - ld c,a - and a,$e0 - ld b,a - ld a,c - add a,18 - and a,$1f - or b - ld [H_SCREENEDGEREDRAWADDR],a - ld a,[$d527] - ld [H_SCREENEDGEREDRAWADDR + 1],a - ld a,REDRAWCOL - ld [H_SCREENEDGEREDRAW],a - ret - -ScheduleColumnRedrawHelper:: ; 0ef2 (0:0ef2) - ld de,wScreenEdgeTiles - ld c,$12 -.loop - ld a,[hli] - ld [de],a - inc de - ld a,[hl] - ld [de],a - inc de - ld a,19 - add l - ld l,a - jr nc,.noCarry - inc h -.noCarry - dec c - jr nz,.loop - ret - -ScheduleWestColumnRedraw:: ; 0f08 (0:0f08) - FuncCoord 0,0 - ld hl,Coord - call ScheduleColumnRedrawHelper - ld a,[$d526] - ld [H_SCREENEDGEREDRAWADDR],a - ld a,[$d527] - ld [H_SCREENEDGEREDRAWADDR + 1],a - ld a,REDRAWCOL - ld [H_SCREENEDGEREDRAW],a - ret - -; function to write the tiles that make up a tile block to memory -; Input: c = tile block ID, hl = destination address -DrawTileBlock:: ; 0f1d (0:0f1d) - push hl - ld a,[$d52c] ; pointer to tiles - ld l,a - ld a,[$d52d] - ld h,a - ld a,c - swap a - ld b,a - and a,$f0 - ld c,a - ld a,b - and a,$0f - ld b,a ; bc = tile block ID * 0x10 - add hl,bc - ld d,h - ld e,l ; de = address of the tile block's tiles - pop hl - ld c,$04 ; 4 loop iterations -.loop ; each loop iteration, write 4 tile numbers - push bc - ld a,[de] - ld [hli],a - inc de - ld a,[de] - ld [hli],a - inc de - ld a,[de] - ld [hli],a - inc de - ld a,[de] - ld [hl],a - inc de - ld bc,$0015 - add hl,bc - pop bc - dec c - jr nz,.loop - ret - -; function to update joypad state and simulate button presses -GetJoypadStateOverworld:: ; 0f4d (0:0f4d) - xor a - ld [$c103],a - ld [$c105],a - call RunMapScript - call GetJoypadState - ld a,[W_FLAGS_D733] - bit 3,a ; check if a trainer wants a challenge - jr nz,.notForcedDownwards - ld a,[W_CURMAP] - cp a,ROUTE_17 ; Cycling Road - jr nz,.notForcedDownwards - ld a,[H_CURRENTPRESSEDBUTTONS] ; current joypad state - and a,%11110011 ; bit mask for all directions and A/B - jr nz,.notForcedDownwards - ld a,%10000000 ; down pressed - ld [H_CURRENTPRESSEDBUTTONS],a ; on the cycling road, if there isn't a trainer and the player isn't pressing buttons, simulate a down press -.notForcedDownwards - ld a,[$d730] - bit 7,a - ret z -; if simulating button presses - ld a,[H_CURRENTPRESSEDBUTTONS] ; current joypad state - ld b,a - ld a,[$cd3b] ; bit mask for button presses that override simulated ones - and b - ret nz ; return if the simulated button presses are overridden - ld hl,$cd38 ; index of current simulated button press - dec [hl] - ld a,[hl] - cp a,$ff - jr z,.doneSimulating ; if the end of the simulated button presses has been reached - ld hl,$ccd3 ; base address of simulated button presses -; add offset to base address - add l - ld l,a - jr nc,.noCarry - inc h -.noCarry - ld a,[hl] - ld [H_CURRENTPRESSEDBUTTONS],a ; store simulated button press in joypad state - and a - ret nz - ld [H_NEWLYPRESSEDBUTTONS],a - ld [H_NEWLYRELEASEDBUTTONS],a - ret -; if done simulating button presses -.doneSimulating - xor a - ld [$cd3a],a - ld [$cd38],a - ld [$ccd3],a - ld [wJoypadForbiddenButtonsMask],a - ld [H_CURRENTPRESSEDBUTTONS],a - ld hl,$d736 - ld a,[hl] - and a,$f8 - ld [hl],a - ld hl,$d730 - res 7,[hl] - ret - -; function to check the tile ahead to determine if the character should get on land or keep surfing -; sets carry if there is a collision and clears carry otherwise -; It seems that this function has a bug in it, but due to luck, it doesn't -; show up. After detecting a sprite collision, it jumps to the code that -; checks if the next tile is passable instead of just directly jumping to the -; "collision detected" code. However, it doesn't store the next tile in c, -; so the old value of c is used. 2429 is always called before this function, -; and 2429 always sets c to 0xF0. There is no 0xF0 background tile, so it -; is considered impassable and it is detected as a collision. -CollisionCheckOnWater:: ; 0fb7 (0:0fb7) - ld a,[$d730] - bit 7,a - jp nz,.noCollision ; return and clear carry if button presses are being simulated - ld a,[$d52a] ; the direction that the player is trying to go in - ld d,a - ld a,[$c10c] ; the player sprite's collision data (bit field) (set in the sprite movement code) - and d ; check if a sprite is in the direction the player is trying to go - jr nz,.checkIfNextTileIsPassable ; bug? - ld hl,TilePairCollisionsWater - call CheckForJumpingAndTilePairCollisions - jr c,.collision - ld a,$35 - call Predef ; get tile in front of player (puts it in c and [$CFC6]) - ld a,[$cfc6] ; tile in front of player - cp a,$14 ; water tile - jr z,.noCollision ; keep surfing if it's a water tile - cp a,$32 ; either the left tile of the S.S. Anne boarding platform or the tile on eastern coastlines (depending on the current tileset) - jr z,.checkIfVermilionDockTileset - cp a,$48 ; tile on right on coast lines in Safari Zone - jr z,.noCollision ; keep surfing -; check if the [land] tile in front of the player is passable -.checkIfNextTileIsPassable - ld hl,$d530 ; pointer to list of passable tiles - ld a,[hli] - ld h,[hl] - ld l,a -.loop - ld a,[hli] - cp a,$ff - jr z,.collision - cp c - jr z,.stopSurfing ; stop surfing if the tile is passable - jr .loop -.collision - ld a,[$c02a] - cp a,(SFX_02_5b - SFX_Headers_02) / 3 ; check if collision sound is already playing - jr z,.setCarry - ld a,(SFX_02_5b - SFX_Headers_02) / 3 - call PlaySound ; play collision sound (if it's not already playing) -.setCarry - scf - jr .done -.noCollision - and a -.done - ret -.stopSurfing - xor a - ld [$d700],a - call LoadPlayerSpriteGraphics - call Func_2307 - jr .noCollision -.checkIfVermilionDockTileset - ld a, [W_CURMAPTILESET] ; tileset - cp SHIP_PORT ; Vermilion Dock tileset - jr nz, .noCollision ; keep surfing if it's not the boarding platform tile - jr .stopSurfing ; if it is the boarding platform tile, stop surfing - -; function to run the current map's script -RunMapScript:: ; 101b (0:101b) - push hl - push de - push bc - callba Func_f225 ; check if the player is pushing a boulder - ld a,[wFlags_0xcd60] - bit 1,a ; is the player pushing a boulder? - jr z,.afterBoulderEffect - callba Func_f2b5 ; displays dust effect when pushing a boulder -.afterBoulderEffect - pop bc - pop de - pop hl - call Func_310e - ld a,[W_CURMAP] ; current map number - call SwitchToMapRomBank ; change to the ROM bank the map's data is in - ld hl,W_MAPSCRIPTPTR - ld a,[hli] - ld h,[hl] - ld l,a - ld de,.return - push de - jp [hl] ; jump to script -.return - ret - -LoadWalkingPlayerSpriteGraphics:: ; 104d (0:104d) - ld de,RedSprite ; $4180 - ld hl,$8000 - jr LoadPlayerSpriteGraphicsCommon - -LoadSurfingPlayerSpriteGraphics:: ; 1055 (0:1055) - ld de,SeelSprite - ld hl,$8000 - jr LoadPlayerSpriteGraphicsCommon - -LoadBikePlayerSpriteGraphics:: ; 105d (0:105d) - ld de,RedCyclingSprite - ld hl,$8000 - -LoadPlayerSpriteGraphicsCommon:: ; 1063 (0:1063) - push de - push hl - ld bc,(BANK(RedSprite) << 8) + $0c - call CopyVideoData - pop hl - pop de - ld a,$c0 - add e - ld e,a - jr nc,.noCarry - inc d -.noCarry - set 3,h - ld bc,$050c - jp CopyVideoData - -; function to load data from the map header -LoadMapHeader:: ; 107c (0:107c) - callba Func_f113 - ld a,[W_CURMAPTILESET] - ld [$d119],a - ld a,[W_CURMAP] - call SwitchToMapRomBank - ld a,[W_CURMAPTILESET] - ld b,a - res 7,a - ld [W_CURMAPTILESET],a - ld [$ff8b],a - bit 7,b - ret nz - ld hl,MapHeaderPointers - ld a,[W_CURMAP] - sla a - jr nc,.noCarry1 - inc h -.noCarry1 - add l - ld l,a - jr nc,.noCarry2 - inc h -.noCarry2 - ld a,[hli] - ld h,[hl] - ld l,a ; hl = base of map header -; copy the first 10 bytes (the fixed area) of the map data to D367-D370 - ld de,$d367 - ld c,$0a -.copyFixedHeaderLoop - ld a,[hli] - ld [de],a - inc de - dec c - jr nz,.copyFixedHeaderLoop -; initialize all the connected maps to disabled at first, before loading the actual values - ld a,$ff - ld [$d371],a - ld [$d37c],a - ld [$d387],a - ld [$d392],a -; copy connection data (if any) to WRAM - ld a,[W_MAPCONNECTIONS] - ld b,a -.checkNorth - bit 3,b - jr z,.checkSouth - ld de,W_MAPCONN1PTR - call CopyMapConnectionHeader -.checkSouth - bit 2,b - jr z,.checkWest - ld de,W_MAPCONN2PTR - call CopyMapConnectionHeader -.checkWest - bit 1,b - jr z,.checkEast - ld de,W_MAPCONN3PTR - call CopyMapConnectionHeader -.checkEast - bit 0,b - jr z,.getObjectDataPointer - ld de,W_MAPCONN4PTR - call CopyMapConnectionHeader -.getObjectDataPointer - ld a,[hli] - ld [$d3a9],a - ld a,[hli] - ld [$d3aa],a - push hl - ld a,[$d3a9] - ld l,a - ld a,[$d3aa] - ld h,a ; hl = base of object data - ld de,$d3ad ; background tile ID - ld a,[hli] - ld [de],a ; save background tile ID -.loadWarpData - ld a,[hli] ; number of warps - ld [$d3ae],a ; save the number of warps - and a ; are there any warps? - jr z,.loadSignData ; if not, skip this - ld c,a - ld de,$d3af ; base address of warps -.warpLoop ; one warp per loop iteration - ld b,$04 -.warpInnerLoop - ld a,[hli] - ld [de],a - inc de - dec b - jr nz,.warpInnerLoop - dec c - jr nz,.warpLoop -.loadSignData - ld a,[hli] ; number of signs - ld [$d4b0],a ; save the number of signs - and a ; are there any signs? - jr z,.loadSpriteData ; if not, skip this - ld c,a - ld de,$d4d1 ; base address of sign text IDs - ld a,d - ld [$ff95],a - ld a,e - ld [$ff96],a - ld de,$d4b1 ; base address of sign coordinates -.signLoop - ld a,[hli] - ld [de],a - inc de - ld a,[hli] - ld [de],a - inc de - push de - ld a,[$ff95] - ld d,a - ld a,[$ff96] - ld e,a - ld a,[hli] - ld [de],a - inc de - ld a,d - ld [$ff95],a - ld a,e - ld [$ff96],a - pop de - dec c - jr nz,.signLoop -.loadSpriteData - ld a,[$d72e] - bit 5,a ; did a battle happen immediately before this? - jp nz,.finishUp ; if so, skip this because battles don't destroy this data - ld a,[hli] - ld [$d4e1],a ; save the number of sprites - push hl -; zero C110-C1FF and C210-C2FF - ld hl,$c110 - ld de,$c210 - xor a - ld b,$f0 -.zeroSpriteDataLoop - ld [hli],a - ld [de],a - inc e - dec b - jr nz,.zeroSpriteDataLoop -; initialize all C100-C1FF sprite entries to disabled (other than player's) - ld hl,$c112 - ld de,$0010 - ld c,$0f -.disableSpriteEntriesLoop - ld [hl],$ff - add hl,de - dec c - jr nz,.disableSpriteEntriesLoop - pop hl - ld de,$c110 - ld a,[$d4e1] ; number of sprites - and a ; are there any sprites? - jp z,.finishUp ; if there are no sprites, skip the rest - ld b,a - ld c,$00 -.loadSpriteLoop - ld a,[hli] - ld [de],a ; store picture ID at C1X0 - inc d - ld a,$04 - add e - ld e,a - ld a,[hli] - ld [de],a ; store Y position at C2X4 - inc e - ld a,[hli] - ld [de],a ; store X position at C2X5 - inc e - ld a,[hli] - ld [de],a ; store movement byte 1 at C2X6 - ld a,[hli] - ld [$ff8d],a ; save movement byte 2 - ld a,[hli] - ld [$ff8e],a ; save text ID and flags byte - push bc - push hl - ld b,$00 - ld hl,W_MAPSPRITEDATA - add hl,bc - ld a,[$ff8d] - ld [hli],a ; store movement byte 2 in byte 0 of sprite entry - ld a,[$ff8e] - ld [hl],a ; this appears pointless, since the value is overwritten immediately after - ld a,[$ff8e] - ld [$ff8d],a - and a,$3f - ld [hl],a ; store text ID in byte 1 of sprite entry - pop hl - ld a,[$ff8d] - bit 6,a - jr nz,.trainerSprite - bit 7,a - jr nz,.itemBallSprite - jr .regularSprite -.trainerSprite - ld a,[hli] - ld [$ff8d],a ; save trainer class - ld a,[hli] - ld [$ff8e],a ; save trainer number (within class) - push hl - ld hl,W_MAPSPRITEEXTRADATA - add hl,bc - ld a,[$ff8d] - ld [hli],a ; store trainer class in byte 0 of the entry - ld a,[$ff8e] - ld [hl],a ; store trainer number in byte 1 of the entry - pop hl - jr .nextSprite -.itemBallSprite - ld a,[hli] - ld [$ff8d],a ; save item number - push hl - ld hl,W_MAPSPRITEEXTRADATA - add hl,bc - ld a,[$ff8d] - ld [hli],a ; store item number in byte 0 of the entry - xor a - ld [hl],a ; zero byte 1, since it is not used - pop hl - jr .nextSprite -.regularSprite - push hl - ld hl,W_MAPSPRITEEXTRADATA - add hl,bc -; zero both bytes, since regular sprites don't use this extra space - xor a - ld [hli],a - ld [hl],a - pop hl -.nextSprite - pop bc - dec d - ld a,$0a - add e - ld e,a - inc c - inc c - dec b - jp nz,.loadSpriteLoop -.finishUp - ld a,$19 - call Predef ; load tileset data - callab LoadWildData ; load wild pokemon data - pop hl ; restore hl from before going to the warp/sign/sprite data (this value was saved for seemingly no purpose) - ld a,[W_CURMAPHEIGHT] ; map height in 4x4 tile blocks - add a ; double it - ld [$d524],a ; store map height in 2x2 tile blocks - ld a,[W_CURMAPWIDTH] ; map width in 4x4 tile blocks - add a ; double it - ld [$d525],a ; map width in 2x2 tile blocks - ld a,[W_CURMAP] - ld c,a - ld b,$00 - ld a,[H_LOADEDROMBANK] - push af - ld a, BANK(MapSongBanks) - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld hl, MapSongBanks - add hl,bc - add hl,bc - ld a,[hli] - ld [$d35b],a ; music 1 - ld a,[hl] - ld [$d35c],a ; music 2 - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; function to copy map connection data from ROM to WRAM -; Input: hl = source, de = destination -CopyMapConnectionHeader:: ; 1238 (0:1238) - ld c,$0b -.loop - ld a,[hli] - ld [de],a - inc de - dec c - jr nz,.loop - ret - -; function to load map data -LoadMapData:: ; 1241 (0:1241) - ld a,[H_LOADEDROMBANK] - push af - call DisableLCD - ld a,$98 - ld [$d527],a - xor a - ld [$d526],a - ld [$ffaf],a - ld [$ffae],a - ld [wWalkCounter],a - ld [$d119],a - ld [$d11a],a - ld [$d3a8],a - call LoadTextBoxTilePatterns - call LoadMapHeader - callba InitMapSprites ; load tile pattern data for sprites - call LoadTileBlockMap - call LoadTilesetTilePatternData - call LoadCurrentMapView -; copy current map view to VRAM - ld hl,wTileMap - ld de,$9800 - ld b,$12 -.vramCopyLoop - ld c,$14 -.vramCopyInnerLoop - ld a,[hli] - ld [de],a - inc e - dec c - jr nz,.vramCopyInnerLoop - ld a,$0c - add e - ld e,a - jr nc,.noCarry - inc d -.noCarry - dec b - jr nz,.vramCopyLoop - ld a,$01 - ld [$cfcb],a - call EnableLCD - ld b,$09 - call GoPAL_SET - call LoadPlayerSpriteGraphics - ld a,[$d732] - and a,$18 ; did the player fly or teleport in? - jr nz,.restoreRomBank - ld a,[W_FLAGS_D733] - bit 1,a - jr nz,.restoreRomBank - call Func_235f ; music related - call Func_2312 ; music related -.restoreRomBank - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; function to switch to the ROM bank that a map is stored in -; Input: a = map number -SwitchToMapRomBank:: ; 12bc (0:12bc) - push hl - push bc - ld c,a - ld b,$00 - ld a,Bank(MapHeaderBanks) - call BankswitchHome ; switch to ROM bank 3 - ld hl,MapHeaderBanks - add hl,bc - ld a,[hl] - ld [$ffe8],a ; save map ROM bank - call BankswitchBack - ld a,[$ffe8] - ld [H_LOADEDROMBANK],a - ld [$2000],a ; switch to map ROM bank - pop bc - pop hl - ret - -Func_12da:: ; 12da (0:12da) - ld a, $1e - ld [$d13a], a - ld hl, $d730 - ld a, [hl] - or $26 - ld [hl], a - ret - -Func_12e7:: ; 12e7 (0:12e7) - ld hl, $d728 - res 0, [hl] - ret - -;appears to be called twice inside function $C38B -;if $d700,$d11a == $1 then biking -;if $d700,$d11a == $2 then surfing -ForceBikeOrSurf:: ; 12ed (0:12ed) - ld b,5 ;graphics bank 5 - ld hl,LoadPlayerSpriteGraphics ;load player sprite graphics - call Bankswitch ;loads bank 5 and then calls LoadPlayerSpriteGraphics - jp Func_2307 ;update map/player state? - -; this is used to check if the player wants to interrupt the opening sequence at several points -; XXX is this used anywhere else? -; INPUT: -; c = number of frames to wait -; sets carry if Up+Select+B, Start, or A is pressed within c frames -; unsets carry otherwise -CheckForUserInterruption:: ; 12f8 (0:12f8) - call DelayFrame - push bc - call GetJoypadStateLowSensitivity - pop bc - ld a,[H_CURRENTPRESSEDBUTTONS] ; currently pressed buttons - cp a,%01000110 ; Up, Select button, B button - jr z,.setCarry ; if all three keys are pressed - ld a,[$ffb5] ; either newly pressed buttons or currently pressed buttons at low sampling rate - and a,%00001001 ; Start button, A button - jr nz,.setCarry ; if either key is pressed - dec c - jr nz,CheckForUserInterruption -.unsetCarry - and a - ret -.setCarry - scf - ret - -; function to load position data for destination warp when switching maps -; INPUT: -; a = ID of destination warp within destination map -LoadDestinationWarpPosition:: ; 1313 (0:1313) - ld b,a - ld a,[H_LOADEDROMBANK] - push af - ld a,[$cf12] - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld a,b - add a - add a - ld c,a - ld b,0 - add hl,bc - ld bc,4 - ld de,$d35f - call CopyData - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; INPUT: -; c: if nonzero, show at least a sliver of health -; d = number of HP bar sections (normally 6) -; e = health (in eighths of bar sections) (normally out of 48) -DrawHPBar:: ; 1336 (0:1336) - push hl - push de - push bc - ld a,$71 ; left of HP bar tile 1 - ld [hli],a - ld a,$62 ; left of HP bar tile 2 - ld [hli],a - push hl - ld a,$63 ; empty bar section tile -.drawEmptyBarLoop - ld [hli],a - dec d - jr nz,.drawEmptyBarLoop - ld a,[$cf94] - dec a ; what should the right of HP bar tile be? - ld a,$6d ; right of HP bar tile, in status screen and battles - jr z,.writeTile - dec a ; right of HP bar tile, in pokemon menu -.writeTile - ld [hl],a - pop hl - ld a,e - and a ; is there enough health to show up on the HP bar? - jr nz,.loop ; if so, draw the HP bar - ld a,c - and a ; should a sliver of health be shown no matter what? - jr z,.done - ld e,1 ; if so, fill one eighth of a bar section -; loop to draw every full bar section -.loop - ld a,e - sub a,8 - jr c,.drawPartialBarSection - ld e,a - ld a,$6b ; filled bar section tile - ld [hli],a - ld a,e - and a - jr z,.done - jr .loop -; draws a partial bar section at the end (if necessary) -; there are 7 possible partial bar sections from 1/8 to 7/8 full -.drawPartialBarSection - ld a,$63 ; empty bar section tile - add e ; add e to get the appropriate partial bar section tile - ld [hl],a ; write the tile -.done - pop bc - pop de - pop hl - ret - -; loads pokemon data from one of multiple sources to $cf98 -; loads base stats to $d0b8 -; INPUT: -; [$cf92] = index of pokemon within party/box -; [$cc49] = source -; 00: player's party -; 01: enemy's party -; 02: current box -; 03: daycare -; OUTPUT: -; [$cf91] = pokemon ID -; $cf98 = base address of pokemon data -; $d0b8 = base address of base stats -LoadMonData:: ; 1372 (0:1372) - ld hl,LoadMonData_ - ld b,BANK(LoadMonData_) - jp Bankswitch - -; writes c to $d0dc+b -Func_137a:: ; 137a (0:137a) - ld hl, $d0dc - ld e, b - ld d, $0 - add hl, de - ld a, c - ld [hl], a - ret - -LoadFlippedFrontSpriteByMonIndex:: ; 1384 (0:1384) - ld a, $1 - ld [W_SPRITEFLIPPED], a - -LoadFrontSpriteByMonIndex:: ; 1389 (0:1389) - push hl - ld a, [$d11e] - push af - ld a, [$cf91] - ld [$d11e], a - ld a, $3a - call Predef ; indirect jump to IndexToPokedex (41010 (10:5010)) - ld hl, $d11e - ld a, [hl] - pop bc - ld [hl], b - and a - pop hl - jr z, .invalidDexNumber ; dex #0 invalid - cp 151 + 1 - jr c, .validDexNumber ; dex >#151 invalid -.invalidDexNumber - ld a, RHYDON ; $1 - ld [$cf91], a - ret -.validDexNumber - push hl - ld de, $9000 - call LoadMonFrontSprite - pop hl - ld a, [H_LOADEDROMBANK] - push af - ld a, Bank(asm_3f0d0) - ld [H_LOADEDROMBANK], a - ld [$2000], a - xor a - ld [$ffe1], a - call asm_3f0d0 - xor a - ld [W_SPRITEFLIPPED], a - pop af - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret - -; plays the cry of a pokemon -; INPUT: -; a = pokemon ID -PlayCry:: ; 13d0 (0:13d0) - call GetCryData - call PlaySound ; play cry - jp WaitForSoundToFinish ; wait for sound to be done playing - -; gets a pokemon's cry data -; INPUT: -; a = pokemon ID -GetCryData:: ; 13d9 (0:13d9) - dec a - ld c,a - ld b,0 - ld hl,CryData - add hl,bc - add hl,bc - add hl,bc - ld a,Bank(CryData) - call BankswitchHome - ld a,[hli] - ld b,a - ld a,[hli] - ld [$c0f1],a - ld a,[hl] - ld [$c0f2],a - call BankswitchBack - ld a,b ; a = cryID - ld c,$14 ; base sound ID for pokemon cries - rlca - add b ; a = cryID * 3 - add c ; a = $14 + cryID * 3 - ret - -DisplayPartyMenu:: ; 13fc (0:13fc) - ld a,[$ffd7] - push af - xor a - ld [$ffd7],a - call GBPalWhiteOutWithDelay3 - call CleanLCD_OAM - call PartyMenuInit - call DrawPartyMenu - jp HandlePartyMenuInput - -GoBackToPartyMenu:: ; 1411 (0:1411) - ld a,[$ffd7] - push af - xor a - ld [$ffd7],a - call PartyMenuInit - call RedrawPartyMenu - jp HandlePartyMenuInput - -PartyMenuInit:: ; 1420 (0:1420) - ld a,$01 - call BankswitchHome - call LoadHpBarAndStatusTilePatterns - ld hl,$d730 - set 6,[hl] ; turn off letter printing delay - xor a - ld [$cc49],a - ld [$cc37],a - ld hl,wTopMenuItemY - inc a - ld [hli],a ; top menu item Y - xor a - ld [hli],a ; top menu item X - ld a,[$cc2b] - push af - ld [hli],a ; current menu item ID - inc hl - ld a,[W_NUMINPARTY] - and a ; are there more than 0 pokemon in the party? - jr z,.storeMaxMenuItemID - dec a -; if party is not empty, the max menu item ID is ([W_NUMINPARTY] - 1) -; otherwise, it is 0 -.storeMaxMenuItemID - ld [hli],a ; max menu item ID - ld a,[$d11f] - and a - ld a,%00000011 ; A button and B button - jr z,.next - xor a - ld [$d11f],a - inc a -.next - ld [hli],a ; menu watched keys - pop af - ld [hl],a ; old menu item ID - ret - -HandlePartyMenuInput:: ; 145a (0:145a) - ld a,1 - ld [$cc4a],a - ld a,$40 - ld [$d09b],a - call HandleMenuInputPokemonSelection - call PlaceUnfilledArrowMenuCursor - ld b,a - xor a - ld [$d09b],a - ld a,[wCurrentMenuItem] - ld [$cc2b],a - ld hl,$d730 - res 6,[hl] ; turn on letter printing delay - ld a,[$cc35] - and a - jp nz,.swappingPokemon - pop af - ld [$ffd7],a - bit 1,b - jr nz,.noPokemonChosen - ld a,[W_NUMINPARTY] - and a - jr z,.noPokemonChosen - ld a,[wCurrentMenuItem] - ld [wWhichPokemon],a - ld hl,W_PARTYMON1 - ld b,0 - ld c,a - add hl,bc - ld a,[hl] - ld [$cf91],a - ld [$cfd9],a - call BankswitchBack - and a - ret -.noPokemonChosen - call BankswitchBack - scf - ret -.swappingPokemon - bit 1,b ; was the B button pressed? - jr z,.handleSwap ; if not, handle swapping the pokemon -.cancelSwap ; if the B button was pressed - callba ErasePartyMenuCursors - xor a - ld [$cc35],a - ld [$d07d],a - call RedrawPartyMenu - jr HandlePartyMenuInput -.handleSwap - ld a,[wCurrentMenuItem] - ld [wWhichPokemon],a - callba SwitchPartyMon - jr HandlePartyMenuInput - -DrawPartyMenu:: ; 14d4 (0:14d4) - ld hl, DrawPartyMenu_ - jr DrawPartyMenuCommon - -RedrawPartyMenu:: ; 14d9 (0:14d9) - ld hl, RedrawPartyMenu_ - -DrawPartyMenuCommon:: ; 14dc (0:14dc) - ld b, BANK(RedrawPartyMenu_) - jp Bankswitch - -; prints a pokemon's status condition -; INPUT: -; de = address of status condition -; hl = destination address -PrintStatusCondition:: ; 14e1 (0:14e1) - push de - dec de - dec de ; de = address of current HP - ld a,[de] - ld b,a - dec de - ld a,[de] - or b ; is the pokemon's HP zero? - pop de - jr nz,PrintStatusConditionNotFainted -; if the pokemon's HP is 0, print "FNT" - ld a,"F" - ld [hli],a - ld a,"N" - ld [hli],a - ld [hl],"T" - and a - ret -PrintStatusConditionNotFainted ; 14f6 - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(PrintStatusAilment) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call PrintStatusAilment ; print status condition - pop bc - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; function to print pokemon level, leaving off the ":L" if the level is at least 100 -; INPUT: -; hl = destination address -; [$cfb9] = level -PrintLevel:: ; 150b (0:150b) - ld a,$6e ; ":L" tile ID - ld [hli],a - ld c,2 ; number of digits - ld a,[$cfb9] ; level - cp a,100 - jr c,PrintLevelCommon -; if level at least 100, write over the ":L" tile - dec hl - inc c ; increment number of digits to 3 - jr PrintLevelCommon - -; prints the level without leaving off ":L" regardless of level -; INPUT: -; hl = destination address -; [$cfb9] = level -PrintLevelFull:: ; 151b (0:151b) - ld a,$6e ; ":L" tile ID - ld [hli],a - ld c,3 ; number of digits - ld a,[$cfb9] ; level - -PrintLevelCommon:: ; 1523 (0:1523) - ld [$d11e],a - ld de,$d11e - ld b,$41 ; no leading zeroes, left-aligned, one byte - jp PrintNumber - -Func_152e:: ; 152e (0:152e) - ld hl,$d0dc - ld c,a - ld b,0 - add hl,bc - ld a,[hl] - ret - -; copies the base stat data of a pokemon to $D0B8 (W_MONHEADER) -; INPUT: -; [$D0B5] = pokemon ID -GetMonHeader:: ; 1537 (0:1537) - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(BulbasaurBaseStats) - ld [H_LOADEDROMBANK],a - ld [$2000],a - push bc - push de - push hl - ld a,[$d11e] - push af - ld a,[$d0b5] - ld [$d11e],a - ld de,FossilKabutopsPic - ld b,$66 ; size of Kabutops fossil and Ghost sprites - cp a,FOSSIL_KABUTOPS ; Kabutops fossil - jr z,.specialID - ld de,GhostPic - cp a,MON_GHOST ; Ghost - jr z,.specialID - ld de,FossilAerodactylPic - ld b,$77 ; size of Aerodactyl fossil sprite - cp a,FOSSIL_AERODACTYL ; Aerodactyl fossil - jr z,.specialID - cp a,MEW - jr z,.mew - ld a,$3a - call Predef ; convert pokemon ID in [$D11E] to pokedex number - ld a,[$d11e] - dec a - ld bc,28 - ld hl,BulbasaurBaseStats - call AddNTimes - ld de,W_MONHEADER - ld bc,28 - call CopyData - jr .done -.specialID - ld hl,W_MONHSPRITEDIM - ld [hl],b ; write sprite dimensions - inc hl - ld [hl],e ; write front sprite pointer - inc hl - ld [hl],d - jr .done -.mew - ld hl,MewBaseStats - ld de,W_MONHEADER - ld bc,28 - ld a,BANK(MewBaseStats) - call FarCopyData -.done - ld a,[$d0b5] - ld [$d0b8],a - pop af - ld [$d11e],a - pop hl - pop de - pop bc - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; copy party pokemon's name to $CD6D -GetPartyMonName2:: ; 15b4 (0:15b4) - ld a,[wWhichPokemon] ; index within party - ld hl,W_PARTYMON1NAME - -; this is called more often -GetPartyMonName:: ; 15ba (0:15ba) - push hl - push bc - call SkipFixedLengthTextEntries ; add 11 to hl, a times - ld de,$cd6d - push de - ld bc,11 - call CopyData - pop de - pop bc - pop hl - ret - -; function to print a BCD (Binary-coded decimal) number -; de = address of BCD number -; hl = destination address -; c = flags and length -; bit 7: if set, do not print leading zeroes -; if unset, print leading zeroes -; bit 6: if set, left-align the string (do not pad empty digits with spaces) -; if unset, right-align the string -; bit 5: if set, print currency symbol at the beginning of the string -; if unset, do not print the currency symbol -; bits 0-4: length of BCD number in bytes -; Note that bits 5 and 7 are modified during execution. The above reflects -; their meaning at the beginning of the functions's execution. -PrintBCDNumber:: ; 15cd (0:15cd) - ld b,c ; save flags in b - res 7,c - res 6,c - res 5,c ; c now holds the length - bit 5,b - jr z,.loop - bit 7,b - jr nz,.loop - ld [hl],"¥" - inc hl -.loop - ld a,[de] - swap a - call PrintBCDDigit ; print upper digit - ld a,[de] - call PrintBCDDigit ; print lower digit - inc de - dec c - jr nz,.loop - bit 7,b ; were any non-zero digits printed? - jr z,.done ; if so, we are done -.numberEqualsZero ; if every digit of the BCD number is zero - bit 6,b ; left or right alignment? - jr nz,.skipRightAlignmentAdjustment - dec hl ; if the string is right-aligned, it needs to be moved back one space -.skipRightAlignmentAdjustment - bit 5,b - jr z,.skipCurrencySymbol - ld [hl],"¥" - inc hl -.skipCurrencySymbol - ld [hl],"0" - call PrintLetterDelay - inc hl -.done - ret - -PrintBCDDigit:: ; 1604 (0:1604) - and a,%00001111 - and a - jr z,.zeroDigit -.nonzeroDigit - bit 7,b ; have any non-space characters been printed? - jr z,.outputDigit -; if bit 7 is set, then no numbers have been printed yet - bit 5,b ; print the currency symbol? - jr z,.skipCurrencySymbol - ld [hl],"¥" - inc hl - res 5,b -.skipCurrencySymbol - res 7,b ; unset 7 to indicate that a nonzero digit has been reached -.outputDigit - add a,"0" - ld [hli],a - jp PrintLetterDelay -.zeroDigit - bit 7,b ; either printing leading zeroes or already reached a nonzero digit? - jr z,.outputDigit ; if so, print a zero digit - bit 6,b ; left or right alignment? - ret nz - inc hl ; if right-aligned, "print" a space by advancing the pointer - ret - -; uncompresses the front or back sprite of the specified mon -; assumes the corresponding mon header is already loaded -; hl contains offset to sprite pointer ($b for front or $d for back) -UncompressMonSprite:: ; 1627 (0:1627) - ld bc,W_MONHEADER - add hl,bc - ld a,[hli] - ld [W_SPRITEINPUTPTR],a ; fetch sprite input pointer - ld a,[hl] - ld [W_SPRITEINPUTPTR+1],a -; define (by index number) the bank that a pokemon's image is in -; index = Mew, bank 1 -; index = Kabutops fossil, bank $B -; index < $1F, bank 9 -; $1F ≤ index < $4A, bank $A -; $4A ≤ index < $74, bank $B -; $74 ≤ index < $99, bank $C -; $99 ≤ index, bank $D - ld a,[$CF91] ; XXX name for this ram location - ld b,a - cp MEW - ld a,BANK(MewPicFront) - jr z,.GotBank - ld a,b - cp FOSSIL_KABUTOPS - ld a,BANK(FossilKabutopsPic) - jr z,.GotBank - ld a,b - cp TANGELA + 1 - ld a,BANK(TangelaPicFront) - jr c,.GotBank - ld a,b - cp MOLTRES + 1 - ld a,BANK(MoltresPicFront) - jr c,.GotBank - ld a,b - cp BEEDRILL + 2 - ld a,BANK(BeedrillPicFront) - jr c,.GotBank - ld a,b - cp STARMIE + 1 - ld a,BANK(StarmiePicFront) - jr c,.GotBank - ld a,BANK(VictreebelPicFront) -.GotBank - jp UncompressSpriteData - -; de: destination location -LoadMonFrontSprite:: ; 1665 (0:1665) - push de - ld hl, W_MONHFRONTSPRITE - W_MONHEADER - call UncompressMonSprite - ld hl, W_MONHSPRITEDIM - ld a, [hli] - ld c, a - pop de - ; fall through - -; postprocesses uncompressed sprite chunks to a 2bpp sprite and loads it into video ram -; calculates alignment parameters to place both sprite chunks in the center of the 7*7 tile sprite buffers -; de: destination location -; a,c: sprite dimensions (in tiles of 8x8 each) -LoadUncompressedSpriteData:: ; 1672 (0:1672) - push de - and $f - ld [H_SPRITEWIDTH], a ; each byte contains 8 pixels (in 1bpp), so tiles=bytes for width - ld b, a - ld a, $7 - sub b ; 7-w - inc a ; 8-w - srl a ; (8-w)/2 ; horizontal center (in tiles, rounded up) - ld b, a - add a - add a - add a - sub b ; 7*((8-w)/2) ; skip for horizontal center (in tiles) - ld [H_SPRITEOFFSET], a - ld a, c - swap a - and $f - ld b, a - add a - add a - add a ; 8*tiles is height in bytes - ld [H_SPRITEHEIGHT], a ; $ff8c - ld a, $7 - sub b ; 7-h ; skip for vertical center (in tiles, relative to current column) - ld b, a - ld a, [H_SPRITEOFFSET] - add b ; 7*((8-w)/2) + 7-h ; combined overall offset (in tiles) - add a - add a - add a ; 8*(7*((8-w)/2) + 7-h) ; combined overall offset (in bytes) - ld [H_SPRITEOFFSET], a - xor a - ld [$4000], a - ld hl, S_SPRITEBUFFER0 - call ZeroSpriteBuffer ; zero buffer 0 - ld de, S_SPRITEBUFFER1 - ld hl, S_SPRITEBUFFER0 - call AlignSpriteDataCentered ; copy and align buffer 1 to 0 (containing the MSB of the 2bpp sprite) - ld hl, S_SPRITEBUFFER1 - call ZeroSpriteBuffer ; zero buffer 1 - ld de, S_SPRITEBUFFER2 - ld hl, S_SPRITEBUFFER1 - call AlignSpriteDataCentered ; copy and align buffer 2 to 1 (containing the LSB of the 2bpp sprite) - pop de - jp InterlaceMergeSpriteBuffers - -; copies and aligns the sprite data properly inside the sprite buffer -; sprite buffers are 7*7 tiles in size, the loaded sprite is centered within this area -AlignSpriteDataCentered:: ; 16c2 (0:16c2) - ld a, [H_SPRITEOFFSET] - ld b, $0 - ld c, a - add hl, bc - ld a, [H_SPRITEWIDTH] ; $ff8b -.columnLoop - push af - push hl - ld a, [H_SPRITEHEIGHT] ; $ff8c - ld c, a -.columnInnerLoop - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .columnInnerLoop - pop hl - ld bc, 7*8 ; 7 tiles - add hl, bc ; advance one full column - pop af - dec a - jr nz, .columnLoop - ret - -; fills the sprite buffer (pointed to in hl) with zeros -ZeroSpriteBuffer:: ; 16df (0:16df) - ld bc, SPRITEBUFFERSIZE -.nextByteLoop - xor a - ld [hli], a - dec bc - ld a, b - or c - jr nz, .nextByteLoop - ret - -; combines the (7*7 tiles, 1bpp) sprite chunks in buffer 0 and 1 into a 2bpp sprite located in buffer 1 through 2 -; in the resulting sprite, the rows of the two source sprites are interlaced -; de: output address -InterlaceMergeSpriteBuffers:: ; 16ea (0:16ea) - xor a - ld [$4000], a - push de - ld hl, S_SPRITEBUFFER2 + (SPRITEBUFFERSIZE - 1) ; destination: end of buffer 2 - ld de, S_SPRITEBUFFER1 + (SPRITEBUFFERSIZE - 1) ; source 2: end of buffer 1 - ld bc, S_SPRITEBUFFER0 + (SPRITEBUFFERSIZE - 1) ; source 1: end of buffer 0 - ld a, SPRITEBUFFERSIZE/2 ; $c4 - ld [H_SPRITEINTERLACECOUNTER], a ; $ff8b -.interlaceLoop - ld a, [de] - dec de - ld [hld], a ; write byte of source 2 - ld a, [bc] - dec bc - ld [hld], a ; write byte of source 1 - ld a, [de] - dec de - ld [hld], a ; write byte of source 2 - ld a, [bc] - dec bc - ld [hld], a ; write byte of source 1 - ld a, [H_SPRITEINTERLACECOUNTER] ; $ff8b - dec a - ld [H_SPRITEINTERLACECOUNTER], a ; $ff8b - jr nz, .interlaceLoop - ld a, [W_SPRITEFLIPPED] - and a - jr z, .notFlipped - ld bc, 2*SPRITEBUFFERSIZE - ld hl, S_SPRITEBUFFER1 -.swapLoop - swap [hl] ; if flipped swap nybbles in all bytes - inc hl - dec bc - ld a, b - or c - jr nz, .swapLoop -.notFlipped - pop hl - ld de, S_SPRITEBUFFER1 - ld c, (2*SPRITEBUFFERSIZE)/16 ; $31, number of 16 byte chunks to be copied - ld a, [H_LOADEDROMBANK] - ld b, a - jp CopyVideoData - -Underground_Coll:: ; 172f (0:172f) - INCBIN "gfx/tilesets/underground.tilecoll" -Overworld_Coll:: ; 1735 (0:1735) - INCBIN "gfx/tilesets/overworld.tilecoll" -RedsHouse1_Coll:: -RedsHouse2_Coll:: ; 1749 (0:1749) - INCBIN "gfx/tilesets/reds_house.tilecoll" -Mart_Coll -Pokecenter_Coll:: ; 1753 (0:1753) - INCBIN "gfx/tilesets/pokecenter.tilecoll" -Dojo_Coll:: -Gym_Coll:: ; 1759 (0:1759) - INCBIN "gfx/tilesets/gym.tilecoll" -Forest_Coll:: ; 1765 (0:1765) - INCBIN "gfx/tilesets/forest.tilecoll" -House_Coll:: ; 1775 (0:1775) - INCBIN "gfx/tilesets/house.tilecoll" -ForestGate_Coll:: -Museum_Coll:: -Gate_Coll:: ; 177f (0:177f) - INCBIN "gfx/tilesets/gate.tilecoll" -Ship_Coll:: ; 178a (0:178a) - INCBIN "gfx/tilesets/ship.tilecoll" -ShipPort_Coll:: ; 1795 (0:1795) - INCBIN "gfx/tilesets/ship_port.tilecoll" -Cemetery_Coll:: ; 179a (0:179a) - INCBIN "gfx/tilesets/cemetery.tilecoll" -Interior_Coll:: ; 17a2 (0:17a2) - INCBIN "gfx/tilesets/interior.tilecoll" -Cavern_Coll:: ; 17ac (0:17ac) - INCBIN "gfx/tilesets/cavern.tilecoll" -Lobby_Coll:: ; 17b8 (0:17b8) - INCBIN "gfx/tilesets/lobby.tilecoll" -Mansion_Coll:: ; 17c0 (0:17c0) - INCBIN "gfx/tilesets/mansion.tilecoll" -Lab_Coll:: ; 17ca (0:17ca) - INCBIN "gfx/tilesets/lab.tilecoll" -Club_Coll:: ; 17d1 (0:17d1) - INCBIN "gfx/tilesets/club.tilecoll" -Facility_Coll:: ; 17dd (0:17dd) - INCBIN "gfx/tilesets/facility.tilecoll" -Plateau_Coll:: ; 17f0 (0:17f0) - INCBIN "gfx/tilesets/plateau.tilecoll" - -; does the same thing as FarCopyData at 009D -; only difference is that it uses [$ff8b] instead of [$cee9] for a temp value -; copy bc bytes of data from a:hl to de -FarCopyData2:: ; 17f7 (0:17f7) - ld [$ff8b],a - ld a,[H_LOADEDROMBANK] - push af - ld a,[$ff8b] - ld [H_LOADEDROMBANK],a - ld [$2000],a - call CopyData - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; does a far copy but the source is de and the destination is hl -; copy bc bytes of data from a:de to hl -FarCopyData3:: ; 180d (0:180d) - ld [$ff8b],a - ld a,[H_LOADEDROMBANK] - push af - ld a,[$ff8b] - ld [H_LOADEDROMBANK],a - ld [$2000],a - push hl - push de - push de - ld d,h - ld e,l - pop hl - call CopyData - pop de - pop hl - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; copies each source byte to the destination twice (next to each other) -; copy bc source bytes from a:hl to de -FarCopyDataDouble:: ; 182b (0:182b) - ld [$ff8b],a - ld a,[H_LOADEDROMBANK] - push af - ld a,[$ff8b] - ld [H_LOADEDROMBANK],a - ld [$2000],a -.loop - ld a,[hli] - ld [de],a - inc de - ld [de],a - inc de - dec bc - ld a,c - or b - jr nz,.loop - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; copy (c * 16) bytes from b:de to hl during V-blank -; transfers up to 128 bytes per V-blank -CopyVideoData:: ; 1848 (0:1848) - ld a,[H_AUTOBGTRANSFERENABLED] ; save auto-transfer enabled flag - push af - xor a - ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer while copying - ld a,[H_LOADEDROMBANK] - ld [$ff8b],a - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld a,e - ld [H_VBCOPYSRC],a - ld a,d - ld [H_VBCOPYSRC + 1],a - ld a,l - ld [H_VBCOPYDEST],a - ld a,h - ld [H_VBCOPYDEST + 1],a -.loop - ld a,c - cp a,8 ; are there more than 128 bytes left to copy? - jr nc,.copyMaxSize ; only copy up to 128 bytes at a time -.copyRemainder - ld [H_VBCOPYSIZE],a - call DelayFrame ; wait for V-blank handler to perform the copy - ld a,[$ff8b] - ld [H_LOADEDROMBANK],a - ld [$2000],a - pop af - ld [H_AUTOBGTRANSFERENABLED],a ; restore original auto-transfer enabled flag - ret -.copyMaxSize - ld a,8 ; 128 bytes - ld [H_VBCOPYSIZE],a - call DelayFrame ; wait for V-blank handler to perform the copy - ld a,c - sub a,8 - ld c,a - jr .loop - -; copy (c * 8) source bytes from b:de to hl during V-blank -; copies each source byte to the destination twice (next to each other) -; transfers up to 64 source bytes per V-blank -CopyVideoDataDouble:: ; 1886 (0:1886) - ld a,[H_AUTOBGTRANSFERENABLED] ; save auto-transfer enabled flag - push af - xor a - ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer while copying - ld a,[H_LOADEDROMBANK] - ld [$ff8b],a - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld a,e - ld [H_VBCOPYDOUBLESRC],a - ld a,d - ld [H_VBCOPYDOUBLESRC + 1],a - ld a,l - ld [H_VBCOPYDOUBLEDEST],a - ld a,h - ld [H_VBCOPYDOUBLEDEST + 1],a -.loop - ld a,c - cp a,8 ; are there more than 64 source bytes left to copy? - jr nc,.copyMaxSize ; only copy up to 64 source bytes at a time -.copyRemainder - ld [H_VBCOPYDOUBLESIZE],a - call DelayFrame ; wait for V-blank handler to perform the copy - ld a,[$ff8b] - ld [H_LOADEDROMBANK],a - ld [$2000],a - pop af - ld [H_AUTOBGTRANSFERENABLED],a ; restore original auto-transfer enabled flag - ret -.copyMaxSize - ld a,8 ; 64 source bytes - ld [H_VBCOPYDOUBLESIZE],a - call DelayFrame ; wait for V-blank handler to perform the copy - ld a,c - sub a,8 - ld c,a - jr .loop - -; clears an area of the screen -; INPUT: -; hl = address of upper left corner of the area -; b = height -; c = width -ClearScreenArea:: ; 18c4 (0:18c4) - ld a,$7F ; blank tile - ld de,20 ; screen width -.loop - push hl - push bc -.innerLoop - ld [hli],a - dec c - jr nz,.innerLoop - pop bc - pop hl - add hl,de - dec b - jr nz,.loop - ret - -; copies the screen tile buffer from WRAM to VRAM -; copying is done in 3 chunks of 6 rows each -; b: high byte of VRAM destination address ($98 or $9c for window tile map 0 or 1 resp.) -CopyScreenTileBufferToVRAM:: ; 18d6 (0:18d6) - ld c, $6 - ld hl, $0000 - ld de, wTileMap - call InitScreenTileBufferTransferParameters - call DelayFrame - ld hl, $600 - ld de, wTileMap + 20 * 6 ; $c418 - call InitScreenTileBufferTransferParameters - call DelayFrame - ld hl, $c00 - ld de, wTileMap + 20 * 12 ; $c490 - call InitScreenTileBufferTransferParameters - jp DelayFrame - -InitScreenTileBufferTransferParameters:: ; 18fc (0:18fc) - ld a, d - ld [H_VBCOPYBGSRC+1], a - call GetRowColAddressBgMap - ld a, l - ld [H_VBCOPYBGDEST], a ; $ffc3 - ld a, h - ld [H_VBCOPYBGDEST+1], a - ld a, c - ld [H_VBCOPYBGNUMROWS], a ; $ffc5 - ld a, e - ld [H_VBCOPYBGSRC], a ; $ffc1 - ret - -ClearScreen:: ; 190f (0:190f) -; clears all tiles in the tilemap, -; then wait three frames - ld bc,$0168 ; tilemap size - inc b - ld hl,wTileMap ; TILEMAP_START - ld a,$7F ; $7F is blank tile -.loop - ld [hli],a - dec c - jr nz,.loop - dec b - jr nz,.loop - jp Delay3 - -TextBoxBorder:: ; 1922 (0:1922) -; draw a text box -; upper-left corner at coordinates hl -; height b -; width c - - ; first row - push hl - ld a,"┌" - ld [hli],a - inc a ; horizontal border ─ - call NPlaceChar - inc a ; upper-right border ┐ - ld [hl],a - - ; middle rows - pop hl - ld de,20 - add hl,de ; skip the top row - -.PlaceRow - push hl - ld a,"│" - ld [hli],a - ld a," " - call NPlaceChar - ld [hl],"│" - - pop hl - ld de,20 - add hl,de ; move to next row - dec b - jr nz,.PlaceRow - - ; bottom row - ld a,"└" - ld [hli],a - ld a,"─" - call NPlaceChar - ld [hl],"┘" - ret -; -NPlaceChar:: ; 194f (0:194f) -; place a row of width c of identical characters - ld d,c -.loop - ld [hli],a - dec d - jr nz,.loop - ret - -PlaceString:: ; 1955 (0:1955) - push hl -PlaceNextChar:: ; 1956 (0:1956) - ld a,[de] - - cp "@" - jr nz,.PlaceText - ld b,h - ld c,l - pop hl - ret - -.PlaceText - cp $4E - jr nz,.next - ld bc,$0028 - ld a,[$FFF6] - bit 2,a - jr z,.next2 - ld bc,$14 -.next2 - pop hl - add hl,bc - push hl - jp Next19E8 - -.next - cp $4F - jr nz,.next3 - pop hl - FuncCoord 1, 16 ; $c4e1 - ld hl,Coord - push hl - jp Next19E8 - -.next3 ; Check against a dictionary - and a - jp z,Char00 - cp $4C - jp z,Char4C - cp $4B - jp z,Char4B - cp $51 - jp z,Char51 - cp $49 - jp z,Char49 - cp $52 - jp z,Char52 - cp $53 - jp z,Char53 - cp $54 - jp z,Char54 - cp $5B - jp z,Char5B - cp $5E - jp z,Char5E - cp $5C - jp z,Char5C - cp $5D - jp z,Char5D - cp $55 - jp z,Char55 - cp $56 - jp z,Char56 - cp $57 - jp z,Char57 - cp $58 - jp z,Char58 - cp $4A - jp z,Char4A - cp $5F - jp z,Char5F - cp $59 - jp z,Char59 - cp $5A - jp z,Char5A - ld [hli],a - call PrintLetterDelay -Next19E8:: ; 19e8 (0:19e8) - inc de - jp PlaceNextChar - -Char00:: ; 19ec (0:19ec) - ld b,h - ld c,l - pop hl - ld de,Char00Text - dec de - ret - -Char00Text:: ; 0x19f4 “%d ERROR.” - TX_FAR _Char00Text - db "@" - -Char52:: ; 0x19f9 player’s name - push de - ld de,W_PLAYERNAME - jr FinishDTE - -Char53:: ; 19ff (0:19ff) ; rival’s name - push de - ld de,W_RIVALNAME - jr FinishDTE - -Char5D:: ; 1a05 (0:1a05) ; TRAINER - push de - ld de,Char5DText - jr FinishDTE - -Char5C:: ; 1a0b (0:1a0b) ; TM - push de - ld de,Char5CText - jr FinishDTE - -Char5B:: ; 1a11 (0:1a11) ; PC - push de - ld de,Char5BText - jr FinishDTE - -Char5E:: ; 1a17 (0:1a17) ; ROCKET - push de - ld de,Char5EText - jr FinishDTE - -Char54:: ; 1a1d (0:1a1d) ; POKé - push de - ld de,Char54Text - jr FinishDTE - -Char56:: ; 1a23 (0:1a23) ; …… - push de - ld de,Char56Text - jr FinishDTE - -Char4A:: ; 1a29 (0:1a29) ; PKMN - push de - ld de,Char4AText - jr FinishDTE - -Char59:: ; 1a2f (0:1a2f) -; depending on whose turn it is, print -; enemy active monster’s name, prefixed with “Enemy ” -; or -; player active monster’s name -; (like Char5A but flipped) - ld a,[H_WHOSETURN] - xor 1 - jr MonsterNameCharsCommon - -Char5A:: ; 1a35 (0:1a35) -; depending on whose turn it is, print -; player active monster’s name -; or -; enemy active monster’s name, prefixed with “Enemy ” - ld a,[H_WHOSETURN] -MonsterNameCharsCommon:: ; 1a37 (0:1a37) - push de - and a - jr nz,.Enemy - ld de,W_PLAYERMONNAME ; player active monster name - jr FinishDTE - -.Enemy ; 1A40 - ; print “Enemy ” - ld de,Char5AText - call PlaceString - - ld h,b - ld l,c - ld de,W_ENEMYMONNAME ; enemy active monster name - -FinishDTE:: ; 1a4b (0:1a4b) - call PlaceString - ld h,b - ld l,c - pop de - inc de - jp PlaceNextChar - -Char5CText:: ; 1a55 (0:1a55) - db "TM@" -Char5DText:: ; 1a58 (0:1a58) - db "TRAINER@" -Char5BText:: ; 1a60 (0:1a60) - db "PC@" -Char5EText:: ; 1a63 (0:1a63) - db "ROCKET@" -Char54Text:: ; 1a6a (0:1a6a) - db "POKé@" -Char56Text:: ; 1a6f (0:1a6f) - db "……@" -Char5AText:: ; 1a72 (0:1a72) - db "Enemy @" -Char4AText:: ; 1a79 (0:1a79) - db $E1,$E2,"@" ; PKMN - -Char55:: ; 1a7c (0:1a7c) - push de - ld b,h - ld c,l - ld hl,Char55Text - call TextCommandProcessor - ld h,b - ld l,c - pop de - inc de - jp PlaceNextChar - -Char55Text:: ; 1a8c (0:1a8c) -; equivalent to Char4B - TX_FAR _Char55Text - db "@" - -Char5F:: ; 1a91 (0:1a91) -; ends a Pokédex entry - ld [hl],"." - pop hl - ret - -Char58:: ; 1a95 (0:1a95) - ld a,[$D12B] - cp 4 - jp z,Next1AA2 - ld a,$EE - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a -Next1AA2:: ; 1aa2 (0:1aa2) - call ProtectedDelay3 - call ManualTextScroll - ld a,$7F - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a -Char57:: ; 1aad (0:1aad) - pop hl - ld de,Char58Text - dec de - ret - -Char58Text:: ; 1ab3 (0:1ab3) - db "@" - -Char51:: ; 1ab4 (0:1ab4) - push de - ld a,$EE - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a - call ProtectedDelay3 - call ManualTextScroll - FuncCoord 1, 13 ; $c4a5 - ld hl,Coord - ld bc,$0412 - call ClearScreenArea - ld c,$14 - call DelayFrames - pop de - FuncCoord 1, 14 ; $c4b9 - ld hl,Coord - jp Next19E8 - -Char49:: ; 1ad5 (0:1ad5) - push de - ld a,$EE - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a - call ProtectedDelay3 - call ManualTextScroll - FuncCoord 1, 10 ; $c469 - ld hl,Coord - ld bc,$0712 - call ClearScreenArea - ld c,$14 - call DelayFrames - pop de - pop hl - FuncCoord 1, 11 ; $c47d - ld hl,Coord - push hl - jp Next19E8 - -Char4B:: ; 1af8 (0:1af8) - ld a,$EE - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a - call ProtectedDelay3 - push de - call ManualTextScroll - pop de - ld a,$7F - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a - ;fall through -Char4C:: ; 1b0a (0:1b0a) - push de - call Next1B18 - call Next1B18 - FuncCoord 1, 16 ; $c4e1 - ld hl,Coord - pop de - jp Next19E8 - -Next1B18:: ; 1b18 (0:1b18) - FuncCoord 0, 14 ; $c4b8 - ld hl,Coord - FuncCoord 0, 13 ; $c4a4 - ld de,Coord - ld b,$3C -.next - ld a,[hli] - ld [de],a - inc de - dec b - jr nz,.next - FuncCoord 1, 16 ; $c4e1 - ld hl,Coord - ld a,$7F - ld b,$12 -.next2 - ld [hli],a - dec b - jr nz,.next2 - - ; wait five frames - ld b,5 -.WaitFrame - call DelayFrame - dec b - jr nz,.WaitFrame - - ret - -ProtectedDelay3:: ; 1b3a (0:1b3a) - push bc - call Delay3 - pop bc - ret - -TextCommandProcessor:: ; 1b40 (0:1b40) - ld a,[$d358] - push af - set 1,a - ld e,a - ld a,[$fff4] - xor e - ld [$d358],a - ld a,c - ld [$cc3a],a - ld a,b - ld [$cc3b],a - -NextTextCommand:: ; 1b55 (0:1b55) - ld a,[hli] - cp a, "@" ; terminator - jr nz,.doTextCommand - pop af - ld [$d358],a - ret -.doTextCommand - push hl - cp a,$17 - jp z,TextCommand17 - cp a,$0e - jp nc,TextCommand0B ; if a != 0x17 and a >= 0xE, go to command 0xB -; if a < 0xE, use a jump table - ld hl,TextCommandJumpTable - push bc - add a - ld b,$00 - ld c,a - add hl,bc - pop bc - ld a,[hli] - ld h,[hl] - ld l,a - jp [hl] - -; draw box -; 04AAAABBCC -; AAAA = address of upper left corner -; BB = height -; CC = width -TextCommand04:: ; 1b78 (0:1b78) - pop hl - ld a,[hli] - ld e,a - ld a,[hli] - ld d,a - ld a,[hli] - ld b,a - ld a,[hli] - ld c,a - push hl - ld h,d - ld l,e - call TextBoxBorder - pop hl - jr NextTextCommand - -; place string inline -; 00{string} -TextCommand00:: ; 1b8a (0:1b8a) - pop hl - ld d,h - ld e,l - ld h,b - ld l,c - call PlaceString - ld h,d - ld l,e - inc hl - jr NextTextCommand - -; place string from RAM -; 01AAAA -; AAAA = address of string -TextCommand01:: ; 1b97 (0:1b97) - pop hl - ld a,[hli] - ld e,a - ld a,[hli] - ld d,a - push hl - ld h,b - ld l,c - call PlaceString - pop hl - jr NextTextCommand - -; print BCD number -; 02AAAABB -; AAAA = address of BCD number -; BB -; bits 0-4 = length in bytes -; bits 5-7 = unknown flags -TextCommand02:: ; 1ba5 (0:1ba5) - pop hl - ld a,[hli] - ld e,a - ld a,[hli] - ld d,a - ld a,[hli] - push hl - ld h,b - ld l,c - ld c,a - call PrintBCDNumber - ld b,h - ld c,l - pop hl - jr NextTextCommand - -; repoint destination address -; 03AAAA -; AAAA = new destination address -TextCommand03:: ; 1bb7 (0:1bb7) - pop hl - ld a,[hli] - ld [$cc3a],a - ld c,a - ld a,[hli] - ld [$cc3b],a - ld b,a - jp NextTextCommand - -; repoint destination to second line of dialogue text box -; 05 -; (no arguments) -TextCommand05:: ; 1bc5 (0:1bc5) - pop hl - FuncCoord 1, 16 ; $c4e1 - ld bc,Coord ; address of second line of dialogue text box - jp NextTextCommand - -; blink arrow and wait for A or B to be pressed -; 06 -; (no arguments) -TextCommand06:: ; 1bcc (0:1bcc) - ld a,[W_ISLINKBATTLE] - cp a,$04 - jp z,TextCommand0D - ld a,$ee ; down arrow - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a ; place down arrow in lower right corner of dialogue text box - push bc - call ManualTextScroll ; blink arrow and wait for A or B to be pressed - pop bc - ld a," " - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a ; overwrite down arrow with blank space - pop hl - jp NextTextCommand - -; scroll text up one line -; 07 -; (no arguments) -TextCommand07:: ; 1be7 (0:1be7) - ld a," " - FuncCoord 18, 16 ; $c4f2 - ld [Coord],a ; place blank space in lower right corner of dialogue text box - call Next1B18 ; scroll up text - call Next1B18 - pop hl - FuncCoord 1, 16 ; $c4e1 - ld bc,Coord ; address of second line of dialogue text box - jp NextTextCommand - -; execute asm inline -; 08{code} -TextCommand08:: ; 1bf9 (0:1bf9) - pop hl - ld de,NextTextCommand - push de ; return address - jp [hl] - -; print decimal number (converted from binary number) -; 09AAAABB -; AAAA = address of number -; BB -; bits 0-3 = how many digits to display -; bits 4-7 = how long the number is in bytes -TextCommand09:: ; 1bff (0:1bff) - pop hl - ld a,[hli] - ld e,a - ld a,[hli] - ld d,a - ld a,[hli] - push hl - ld h,b - ld l,c - ld b,a - and a,$0f - ld c,a - ld a,b - and a,$f0 - swap a - set 6,a - ld b,a - call PrintNumber - ld b,h - ld c,l - pop hl - jp NextTextCommand - -; wait half a second if the user doesn't hold A or B -; 0A -; (no arguments) -TextCommand0A:: ; 1c1d (0:1c1d) - push bc - call GetJoypadState - ld a,[H_CURRENTPRESSEDBUTTONS] - and a,%00000011 ; A and B buttons - jr nz,.skipDelay - ld c,30 - call DelayFrames -.skipDelay - pop bc - pop hl - jp NextTextCommand - -; plays sounds -; this actually handles various command ID's, not just 0B -; (no arguments) -TextCommand0B:: ; 1c31 (0:1c31) - pop hl - push bc - dec hl - ld a,[hli] - ld b,a ; b = command number that got us here - push hl - ld hl,TextCommandSounds -.loop - ld a,[hli] - cp b - jr z,.matchFound - inc hl - jr .loop -.matchFound - cp a,$14 - jr z,.pokemonCry - cp a,$15 - jr z,.pokemonCry - cp a,$16 - jr z,.pokemonCry - ld a,[hl] - call PlaySound - call WaitForSoundToFinish - pop hl - pop bc - jp NextTextCommand -.pokemonCry - push de - ld a,[hl] - call PlayCry - pop de - pop hl - pop bc - jp NextTextCommand - -; format: text command ID, sound ID or cry ID -TextCommandSounds:: ; 1c64 (0:1c64) - db $0B,(SFX_02_3a - SFX_Headers_02) / 3 - db $12,(SFX_02_46 - SFX_Headers_02) / 3 - db $0E,(SFX_02_41 - SFX_Headers_02) / 3 - db $0F,(SFX_02_3a - SFX_Headers_02) / 3 - db $10,(SFX_02_3b - SFX_Headers_02) / 3 - db $11,(SFX_02_42 - SFX_Headers_02) / 3 - db $13,(SFX_02_44 - SFX_Headers_02) / 3 - db $14,NIDORINA ; used in OakSpeech - db $15,PIDGEOT ; used in SaffronCityText12 - db $16,DEWGONG ; unused? - -; draw ellipses -; 0CAA -; AA = number of ellipses to draw -TextCommand0C:: ; 1c78 (0:1c78) - pop hl - ld a,[hli] - ld d,a - push hl - ld h,b - ld l,c -.loop - ld a,$75 ; ellipsis - ld [hli],a - push de - call GetJoypadState - pop de - ld a,[H_CURRENTPRESSEDBUTTONS] ; joypad state - and a,%00000011 ; is A or B button pressed? - jr nz,.skipDelay ; if so, skip the delay - ld c,10 - call DelayFrames -.skipDelay - dec d - jr nz,.loop - ld b,h - ld c,l - pop hl - jp NextTextCommand - -; wait for A or B to be pressed -; 0D -; (no arguments) -TextCommand0D:: ; 1c9a (0:1c9a) - push bc - call ManualTextScroll ; wait for A or B to be pressed - pop bc - pop hl - jp NextTextCommand - -; process text commands in another ROM bank -; 17AAAABB -; AAAA = address of text commands -; BB = bank -TextCommand17:: ; 1ca3 (0:1ca3) - pop hl - ld a,[H_LOADEDROMBANK] - push af - ld a,[hli] - ld e,a - ld a,[hli] - ld d,a - ld a,[hli] - ld [H_LOADEDROMBANK],a - ld [$2000],a - push hl - ld l,e - ld h,d - call TextCommandProcessor - pop hl - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - jp NextTextCommand - -TextCommandJumpTable:: ; 1cc1 (0:1cc1) - dw TextCommand00 - dw TextCommand01 - dw TextCommand02 - dw TextCommand03 - dw TextCommand04 - dw TextCommand05 - dw TextCommand06 - dw TextCommand07 - dw TextCommand08 - dw TextCommand09 - dw TextCommand0A - dw TextCommand0B - dw TextCommand0C - dw TextCommand0D - -; this function seems to be used only once -; it store the address of a row and column of the VRAM background map in hl -; INPUT: h - row, l - column, b - high byte of background tile map address in VRAM -GetRowColAddressBgMap:: ; 1cdd (0:1cdd) - xor a - srl h - rr a - srl h - rr a - srl h - rr a - or l - ld l,a - ld a,b - or h - ld h,a - ret - -; clears a VRAM background map with blank space tiles -; INPUT: h - high byte of background tile map address in VRAM -ClearBgMap:: ; 1cf0 (0:1cf0) - ld a," " - jr .next - ld a,l -.next - ld de,$400 ; size of VRAM background map - ld l,e -.loop - ld [hli],a - dec e - jr nz,.loop - dec d - jr nz,.loop - ret - -; When the player takes a step, a row or column of 2x2 tile blocks at the edge -; of the screen toward which they moved is exposed and has to be redrawn. -; This function does the redrawing. -RedrawExposedScreenEdge:: ; 1d01 (0:1d01) - ld a,[H_SCREENEDGEREDRAW] - and a - ret z - ld b,a - xor a - ld [H_SCREENEDGEREDRAW],a - dec b - jr nz,.redrawRow -.redrawColumn - ld hl,wScreenEdgeTiles - ld a,[H_SCREENEDGEREDRAWADDR] - ld e,a - ld a,[H_SCREENEDGEREDRAWADDR + 1] - ld d,a - ld c,18 ; screen height -.loop1 - ld a,[hli] - ld [de],a - inc de - ld a,[hli] - ld [de],a - ld a,31 - add e - ld e,a - jr nc,.noCarry - inc d -.noCarry -; the following 4 lines wrap us from bottom to top if necessary - ld a,d - and a,$03 - or a,$98 - ld d,a - dec c - jr nz,.loop1 - xor a - ld [H_SCREENEDGEREDRAW],a - ret -.redrawRow - ld hl,wScreenEdgeTiles - ld a,[H_SCREENEDGEREDRAWADDR] - ld e,a - ld a,[H_SCREENEDGEREDRAWADDR + 1] - ld d,a - push de - call .drawHalf ; draw upper half - pop de - ld a,32 ; width of VRAM background map - add e - ld e,a - ; draw lower half -.drawHalf - ld c,10 -.loop2 - ld a,[hli] - ld [de],a - inc de - ld a,[hli] - ld [de],a - ld a,e - inc a -; the following 6 lines wrap us from the right edge to the left edge if necessary - and a,$1f - ld b,a - ld a,e - and a,$e0 - or b - ld e,a - dec c - jr nz,.loop2 - ret - -; This function automatically transfers tile number data from the tile map at -; wTileMap to VRAM during V-blank. Note that it only transfers one third of the -; background per V-blank. It cycles through which third it draws. -; This transfer is turned off when walking around the map, but is turned -; on when talking to sprites, battling, using menus, etc. This is because -; the above function, RedrawExposedScreenEdge, is used when walking to -; improve efficiency. -AutoBgMapTransfer:: ; 1d57 (0:1d57) - ld a,[H_AUTOBGTRANSFERENABLED] - and a - ret z - ld hl,[sp + 0] - ld a,h - ld [H_SPTEMP],a - ld a,l - ld [H_SPTEMP + 1],a ; save stack pinter - ld a,[H_AUTOBGTRANSFERPORTION] - and a - jr z,.transferTopThird - dec a - jr z,.transferMiddleThird -.transferBottomThird - FuncCoord 0,12 - ld hl,Coord - ld sp,hl - ld a,[H_AUTOBGTRANSFERDEST + 1] - ld h,a - ld a,[H_AUTOBGTRANSFERDEST] - ld l,a - ld de,(12 * 32) - add hl,de - xor a ; TRANSFERTOP - jr .doTransfer -.transferTopThird - FuncCoord 0,0 - ld hl,Coord - ld sp,hl - ld a,[H_AUTOBGTRANSFERDEST + 1] - ld h,a - ld a,[H_AUTOBGTRANSFERDEST] - ld l,a - ld a,TRANSFERMIDDLE - jr .doTransfer -.transferMiddleThird - FuncCoord 0,6 - ld hl,Coord - ld sp,hl - ld a,[H_AUTOBGTRANSFERDEST + 1] - ld h,a - ld a,[H_AUTOBGTRANSFERDEST] - ld l,a - ld de,(6 * 32) - add hl,de - ld a,TRANSFERBOTTOM -.doTransfer - ld [H_AUTOBGTRANSFERPORTION],a ; store next portion - ld b,6 - -; unrolled loop and using pop for speed -TransferBgRows:: ; 1d9e (0:1d9e) - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - ld a,13 - add l - ld l,a - jr nc,.noCarry - inc h -.noCarry - dec b - jr nz,TransferBgRows - ld a,[H_SPTEMP] - ld h,a - ld a,[H_SPTEMP + 1] - ld l,a - ld sp,hl ; restore stack pointer - ret - -; Copies [H_VBCOPYBGNUMROWS] rows from H_VBCOPYBGSRC to H_VBCOPYBGDEST. -; If H_VBCOPYBGSRC is XX00, the transfer is disabled. -VBlankCopyBgMap:: ; 1de1 (0:1de1) - ld a,[H_VBCOPYBGSRC] ; doubles as enabling byte - and a - ret z - ld hl,[sp + 0] - ld a,h - ld [H_SPTEMP],a - ld a,l - ld [H_SPTEMP + 1],a ; save stack pointer - ld a,[H_VBCOPYBGSRC] - ld l,a - ld a,[H_VBCOPYBGSRC + 1] - ld h,a - ld sp,hl - ld a,[H_VBCOPYBGDEST] - ld l,a - ld a,[H_VBCOPYBGDEST + 1] - ld h,a - ld a,[H_VBCOPYBGNUMROWS] - ld b,a - xor a - ld [H_VBCOPYBGSRC],a ; disable transfer so it doesn't continue next V-blank - jr TransferBgRows - -; This function copies ([H_VBCOPYDOUBLESIZE] * 8) source bytes -; from H_VBCOPYDOUBLESRC to H_VBCOPYDOUBLEDEST. -; It copies each source byte to the destination twice (next to each other). -; The function updates the source and destination addresses, so the transfer -; can be continued easily by repeatingly calling this function. -VBlankCopyDouble:: ; 1e02 (0:1e02) - ld a,[H_VBCOPYDOUBLESIZE] - and a ; are there any bytes to copy? - ret z - ld hl,[sp + 0] - ld a,h - ld [H_SPTEMP],a - ld a,l - ld [H_SPTEMP + 1],a ; save stack pointer - ld a,[H_VBCOPYDOUBLESRC] - ld l,a - ld a,[H_VBCOPYDOUBLESRC + 1] - ld h,a - ld sp,hl - ld a,[H_VBCOPYDOUBLEDEST] - ld l,a - ld a,[H_VBCOPYDOUBLEDEST + 1] - ld h,a - ld a,[H_VBCOPYDOUBLESIZE] - ld b,a - xor a - ld [H_VBCOPYDOUBLESIZE],a ; disable transfer so it doesn't continue next V-blank -.loop - pop de - ld [hl],e - inc l - ld [hl],e - inc l - ld [hl],d - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],e - inc l - ld [hl],d - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],e - inc l - ld [hl],d - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],e - inc l - ld [hl],d - inc l - ld [hl],d - inc hl - dec b - jr nz,.loop - ld a,l - ld [H_VBCOPYDOUBLEDEST],a - ld a,h - ld [H_VBCOPYDOUBLEDEST + 1],a ; update destination address - ld hl,[sp + 0] - ld a,l - ld [H_VBCOPYDOUBLESRC],a - ld a,h - ld [H_VBCOPYDOUBLESRC + 1],a ; update source address - ld a,[H_SPTEMP] - ld h,a - ld a,[H_SPTEMP + 1] - ld l,a - ld sp,hl ; restore stack pointer - ret - -; Copies ([H_VBCOPYSIZE] * 16) bytes from H_VBCOPYSRC to H_VBCOPYDEST. -; The function updates the source and destination addresses, so the transfer -; can be continued easily by repeatingly calling this function. -VBlankCopy:: ; 1e5e (0:1e5e) - ld a,[H_VBCOPYSIZE] - and a ; are there any bytes to copy? - ret z - ld hl,[sp + 0] - ld a,h - ld [H_SPTEMP],a - ld a,l - ld [H_SPTEMP + 1],a ; save stack pointer - ld a,[H_VBCOPYSRC] - ld l,a - ld a,[H_VBCOPYSRC + 1] - ld h,a - ld sp,hl - ld a,[H_VBCOPYDEST] - ld l,a - ld a,[H_VBCOPYDEST + 1] - ld h,a - ld a,[H_VBCOPYSIZE] - ld b,a - xor a - ld [H_VBCOPYSIZE],a ; disable transfer so it doesn't continue next V-blank -.loop - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc l - pop de - ld [hl],e - inc l - ld [hl],d - inc hl - dec b - jr nz,.loop - ld a,l - ld [H_VBCOPYDEST],a - ld a,h - ld [H_VBCOPYDEST + 1],a - ld hl,[sp + 0] - ld a,l - ld [H_VBCOPYSRC],a - ld a,h - ld [H_VBCOPYSRC + 1],a - ld a,[H_SPTEMP] - ld h,a - ld a,[H_SPTEMP + 1] - ld l,a - ld sp,hl ; restore stack pointer - ret - -; This function updates the moving water and flower background tiles. -UpdateMovingBgTiles:: ; 1ebe (0:1ebe) - ld a,[$ffd7] - and a - ret z - ld a,[$ffd8] - inc a - ld [$ffd8],a - cp a,20 - ret c - cp a,21 - jr z,.updateFlowerTile - ld hl,$9140 ; water tile pattern VRAM location - ld c,16 ; number of bytes in a tile pattern - ld a,[$d085] - inc a - and a,$07 - ld [$d085],a - and a,$04 - jr nz,.rotateWaterLeftLoop -.rotateWaterRightloop - ld a,[hl] - rrca - ld [hli],a - dec c - jr nz,.rotateWaterRightloop - jr .done -.rotateWaterLeftLoop - ld a,[hl] - rlca - ld [hli],a - dec c - jr nz,.rotateWaterLeftLoop -.done - ld a,[$ffd7] - rrca - ret nc - xor a - ld [$ffd8],a - ret -.updateFlowerTile - xor a - ld [$ffd8],a - ld a,[$d085] - and a,$03 - cp a,2 - ld hl,FlowerTilePattern1 - jr c,.writeTilePatternToVram - ld hl,FlowerTilePattern2 - jr z,.writeTilePatternToVram - ld hl,FlowerTilePattern3 -.writeTilePatternToVram - ld de,$9030 ; flower tile pattern VRAM location - ld c,16 ; number of bytes in a tile pattern -.flowerTileLoop - ld a,[hli] - ld [de],a - inc de - dec c - jr nz,.flowerTileLoop - ret - -FlowerTilePattern1:: ; 1f19 (0:1f19) - INCBIN "gfx/tilesets/flower/flower1.2bpp" - -FlowerTilePattern2:: ; 1f29 (0:1f29) - INCBIN "gfx/tilesets/flower/flower2.2bpp" - -FlowerTilePattern3:: ; 1f39 (0:1f39) - INCBIN "gfx/tilesets/flower/flower3.2bpp" - -SoftReset:: ; 1f49 (0:1f49) - call StopAllSounds - call GBPalWhiteOut - ld c, $20 - call DelayFrames - ;fall through - -; initialization code -; explanation for %11100011 (value stored in rLCDC) -; * LCD enabled -; * Window tile map at $9C00 -; * Window display enabled -; * BG and window tile data at $8800 -; * BG tile map at $9800 -; * 8x8 OBJ size -; * OBJ display enabled -; * BG display enabled -InitGame:: ; 1f54 (0:1f54) - di -; zero I/O registers - xor a - ld [$ff0f],a - ld [$ffff],a - ld [$ff43],a - ld [$ff42],a - ld [$ff01],a - ld [$ff02],a - ld [$ff4b],a - ld [$ff4a],a - ld [$ff06],a - ld [$ff07],a - ld [$ff47],a - ld [$ff48],a - ld [$ff49],a - ld a,%10000000 ; enable LCD - ld [rLCDC],a - call DisableLCD ; why enable then disable? - ld sp,$dfff ; initialize stack pointer - ld hl,$c000 ; start of WRAM - ld bc,$2000 ; size of WRAM -.zeroWramLoop - ld [hl],0 - inc hl - dec bc - ld a,b - or c - jr nz,.zeroWramLoop - call ZeroVram - ld hl,$ff80 - ld bc,$007f - call FillMemory ; zero HRAM - call CleanLCD_OAM ; this is unnecessary since it was already cleared above - ld a,Bank(WriteDMACodeToHRAM) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call WriteDMACodeToHRAM ; copy DMA code to HRAM - xor a - ld [$ffd7],a - ld [$ff41],a - ld [$ffae],a - ld [$ffaf],a - ld [$ff0f],a - ld a,%00001101 ; enable V-blank, timer, and serial interrupts - ld [rIE],a - ld a,$90 ; put the window off the screen - ld [$ffb0],a - ld [rWY],a - ld a,$07 - ld [rWX],a - ld a,$ff - ld [$ffaa],a - ld h,$98 - call ClearBgMap ; fill $9800-$9BFF (BG tile map) with $7F tiles - ld h,$9c - call ClearBgMap ; fill $9C00-$9FFF (Window tile map) with $7F tiles - ld a,%11100011 - ld [rLCDC],a ; enabled LCD - ld a,$10 - ld [H_SOFTRESETCOUNTER],a - call StopAllSounds - ei - ld a,$40 - call Predef ; SGB border - ld a,$1f - ld [$c0ef],a - ld [$c0f0],a - ld a,$9c - ld [$ffbd],a - xor a - ld [$ffbc],a - dec a - ld [$cfcb],a - ld a,$32 - call Predef ; display the copyrights, GameFreak logo, and battle animation - call DisableLCD - call ZeroVram - call GBPalNormal - call CleanLCD_OAM - ld a,%11100011 - ld [rLCDC],a ; enable LCD - jp SetDefaultNamesBeforeTitlescreen - -; zeroes all VRAM -ZeroVram:: ; 2004 (0:2004) - ld hl,$8000 - ld bc,$2000 - xor a - jp FillMemory - -; immediately stops all sounds -StopAllSounds:: ; 200e (0:200e) - ld a, Bank(Func_9876) - ld [$c0ef], a - ld [$c0f0], a - xor a - ld [wMusicHeaderPointer], a - ld [$c0ee], a - ld [$cfca], a - dec a - jp PlaySound - -VBlank:: ; 2024 (0:2024) - push af - push bc - push de - push hl - ld a,[H_LOADEDROMBANK] ; current ROM bank - ld [$d122],a - ld a,[$ffae] - ld [rSCX],a - ld a,[$ffaf] - ld [rSCY],a - ld a,[$d0a0] - and a - jr nz,.doVramTransfers - ld a,[$ffb0] - ld [rWY],a -.doVramTransfers - call AutoBgMapTransfer - call VBlankCopyBgMap - call RedrawExposedScreenEdge - call VBlankCopy - call VBlankCopyDouble - call UpdateMovingBgTiles - call $ff80 ; OAM DMA - ld a,Bank(PrepareOAMData) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call PrepareOAMData ; update OAM buffer with current sprite data - call GenRandom - ld a,[H_VBLANKOCCURRED] - and a - jr z,.next - xor a - ld [H_VBLANKOCCURRED],a -.next - ld a,[H_FRAMECOUNTER] - and a - jr z,.handleMusic - dec a - ld [H_FRAMECOUNTER],a -.handleMusic - call Func_28cb - ld a,[$c0ef] ; music ROM bank - ld [H_LOADEDROMBANK],a - ld [$2000],a - cp a,$02 - jr nz,.checkIfBank08 -.bank02 - call Func_9103 - jr .afterMusic -.checkIfBank08 - cp a,$08 - jr nz,.bank1F -.bank08 - call Func_2136e - call Func_21879 - jr .afterMusic -.bank1F - call Func_7d177 -.afterMusic - callba Func_18dee ; keep track of time played - ld a,[$fff9] - and a - call z,ReadJoypadRegister - ld a,[$d122] - ld [H_LOADEDROMBANK],a - ld [$2000],a - pop hl - pop de - pop bc - pop af - reti - -DelayFrame:: ; 20af (0:20af) -; delay for one frame - ld a,1 - ld [H_VBLANKOCCURRED],a +NPC_SPRITES_1 EQU $4 +NPC_SPRITES_2 EQU $5 -; wait for the next Vblank, halting to conserve battery -.halt - db $76 ; XXX this is a hack--rgbasm adds a nop after this instr even when ints are enabled - ld a,[H_VBLANKOCCURRED] - and a - jr nz,.halt - ret - -; These routines manage gradual fading -; (e.g., entering a doorway) -LoadGBPal:: ; 20ba (0:20ba) - ld a,[$d35d] ;tells if cur.map is dark (requires HM5_FLASH?) - ld b,a - ld hl,GBPalTable_00 ;16 - ld a,l - sub b - ld l,a - jr nc,.jr0 - dec h -.jr0 - ld a,[hli] - ld [rBGP],a - ld a,[hli] - ld [rOBP0],a - ld a,[hli] - ld [rOBP1],a - ret - -GBFadeOut1:: ; 20d1 (0:20d1) - ld hl,IncGradGBPalTable_01 ;0d - ld b,$04 - jr GBFadeOutCommon - -GBFadeOut2:: ; 20d8 (0:20d8) - ld hl,IncGradGBPalTable_02 ;1c - ld b,$03 - -GBFadeOutCommon:: ; 20dd (0:20dd) - ld a,[hli] - ld [rBGP],a - ld a,[hli] - ld [rOBP0],a - ld a,[hli] - ld [rOBP1],a - ld c,8 - call DelayFrames - dec b - jr nz,GBFadeOutCommon - ret - -GBFadeIn1:: ; 20ef (0:20ef) - ld hl,DecGradGBPalTable_01 ;18 - ld b,$04 - jr GBFadeInCommon - -GBFadeIn2:: ; 20f6 (0:20f6) - ld hl,DecGradGBPalTable_02 ;21 - ld b,$03 - -GBFadeInCommon:: ; 20fb (0:20fb) - ld a,[hld] - ld [rOBP1],a - ld a,[hld] - ld [rOBP0],a - ld a,[hld] - ld [rBGP],a - ld c,8 - call DelayFrames - dec b - jr nz,GBFadeInCommon - ret - -IncGradGBPalTable_01:: ; 210d (0:210d) - db %11111111 ;BG Pal - db %11111111 ;OBJ Pal 1 - db %11111111 ;OBJ Pal 2 - ;and so on... - db %11111110 - db %11111110 - db %11111000 - - db %11111001 - db %11100100 - db %11100100 -GBPalTable_00:: ; 2116 (0:2116) - db %11100100 - db %11010000 -DecGradGBPalTable_01:: ; 2118 (0:2118) - db %11100000 - ;19 - db %11100100 - db %11010000 - db %11100000 -IncGradGBPalTable_02:: ; 211c (0:211c) - db %10010000 - db %10000000 - db %10010000 - - db %01000000 - db %01000000 -DecGradGBPalTable_02:: ; 2121 (0:2121) - db %01000000 - - db %00000000 - db %00000000 - db %00000000 - -Serial:: ; 2125 (0:2125) - push af - push bc - push de - push hl - ld a, [$ffaa] - inc a - jr z, .asm_2142 - ld a, [$ff01] - ld [$ffad], a - ld a, [$ffac] - ld [$ff01], a - ld a, [$ffaa] - cp $2 - jr z, .asm_2162 - ld a, $80 - ld [$ff02], a - jr .asm_2162 -.asm_2142 - ld a, [$ff01] - ld [$ffad], a - ld [$ffaa], a - cp $2 - jr z, .asm_215f - xor a - ld [$ff01], a - ld a, $3 - ld [rDIV], a ; $ff04 -.asm_2153 - ld a, [rDIV] ; $ff04 - bit 7, a - jr nz, .asm_2153 - ld a, $80 - ld [$ff02], a - jr .asm_2162 -.asm_215f - xor a - ld [$ff01], a -.asm_2162 - ld a, $1 - ld [$ffa9], a - ld a, $fe - ld [$ffac], a - pop hl - pop de - pop bc - pop af - reti - -Func_216f:: ; 216f (0:216f) - ld a, $1 - ld [$ffab], a -.asm_2173 - ld a, [hl] - ld [$ffac], a - call Func_219a - push bc - ld b, a - inc hl - ld a, $30 -.asm_217e - dec a - jr nz, .asm_217e - ld a, [$ffab] - and a - ld a, b - pop bc - jr z, .asm_2192 - dec hl - cp $fd - jr nz, .asm_2173 - xor a - ld [$ffab], a - jr .asm_2173 -.asm_2192 - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .asm_2173 - ret - -Func_219a:: ; 219a (0:219a) - xor a - ld [$ffa9], a - ld a, [$ffaa] - cp $2 - jr nz, .asm_21a7 - ld a, $81 - ld [$ff02], a -.asm_21a7 - ld a, [$ffa9] - and a - jr nz, .asm_21f1 - ld a, [$ffaa] - cp $1 - jr nz, .asm_21cc - call Func_2237 - jr z, .asm_21cc - call Func_2231 - push hl - ld hl, $cc48 - inc [hl] - jr nz, .asm_21c3 - dec hl - inc [hl] -.asm_21c3 - pop hl - call Func_2237 - jr nz, .asm_21a7 - jp Func_223f -.asm_21cc - ld a, [rIE] ; $ffff - and $f - cp $8 - jr nz, .asm_21a7 - ld a, [W_NUMHITS] ; $d074 - dec a - ld [W_NUMHITS], a ; $d074 - jr nz, .asm_21a7 - ld a, [$d075] - dec a - ld [$d075], a - jr nz, .asm_21a7 - ld a, [$ffaa] - cp $1 - jr z, .asm_21f1 - ld a, $ff -.asm_21ee - dec a - jr nz, .asm_21ee -.asm_21f1 - xor a - ld [$ffa9], a - ld a, [rIE] ; $ffff - and $f - sub $8 - jr nz, .asm_2204 - ld [W_NUMHITS], a ; $d074 - ld a, $50 - ld [$d075], a -.asm_2204 - ld a, [$ffad] - cp $fe - ret nz - call Func_2237 - jr z, .asm_221f - push hl - ld hl, $cc48 - ld a, [hl] - dec a - ld [hld], a - inc a - jr nz, .asm_2219 - dec [hl] -.asm_2219 - pop hl - call Func_2237 - jr z, Func_223f -.asm_221f - ld a, [rIE] ; $ffff - and $f - cp $8 - ld a, $fe - ret z - ld a, [hl] - ld [$ffac], a - call DelayFrame - jp Func_219a - -Func_2231:: ; 2231 (0:2231) - ld a, $f -.asm_2233 - dec a - jr nz, .asm_2233 - ret - -Func_2237:: ; 2237 (0:2237) - push hl - ld hl, $cc47 - ld a, [hli] - or [hl] - pop hl - ret - -Func_223f:: ; 223f (0:223f) - dec a - ld [$cc47], a - ld [$cc48], a - ret - -Func_2247:: ; 2247 (0:2247) - ld hl, $cc42 - ld de, $cc3d - ld c, $2 - ld a, $1 - ld [$ffab], a -.asm_2253 - call DelayFrame - ld a, [hl] - ld [$ffac], a - call Func_219a - ld b, a - inc hl - ld a, [$ffab] - and a - ld a, $0 - ld [$ffab], a - jr nz, .asm_2253 - ld a, b - ld [de], a - inc de - dec c - jr nz, .asm_2253 - ret +GFX EQU $4 -Func_226e:: ; 226e (0:226e) - call SaveScreenTilesToBuffer1 - callab PrintWaitingText - call Func_227f - jp LoadScreenTilesFromBuffer1 +PICS_1 EQU $9 +PICS_2 EQU $A +PICS_3 EQU $B +PICS_4 EQU $C +PICS_5 EQU $D -Func_227f:: ; 227f (0:227f) - ld a, $ff - ld [$cc3e], a -.asm_2284 - call Func_22c3 - call DelayFrame - call Func_2237 - jr z, .asm_22a0 - push hl - ld hl, $cc48 - dec [hl] - jr nz, .asm_229f - dec hl - dec [hl] - jr nz, .asm_229f - pop hl - xor a - jp Func_223f -.asm_229f - pop hl -.asm_22a0 - ld a, [$cc3e] - inc a - jr z, .asm_2284 - ld b, $a -.asm_22a8 - call DelayFrame - call Func_22c3 - dec b - jr nz, .asm_22a8 - ld b, $a -.asm_22b3 - call DelayFrame - call Func_22ed - dec b - jr nz, .asm_22b3 - ld a, [$cc3e] - ld [$cc3d], a - ret -Func_22c3:: ; 22c3 (0:22c3) - call asm_22d7 - ld a, [$cc42] - add $60 - ld [$ffac], a - ld a, [$ffaa] - cp $2 - jr nz, asm_22d7 - ld a, $81 - ld [$ff02], a -asm_22d7:: ; 22d7 (0:22d7) - ld a, [$ffad] - ld [$cc3d], a - and $f0 - cp $60 - ret nz - xor a - ld [$ffad], a - ld a, [$cc3d] - and $f - ld [$cc3e], a - ret +INCLUDE "home.asm" -Func_22ed:: ; 22ed (0:22ed) - xor a - ld [$ffac], a - ld a, [$ffaa] - cp $2 - ret nz - ld a, $81 - ld [$ff02], a - ret - -Func_22fa:: ; 22fa (0:22fa) - ld a, $2 - ld [$ff01], a - xor a - ld [$ffad], a - ld a, $80 - ld [$ff02], a - ret - -; timer interrupt is apparently not invoked anyway -Timer:: ; 2306 (0:2306) - reti - -Func_2307:: ; 2307 (0:2307) - call WaitForSoundToFinish - xor a - ld c, a - ld d, a - ld [$cfca], a - jr asm_2324 - -Func_2312:: ; 2312 (0:2312) - ld c, $a - ld d, $0 - ld a, [$d72e] - bit 5, a - jr z, asm_2324 - xor a - ld [$cfca], a - ld c, $8 - ld d, c -asm_2324:: ; 2324 (0:2324) - ld a, [$d700] - and a - jr z, .asm_2343 - cp $2 - jr z, .asm_2332 - ld a, MUSIC_BIKE_RIDING - jr .asm_2334 -.asm_2332 - ld a, MUSIC_SURFING -.asm_2334 - ld b, a - ld a, d - and a - ld a, Bank(Func_7d8ea) - jr nz, .asm_233e - ld [$c0ef], a -.asm_233e - ld [$c0f0], a - jr .asm_234c -.asm_2343 - ld a, [$d35b] - ld b, a - call Func_2385 - jr c, .asm_2351 -.asm_234c - ld a, [$cfca] - cp b - ret z -.asm_2351 - ld a, c - ld [wMusicHeaderPointer], a - ld a, b - ld [$cfca], a - ld [$c0ee], a - jp PlaySound - -Func_235f:: ; 235f (0:235f) - ld a, [$c0ef] - ld b, a - cp $2 - jr nz, .checkForBank08 -.bank02 - ld hl, Func_9103 - jr .asm_2378 -.checkForBank08 - cp $8 - jr nz, .bank1F -.bank08 - ld hl, Func_21879 - jr .asm_2378 -.bank1F - ld hl, Func_7d177 -.asm_2378 - ld c, $6 -.asm_237a - push bc - push hl - call Bankswitch - pop hl - pop bc - dec c - jr nz, .asm_237a - ret - -Func_2385:: ; 2385 (0:2385) - ld a, [$d35c] - ld e, a - ld a, [$c0ef] - cp e - jr nz, .asm_2394 - ld [$c0f0], a - and a - ret -.asm_2394 - ld a, c - and a - ld a, e - jr nz, .asm_239c - ld [$c0ef], a -.asm_239c - ld [$c0f0], a - scf - ret - -PlayMusic:: ; 23a1 (0:23a1) - ld b, a - ld [$c0ee], a - xor a - ld [wMusicHeaderPointer], a - ld a, c - ld [$c0ef], a - ld [$c0f0], a - ld a, b - -; plays music specified by a. If value is $ff, music is stopped -PlaySound:: ; 23b1 (0:23b1) - push hl - push de - push bc - ld b, a - ld a, [$c0ee] - and a - jr z, .asm_23c8 - xor a - ld [$c02a], a - ld [$c02b], a - ld [$c02c], a - ld [$c02d], a -.asm_23c8 - ld a, [wMusicHeaderPointer] - and a - jr z, .asm_23e3 - ld a, [$c0ee] - and a - jr z, .asm_2425 - xor a - ld [$c0ee], a - ld a, [$cfca] - cp $ff - jr nz, .asm_2414 - xor a - ld [wMusicHeaderPointer], a -.asm_23e3 - xor a - ld [$c0ee], a - ld a, [H_LOADEDROMBANK] - ld [$ffb9], a - ld a, [$c0ef] - ld [H_LOADEDROMBANK], a - ld [$2000], a - cp $2 - jr nz, .checkForBank08 -.bank02 - ld a, b - call Func_9876 - jr .asm_240b -.checkForBank08 - cp $8 - jr nz, .bank1F -.bank08 - ld a, b - call Func_22035 - jr .asm_240b -.bank1F - ld a, b - call Func_7d8ea -.asm_240b - ld a, [$ffb9] - ld [H_LOADEDROMBANK], a - ld [$2000], a - jr .asm_2425 -.asm_2414 - ld a, b - ld [$cfca], a - ld a, [wMusicHeaderPointer] - ld [$cfc8], a - ld [$cfc9], a - ld a, b - ld [wMusicHeaderPointer], a -.asm_2425 - pop bc - pop de - pop hl - ret - -UpdateSprites:: ; 2429 (0:2429) - ld a, [$cfcb] - dec a - ret nz - ld a, [H_LOADEDROMBANK] - push af - ld a, Bank(_UpdateSprites) - ld [H_LOADEDROMBANK], a - ld [$2000], a - call _UpdateSprites - pop af - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret - -INCLUDE "data/mart_inventories.asm" - -TextScriptEndingChar:: ; 24d6 (0:24d6) - db "@" -TextScriptEnd:: ; 24d7 (0:24d7) - ld hl,TextScriptEndingChar - ret - -ExclamationText:: ; 24db (0:24db) - TX_FAR _ExclamationText - db "@" - -GroundRoseText:: ; 24e0 (0:24e0) - TX_FAR _GroundRoseText - db "@" - -BoulderText:: ; 24e5 (0:24e5) - TX_FAR _BoulderText - db "@" - -MartSignText:: ; 24ea (0:24ea) - TX_FAR _MartSignText - db "@" - -PokeCenterSignText:: ; 24ef (0:24ef) - TX_FAR _PokeCenterSignText - db "@" - -Predef5CText:: ; 24f4 (0:24f4) -; XXX better label (what does predef $5C do?) - db $08 ; asm - ld a, $5c - call Predef - jp TextScriptEnd - -; bankswitches and runs _UncompressSpriteData -; bank is given in a, sprite input stream is pointed to in W_SPRITEINPUTPTR -UncompressSpriteData:: ; 24fd (0:24fd) - ld b, a - ld a, [H_LOADEDROMBANK] - push af - ld a, b - ld [H_LOADEDROMBANK], a - ld [$2000], a - ld a, $a - ld [$0], a - xor a - ld [$4000], a - call _UncompressSpriteData - pop af - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret - -; initializes necessary data to load a sprite and runs UncompressSpriteDataLoop -_UncompressSpriteData:: ; 251a (0:251a) - ld hl, S_SPRITEBUFFER1 - ld c, (2*SPRITEBUFFERSIZE) % $100 - ld b, (2*SPRITEBUFFERSIZE) / $100 - xor a - call FillMemory ; clear sprite buffer 1 and 2 - ld a, $1 - ld [W_SPRITEINPUTBITCOUNTER], a - ld a, $3 - ld [W_SPRITEOUTPUTBITOFFSET], a - xor a - ld [W_SPRITECURPOSX], a - ld [W_SPRITECURPOSY], a - ld [W_SPRITELOADFLAGS], a ; $d0a8 - call ReadNextInputByte ; first byte of input determines sprite width (high nybble) and height (low nybble) in tiles (8x8 pixels) - ld b, a - and $f - add a - add a - add a - ld [W_SPRITEHEIGHT], a - ld a, b - swap a - and $f - add a - add a - add a - ld [W_SPRITEWITDH], a - call ReadNextInputBit - ld [W_SPRITELOADFLAGS], a ; initialite bit1 to 0 and bit0 to the first input bit - ; this will load two chunks of data to S_SPRITEBUFFER1 and S_SPRITEBUFFER2 - ; bit 0 decides in which one the first chunk is placed - ; fall through - -; uncompresses a chunk from the sprite input data stream (pointed to at $d0da) into S_SPRITEBUFFER1 or S_SPRITEBUFFER2 -; each chunk is a 1bpp sprite. A 2bpp sprite consist of two chunks which are merged afterwards -; note that this is an endless loop which is terminated during a call to MoveToNextBufferPosition by manipulating the stack -UncompressSpriteDataLoop:: ; 2556 (0:2556) - ld hl, S_SPRITEBUFFER1 - ld a, [W_SPRITELOADFLAGS] ; $d0a8 - bit 0, a - jr z, .useSpriteBuffer1 ; check which buffer to use - ld hl, S_SPRITEBUFFER2 -.useSpriteBuffer1 - call StoreSpriteOutputPointer - ld a, [W_SPRITELOADFLAGS] ; $d0a8 - bit 1, a - jr z, .startDecompression ; check if last iteration - call ReadNextInputBit ; if last chunk, read 1-2 bit unpacking mode - and a - jr z, .unpackingMode0 ; 0 -> mode 0 - call ReadNextInputBit ; 1 0 -> mode 1 - inc a ; 1 1 -> mode 2 -.unpackingMode0 - ld [W_SPRITEUNPACKMODE], a -.startDecompression - call ReadNextInputBit - and a - jr z, .readRLEncodedZeros ; if first bit is 0, the input starts with zeroes, otherwise with (non-zero) input -.readNextInput - call ReadNextInputBit - ld c, a - call ReadNextInputBit - sla c - or c ; read next two bits into c - and a - jr z, .readRLEncodedZeros ; 00 -> RLEncoded zeroes following - call WriteSpriteBitsToBuffer ; otherwise write input to output and repeat - call MoveToNextBufferPosition - jr .readNextInput -.readRLEncodedZeros - ld c, $0 ; number of zeroes it length encoded, the number -.countConsecutiveOnesLoop ; of consecutive ones determines the number of bits the number has - call ReadNextInputBit - and a - jr z, .countConsecutiveOnesFinished - inc c - jr .countConsecutiveOnesLoop -.countConsecutiveOnesFinished - ld a, c - add a - ld hl, LengthEncodingOffsetList - add l - ld l, a - jr nc, .noCarry - inc h -.noCarry - ld a, [hli] ; read offset that is added to the number later on - ld e, a ; adding an offset of 2^length - 1 makes every integer uniquely - ld d, [hl] ; representable in the length encoding and saves bits - push de - inc c - ld e, $0 - ld d, e -.readNumberOfZerosLoop ; reads the next c+1 bits of input - call ReadNextInputBit - or e - ld e, a - dec c - jr z, .readNumberOfZerosDone - sla e - rl d - jr .readNumberOfZerosLoop -.readNumberOfZerosDone - pop hl ; add the offset - add hl, de - ld e, l - ld d, h -.writeZerosLoop - ld b, e - xor a ; write 00 to buffer - call WriteSpriteBitsToBuffer - ld e, b - call MoveToNextBufferPosition - dec de - ld a, d - and a - jr nz, .continueLoop - ld a, e - and a -.continueLoop - jr nz, .writeZerosLoop - jr .readNextInput - -; moves output pointer to next position -; also cancels the calling function if the all output is done (by removing the return pointer from stack) -; and calls postprocessing functions according to the unpack mode -MoveToNextBufferPosition:: ; 25d8 (0:25d8) - ld a, [W_SPRITEHEIGHT] - ld b, a - ld a, [W_SPRITECURPOSY] - inc a - cp b - jr z, .curColumnDone - ld [W_SPRITECURPOSY], a - ld a, [W_SPRITEOUTPUTPTR] - inc a - ld [W_SPRITEOUTPUTPTR], a - ret nz - ld a, [W_SPRITEOUTPUTPTR+1] - inc a - ld [W_SPRITEOUTPUTPTR+1], a - ret -.curColumnDone - xor a - ld [W_SPRITECURPOSY], a - ld a, [W_SPRITEOUTPUTBITOFFSET] - and a - jr z, .bitOffsetsDone - dec a - ld [W_SPRITEOUTPUTBITOFFSET], a - ld hl, W_SPRITEOUTPUTPTRCACHED - ld a, [hli] - ld [W_SPRITEOUTPUTPTR], a - ld a, [hl] - ld [W_SPRITEOUTPUTPTR+1], a - ret -.bitOffsetsDone - ld a, $3 - ld [W_SPRITEOUTPUTBITOFFSET], a - ld a, [W_SPRITECURPOSX] - add $8 - ld [W_SPRITECURPOSX], a - ld b, a - ld a, [W_SPRITEWITDH] - cp b - jr z, .allColumnsDone - ld a, [W_SPRITEOUTPUTPTR] - ld l, a - ld a, [W_SPRITEOUTPUTPTR+1] - ld h, a - inc hl - jp StoreSpriteOutputPointer -.allColumnsDone - pop hl - xor a - ld [W_SPRITECURPOSX], a - ld a, [W_SPRITELOADFLAGS] ; $d0a8 - bit 1, a - jr nz, .done ; test if there is one more sprite to go - xor $1 - set 1, a - ld [W_SPRITELOADFLAGS], a ; $d0a8 - jp UncompressSpriteDataLoop -.done - jp UnpackSprite - -; writes 2 bits (from a) to the output buffer (pointed to from W_SPRITEOUTPUTPTR) -WriteSpriteBitsToBuffer:: ; 2649 (0:2649) - ld e, a - ld a, [W_SPRITEOUTPUTBITOFFSET] - and a - jr z, .offset0 - cp $2 - jr c, .offset1 - jr z, .offset2 - rrc e ; offset 3 - rrc e - jr .offset0 -.offset1 - sla e - sla e - jr .offset0 -.offset2 - swap e -.offset0 - ld a, [W_SPRITEOUTPUTPTR] - ld l, a - ld a, [W_SPRITEOUTPUTPTR+1] - ld h, a - ld a, [hl] - or e - ld [hl], a - ret - -; reads next bit from input stream and returns it in a -ReadNextInputBit:: ; 2670 (0:2670) - ld a, [W_SPRITEINPUTBITCOUNTER] - dec a - jr nz, .curByteHasMoreBitsToRead - call ReadNextInputByte - ld [W_SPRITEINPUTCURBYTE], a - ld a, $8 -.curByteHasMoreBitsToRead - ld [W_SPRITEINPUTBITCOUNTER], a - ld a, [W_SPRITEINPUTCURBYTE] - rlca - ld [W_SPRITEINPUTCURBYTE], a - and $1 - ret - -; reads next byte from input stream and returns it in a -ReadNextInputByte:: ; 268b (0:268b) - ld a, [W_SPRITEINPUTPTR] - ld l, a - ld a, [W_SPRITEINPUTPTR+1] - ld h, a - ld a, [hli] - ld b, a - ld a, l - ld [W_SPRITEINPUTPTR], a - ld a, h - ld [W_SPRITEINPUTPTR+1], a - ld a, b - ret - -; the nth item is 2^n - 1 -LengthEncodingOffsetList:: ; 269f (0:269f) - dw %0000000000000001 - dw %0000000000000011 - dw %0000000000000111 - dw %0000000000001111 - dw %0000000000011111 - dw %0000000000111111 - dw %0000000001111111 - dw %0000000011111111 - dw %0000000111111111 - dw %0000001111111111 - dw %0000011111111111 - dw %0000111111111111 - dw %0001111111111111 - dw %0011111111111111 - dw %0111111111111111 - dw %1111111111111111 - -; unpacks the sprite data depending on the unpack mode -UnpackSprite:: ; 26bf (0:26bf) - ld a, [W_SPRITEUNPACKMODE] - cp $2 - jp z, UnpackSpriteMode2 - and a - jp nz, XorSpriteChunks - ld hl, S_SPRITEBUFFER1 - call SpriteDifferentialDecode - ld hl, S_SPRITEBUFFER2 - ; fall through - -; decodes differential encoded sprite data -; input bit value 0 preserves the current bit value and input bit value 1 toggles it (starting from initial value 0). -SpriteDifferentialDecode:: ; 26d4 (0:26d4) - xor a - ld [W_SPRITECURPOSX], a - ld [W_SPRITECURPOSY], a - call StoreSpriteOutputPointer - ld a, [W_SPRITEFLIPPED] - and a - jr z, .notFlipped - ld hl, DecodeNybble0TableFlipped - ld de, DecodeNybble1TableFlipped - jr .storeDecodeTablesPointers -.notFlipped - ld hl, DecodeNybble0Table - ld de, DecodeNybble1Table -.storeDecodeTablesPointers - ld a, l - ld [W_SPRITEDECODETABLE0PTR], a - ld a, h - ld [W_SPRITEDECODETABLE0PTR+1], a - ld a, e - ld [W_SPRITEDECODETABLE1PTR], a - ld a, d - ld [W_SPRITEDECODETABLE1PTR+1], a - ld e, $0 ; last decoded nybble, initialized to 0 -.decodeNextByteLoop - ld a, [W_SPRITEOUTPUTPTR] - ld l, a - ld a, [W_SPRITEOUTPUTPTR+1] - ld h, a - ld a, [hl] - ld b, a - swap a - and $f - call DifferentialDecodeNybble ; decode high nybble - swap a - ld d, a - ld a, b - and $f - call DifferentialDecodeNybble ; decode low nybble - or d - ld b, a - ld a, [W_SPRITEOUTPUTPTR] - ld l, a - ld a, [W_SPRITEOUTPUTPTR+1] - ld h, a - ld a, b - ld [hl], a ; write back decoded data - ld a, [W_SPRITEHEIGHT] - add l ; move on to next column - jr nc, .noCarry - inc h -.noCarry - ld [W_SPRITEOUTPUTPTR], a - ld a, h - ld [W_SPRITEOUTPUTPTR+1], a - ld a, [W_SPRITECURPOSX] - add $8 - ld [W_SPRITECURPOSX], a - ld b, a - ld a, [W_SPRITEWITDH] - cp b - jr nz, .decodeNextByteLoop ; test if current row is done - xor a - ld e, a - ld [W_SPRITECURPOSX], a - ld a, [W_SPRITECURPOSY] ; move on to next row - inc a - ld [W_SPRITECURPOSY], a - ld b, a - ld a, [W_SPRITEHEIGHT] - cp b - jr z, .done ; test if all rows finished - ld a, [W_SPRITEOUTPUTPTRCACHED] - ld l, a - ld a, [W_SPRITEOUTPUTPTRCACHED+1] - ld h, a - inc hl - call StoreSpriteOutputPointer - jr .decodeNextByteLoop -.done - xor a - ld [W_SPRITECURPOSY], a - ret - -; decodes the nybble stored in a. Last decoded data is assumed to be in e (needed to determine if initial value is 0 or 1) -DifferentialDecodeNybble:: ; 276d (0:276d) - srl a ; c=a%2, a/=2 - ld c, $0 - jr nc, .evenNumber - ld c, $1 -.evenNumber - ld l, a - ld a, [W_SPRITEFLIPPED] - and a - jr z, .notFlipped ; determine if initial value is 0 or one - bit 3, e ; if flipped, consider MSB of last data - jr .selectLookupTable -.notFlipped - bit 0, e ; else consider LSB -.selectLookupTable - ld e, l - jr nz, .initialValue1 ; load the appropriate table - ld a, [W_SPRITEDECODETABLE0PTR] - ld l, a - ld a, [W_SPRITEDECODETABLE0PTR+1] - jr .tableLookup -.initialValue1 - ld a, [W_SPRITEDECODETABLE1PTR] - ld l, a - ld a, [W_SPRITEDECODETABLE1PTR+1] -.tableLookup - ld h, a - ld a, e - add l - ld l, a - jr nc, .noCarry - inc h -.noCarry - ld a, [hl] - bit 0, c - jr nz, .selectLowNybble - swap a ; select high nybble -.selectLowNybble - and $f - ld e, a ; update last decoded data - ret - -DecodeNybble0Table:: ; 27a7 (0:27a7) - dn $0, $1 - dn $3, $2 - dn $7, $6 - dn $4, $5 - dn $f, $e - dn $c, $d - dn $8, $9 - dn $b, $a -DecodeNybble1Table:: ; 27af (0:27af) - dn $f, $e - dn $c, $d - dn $8, $9 - dn $b, $a - dn $0, $1 - dn $3, $2 - dn $7, $6 - dn $4, $5 -DecodeNybble0TableFlipped:: ; 27b7 (0:27b7) - dn $0, $8 - dn $c, $4 - dn $e, $6 - dn $2, $a - dn $f, $7 - dn $3, $b - dn $1, $9 - dn $d, $5 -DecodeNybble1TableFlipped:: ; 27bf (0:27bf) - dn $f, $7 - dn $3, $b - dn $1, $9 - dn $d, $5 - dn $0, $8 - dn $c, $4 - dn $e, $6 - dn $2, $a - -; combines the two loaded chunks with xor (the chunk loaded second is the destination). The source chunk is differeintial decoded beforehand. -XorSpriteChunks:: ; 27c7 (0:27c7) - xor a - ld [W_SPRITECURPOSX], a - ld [W_SPRITECURPOSY], a - call ResetSpriteBufferPointers - ld a, [W_SPRITEOUTPUTPTR] ; points to buffer 1 or 2, depending on flags - ld l, a - ld a, [W_SPRITEOUTPUTPTR+1] - ld h, a - call SpriteDifferentialDecode ; decode buffer 1 or 2, depending on flags - call ResetSpriteBufferPointers - ld a, [W_SPRITEOUTPUTPTR] ; source buffer, points to buffer 1 or 2, depending on flags - ld l, a - ld a, [W_SPRITEOUTPUTPTR+1] - ld h, a - ld a, [W_SPRITEOUTPUTPTRCACHED] ; destination buffer, points to buffer 2 or 1, depending on flags - ld e, a - ld a, [W_SPRITEOUTPUTPTRCACHED+1] - ld d, a -.xorChunksLoop - ld a, [W_SPRITEFLIPPED] - and a - jr z, .notFlipped - push de - ld a, [de] - ld b, a - swap a - and $f - call ReverseNybble ; if flipped reverse the nybbles in the destination buffer - swap a - ld c, a - ld a, b - and $f - call ReverseNybble - or c - pop de - ld [de], a -.notFlipped - ld a, [hli] - ld b, a - ld a, [de] - xor b - ld [de], a - inc de - ld a, [W_SPRITECURPOSY] - inc a - ld [W_SPRITECURPOSY], a ; go to next row - ld b, a - ld a, [W_SPRITEHEIGHT] - cp b - jr nz, .xorChunksLoop ; test if column finished - xor a - ld [W_SPRITECURPOSY], a - ld a, [W_SPRITECURPOSX] - add $8 - ld [W_SPRITECURPOSX], a ; go to next column - ld b, a - ld a, [W_SPRITEWITDH] - cp b - jr nz, .xorChunksLoop ; test if all columns finished - xor a - ld [W_SPRITECURPOSX], a - ret - -; reverses the bits in the nybble given in register a -ReverseNybble:: ; 2837 (0:2837) - ld de, NybbleReverseTable - add e - ld e, a - jr nc, .asm_283f - inc d -.asm_283f - ld a, [de] - ret - -; resets sprite buffer pointers to buffer 1 and 2, depending on W_SPRITELOADFLAGS -ResetSpriteBufferPointers:: ; 2841 (0:2841) - ld a, [W_SPRITELOADFLAGS] ; $d0a8 - bit 0, a - jr nz, .buffer2Selected - ld de, S_SPRITEBUFFER1 - ld hl, S_SPRITEBUFFER2 - jr .storeBufferPointers -.buffer2Selected - ld de, S_SPRITEBUFFER2 - ld hl, S_SPRITEBUFFER1 -.storeBufferPointers - ld a, l - ld [W_SPRITEOUTPUTPTR], a - ld a, h - ld [W_SPRITEOUTPUTPTR+1], a - ld a, e - ld [W_SPRITEOUTPUTPTRCACHED], a - ld a, d - ld [W_SPRITEOUTPUTPTRCACHED+1], a - ret - -; maps each nybble to its reverse -NybbleReverseTable:: ; 2867 (0:2867) - db $0, $8, $4, $c, $2, $a, $6 ,$e, $1, $9, $5, $d, $3, $b, $7 ,$f - -; combines the two loaded chunks with xor (the chunk loaded second is the destination). Both chunks are differeintial decoded beforehand. -UnpackSpriteMode2:: ; 2877 (0:2877) - call ResetSpriteBufferPointers - ld a, [W_SPRITEFLIPPED] - push af - xor a - ld [W_SPRITEFLIPPED], a ; temporarily clear flipped flag for decoding the destination chunk - ld a, [W_SPRITEOUTPUTPTRCACHED] - ld l, a - ld a, [W_SPRITEOUTPUTPTRCACHED+1] - ld h, a - call SpriteDifferentialDecode - call ResetSpriteBufferPointers - pop af - ld [W_SPRITEFLIPPED], a - jp XorSpriteChunks - -; stores hl into the output pointers -StoreSpriteOutputPointer:: ; 2897 (0:2897) - ld a, l - ld [W_SPRITEOUTPUTPTR], a - ld [W_SPRITEOUTPUTPTRCACHED], a - ld a, h - ld [W_SPRITEOUTPUTPTR+1], a - ld [W_SPRITEOUTPUTPTRCACHED+1], a - ret - -ResetPlayerSpriteData:: ; 28a6 (0:28a6) - ld hl, wSpriteStateData1 - call ResetPlayerSpriteData_ClearSpriteData - ld hl, wSpriteStateData2 - call ResetPlayerSpriteData_ClearSpriteData - ld a, $1 - ld [wSpriteStateData1], a - ld [$c20e], a - ld hl, $c104 - ld [hl], $3c ; set Y screen pos - inc hl - inc hl - ld [hl], $40 ; set X screen pos - ret - -; overwrites sprite data with zeroes -ResetPlayerSpriteData_ClearSpriteData:: ; 28c4 (0:28c4) - ld bc, $10 - xor a - jp FillMemory - -Func_28cb:: ; 28cb (0:28cb) - ld a, [wMusicHeaderPointer] - and a - jr nz, .asm_28dc - ld a, [$d72c] - bit 1, a - ret nz - ld a, $77 - ld [$ff24], a - ret -.asm_28dc - ld a, [$cfc9] - and a - jr z, .asm_28e7 - dec a - ld [$cfc9], a - ret -.asm_28e7 - ld a, [$cfc8] - ld [$cfc9], a - ld a, [$ff24] - and a - jr z, .asm_2903 - ld b, a - and $f - dec a - ld c, a - ld a, b - and $f0 - swap a - dec a - swap a - or c - ld [$ff24], a - ret -.asm_2903 - ld a, [wMusicHeaderPointer] - ld b, a - xor a - ld [wMusicHeaderPointer], a - ld a, $ff - ld [$c0ee], a - call PlaySound - ld a, [$c0f0] - ld [$c0ef], a - ld a, b - ld [$c0ee], a - jp PlaySound - -; this function is used to display sign messages, sprite dialog, etc. -; INPUT: [$ff8c] = sprite ID or text ID -DisplayTextID:: ; 2920 (0:2920) - ld a,[H_LOADEDROMBANK] - push af - callba DisplayTextIDInit ; initialization - ld hl,$cf11 - bit 0,[hl] - res 0,[hl] - jr nz,.skipSwitchToMapBank - ld a,[W_CURMAP] - call SwitchToMapRomBank -.skipSwitchToMapBank - ld a,30 ; half a second - ld [H_FRAMECOUNTER],a ; used as joypad poll timer - ld hl,W_MAPTEXTPTR - ld a,[hli] - ld h,[hl] - ld l,a ; hl = map text pointer - ld d,$00 - ld a,[$ff8c] ; text ID - ld [$cf13],a - and a - jp z,DisplayStartMenu - cp a,$d3 ; safari game over - jp z,DisplaySafariGameOverText - cp a,$d0 ; fainted - jp z,DisplayPokemonFaintedText - cp a,$d1 ; blacked out - jp z,DisplayPlayerBlackedOutText - cp a,$d2 ; repel wore off - jp z,DisplayRepelWoreOffText - ld a,[$d4e1] ; number of sprites - ld e,a - ld a,[$ff8c] ; sprite ID - cp e - jr z,.spriteHandling - jr nc,.skipSpriteHandling -.spriteHandling -; get the text ID of the sprite - push hl - push de - push bc - callba Func_13074 ; update the graphics of the sprite the player is talking to (to face the right direction) - pop bc - pop de - ld hl,W_MAPSPRITEDATA ; NPC text entries - ld a,[$ff8c] - dec a - add a - add l - ld l,a - jr nc,.noCarry - inc h -.noCarry - inc hl - ld a,[hl] ; a = text ID of the sprite - pop hl -.skipSpriteHandling -; look up the address of the text in the map's text entries - dec a - ld e,a - sla e - add hl,de - ld a,[hli] - ld h,[hl] - ld l,a ; hl = address of the text - ld a,[hl] ; a = first byte of text -; check first byte of text for special cases - cp a,$fe ; Pokemart NPC - jp z,DisplayPokemartDialogue - cp a,$ff ; Pokemon Center NPC - jp z,DisplayPokemonCenterDialogue - cp a,$fc ; Item Storage PC - jp z,FuncTX_ItemStoragePC - cp a,$fd ; Bill's PC - jp z,FuncTX_BillsPC - cp a,$f9 ; Pokemon Center PC - jp z,FuncTX_PokemonCenterPC - cp a,$f5 ; Vending Machine - jr nz,.notVendingMachine - callba VendingMachineMenu ; jump banks to vending machine routine - jr AfterDisplayingTextID -.notVendingMachine - cp a,$f7 ; slot machine - jp z,FuncTX_SlotMachine - cp a,$f6 ; cable connection NPC in Pokemon Center - jr nz,.notSpecialCase - callab CableClubNPC - jr AfterDisplayingTextID -.notSpecialCase - call Func_3c59 ; display the text - ld a,[$cc3c] - and a - jr nz,HoldTextDisplayOpen - -AfterDisplayingTextID:: ; 29d6 (0:29d6) - ld a,[$cc47] - and a - jr nz,HoldTextDisplayOpen - call WaitForTextScrollButtonPress ; wait for a button press after displaying all the text - -; loop to hold the dialogue box open as long as the player keeps holding down the A button -HoldTextDisplayOpen:: ; 29df (0:29df) - call GetJoypadState - ld a,[H_CURRENTPRESSEDBUTTONS] - bit 0,a ; is the A button being pressed? - jr nz,HoldTextDisplayOpen - -CloseTextDisplay:: ; 29e8 (0:29e8) - ld a,[W_CURMAP] - call SwitchToMapRomBank - ld a,$90 - ld [$ffb0],a ; move the window off the screen - call DelayFrame - call LoadGBPal - xor a - ld [H_AUTOBGTRANSFERENABLED],a ; disable continuous WRAM to VRAM transfer each V-blank -; loop to make sprites face the directions they originally faced before the dialogue - ld hl,$c219 - ld c,$0f - ld de,$0010 -.restoreSpriteFacingDirectionLoop - ld a,[hl] - dec h - ld [hl],a - inc h - add hl,de - dec c - jr nz,.restoreSpriteFacingDirectionLoop - ld a,BANK(InitMapSprites) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call InitMapSprites ; reload sprite tile pattern data (since it was partially overwritten by text tile patterns) - ld hl,$cfc4 - res 0,[hl] - ld a,[$d732] - bit 3,a - call z,LoadPlayerSpriteGraphics - call LoadCurrentMapView - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - jp UpdateSprites ; move sprites - -DisplayPokemartDialogue:: ; 2a2e (0:2a2e) - push hl - ld hl,PokemartGreetingText - call PrintText - pop hl - inc hl - call LoadItemList - ld a,$02 - ld [$cf94],a ; selects between subtypes of menus - ld a,[H_LOADEDROMBANK] - push af - ld a,Bank(DisplayPokemartDialogue_) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call DisplayPokemartDialogue_ - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - jp AfterDisplayingTextID - -PokemartGreetingText:: ; 2a55 (0:2a55) - TX_FAR _PokemartGreetingText - db "@" - -LoadItemList:: ; 2a5a (0:2a5a) - ld a,$01 - ld [$cfcb],a - ld a,h - ld [$d128],a - ld a,l - ld [$d129],a - ld de,$cf7b -.loop - ld a,[hli] - ld [de],a - inc de - cp a,$ff - jr nz,.loop - ret - -DisplayPokemonCenterDialogue:: ; 2a72 (0:2a72) - xor a - ld [$ff8b],a - ld [$ff8c],a - ld [$ff8d],a - inc hl - ld a,[H_LOADEDROMBANK] - push af - ld a,Bank(DisplayPokemonCenterDialogue_) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call DisplayPokemonCenterDialogue_ - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - jp AfterDisplayingTextID - -DisplaySafariGameOverText:: ; 2a90 (0:2a90) - callab PrintSafariGameOverText - jp AfterDisplayingTextID - -DisplayPokemonFaintedText:: ; 2a9b (0:2a9b) - ld hl,PokemonFaintedText - call PrintText - jp AfterDisplayingTextID - -PokemonFaintedText:: ; 2aa4 (0:2aa4) - TX_FAR _PokemonFaintedText - db "@" - -DisplayPlayerBlackedOutText:: ; 2aa9 (0:2aa9) - ld hl,PlayerBlackedOutText - call PrintText - ld a,[$d732] - res 5,a - ld [$d732],a - jp HoldTextDisplayOpen - -PlayerBlackedOutText:: ; 2aba (0:2aba) - TX_FAR _PlayerBlackedOutText - db "@" - -DisplayRepelWoreOffText:: ; 2abf (0:2abf) - ld hl,RepelWoreOffText - call PrintText - jp AfterDisplayingTextID - -RepelWoreOffText:: ; 2ac8 (0:2ac8) - TX_FAR _RepelWoreOffText - db "@" - -INCLUDE "engine/menu/start_menu.asm" - -; function to count how many bits are set in a string of bytes -; INPUT: -; hl = address of string of bytes -; b = length of string of bytes -; OUTPUT: -; [$D11E] = number of set bits -CountSetBits:: ; 2b7f (0:2b7f) - ld c,0 -.loop - ld a,[hli] - ld e,a - ld d,8 -.innerLoop ; count how many bits are set in the current byte - srl e - ld a,0 - adc c - ld c,a - dec d - jr nz,.innerLoop - dec b - jr nz,.loop - ld a,c - ld [$d11e],a ; store number of set bits - ret - -; subtracts the amount the player paid from their money -; sets carry flag if there is enough money and unsets carry flag if not -SubtractAmountPaidFromMoney:: ; 2b96 (0:2b96) - ld b,BANK(SubtractAmountPaidFromMoney_) - ld hl,SubtractAmountPaidFromMoney_ - jp Bankswitch - -; adds the amount the player sold to their money -AddAmountSoldToMoney:: ; 2b9e (0:2b9e) - ld de,wPlayerMoney + 2 - ld hl,$ffa1 ; total price of items - ld c,3 ; length of money in bytes - ld a,$0b - call Predef ; add total price to money - ld a,$13 - ld [$d125],a - call DisplayTextBoxID ; redraw money text box - ld a, (SFX_02_5a - SFX_Headers_02) / 3 - call PlaySoundWaitForCurrent ; play sound - jp WaitForSoundToFinish ; wait until sound is done playing - -; 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) -; [$CF92] = index (within the inventory) of the item to remove -; [$CF96] = quantity to remove -RemoveItemFromInventory:: ; 2bbb (0:2bbb) - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(RemoveItemFromInventory_) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call RemoveItemFromInventory_ - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; 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) -; [$CF91] = item ID -; [$CF96] = item quantity -; sets carry flag if successful, unsets carry flag if unsuccessful -AddItemToInventory:: ; 2bcf (0:2bcf) - push bc - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(AddItemToInventory_) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call AddItemToInventory_ - pop bc - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - pop bc - ret - -; INPUT: -; [wListMenuID] = list menu ID -; [$cf8b] = address of the list (2 bytes) -DisplayListMenuID:: ; 2be6 (0:2be6) - xor a - ld [H_AUTOBGTRANSFERENABLED],a ; disable auto-transfer - ld a,1 - ld [$ffb7],a ; joypad state update flag - ld a,[W_BATTLETYPE] - and a ; is it the Old Man battle? - jr nz,.specialBattleType - ld a,$01 ; hardcoded bank - jr .bankswitch -.specialBattleType ; Old Man battle - ld a, Bank(OldManItemList) -.bankswitch - call BankswitchHome - ld hl,$d730 - set 6,[hl] ; turn off letter printing delay - xor a - ld [$cc35],a ; 0 means no item is currently being swapped - ld [$d12a],a - ld a,[$cf8b] - ld l,a - ld a,[$cf8c] - ld h,a ; hl = address of the list - ld a,[hl] - ld [$d12a],a ; [$d12a] = number of list entries - ld a,$0d ; list menu text box ID - ld [$d125],a - call DisplayTextBoxID ; draw the menu text box - call UpdateSprites ; move sprites - FuncCoord 4,2 ; coordinates of upper left corner of menu text box - ld hl,Coord - ld de,$090e ; height and width of menu text box - ld a,[wListMenuID] - and a ; is it a PC pokemon list? - jr nz,.skipMovingSprites - call UpdateSprites ; move sprites -.skipMovingSprites - ld a,1 ; max menu item ID is 1 if the list has less than 2 entries - ld [$cc37],a - ld a,[$d12a] - cp a,2 ; does the list have less than 2 entries? - jr c,.setMenuVariables - ld a,2 ; max menu item ID is 2 if the list has at least 2 entries -.setMenuVariables - ld [wMaxMenuItem],a - ld a,4 - ld [wTopMenuItemY],a - ld a,5 - ld [wTopMenuItemX],a - ld a,%00000111 ; A button, B button, Select button - ld [wMenuWatchedKeys],a - ld c,10 - call DelayFrames - -DisplayListMenuIDLoop:: ; 2c53 (0:2c53) - xor a - ld [H_AUTOBGTRANSFERENABLED],a ; disable transfer - call PrintListMenuEntries - ld a,1 - ld [H_AUTOBGTRANSFERENABLED],a ; enable transfer - call Delay3 - ld a,[W_BATTLETYPE] - and a ; is it the Old Man battle? - jr z,.notOldManBattle -.oldManBattle - ld a,"▶" - FuncCoord 5,4 - ld [Coord],a ; place menu cursor in front of first menu entry - ld c,80 - call DelayFrames - xor a - ld [wCurrentMenuItem],a - ld hl,Coord - ld a,l - ld [wMenuCursorLocation],a - ld a,h - ld [wMenuCursorLocation + 1],a - jr .buttonAPressed -.notOldManBattle - call LoadGBPal - call HandleMenuInput - push af - call PlaceMenuCursor - pop af - bit 0,a ; was the A button pressed? - jp z,.checkOtherKeys -.buttonAPressed - ld a,[wCurrentMenuItem] - call PlaceUnfilledArrowMenuCursor - ld a,$01 - ld [$d12e],a - ld [$d12d],a - xor a - ld [$cc37],a - ld a,[wCurrentMenuItem] - ld c,a - ld a,[wListScrollOffset] - add c - ld c,a - ld a,[$d12a] ; number of list entries - and a ; is the list empty? - jp z,ExitListMenu ; if so, exit the menu - dec a - cp c ; did the player select Cancel? - jp c,ExitListMenu ; if so, exit the menu - ld a,c - ld [wWhichPokemon],a - ld a,[wListMenuID] - cp a,ITEMLISTMENU - jr nz,.skipMultiplying -; if it's an item menu - sla c ; item entries are 2 bytes long, so multiply by 2 -.skipMultiplying - ld a,[$cf8b] - ld l,a - ld a,[$cf8c] - ld h,a - inc hl ; hl = beginning of list entries - ld b,0 - add hl,bc - ld a,[hl] - ld [$cf91],a - ld a,[wListMenuID] - and a ; is it a PC pokemon list? - jr z,.pokemonList - push hl - call GetItemPrice - pop hl - ld a,[wListMenuID] - cp a,ITEMLISTMENU - jr nz,.skipGettingQuantity -; if it's an item menu - inc hl - ld a,[hl] ; a = item quantity - ld [$cf97],a -.skipGettingQuantity - ld a,[$cf91] - ld [$d0b5],a - ld a,$01 - ld [$d0b7],a - call GetName - jr .storeChosenEntry -.pokemonList - ld hl,W_NUMINPARTY - ld a,[$cf8b] - cp l ; is it a list of party pokemon or box pokemon? - ld hl,W_PARTYMON1NAME - jr z,.getPokemonName - ld hl, W_BOXMON1NAME ; box pokemon names -.getPokemonName - ld a,[wWhichPokemon] - call GetPartyMonName -.storeChosenEntry ; store the menu entry that the player chose and return - ld de,$cd6d - call CopyStringToCF4B ; copy name to $cf4b - ld a,$01 - ld [$d12e],a - ld a,[wCurrentMenuItem] - ld [$d12d],a - xor a - ld [$ffb7],a ; joypad state update flag - ld hl,$d730 - res 6,[hl] ; turn on letter printing delay - jp BankswitchBack -.checkOtherKeys ; check B, SELECT, Up, and Down keys - bit 1,a ; was the B button pressed? - jp nz,ExitListMenu ; if so, exit the menu - bit 2,a ; was the select button pressed? - jp nz,HandleItemListSwapping ; if so, allow the player to swap menu entries - ld b,a - bit 7,b ; was Down pressed? - ld hl,wListScrollOffset - jr z,.upPressed -.downPressed - ld a,[hl] - add a,3 - ld b,a - ld a,[$d12a] ; number of list entries - cp b ; will going down scroll past the Cancel button? - jp c,DisplayListMenuIDLoop - inc [hl] ; if not, go down - jp DisplayListMenuIDLoop -.upPressed - ld a,[hl] - and a - jp z,DisplayListMenuIDLoop - dec [hl] - jp DisplayListMenuIDLoop - -DisplayChooseQuantityMenu:: ; 2d57 (0:2d57) -; text box dimensions/coordinates for just quantity - FuncCoord 15,9 - ld hl,Coord - ld b,1 ; height - ld c,3 ; width - ld a,[wListMenuID] - cp a,PRICEDITEMLISTMENU - jr nz,.drawTextBox -; text box dimensions/coordinates for quantity and price - FuncCoord 7,9 - ld hl,Coord - ld b,1 ; height - ld c,11 ; width -.drawTextBox - call TextBoxBorder - FuncCoord 16,10 - ld hl,Coord - ld a,[wListMenuID] - cp a,PRICEDITEMLISTMENU - jr nz,.printInitialQuantity - FuncCoord 8,10 - ld hl,Coord -.printInitialQuantity - ld de,InitialQuantityText - call PlaceString - xor a - ld [$cf96],a ; initialize current quantity to 0 - jp .incrementQuantity -.waitForKeyPressLoop - call GetJoypadStateLowSensitivity - ld a,[H_NEWLYPRESSEDBUTTONS] ; newly pressed buttons - bit 0,a ; was the A button pressed? - jp nz,.buttonAPressed - bit 1,a ; was the B button pressed? - jp nz,.buttonBPressed - bit 6,a ; was Up pressed? - jr nz,.incrementQuantity - bit 7,a ; was Down pressed? - jr nz,.decrementQuantity - jr .waitForKeyPressLoop -.incrementQuantity - ld a,[$cf97] ; max quantity - inc a - ld b,a - ld hl,$cf96 ; current quantity - inc [hl] - ld a,[hl] - cp b - jr nz,.handleNewQuantity -; wrap to 1 if the player goes above the max quantity - ld a,1 - ld [hl],a - jr .handleNewQuantity -.decrementQuantity - ld hl,$cf96 ; current quantity - dec [hl] - jr nz,.handleNewQuantity -; wrap to the max quantity if the player goes below 1 - ld a,[$cf97] ; max quantity - ld [hl],a -.handleNewQuantity - FuncCoord 17,10 - ld hl,Coord - ld a,[wListMenuID] - cp a,PRICEDITEMLISTMENU - jr nz,.printQuantity -.printPrice - ld c,$03 - ld a,[$cf96] - ld b,a - ld hl,$ff9f ; total price -; initialize total price to 0 - xor a - ld [hli],a - ld [hli],a - ld [hl],a -.addLoop ; loop to multiply the individual price by the quantity to get the total price - ld de,$ffa1 - ld hl,$ff8d - push bc - ld a,$0b - call Predef ; add the individual price to the current sum - pop bc - dec b - jr nz,.addLoop - ld a,[$ff8e] - and a ; should the price be halved (for selling items)? - jr z,.skipHalvingPrice - xor a - ld [$ffa2],a - ld [$ffa3],a - ld a,$02 - ld [$ffa4],a - ld a,$0d - call Predef ; halves the price -; store the halved price - ld a,[$ffa2] - ld [$ff9f],a - ld a,[$ffa3] - ld [$ffa0],a - ld a,[$ffa4] - ld [$ffa1],a -.skipHalvingPrice - FuncCoord 12,10 - ld hl,Coord - ld de,SpacesBetweenQuantityAndPriceText - call PlaceString - ld de,$ff9f ; total price - ld c,$a3 - call PrintBCDNumber - FuncCoord 9,10 - ld hl,Coord -.printQuantity - ld de,$cf96 ; current quantity - ld bc,$8102 ; print leading zeroes, 1 byte, 2 digits - call PrintNumber - jp .waitForKeyPressLoop -.buttonAPressed ; the player chose to make the transaction - xor a - ld [$cc35],a ; 0 means no item is currently being swapped - ret -.buttonBPressed ; the player chose to cancel the transaction - xor a - ld [$cc35],a ; 0 means no item is currently being swapped - ld a,$ff - ret - -InitialQuantityText:: ; 2e30 (0:2e30) - db "×01@" - -SpacesBetweenQuantityAndPriceText:: ; 2e34 (0:2e34) - db " @" - -ExitListMenu:: ; 2e3b (0:2e3b) - ld a,[wCurrentMenuItem] - ld [$d12d],a - ld a,$02 - ld [$d12e],a - ld [$cc37],a - xor a - ld [$ffb7],a - ld hl,$d730 - res 6,[hl] - call BankswitchBack - xor a - ld [$cc35],a ; 0 means no item is currently being swapped - scf - ret - -PrintListMenuEntries:: ; 2e5a (0:2e5a) - FuncCoord 5, 3 ; $c3e1 - ld hl,Coord - ld b,$09 - ld c,$0e - call ClearScreenArea - ld a,[$cf8b] - ld e,a - ld a,[$cf8c] - ld d,a - inc de ; de = beginning of list entries - ld a,[wListScrollOffset] - ld c,a - ld a,[wListMenuID] - cp a,ITEMLISTMENU - ld a,c - jr nz,.skipMultiplying -; if it's an item menu -; item entries are 2 bytes long, so multiply by 2 - sla a - sla c -.skipMultiplying - add e - ld e,a - jr nc,.noCarry - inc d -.noCarry - FuncCoord 6,4 ; coordinates of first list entry name - ld hl,Coord - ld b,4 ; print 4 names -.loop - ld a,b - ld [wWhichPokemon],a - ld a,[de] - ld [$d11e],a - cp a,$ff - jp z,.printCancelMenuItem - push bc - push de - push hl - push hl - push de - ld a,[wListMenuID] - and a - jr z,.pokemonPCMenu - cp a,$01 - jr z,.movesMenu -.itemMenu - call GetItemName - jr .placeNameString -.pokemonPCMenu - push hl - ld hl,W_NUMINPARTY - ld a,[$cf8b] - cp l ; is it a list of party pokemon or box pokemon? - ld hl,W_PARTYMON1NAME - jr z,.getPokemonName - ld hl, W_BOXMON1NAME ; box pokemon names -.getPokemonName - ld a,[wWhichPokemon] - ld b,a - ld a,4 - sub b - ld b,a - ld a,[wListScrollOffset] - add b - call GetPartyMonName - pop hl - jr .placeNameString -.movesMenu - call GetMoveName -.placeNameString - call PlaceString - pop de - pop hl - ld a,[$cf93] - and a ; should prices be printed? - jr z,.skipPrintingItemPrice -.printItemPrice - push hl - ld a,[de] - ld de,ItemPrices - ld [$cf91],a - call GetItemPrice ; get price - pop hl - ld bc,20 + 5 ; 1 row down and 5 columns right - add hl,bc - ld c,$a3 ; no leading zeroes, right-aligned, print currency symbol, 3 bytes - call PrintBCDNumber -.skipPrintingItemPrice - ld a,[wListMenuID] - and a - jr nz,.skipPrintingPokemonLevel -.printPokemonLevel - ld a,[$d11e] - push af - push hl - ld hl,W_NUMINPARTY - ld a,[$cf8b] - cp l ; is it a list of party pokemon or box pokemon? - ld a,$00 - jr z,.next - ld a,$02 -.next - ld [$cc49],a - ld hl,wWhichPokemon - ld a,[hl] - ld b,a - ld a,$04 - sub b - ld b,a - ld a,[wListScrollOffset] - add b - ld [hl],a - call LoadMonData ; load pokemon info - ld a,[$cc49] - and a ; is it a list of party pokemon or box pokemon? - jr z,.skipCopyingLevel -.copyLevel - ld a,[$cf9b] - ld [$cfb9],a -.skipCopyingLevel - pop hl - ld bc,$001c - add hl,bc - call PrintLevel ; print level - pop af - ld [$d11e],a -.skipPrintingPokemonLevel - pop hl - pop de - inc de - ld a,[wListMenuID] - cp a,ITEMLISTMENU - jr nz,.nextListEntry -.printItemQuantity - ld a,[$d11e] - ld [$cf91],a - call IsKeyItem ; check if item is unsellable - ld a,[$d124] - and a ; is the item unsellable? - jr nz,.skipPrintingItemQuantity ; if so, don't print the quantity - push hl - ld bc,20 + 8 ; 1 row down and 8 columns right - add hl,bc - ld a,"×" - ldi [hl],a - ld a,[$d11e] - push af - ld a,[de] - ld [$cf97],a - push de - ld de,$d11e - ld [de],a - ld bc,$0102 - call PrintNumber - pop de - pop af - ld [$d11e],a - pop hl -.skipPrintingItemQuantity - inc de - pop bc - inc c - push bc - inc c - ld a,[$cc35] ; ID of item chosen for swapping (counts from 1) - and a ; is an item being swapped? - jr z,.nextListEntry - sla a - cp c ; is it this item? - jr nz,.nextListEntry - dec hl - ld a,$ec ; unfilled right arrow menu cursor to indicate an item being swapped - ld [hli],a -.nextListEntry - ld bc,2 * 20 ; 2 rows - add hl,bc - pop bc - inc c - dec b - jp nz,.loop - ld bc,-8 - add hl,bc - ld a,$ee ; down arrow - ld [hl],a - ret -.printCancelMenuItem - ld de,ListMenuCancelText - jp PlaceString - -ListMenuCancelText:: ; 2f97 (0:2f97) - db "CANCEL@" - -GetMonName:: ; 2f9e (0:2f9e) - push hl - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(MonsterNames) ; 07 - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld a,[$d11e] - dec a - ld hl,MonsterNames ; 421E - ld c,10 - ld b,0 - call AddNTimes - ld de,$cd6d - push de - ld bc,10 - call CopyData - ld hl,$cd77 - ld [hl], "@" - pop de - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - pop hl - ret - -GetItemName:: ; 2fcf (0:2fcf) -; given an item ID at [$D11E], store the name of the item into a string -; starting at $CD6D - push hl - push bc - ld a,[$D11E] - cp HM_01 ; is this a TM/HM? - jr nc,.Machine - - ld [$D0B5],a - ld a,ITEM_NAME - ld [W_LISTTYPE],a - ld a,BANK(ItemNames) - ld [$D0B7],a - call GetName - jr .Finish - -.Machine - call GetMachineName -.Finish - ld de,$CD6D ; pointer to where item name is stored in RAM - pop bc - pop hl - ret - -GetMachineName:: ; 2ff3 (0:2ff3) -; copies the name of the TM/HM in [$D11E] to $CD6D - push hl - push de - push bc - ld a,[$D11E] - push af - cp TM_01 ; is this a TM? [not HM] - jr nc,.WriteTM -; if HM, then write "HM" and add 5 to the item ID, so we can reuse the -; TM printing code - add 5 - ld [$D11E],a - ld hl,HiddenPrefix ; points to "HM" - ld bc,2 - jr .WriteMachinePrefix -.WriteTM - ld hl,TechnicalPrefix ; points to "TM" - ld bc,2 -.WriteMachinePrefix - ld de,$CD6D - call CopyData - -; now get the machine number and convert it to text - ld a,[$D11E] - sub TM_01 - 1 - ld b,$F6 ; "0" -.FirstDigit - sub 10 - jr c,.SecondDigit - inc b - jr .FirstDigit -.SecondDigit - add 10 - push af - ld a,b - ld [de],a - inc de - pop af - ld b,$F6 ; "0" - add b - ld [de],a - inc de - ld a,"@" - ld [de],a - - pop af - ld [$D11E],a - pop bc - pop de - pop hl - ret - -TechnicalPrefix:: ; 303c (0:303c) - db "TM" -HiddenPrefix:: ; 303e (0:303e) - db "HM" - -; sets carry if item is HM, clears carry if item is not HM -; Input: a = item ID -IsItemHM:: ; 3040 (0:3040) - cp a,HM_01 - jr c,.notHM - cp a,TM_01 - ret -.notHM - and a - ret - -; sets carry if move is an HM, clears carry if move is not an HM -; Input: a = move ID -IsMoveHM:: ; 3049 (0:3049) - ld hl,HMMoves - ld de,1 - jp IsInArray - -HMMoves:: ; 3052 (0:3052) - db CUT,FLY,SURF,STRENGTH,FLASH - db $ff ; terminator - -GetMoveName:: ; 3058 (0:3058) - push hl - ld a,MOVE_NAME - ld [W_LISTTYPE],a - ld a,[$d11e] - ld [$d0b5],a - ld a,BANK(MoveNames) - ld [$d0b7],a - call GetName - ld de,$cd6d ; pointer to where move name is stored in RAM - pop hl - ret - -; reloads text box tile patterns, current map view, and tileset tile patterns -ReloadMapData:: ; 3071 (0:3071) - ld a,[H_LOADEDROMBANK] - push af - ld a,[W_CURMAP] - call SwitchToMapRomBank - call DisableLCD - call LoadTextBoxTilePatterns - call LoadCurrentMapView - call LoadTilesetTilePatternData - call EnableLCD - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; reloads tileset tile patterns -ReloadTilesetTilePatterns:: ; 3090 (0:3090) - ld a,[H_LOADEDROMBANK] - push af - ld a,[W_CURMAP] - call SwitchToMapRomBank - call DisableLCD - call LoadTilesetTilePatternData - call EnableLCD - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; shows the town map and lets the player choose a destination to fly to -ChooseFlyDestination:: ; 30a9 (0:30a9) - ld hl,$d72e - res 4,[hl] - ld b, BANK(LoadTownMap_Fly) - ld hl, LoadTownMap_Fly - jp Bankswitch - -; causes the text box to close waithout waiting for a button press after displaying text -DisableWaitingAfterTextDisplay:: ; 30b6 (0:30b6) - ld a,$01 - ld [$cc3c],a - ret - -; uses an item -; UseItem is used with dummy items to perform certain other functions as well -; INPUT: -; [$cf91] = item ID -; OUTPUT: -; [$cd6a] = success -; 00: unsucessful -; 01: successful -; 02: not able to be used right now, no extra menu displayed (only certain items use this) -UseItem:: ; 30bc (0:30bc) - ld b,BANK(UseItem_) - ld hl,UseItem_ - jp Bankswitch - -; confirms the item toss and then tosses the item -; INPUT: -; hl = address of inventory (either wNumBagItems or wNumBoxItems) -; [$cf91] = item ID -; [$cf92] = index of item within inventory -; [$cf96] = quantity to toss -; OUTPUT: -; clears carry flag if the item is tossed, sets carry flag if not -TossItem:: ; 30c4 (0:30c4) - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(TossItem_) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call TossItem_ - pop de - ld a,d - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; checks if an item is a key item -; INPUT: -; [$cf91] = item ID -; OUTPUT: -; [$d124] = result -; 00: item is not key item -; 01: item is key item -IsKeyItem:: ; 30d9 (0:30d9) - push hl - push de - push bc - callba IsKeyItem_ - pop bc - pop de - pop hl - ret - -; function to draw various text boxes -; INPUT: -; [$D125] = text box ID -DisplayTextBoxID:: ; 30e8 (0:30e8) - ld a,[H_LOADEDROMBANK] - push af - ld a,BANK(DisplayTextBoxID_) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call DisplayTextBoxID_ - pop bc - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -Func_30fd:: ; 30fd (0:30fd) - ld a, [$cc57] - and a - ret nz - ld a, [$d736] - bit 1, a - ret nz - ld a, [$d730] - and $80 - ret - -Func_310e:: ; 310e (0:310e) - ld hl, $d736 - bit 0, [hl] - res 0, [hl] - jr nz, .asm_3146 - ld a, [$cc57] - and a - ret z - dec a - add a - ld d, $0 - ld e, a - ld hl, .pointerTable_3140 - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [H_LOADEDROMBANK] - push af - ld a, [$cc58] - ld [H_LOADEDROMBANK], a - ld [$2000], a - ld a, [$cf10] - call CallFunctionInTable - pop af - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret -.pointerTable_3140 - dw PointerTable_1a442 - dw PointerTable_1a510 - dw PointerTable_1a57d -.asm_3146 - ld b, BANK(Func_1a3e0) - ld hl, Func_1a3e0 - jp Bankswitch - -Func_314e:: ; 314e (0:314e) - ld b, BANK(Func_1a41d) - ld hl, Func_1a41d - jp Bankswitch - -Func_3156:: ; 3156 (0:3156) - ret - -; stores hl in [W_TRAINERHEADERPTR] -StoreTrainerHeaderPointer:: ; 3157 (0:3157) - ld a, h - ld [W_TRAINERHEADERPTR], a - ld a, l - ld [W_TRAINERHEADERPTR+1], a - ret - -; executes the current map script from the function pointer array provided in hl. -; a: map script index to execute (unless overridden by [$d733] bit 4) -ExecuteCurMapScriptInTable:: ; 3160 (0:3160) - push af - push de - call StoreTrainerHeaderPointer - pop hl - pop af - push hl - ld hl, W_FLAGS_D733 - bit 4, [hl] - res 4, [hl] - jr z, .useProvidedIndex ; test if map script index was overridden manually - ld a, [W_CURMAPSCRIPT] -.useProvidedIndex - pop hl - ld [W_CURMAPSCRIPT], a - call CallFunctionInTable - ld a, [W_CURMAPSCRIPT] - ret - -LoadGymLeaderAndCityName:: ; 317f (0:317f) - push de - ld de, wGymCityName - ld bc, $11 - call CopyData ; load city name - pop hl - ld de, wGymLeaderName - ld bc, $b - jp CopyData ; load gym leader name - -; reads specific information from trainer header (pointed to at W_TRAINERHEADERPTR) -; a: offset in header data -; 0 -> flag's bit (into wTrainerHeaderFlagBit) -; 2 -> flag's byte ptr (into hl) -; 4 -> before battle text (into hl) -; 6 -> after battle text (into hl) -; 8 -> end battle text (into hl) -ReadTrainerHeaderInfo:: ; 3193 (0:3193) - push de - push af - ld d, $0 - ld e, a - ld hl, W_TRAINERHEADERPTR - ld a, [hli] - ld l, [hl] - ld h, a - add hl, de - pop af - and a - jr nz, .nonZeroOffset - ld a, [hl] - ld [wTrainerHeaderFlagBit], a ; store flag's bit - jr .done -.nonZeroOffset - cp $2 - jr z, .readPointer ; read flag's byte ptr - cp $4 - jr z, .readPointer ; read before battle text - cp $6 - jr z, .readPointer ; read after battle text - cp $8 - jr z, .readPointer ; read end battle text - cp $a - jr nz, .done - ld a, [hli] ; read end battle text (2) but override the result afterwards (XXX why, bug?) - ld d, [hl] - ld e, a - jr .done -.readPointer - ld a, [hli] - ld h, [hl] - ld l, a -.done - pop de - ret - -; calls HandleBitArray -HandleBitArray_Bank0:: ; 31c7 (0:31c7) - ld a, $10 - jp Predef ; indirect jump to HandleBitArray (f666 (3:7666)) - -; direct talking to a trainer (rather than getting seen by one) -TalkToTrainer:: ; 31cc (0:31cc) - call StoreTrainerHeaderPointer - xor a - call ReadTrainerHeaderInfo ; read flag's bit - ld a, $2 - call ReadTrainerHeaderInfo ; read flag's byte ptr - ld a, [wTrainerHeaderFlagBit] - ld c, a - ld b, $2 - call HandleBitArray_Bank0 ; read trainer's flag - ld a, c - and a - jr z, .trainerNotYetFought ; test trainer's flag - ld a, $6 - call ReadTrainerHeaderInfo ; print after battle text - jp PrintText -.trainerNotYetFought ; 0x31ed - ld a, $4 - call ReadTrainerHeaderInfo ; print before battle text - call PrintText - ld a, $a - call ReadTrainerHeaderInfo ; (?) does nothing apparently (maybe bug in ReadTrainerHeaderInfo) - push de - ld a, $8 - call ReadTrainerHeaderInfo ; read end battle text - pop de - call PreBattleSaveRegisters - ld hl, W_FLAGS_D733 - set 4, [hl] ; activate map script index override (index is set below) - ld hl, wFlags_0xcd60 - bit 0, [hl] ; test if player is already being engaged by another trainer - ret nz - call EngageMapTrainer - ld hl, W_CURMAPSCRIPT - inc [hl] ; progress map script index (assuming it was 0 before) to start pre-battle routines - jp Func_325d - -; checks if any trainers are seeing the player and wanting to fight -CheckFightingMapTrainers:: ; 3219 (0:3219) - call CheckForEngagingTrainers - ld a, [$cf13] - cp $ff - jr nz, .trainerEngaging - xor a - ld [$cf13], a - ld [wTrainerHeaderFlagBit], a - ret -.trainerEngaging - ld hl, W_FLAGS_D733 - set 3, [hl] - ld [$cd4f], a - xor a - ld [$cd50], a - ld a, $4c - call Predef - ld a, BTN_RIGHT | BTN_LEFT | BTN_UP | BTN_DOWN - ld [wJoypadForbiddenButtonsMask], a - xor a - ldh [$b4], a - call TrainerWalkUpToPlayer_Bank0 - ld hl, W_CURMAPSCRIPT - inc [hl] ; progress to battle phase 1 (engaging) - ret - -Func_324c:: ; 324c (0:324c) - ld a, [$d730] - and $1 - ret nz - ld [wJoypadForbiddenButtonsMask], a - ld a, [$cf13] - ld [H_DOWNARROWBLINKCNT2], a ; $ff8c - call DisplayTextID - -Func_325d:: ; 325d (0:325d) - xor a - ld [wJoypadForbiddenButtonsMask], a - call InitBattleEnemyParameters - ld hl, $d72d - set 6, [hl] - set 7, [hl] - ld hl, $d72e - set 1, [hl] - ld hl, W_CURMAPSCRIPT - inc [hl] ; progress to battle phase 2 (battling) - ret - -EndTrainerBattle:: ; 3275 (0:3275) - ld hl, $d126 - set 5, [hl] - set 6, [hl] - ld hl, $d72d - res 7, [hl] - ld hl, wFlags_0xcd60 - res 0, [hl] ; player is no longer engaged by any trainer - ld a, [W_ISINBATTLE] ; $d057 - cp $ff - jp z, ResetButtonPressedAndMapScript - ld a, $2 - call ReadTrainerHeaderInfo - ld a, [wTrainerHeaderFlagBit] - ld c, a - ld b, $1 - call HandleBitArray_Bank0 ; flag trainer as fought - ld a, [W_ENEMYMONORTRAINERCLASS] - cp $c8 - jr nc, .skipRemoveSprite ; test if trainer was fought (in that case skip removing the corresponding sprite) - ld hl, W_MISSABLEOBJECTLIST - ld de, $2 - ld a, [$cf13] - call IsInArray ; search for sprite ID - inc hl - ld a, [hl] - ld [$cc4d], a ; load corresponding missable object index and remove it - ld a, $11 - call Predef ; indirect jump to RemoveMissableObject (f1d7 (3:71d7)) -.skipRemoveSprite - ld hl, $d730 - bit 4, [hl] - res 4, [hl] - ret nz - -ResetButtonPressedAndMapScript:: ; 32c1 (0:32c1) - xor a - ld [wJoypadForbiddenButtonsMask], a - ld [H_CURRENTPRESSEDBUTTONS], a - ld [H_NEWLYPRESSEDBUTTONS], a - ld [H_NEWLYRELEASEDBUTTONS], a - ld [W_CURMAPSCRIPT], a ; reset battle status - ret - -; calls TrainerWalkUpToPlayer -TrainerWalkUpToPlayer_Bank0:: ; 32cf (0:32cf) - ld b, BANK(TrainerWalkUpToPlayer) - ld hl, TrainerWalkUpToPlayer - jp Bankswitch - -; sets opponent type and mon set/lvl based on the engaging trainer data -InitBattleEnemyParameters:: ; 32d7 (0:32d7) - ld a, [wEngagedTrainerClass] - ld [W_CUROPPONENT], a ; $d059 - ld [W_ENEMYMONORTRAINERCLASS], a - cp $c8 - ld a, [wEngagedTrainerSet] ; $cd2e - jr c, .noTrainer - ld [W_TRAINERNO], a ; $d05d - ret -.noTrainer - ld [W_CURENEMYLVL], a ; $d127 - ret - -Func_32ef:: ; 32ef (0:32ef) - ld hl, Func_567f9 - jr asm_3301 - -Func_32f4:: ; 32f4 (0:32f4) - ld hl, Func_56819 - jr asm_3301 ; 0x32f7 $8 - -Func_32f9:: ; 32f9 (0:32f9) - ld hl, Func_5683d - jr asm_3301 - -Func_32fe:: ; 32fe (0:32fe) - ld hl, Func_5685d -asm_3301:: ; 3301 (0:3301) - ld b, BANK(Func_567f9) ; BANK(Func_56819), BANK(Func_5683d), BANK(Func_5685d) - jp Bankswitch ; indirect jump to one of the four functions - -CheckForEngagingTrainers:: ; 3306 (0:3306) - xor a - call ReadTrainerHeaderInfo ; read trainer flag's bit (unused) - ld d, h ; store trainer header address in de - ld e, l -.trainerLoop - call StoreTrainerHeaderPointer ; set trainer header pointer to current trainer - ld a, [de] - ld [$cf13], a ; store trainer flag's bit - ld [wTrainerHeaderFlagBit], a - cp $ff - ret z - ld a, $2 - call ReadTrainerHeaderInfo ; read trainer flag's byte ptr - ld b, $2 - ld a, [wTrainerHeaderFlagBit] - ld c, a - call HandleBitArray_Bank0 ; read trainer flag - ld a, c - and a - jr nz, .trainerAlreadyFought - push hl - push de - push hl - xor a - call ReadTrainerHeaderInfo ; get trainer header pointer - inc hl - ld a, [hl] ; read trainer engage distance - pop hl - ld [wTrainerEngageDistance], a - ld a, [$cf13] - swap a - ld [wTrainerSpriteOffset], a ; $cd3d - ld a, $39 - call Predef ; indirect jump to CheckEngagePlayer (5690f (15:690f)) - pop de - pop hl - ld a, [wTrainerSpriteOffset] ; $cd3d - and a - ret nz ; break if the trainer is engaging -.trainerAlreadyFought - ld hl, $c - add hl, de - ld d, h - ld e, l - jr .trainerLoop - -; saves loaded rom bank and hl as well as de registers -PreBattleSaveRegisters:: ; 3354 (0:3354) - ld a, [H_LOADEDROMBANK] - ld [W_PBSTOREDROMBANK], a - ld a, h - ld [W_PBSTOREDREGISTERH], a - ld a, l - ld [W_PBSTOREDREGISTERL], a - ld a, d - ld [W_PBSTOREDREGISTERD], a - ld a, e - ld [W_PBSTOREDREGISTERE], a - ret - -; loads data of some trainer on the current map and plays pre-battle music -; [$cf13]: sprite ID of trainer who is engaged -EngageMapTrainer:: ; 336a (0:336a) - ld hl, W_MAPSPRITEEXTRADATA - ld d, $0 - ld a, [$cf13] - dec a - add a - ld e, a - add hl, de ; seek to engaged trainer data - ld a, [hli] ; load trainer class - ld [wEngagedTrainerClass], a - ld a, [hl] ; load trainer mon set - ld [wEnemyMonAttackMod], a ; $cd2e - jp PlayTrainerMusic - -Func_3381:: ; 3381 (0:3381) - push hl - ld hl, $d72d - bit 7, [hl] - res 7, [hl] - pop hl - ret z - ld a, [H_LOADEDROMBANK] - push af - ld a, [W_PBSTOREDROMBANK] - ld [H_LOADEDROMBANK], a - ld [$2000], a - push hl - callba SaveTrainerName - ld hl, TrainerNameText - call PrintText - pop hl - pop af - ld [H_LOADEDROMBANK], a - ld [$2000], a - callba Func_1a5e7 - jp WaitForSoundToFinish - -Func_33b7:: ; 33b7 (0:33b7) - ld a, [$cf0b] - and a - jr nz, .asm_33c6 - ld a, [W_PBSTOREDREGISTERH] - ld h, a - ld a, [W_PBSTOREDREGISTERL] - ld l, a - ret -.asm_33c6 - ld a, [W_PBSTOREDREGISTERD] - ld h, a - ld a, [W_PBSTOREDREGISTERE] - ld l, a - ret - -TrainerNameText:: ; 33cf (0:33cf) - TX_FAR _TrainerNameText - db $08 - -Func_33d4:: ; 33d4 (0:33d4) - call Func_33b7 - call TextCommandProcessor - jp TextScriptEnd - -Func_33dd:: ; 33dd (0:33dd) - ld a, [wFlags_0xcd60] - bit 0, a - ret nz - call EngageMapTrainer - xor a - ret - -PlayTrainerMusic:: ; 33e8 (0:33e8) - ld a, [wEngagedTrainerClass] - cp $c8 + SONY1 - ret z - cp $c8 + SONY2 - ret z - cp $c8 + SONY3 - ret z - ld a, [W_GYMLEADERNO] ; $d05c - and a - ret nz - xor a - ld [wMusicHeaderPointer], a - ld a, $ff - call PlaySound ; stop music - ld a, BANK(Music_MeetEvilTrainer) - ld [$c0ef], a - ld [$c0f0], a - ld a, [wEngagedTrainerClass] - ld b, a - ld hl, EvilTrainerList -.evilTrainerListLoop - ld a, [hli] - cp $ff - jr z, .noEvilTrainer - cp b - jr nz, .evilTrainerListLoop - ld a, MUSIC_MEET_EVIL_TRAINER - jr .PlaySound -.noEvilTrainer - ld hl, FemaleTrainerList -.femaleTrainerListLoop - ld a, [hli] - cp $ff - jr z, .maleTrainer - cp b - jr nz, .femaleTrainerListLoop - ld a, MUSIC_MEET_FEMALE_TRAINER - jr .PlaySound -.maleTrainer - ld a, MUSIC_MEET_MALE_TRAINER -.PlaySound - ld [$c0ee], a - jp PlaySound - -INCLUDE "data/trainer_types.asm" - -Func_3442:: ; 3442 (0:3442) - ld a, [hli] - cp $ff - ret z - cp b - jr nz, .asm_345b - ld a, [hli] - cp c - jr nz, .asm_345c - ld a, [hli] - ld d, [hl] - ld e, a - ld hl, $ccd3 - call DecodeRLEList - dec a - ld [$cd38], a - ret -.asm_345b - inc hl -.asm_345c - inc hl - inc hl - jr Func_3442 - -FuncTX_ItemStoragePC:: ; 3460 (0:3460) - call SaveScreenTilesToBuffer2 - ld b, BANK(PlayerPC) - ld hl, PlayerPC - jr bankswitchAndContinue - -FuncTX_BillsPC:: ; 346a (0:346a) - call SaveScreenTilesToBuffer2 - ld b, BANK(Func_214c2) - ld hl, Func_214c2 - jr bankswitchAndContinue - -FuncTX_SlotMachine:: ; 3474 (0:3474) -; XXX find a better name for this function -; special_F7 - ld b,BANK(CeladonPrizeMenu) - ld hl,CeladonPrizeMenu -bankswitchAndContinue:: ; 3479 (0:3479) - call Bankswitch - jp HoldTextDisplayOpen ; continue to main text-engine function - -FuncTX_PokemonCenterPC:: ; 347f (0:347f) - ld b, BANK(ActivatePC) - ld hl, ActivatePC - jr bankswitchAndContinue - -Func_3486:: ; 3486 (0:3486) - xor a - ld [$cd3b], a - ld [$c206], a - ld hl, $d730 - set 7, [hl] - ret - -IsItemInBag:: ; 3493 (0:3493) -; given an item_id in b -; set zero flag if item isn't in player's bag -; else reset zero flag -; related to Pokémon Tower and ghosts - ld a,$1C - call Predef - ld a,b - and a - ret - -DisplayPokedex:: ; 349b (0:349b) - ld [$d11e], a - ld b, BANK(Func_7c18) - ld hl, Func_7c18 - jp Bankswitch - -Func_34a6:: ; 34a6 (0:34a6) - call Func_34ae - ld c, $6 - jp DelayFrames - -Func_34ae:: ; 34ae (0:34ae) - ld a, $9 - ld [H_DOWNARROWBLINKCNT1], a ; $ff8b - call Func_34fc - ld a, [$ff8d] - ld [hl], a - ret - -Func_34b9:: ; 34b9 (0:34b9) - ld de, $fff9 - add hl, de - ld [hl], a - ret - -; tests if the player's coordinates are in a specified array -; INPUT: -; hl = address of array -; OUTPUT: -; [$cd3d] = if there is match, the matching array index -; sets carry if the coordinates are in the array, clears carry if not -ArePlayerCoordsInArray:: ; 34bf (0:34bf) - ld a,[W_YCOORD] - ld b,a - ld a,[W_XCOORD] - ld c,a - ; fallthrough - -CheckCoords:: ; 34c7 (0:34c7) - xor a - ld [$cd3d],a -.loop - ld a,[hli] - cp a,$ff ; reached terminator? - jr z,.notInArray - push hl - ld hl,$cd3d - inc [hl] - pop hl -.compareYCoord - cp b - jr z,.compareXCoord - inc hl - jr .loop -.compareXCoord - ld a,[hli] - cp c - jr nz,.loop -.inArray - scf - ret -.notInArray - and a - ret - -; tests if a boulder's coordinates are in a specified array -; INPUT: -; hl = address of array -; ff8c = which boulder to check? XXX -; OUTPUT: -; [$cd3d] = if there is match, the matching array index -; sets carry if the coordinates are in the array, clears carry if not -CheckBoulderCoords:: ; 34e4 (0:34e4) - push hl - ld hl, $c204 - ld a, [$ff8c] - swap a - ld d, $0 - ld e, a - add hl, de - ld a, [hli] - sub $4 ; because sprite coordinates are offset by 4 - ld b, a - ld a, [hl] - sub $4 ; because sprite coordinates are offset by 4 - ld c, a - pop hl - jp CheckCoords - -Func_34fc:: ; 34fc (0:34fc) - ld h, $c1 - jr asm_3502 - -Func_3500:: ; 3500 (0:3500) - ld h, $c2 -asm_3502:: ; 3502 (0:3502) - ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b - ld b, a - ld a, [H_DOWNARROWBLINKCNT2] ; $ff8c - swap a - add b - ld l, a - ret - -; decodes a $ff-terminated RLEncoded list -; each entry is a pair of bytes <byte value> <repetitions> -; the final $ff will be replicated in the output list and a contains the number of bytes written -; de: input list -; hl: output list -DecodeRLEList:: ; 350c (0:350c) - xor a - ld [wRLEByteCount], a ; count written bytes here -.listLoop - ld a, [de] - cp $ff - jr z, .endOfList - ld [H_DOWNARROWBLINKCNT1], a ; store byte value to be written - inc de - ld a, [de] - ld b, $0 - ld c, a ; number of bytes to be written - ld a, [wRLEByteCount] - add c - ld [wRLEByteCount], a ; update total number of written bytes - ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b - call FillMemory ; write a c-times to output - inc de - jr .listLoop -.endOfList - ld a, $ff - ld [hl], a ; write final $ff - ld a, [wRLEByteCount] - inc a ; include sentinel in counting - ret - -; sets movement byte 1 for sprite [$FF8C] to $FE and byte 2 to [$FF8D] -SetSpriteMovementBytesToFE:: ; 3533 (0:3533) - push hl - call GetSpriteMovementByte1Pointer - ld [hl], $fe - call GetSpriteMovementByte2Pointer - ld a, [$ff8d] - ld [hl], a - pop hl - ret - -; sets both movement bytes for sprite [$FF8C] to $FF -SetSpriteMovementBytesToFF:: ; 3541 (0:3541) - push hl - call GetSpriteMovementByte1Pointer - ld [hl],$FF - call GetSpriteMovementByte2Pointer - ld [hl],$FF ; prevent person from walking? - pop hl - ret - -; returns the sprite movement byte 1 pointer for sprite [$FF8C] in hl -GetSpriteMovementByte1Pointer:: ; 354e (0:354e) - ld h,$C2 - ld a,[$FF8C] ; the sprite to move - swap a - add a,6 - ld l,a - ret - -; returns the sprite movement byte 2 pointer for sprite [$FF8C] in hl -GetSpriteMovementByte2Pointer:: ; 3558 (0:3558) - push de - ld hl,W_MAPSPRITEDATA - ld a,[$FF8C] ; the sprite to move - dec a - add a - ld d,0 - ld e,a - add hl,de - pop de - ret - -GetTrainerInformation:: ; 3566 (0:3566) - call GetTrainerName - ld a, [W_ISLINKBATTLE] ; $d12b - and a - jr nz, .linkBattle - ld a, Bank(TrainerPicAndMoneyPointers) - call BankswitchHome - ld a, [W_TRAINERCLASS] ; $d031 - dec a - ld hl, TrainerPicAndMoneyPointers - ld bc, $5 - call AddNTimes - ld de, $d033 - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - ld de, $d046 - ld a, [hli] - ld [de], a - inc de - ld a, [hli] - ld [de], a - jp BankswitchBack -.linkBattle - ld hl, $d033 - ld de, RedPicFront - ld [hl], e - inc hl - ld [hl], d - ret - -GetTrainerName:: ; 359e (0:359e) - ld b, BANK(GetTrainerName_) - ld hl, GetTrainerName_ - jp Bankswitch - -; tests if player's money are at least as much as [$ff9f] -; sets carry flag if not enough money -; sets zero flag if amounts match exactly -HasEnoughMoney:: ; 35a6 (0:35a6) - ld de, wPlayerMoney ; $d347 - ld hl, $ff9f - ld c, $3 - jp StringCmp - -; tests if player's game corner coins are at least as many as [$ffa0] -; sets carry flag if not enough coins -; sets zero flag if amounts match exactly -HasEnoughCoins:: ; 35b1 (0:35b1) - ld de, wPlayerCoins - ld hl, $ffa0 - ld c, $2 - jp StringCmp - -BankswitchHome:: ; 35bc (0:35bc) -; switches to bank # in a -; Only use this when in the home bank! - ld [$CF09],a - ld a,[H_LOADEDROMBANK] - ld [$CF08],a - ld a,[$CF09] - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -BankswitchBack:: ; 35cd (0:35cd) -; returns from BankswitchHome - ld a,[$CF08] - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -Bankswitch:: ; 35d6 (0:35d6) -; self-contained bankswitch, use this when not in the home bank -; switches to the bank in b - ld a,[H_LOADEDROMBANK] - push af - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld bc,.Return - push bc - jp [hl] -.Return - pop bc - ld a,b - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -; displays yes/no choice -; yes -> set carry -YesNoChoice:: ; 35ec (0:35ec) - call SaveScreenTilesToBuffer1 - call InitYesNoTextBoxParameters - jr DisplayYesNoChoice - -Func_35f4:: ; 35f4 (0:35f4) - ld a, $14 - ld [$d125], a - call InitYesNoTextBoxParameters - jp DisplayTextBoxID - -InitYesNoTextBoxParameters:: ; 35ff (0:35ff) - xor a - ld [$d12c], a - FuncCoord 14, 7 ; $c43a - ld hl, Coord - ld bc, $80f - ret - -YesNoChoicePokeCenter:: ; 360a (0:360a) - call SaveScreenTilesToBuffer1 - ld a, $6 - ld [$d12c], a - FuncCoord 11, 6 ; $c423 - ld hl, Coord - ld bc, $80c - jr DisplayYesNoChoice - -Func_361a:: ; 361a (0:361a) - call SaveScreenTilesToBuffer1 - ld a, $3 - ld [$d12c], a - FuncCoord 12, 7 ; $c438 - ld hl, Coord - ld bc, $080d -DisplayYesNoChoice:: ; 3628 (0:3628) - ld a, $14 - ld [$d125], a - call DisplayTextBoxID - jp LoadScreenTilesFromBuffer1 - -; calculates the difference |a-b|, setting carry flag if a<b -CalcDifference:: ; 3633 (0:3633) - sub b - ret nc - cpl - add $1 - scf - ret - -MoveSprite:: ; 363a (0:363a) -; move the sprite [$FF8C] with the movement pointed to by de -; actually only copies the movement data to $CC5B for later - call SetSpriteMovementBytesToFF -MoveSprite_:: ; 363d (0:363d) - push hl - push bc - call GetSpriteMovementByte1Pointer - xor a - ld [hl],a - ld hl,$CC5B - ld c,0 - -.loop - ld a,[de] - ld [hli],a - inc de - inc c - cp a,$FF ; have we reached the end of the movement data? - jr nz,.loop - - ld a,c - ld [$CF0F],a ; number of steps taken - - pop bc - ld hl,$D730 - set 0,[hl] - pop hl - xor a - ld [$CD3B],a - ld [$CCD3],a - dec a - ld [wJoypadForbiddenButtonsMask],a - ld [$CD3A],a - ret - -Func_366b:: ; 366b (0:366b) - push hl - ld hl, $ffe7 - xor a - ld [hld], a - ld a, [hld] - and a - jr z, .asm_367e - ld a, [hli] -.asm_3676 - sub [hl] - jr c, .asm_367e - inc hl - inc [hl] - dec hl - jr .asm_3676 -.asm_367e - pop hl - ret - -; copies the tile patterns for letters and numbers into VRAM -LoadFontTilePatterns:: ; 3680 (0:3680) - ld a,[rLCDC] - bit 7,a ; is the LCD enabled? - jr nz,.lcdEnabled -.lcdDisabled - ld hl,FontGraphics - ld de,$8800 - ld bc,$400 - ld a,BANK(FontGraphics) - jp FarCopyDataDouble ; if LCD is off, transfer all at once -.lcdEnabled - ld de,FontGraphics - ld hl,$8800 - ld bc,(BANK(FontGraphics) << 8 | $80) - jp CopyVideoDataDouble ; if LCD is on, transfer during V-blank - -; copies the text box tile patterns into VRAM -LoadTextBoxTilePatterns:: ; 36a0 (0:36a0) - ld a,[rLCDC] - bit 7,a ; is the LCD enabled? - jr nz,.lcdEnabled -.lcdDisabled - ld hl,TextBoxGraphics - ld de,$9600 - ld bc,$0200 - ld a,BANK(TextBoxGraphics) - jp FarCopyData2 ; if LCD is off, transfer all at once -.lcdEnabled - ld de,TextBoxGraphics - ld hl,$9600 - ld bc,(BANK(TextBoxGraphics) << 8 | $20) - jp CopyVideoData ; if LCD is on, transfer during V-blank - -; copies HP bar and status display tile patterns into VRAM -LoadHpBarAndStatusTilePatterns:: ; 36c0 (0:36c0) - ld a,[rLCDC] - bit 7,a ; is the LCD enabled? - jr nz,.lcdEnabled -.lcdDisabled - ld hl,HpBarAndStatusGraphics - ld de,$9620 - ld bc,$01e0 - ld a,BANK(HpBarAndStatusGraphics) - jp FarCopyData2 ; if LCD is off, transfer all at once -.lcdEnabled - ld de,HpBarAndStatusGraphics - ld hl,$9620 - ld bc,(BANK(HpBarAndStatusGraphics) << 8 | $1e) - jp CopyVideoData ; if LCD is on, transfer during V-blank - -;Fills memory range with the specified byte. -;input registers a = fill_byte, bc = length, hl = address -FillMemory:: ; 36e0 (0:36e0) - push de - ld d, a -.loop - ld a, d - ldi [hl], a - dec bc - ld a, b - or c - jr nz, .loop - pop de - ret - -; loads sprite that de points to -; bank of sprite is given in a -UncompressSpriteFromDE:: ; 36eb (0:36eb) - ld hl, W_SPRITEINPUTPTR - ld [hl], e - inc hl - ld [hl], d - jp UncompressSpriteData - -SaveScreenTilesToBuffer2:: ; 36f4 (0:36f4) - ld hl, wTileMap - ld de, wTileMapBackup2 - ld bc, $168 - call CopyData - ret - -LoadScreenTilesFromBuffer2:: ; 3701 (0:3701) - call LoadScreenTilesFromBuffer2DisableBGTransfer - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a ; $ffba - ret - -; loads screen tiles stored in wTileMapBackup2 but leaves H_AUTOBGTRANSFERENABLED disabled -LoadScreenTilesFromBuffer2DisableBGTransfer:: ; 3709 (0:3709) - xor a - ld [H_AUTOBGTRANSFERENABLED], a ; $ffba - ld hl, wTileMapBackup2 - ld de, wTileMap - ld bc, $168 - call CopyData - ret - -SaveScreenTilesToBuffer1:: ; 3719 (0:3719) - ld hl, wTileMap - ld de, wTileMapBackup - ld bc, $168 - jp CopyData - -LoadScreenTilesFromBuffer1:: ; 3725 (0:3725) - xor a - ld [H_AUTOBGTRANSFERENABLED], a ; $ffba - ld hl, wTileMapBackup - ld de, wTileMap - ld bc, $168 - call CopyData - ld a, $1 - ld [H_AUTOBGTRANSFERENABLED], a ; $ffba - ret - -DelayFrames:: ; 3739 (0:3739) -; wait n frames, where n is the value in c - call DelayFrame - dec c - jr nz,DelayFrames - ret - -PlaySoundWaitForCurrent:: ; 3740 (0:3740) - push af - call WaitForSoundToFinish - pop af - jp PlaySound - -; Wait for sound to finish playing -WaitForSoundToFinish:: ; 3748 (0:3748) - ld a, [$d083] - and $80 - ret nz - push hl -.asm_374f - ld hl, $c02a - xor a - or [hl] - inc hl - or [hl] - inc hl - inc hl - or [hl] - jr nz, .asm_374f - pop hl - ret - -NamePointers:: ; 375d (0:375d) - dw MonsterNames - dw MoveNames - dw UnusedNames - dw ItemNames - dw W_PARTYMON1OT ; player's OT names list - dw W_ENEMYMON1OT ; enemy's OT names list - dw TrainerNames - -GetName:: ; 376b (0:376b) -; arguments: -; [$D0B5] = which name -; [$D0B6] = which list (W_LISTTYPE) -; [$D0B7] = bank of list -; -; returns pointer to name in de - ld a,[$d0b5] - ld [$d11e],a - cp a,$C4 ;it's TM/HM - jp nc,GetMachineName - ld a,[H_LOADEDROMBANK] - push af - push hl - push bc - push de - ld a,[W_LISTTYPE] ;List3759_entrySelector - dec a - jr nz,.otherEntries - ;1 = MON_NAMES - call GetMonName - ld hl,11 - add hl,de - ld e,l - ld d,h - jr .gotPtr -.otherEntries ; $378d - ;2-7 = OTHER ENTRIES - ld a,[$d0b7] - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld a,[W_LISTTYPE] ;VariousNames' entryID - dec a - add a - ld d,0 - ld e,a - jr nc,.skip - inc d -.skip ; $37a0 - ld hl,NamePointers - add hl,de - ld a,[hli] - ld [$ff96],a - ld a,[hl] - ld [$ff95],a - ld a,[$ff95] - ld h,a - ld a,[$ff96] - ld l,a - ld a,[$d0b5] - ld b,a - ld c,0 -.nextName - ld d,h - ld e,l -.nextChar - ld a,[hli] - cp a, "@" - jr nz,.nextChar - inc c ;entry counter - ld a,b ;wanted entry - cp c - jr nz,.nextName - ld h,d - ld l,e - ld de,$cd6d - ld bc,$0014 - call CopyData -.gotPtr ; $37cd - ld a,e - ld [$cf8d],a - ld a,d - ld [$cf8e],a - pop de - pop bc - pop hl - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -GetItemPrice:: ; 37df (0:37df) - ld a, [H_LOADEDROMBANK] - push af - ld a, [wListMenuID] ; $cf94 - cp $1 - ld a, $1 ; hardcoded Bank - jr nz, .asm_37ed - ld a, $f ; hardcoded Bank -.asm_37ed - ld [H_LOADEDROMBANK], a - ld [$2000], a - ld hl, $cf8f - ld a, [hli] - ld h, [hl] - ld l, a - ld a, [$cf91] - cp HM_01 - jr nc, .asm_3812 - ld bc, $3 -.asm_3802 - add hl, bc - dec a - jr nz, .asm_3802 - dec hl - ld a, [hld] - ld [$ff8d], a - ld a, [hld] - ld [H_DOWNARROWBLINKCNT2], a ; $ff8c - ld a, [hl] - ld [H_DOWNARROWBLINKCNT1], a ; $ff8b - jr .asm_381c -.asm_3812 - ld a, Bank(GetMachinePrice) - ld [H_LOADEDROMBANK], a - ld [$2000], a - call GetMachinePrice -.asm_381c - ld de, H_DOWNARROWBLINKCNT1 ; $ff8b - pop af - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret - -; copies a string from [de] to [$cf4b] -CopyStringToCF4B:: ; 3826 (0:3826) - ld hl, $cf4b - ; fall through - -; copies a string from [de] to [hl] -CopyString:: ; 3829 (0:3829) - ld a, [de] - inc de - ld [hli], a - cp "@" - jr nz, CopyString - ret - -; this function is used when lower button sensitivity is wanted (e.g. menus) -; OUTPUT: [$ffb5] = pressed buttons in usual format -; there are two flags that control its functionality, [$ffb6] and [$ffb7] -; there are esentially three modes of operation -; 1. Get newly pressed buttons only -; ([$ffb7] == 0, [$ffb6] == any) -; Just copies [H_NEWLYPRESSEDBUTTONS] to [$ffb5]. -; 2. Get currently pressed buttons at low sample rate with delay -; ([$ffb7] == 1, [$ffb6] != 0) -; If the user holds down buttons for more than half a second, -; report buttons as being pressed up to 12 times per second thereafter. -; If the user holds down buttons for less than half a second, -; report only one button press. -; 3. Same as 2, but report no buttons as pressed if A or B is held down. -; ([$ffb7] == 1, [$ffb6] == 0) -GetJoypadStateLowSensitivity:: ; 3831 (0:3831) - call GetJoypadState - ld a,[$ffb7] ; flag - and a ; get all currently pressed buttons or only newly pressed buttons? - ld a,[H_NEWLYPRESSEDBUTTONS] ; newly pressed buttons - jr z,.storeButtonState - ld a,[H_CURRENTPRESSEDBUTTONS] ; all currently pressed buttons -.storeButtonState - ld [$ffb5],a - ld a,[H_NEWLYPRESSEDBUTTONS] ; newly pressed buttons - and a ; have any buttons been newly pressed since last check? - jr z,.noNewlyPressedButtons -.newlyPressedButtons - ld a,30 ; half a second delay - ld [H_FRAMECOUNTER],a - ret -.noNewlyPressedButtons - ld a,[H_FRAMECOUNTER] - and a ; is the delay over? - jr z,.delayOver -.delayNotOver - xor a - ld [$ffb5],a ; report no buttons as pressed - ret -.delayOver -; if [$ffb6] = 0 and A or B is pressed, report no buttons as pressed - ld a,[H_CURRENTPRESSEDBUTTONS] - and a,%00000011 ; A and B buttons - jr z,.setShortDelay - ld a,[$ffb6] ; flag - and a - jr nz,.setShortDelay - xor a - ld [$ffb5],a -.setShortDelay - ld a,5 ; 1/12 of a second delay - ld [H_FRAMECOUNTER],a - ret - -WaitForTextScrollButtonPress:: ; 3865 (0:3865) - ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b - push af - ld a, [H_DOWNARROWBLINKCNT2] ; $ff8c - push af - xor a - ld [H_DOWNARROWBLINKCNT1], a ; $ff8b - ld a, $6 - ld [H_DOWNARROWBLINKCNT2], a ; $ff8c -.asm_3872 - push hl - ld a, [$d09b] - and a - jr z, .asm_387c - call Func_716c6 -.asm_387c - FuncCoord 18, 16 ; $c4f2 - ld hl, Coord - call HandleDownArrowBlinkTiming - pop hl - call GetJoypadStateLowSensitivity - ld a, $2d - call Predef ; indirect jump to Func_5a5f (5a5f (1:5a5f)) - ld a, [$ffb5] - and BTN_A | BTN_B ; $3 - jr z, .asm_3872 - pop af - ld [H_DOWNARROWBLINKCNT2], a ; $ff8c - pop af - ld [H_DOWNARROWBLINKCNT1], a ; $ff8b - ret - -; (unlass in link battle) waits for A or B being pressed and outputs the scrolling sound effect -ManualTextScroll:: ; 3898 (0:3898) - ld a, [W_ISLINKBATTLE] ; $d12b - cp $4 - jr z, .inLinkBattle - call WaitForTextScrollButtonPress - ld a, (SFX_02_40 - SFX_Headers_02) / 3 - jp PlaySound -.inLinkBattle - ld c, $41 - jp DelayFrames - -; function to do multiplication -; all values are big endian -; INPUT -; FF96-FF98 = multiplicand -; FF99 = multiplier -; OUTPUT -; FF95-FF98 = product -Multiply:: ; 38ac (0:38ac) - push hl - push bc - callab _Multiply - pop bc - pop hl - ret - -; function to do division -; all values are big endian -; INPUT -; FF95-FF98 = dividend -; FF99 = divisor -; b = number of bytes in the dividend (starting from FF95) -; OUTPUT -; FF95-FF98 = quotient -; FF99 = remainder -Divide:: ; 38b9 (0:38b9) - push hl - push de - push bc - ld a,[H_LOADEDROMBANK] - push af - ld a,Bank(_Divide) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call _Divide - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - pop bc - pop de - pop hl - ret - -; This function is used to wait a short period after printing a letter to the -; screen unless the player presses the A/B button or the delay is turned off -; through the [$d730] or [$d358] flags. -PrintLetterDelay:: ; 38d3 (0:38d3) - ld a,[$d730] - bit 6,a - ret nz - ld a,[$d358] - bit 1,a - ret z - push hl - push de - push bc - ld a,[$d358] - bit 0,a - jr z,.waitOneFrame - ld a,[$d355] - and a,$0f - ld [H_FRAMECOUNTER],a - jr .checkButtons -.waitOneFrame - ld a,1 - ld [H_FRAMECOUNTER],a -.checkButtons - call GetJoypadState - ld a,[H_CURRENTPRESSEDBUTTONS] -.checkAButton - bit 0,a ; is the A button pressed? - jr z,.checkBButton - jr .endWait -.checkBButton - bit 1,a ; is the B button pressed? - jr z,.buttonsNotPressed -.endWait - call DelayFrame - jr .done -.buttonsNotPressed ; if neither A nor B is pressed - ld a,[H_FRAMECOUNTER] - and a - jr nz,.checkButtons -.done - pop bc - pop de - pop hl - ret - -; Copies [hl, bc) to [de, bc - hl). -; In other words, the source data is from hl up to but not including bc, -; and the destination is de. -CopyDataUntil:: ; 3913 (0:3913) - ld a,[hli] - ld [de],a - inc de - ld a,h - cp b - jr nz,CopyDataUntil - ld a,l - cp c - jr nz,CopyDataUntil - ret - -; Function to remove a pokemon from the party or the current box. -; wWhichPokemon determines the pokemon. -; [$cf95] == 0 specifies the party. -; [$cf95] != 0 specifies the current box. -RemovePokemon:: ; 391f (0:391f) - ld hl, _RemovePokemon - ld b, BANK(_RemovePokemon) - jp Bankswitch - -AddPokemonToParty:: ; 3927 (0:3927) - push hl - push de - push bc - callba _AddPokemonToParty - pop bc - pop de - pop hl - ret - -; calculates all 5 stats of current mon and writes them to [de] -CalcStats:: ; 3936 (0:3936) - ld c, $0 -.statsLoop - inc c - call CalcStat - ld a, [H_MULTIPLICAND+1] - ld [de], a - inc de - ld a, [H_MULTIPLICAND+2] - ld [de], a - inc de - ld a, c - cp $5 - jr nz, .statsLoop - ret - -; calculates stat c of current mon -; c: stat to calc (HP=1,Atk=2,Def=3,Spd=4,Spc=5) -; b: consider stat exp? -; hl: base ptr to stat exp values ([hl + 2*c - 1] and [hl + 2*c]) -CalcStat:: ; 394a (0:394a) - push hl - push de - push bc - ld a, b - ld d, a - push hl - ld hl, W_MONHEADER - ld b, $0 - add hl, bc - ld a, [hl] ; read base value of stat - ld e, a - pop hl - push hl - sla c - ld a, d - and a - jr z, .statExpDone ; consider stat exp? - add hl, bc ; skip to corresponding stat exp value -.statExpLoop ; calculates ceil(Sqrt(stat exp)) in b - xor a - ld [H_MULTIPLICAND], a - ld [H_MULTIPLICAND+1], a - inc b ; increment current stat exp bonus - ld a, b - cp $ff - jr z, .statExpDone - ld [H_MULTIPLICAND+2], a - ld [H_MULTIPLIER], a - call Multiply - ld a, [hld] - ld d, a - ld a, [$ff98] - sub d - ld a, [hli] - ld d, a - ld a, [$ff97] - sbc d ; test if (current stat exp bonus)^2 < stat exp - jr c, .statExpLoop -.statExpDone - srl c - pop hl - push bc - ld bc, $b ; skip to stat IV values - add hl, bc - pop bc - ld a, c - cp $2 - jr z, .getAttackIV - cp $3 - jr z, .getDefenseIV - cp $4 - jr z, .getSpeedIV - cp $5 - jr z, .getSpecialIV -.getHpIV - push bc - ld a, [hl] ; Atk IV - swap a - and $1 - sla a - sla a - sla a - ld b, a - ld a, [hli] ; Def IV - and $1 - sla a - sla a - add b - ld b, a - ld a, [hl] ; Spd IV - swap a - and $1 - sla a - add b - ld b, a - ld a, [hl] ; Spc IV - and $1 - add b ; HP IV: LSB of the other 4 IVs - pop bc - jr .calcStatFromIV -.getAttackIV - ld a, [hl] - swap a - and $f - jr .calcStatFromIV -.getDefenseIV - ld a, [hl] - and $f - jr .calcStatFromIV -.getSpeedIV - inc hl - ld a, [hl] - swap a - and $f - jr .calcStatFromIV -.getSpecialIV - inc hl - ld a, [hl] - and $f -.calcStatFromIV - ld d, $0 - add e - ld e, a - jr nc, .noCarry - inc d ; de = Base + IV -.noCarry - sla e - rl d ; de = (Base + IV) * 2 - srl b - srl b ; b = ceil(Sqrt(stat exp)) / 4 - ld a, b - add e - jr nc, .noCarry2 - inc d ; da = (Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4 -.noCarry2 - ld [H_MULTIPLICAND+2], a - ld a, d - ld [H_MULTIPLICAND+1], a - xor a - ld [H_MULTIPLICAND], a - ld a, [W_CURENEMYLVL] ; $d127 - ld [H_MULTIPLIER], a - call Multiply ; ((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level - ld a, [H_MULTIPLICAND] - ld [H_DIVIDEND], a - ld a, [H_MULTIPLICAND+1] - ld [H_DIVIDEND+1], a - ld a, [H_MULTIPLICAND+2] - ld [H_DIVIDEND+2], a - ld a, $64 - ld [H_DIVISOR], a - ld a, $3 - ld b, a - call Divide ; (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 - ld a, c - cp $1 - ld a, $5 - jr nz, .notHPStat - ld a, [W_CURENEMYLVL] ; $d127 - ld b, a - ld a, [H_MULTIPLICAND+2] - add b - ld [H_MULTIPLICAND+2], a - jr nc, .noCarry3 - ld a, [H_MULTIPLICAND+1] - inc a - ld [H_MULTIPLICAND+1], a ; HP: (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 + Level -.noCarry3 - ld a, $a -.notHPStat - ld b, a - ld a, [H_MULTIPLICAND+2] - add b - ld [H_MULTIPLICAND+2], a - jr nc, .noCarry4 - ld a, [H_MULTIPLICAND+1] - inc a ; non-HP: (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 + 5 - ld [H_MULTIPLICAND+1], a ; HP: (((Base + IV) * 2 + ceil(Sqrt(stat exp)) / 4) * Level) / 100 + Level + 10 -.noCarry4 - ld a, [H_MULTIPLICAND+1] ; check for overflow (>999) - cp $4 - jr nc, .overflow - cp $3 - jr c, .noOverflow - ld a, [H_MULTIPLICAND+2] - cp $e8 - jr c, .noOverflow -.overflow - ld a, $3 ; overflow: cap at 999 - ld [H_MULTIPLICAND+1], a - ld a, $e7 - ld [H_MULTIPLICAND+2], a -.noOverflow - pop bc - pop de - pop hl - ret - -AddEnemyMonToPlayerParty:: ; 3a53 (0:3a53) - ld a, [H_LOADEDROMBANK] - push af - ld a, BANK(_AddEnemyMonToPlayerParty) - ld [H_LOADEDROMBANK], a - ld [$2000], a - call _AddEnemyMonToPlayerParty - pop bc - ld a, b - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret - -Func_3a68:: ; 3a68 (0:3a68) - ld a, [H_LOADEDROMBANK] - push af - ld a, BANK(Func_f51e) - ld [H_LOADEDROMBANK], a - ld [$2000], a - call Func_f51e - pop bc - ld a, b - ld [H_LOADEDROMBANK], a - ld [$2000], a - ret - -; skips a text entries, each of size $b (like trainer name, OT name, rival name, ...) -; hl: base pointer, will be incremented by $b * a -SkipFixedLengthTextEntries:: ; 3a7d (0:3a7d) - and a - ret z - ld bc, $b -.skipLoop - add hl, bc - dec a - jr nz, .skipLoop - ret - -AddNTimes:: ; 3a87 (0:3a87) -; add bc to hl a times - and a - ret z -.loop - add hl,bc - dec a - jr nz,.loop - ret - -; Compare strings, c bytes in length, at de and hl. -; Often used to compare big endian numbers in battle calculations. -StringCmp:: ; 3a8e (0:3a8e) - ld a,[de] - cp [hl] - ret nz - inc de - inc hl - dec c - jr nz,StringCmp - ret - -; INPUT: -; a = oam block index (each block is 4 oam entries) -; b = Y coordinate of upper left corner of sprite -; c = X coordinate of upper left corner of sprite -; de = base address of 4 tile number and attribute pairs -WriteOAMBlock:: ; 3a97 (0:3a97) - ld h,$c3 - swap a ; multiply by 16 - ld l,a - call .writeOneEntry ; upper left - push bc - ld a,8 - add c - ld c,a - call .writeOneEntry ; upper right - pop bc - ld a,8 - add b - ld b,a - call .writeOneEntry ; lower left - ld a,8 - add c - ld c,a - ; lower right -.writeOneEntry - ld [hl],b ; Y coordinate - inc hl - ld [hl],c ; X coordinate - inc hl - ld a,[de] ; tile number - inc de - ld [hli],a - ld a,[de] ; attribute - inc de - ld [hli],a - ret - -HandleMenuInput:: ; 3abe (0:3abe) - xor a - ld [$d09b],a - -HandleMenuInputPokemonSelection:: ; 3ac2 (0:3ac2) - ld a,[H_DOWNARROWBLINKCNT1] - push af - ld a,[H_DOWNARROWBLINKCNT2] - push af ; save existing values on stack - xor a - ld [H_DOWNARROWBLINKCNT1],a ; blinking down arrow timing value 1 - ld a,$06 - ld [H_DOWNARROWBLINKCNT2],a ; blinking down arrow timing value 2 -.loop1 - xor a - ld [$d08b],a ; counter for pokemon shaking animation - call PlaceMenuCursor - call Delay3 -.loop2 - push hl - ld a,[$d09b] - and a ; is it a pokemon selection menu? - jr z,.getJoypadState - callba AnimatePartyMon ; shake mini sprite of selected pokemon -.getJoypadState - pop hl - call GetJoypadStateLowSensitivity - ld a,[$ffb5] - and a ; was a key pressed? - jr nz,.keyPressed - push hl - FuncCoord 18,11 ; coordinates of blinking down arrow in some menus - ld hl,Coord - call HandleDownArrowBlinkTiming ; blink down arrow (if any) - pop hl - ld a,[wMenuJoypadPollCount] - dec a - jr z,.giveUpWaiting - jr .loop2 -.giveUpWaiting -; if a key wasn't pressed within the specified number of checks - pop af - ld [H_DOWNARROWBLINKCNT2],a - pop af - ld [H_DOWNARROWBLINKCNT1],a ; restore previous values - xor a - ld [wMenuWrappingEnabled],a ; disable menu wrapping - ret -.keyPressed - xor a - ld [$cc4b],a - ld a,[$ffb5] - ld b,a - bit 6,a ; pressed Up key? - jr z,.checkIfDownPressed -.upPressed - ld a,[wCurrentMenuItem] ; selected menu item - and a ; already at the top of the menu? - jr z,.alreadyAtTop -.notAtTop - dec a - ld [wCurrentMenuItem],a ; move selected menu item up one space - jr .checkOtherKeys -.alreadyAtTop - ld a,[wMenuWrappingEnabled] - and a ; is wrapping around enabled? - jr z,.noWrappingAround - ld a,[wMaxMenuItem] - ld [wCurrentMenuItem],a ; wrap to the bottom of the menu - jr .checkOtherKeys -.checkIfDownPressed - bit 7,a - jr z,.checkOtherKeys -.downPressed - ld a,[wCurrentMenuItem] - inc a - ld c,a - ld a,[wMaxMenuItem] - cp c - jr nc,.notAtBottom -.alreadyAtBottom - ld a,[wMenuWrappingEnabled] - and a ; is wrapping around enabled? - jr z,.noWrappingAround - ld c,$00 ; wrap from bottom to top -.notAtBottom - ld a,c - ld [wCurrentMenuItem],a -.checkOtherKeys - ld a,[wMenuWatchedKeys] - and b ; does the menu care about any of the pressed keys? - jp z,.loop1 -.checkIfAButtonOrBButtonPressed - ld a,[$ffb5] - and a,%00000011 ; pressed A button or B button? - jr z,.skipPlayingSound -.AButtonOrBButtonPressed - push hl - ld hl,wFlags_0xcd60 - bit 5,[hl] - pop hl - jr nz,.skipPlayingSound - ld a,(SFX_02_40 - SFX_Headers_02) / 3 - call PlaySound ; play sound -.skipPlayingSound - pop af - ld [H_DOWNARROWBLINKCNT2],a - pop af - ld [H_DOWNARROWBLINKCNT1],a ; restore previous values - xor a - ld [wMenuWrappingEnabled],a ; disable menu wrapping - ld a,[$ffb5] - ret -.noWrappingAround - ld a,[$cc37] - and a ; should we return if the user tried to go past the top or bottom? - jr z,.checkOtherKeys - jr .checkIfAButtonOrBButtonPressed - -PlaceMenuCursor:: ; 3b7c (0:3b7c) - ld a,[wTopMenuItemY] - and a ; is the y coordinate 0? - jr z,.adjustForXCoord - ld hl,wTileMap - ld bc,20 ; screen width -.topMenuItemLoop - add hl,bc - dec a - jr nz,.topMenuItemLoop -.adjustForXCoord - ld a,[wTopMenuItemX] - ld b,$00 - ld c,a - add hl,bc - push hl - ld a,[wLastMenuItem] - and a ; was the previous menu id 0? - jr z,.checkForArrow1 - push af - ld a,[$fff6] - bit 1,a ; is the menu double spaced? - jr z,.doubleSpaced1 - ld bc,20 - jr .getOldMenuItemScreenPosition -.doubleSpaced1 - ld bc,40 -.getOldMenuItemScreenPosition - pop af -.oldMenuItemLoop - add hl,bc - dec a - jr nz,.oldMenuItemLoop -.checkForArrow1 - ld a,[hl] - cp a,"▶" ; was an arrow next to the previously selected menu item? - jr nz,.skipClearingArrow -.clearArrow - ld a,[wTileBehindCursor] - ld [hl],a -.skipClearingArrow - pop hl - ld a,[wCurrentMenuItem] - and a - jr z,.checkForArrow2 - push af - ld a,[$fff6] - bit 1,a ; is the menu double spaced? - jr z,.doubleSpaced2 - ld bc,20 - jr .getCurrentMenuItemScreenPosition -.doubleSpaced2 - ld bc,40 -.getCurrentMenuItemScreenPosition - pop af -.currentMenuItemLoop - add hl,bc - dec a - jr nz,.currentMenuItemLoop -.checkForArrow2 - ld a,[hl] - cp a,"▶" ; has the right arrow already been placed? - jr z,.skipSavingTile ; if so, don't lose the saved tile - ld [wTileBehindCursor],a ; save tile before overwriting with right arrow -.skipSavingTile - ld a,"▶" ; place right arrow - ld [hl],a - ld a,l - ld [wMenuCursorLocation],a - ld a,h - ld [wMenuCursorLocation + 1],a - ld a,[wCurrentMenuItem] - ld [wLastMenuItem],a - ret - -; This is used to mark a menu cursor other than the one currently being -; manipulated. In the case of submenus, this is used to show the location of -; the menu cursor in the parent menu. In the case of swapping items in list, -; this is used to mark the item that was first chosen to be swapped. -PlaceUnfilledArrowMenuCursor:: ; 3bec (0:3bec) - ld b,a - ld a,[wMenuCursorLocation] - ld l,a - ld a,[wMenuCursorLocation + 1] - ld h,a - ld [hl],$ec ; outline of right arrow - ld a,b - ret - -; Replaces the menu cursor with a blank space. -EraseMenuCursor:: ; 3bf9 (0:3bf9) - ld a,[wMenuCursorLocation] - ld l,a - ld a,[wMenuCursorLocation + 1] - ld h,a - ld [hl]," " - ret - -; This toggles a blinking down arrow at hl on and off after a delay has passed. -; This is often called even when no blinking is occurring. -; The reason is that most functions that call this initialize H_DOWNARROWBLINKCNT1 to 0. -; The effect is that if the tile at hl is initialized with a down arrow, -; this function will toggle that down arrow on and off, but if the tile isn't -; initliazed with a down arrow, this function does nothing. -; That allows this to be called without worrying about if a down arrow should -; be blinking. -HandleDownArrowBlinkTiming:: ; 3c04 (0:3c04) - ld a,[hl] - ld b,a - ld a,$ee ; down arrow - cp b - jr nz,.downArrowOff -.downArrowOn - ld a,[H_DOWNARROWBLINKCNT1] - dec a - ld [H_DOWNARROWBLINKCNT1],a - ret nz - ld a,[H_DOWNARROWBLINKCNT2] - dec a - ld [H_DOWNARROWBLINKCNT2],a - ret nz - ld a," " - ld [hl],a - ld a,$ff - ld [H_DOWNARROWBLINKCNT1],a - ld a,$06 - ld [H_DOWNARROWBLINKCNT2],a - ret -.downArrowOff - ld a,[H_DOWNARROWBLINKCNT1] - and a - ret z - dec a - ld [H_DOWNARROWBLINKCNT1],a - ret nz - dec a - ld [H_DOWNARROWBLINKCNT1],a - ld a,[H_DOWNARROWBLINKCNT2] - dec a - ld [H_DOWNARROWBLINKCNT2],a - ret nz - ld a,$06 - ld [H_DOWNARROWBLINKCNT2],a - ld a,$ee ; down arrow - ld [hl],a - ret - -; The following code either enables or disables the automatic drawing of -; text boxes by DisplayTextID. Both functions cause DisplayTextID to wait -; for a button press after displaying text (unless [$cc47] is set). - -EnableAutoTextBoxDrawing:: ; 3c3c (0:3c3c) - xor a - jr AutoTextBoxDrawingCommon - -DisableAutoTextBoxDrawing:: ; 3c3f (0:3c3f) - ld a,$01 - -AutoTextBoxDrawingCommon:: ; 3c41 (0:3c41) - ld [$cf0c],a ; control text box drawing - xor a - ld [$cc3c],a ; make DisplayTextID wait for button press - ret - -PrintText:: ; 3c49 (0:3c49) -; given a pointer in hl, print the text there - push hl - ld a,1 - ld [$D125],a - call DisplayTextBoxID - call UpdateSprites - call Delay3 - pop hl -Func_3c59:: ; 3c59 (0:3c59) - FuncCoord 1,14 - ld bc,Coord ;$C4B9 - jp TextCommandProcessor - -; converts a big-endian binary number into decimal and prints it -; INPUT: -; b = flags and number of bytes -; bit 7: if set, print leading zeroes -; if unset, do not print leading zeroes -; bit 6: if set, left-align the string (do not pad empty digits with spaces) -; if unset, right-align the string -; bits 4-5: unused -; bits 0-3: number of bytes (only 1 - 3 bytes supported) -; c = number of decimal digits -; de = address of the number (big-endian) -PrintNumber:: ; 3c5f (0:3c5f) - push bc - xor a - ld [H_PASTLEADINGZEROES],a - ld [H_NUMTOPRINT],a - ld [H_NUMTOPRINT + 1],a - ld a,b - and a,%00001111 - cp a,1 - jr z,.oneByte - cp a,2 - jr z,.twoBytes -.threeBytes - ld a,[de] - ld [H_NUMTOPRINT],a - inc de - ld a,[de] - ld [H_NUMTOPRINT + 1],a - inc de - ld a,[de] - ld [H_NUMTOPRINT + 2],a - jr .checkNumDigits -.twoBytes - ld a,[de] - ld [H_NUMTOPRINT + 1],a - inc de - ld a,[de] - ld [H_NUMTOPRINT + 2],a - jr .checkNumDigits -.oneByte - ld a,[de] - ld [H_NUMTOPRINT + 2],a -.checkNumDigits - push de - ld d,b - ld a,c - ld b,a - xor a - ld c,a - ld a,b ; a = number of decimal digits - cp a,2 - jr z,.tensPlace - cp a,3 - jr z,.hundredsPlace - cp a,4 - jr z,.thousandsPlace - cp a,5 - jr z,.tenThousandsPlace - cp a,6 - jr z,.hundredThousandsPlace -.millionsPlace - ld a,1000000 >> 16 - ld [H_POWEROFTEN],a - ld a,(1000000 >> 8) & $FF - ld [H_POWEROFTEN + 1],a - ld a,1000000 & $FF - ld [H_POWEROFTEN + 2],a - call PrintNumber_PrintDigit - call PrintNumber_AdvancePointer -.hundredThousandsPlace - ld a,100000 >> 16 - ld [H_POWEROFTEN],a - ld a,(100000 >> 8) & $FF - ld [H_POWEROFTEN + 1],a - ld a,100000 & $FF - ld [H_POWEROFTEN + 2],a - call PrintNumber_PrintDigit - call PrintNumber_AdvancePointer -.tenThousandsPlace - xor a - ld [H_POWEROFTEN],a - ld a,10000 >> 8 - ld [H_POWEROFTEN + 1],a - ld a,10000 & $FF - ld [H_POWEROFTEN + 2],a - call PrintNumber_PrintDigit - call PrintNumber_AdvancePointer -.thousandsPlace - xor a - ld [H_POWEROFTEN],a - ld a,1000 >> 8 - ld [H_POWEROFTEN + 1],a - ld a,1000 & $FF - ld [H_POWEROFTEN + 2],a - call PrintNumber_PrintDigit - call PrintNumber_AdvancePointer -.hundredsPlace - xor a - ld [H_POWEROFTEN],a - xor a - ld [H_POWEROFTEN + 1],a - ld a,100 - ld [H_POWEROFTEN + 2],a - call PrintNumber_PrintDigit - call PrintNumber_AdvancePointer -.tensPlace - ld c,00 - ld a,[H_NUMTOPRINT + 2] -.loop - cp a,10 - jr c,.underflow - sub a,10 - inc c - jr .loop -.underflow - ld b,a - ld a,[H_PASTLEADINGZEROES] - or c - ld [H_PASTLEADINGZEROES],a - jr nz,.pastLeadingZeroes - call PrintNumber_PrintLeadingZero - jr .advancePointer -.pastLeadingZeroes - ld a,"0" - add c - ld [hl],a -.advancePointer - call PrintNumber_AdvancePointer -.onesPlace - ld a,"0" - add b - ld [hli],a - pop de - dec de - pop bc - ret - -; prints a decimal digit -; This works by repeatedely subtracting a power of ten until the number becomes negative. -; The number of subtractions it took in order to make the number negative is the digit for the current number place. -; The last value that the number had before becoming negative is kept as the new value of the number. -; A more succinct description is that the number is divided by a power of ten -; and the quotient becomes the digit while the remainder is stored as the new value of the number. -PrintNumber_PrintDigit:: ; 3d25 (0:3d25) - ld c,0 ; counts number of loop iterations to determine the decimal digit -.loop - ld a,[H_POWEROFTEN] - ld b,a - ld a,[H_NUMTOPRINT] - ld [H_SAVEDNUMTOPRINT],a - cp b - jr c,.underflow0 - sub b - ld [H_NUMTOPRINT],a - ld a,[H_POWEROFTEN + 1] - ld b,a - ld a,[H_NUMTOPRINT + 1] - ld [H_SAVEDNUMTOPRINT + 1],a - cp b - jr nc,.noBorrowForByte1 -.byte1BorrowFromByte0 - ld a,[H_NUMTOPRINT] - or a,0 - jr z,.underflow1 - dec a - ld [H_NUMTOPRINT],a - ld a,[H_NUMTOPRINT + 1] -.noBorrowForByte1 - sub b - ld [H_NUMTOPRINT + 1],a - ld a,[H_POWEROFTEN + 2] - ld b,a - ld a,[H_NUMTOPRINT + 2] - ld [H_SAVEDNUMTOPRINT + 2],a - cp b - jr nc,.noBorrowForByte2 -.byte2BorrowFromByte1 - ld a,[H_NUMTOPRINT + 1] - and a - jr nz,.finishByte2BorrowFromByte1 -.byte2BorrowFromByte0 - ld a,[H_NUMTOPRINT] - and a - jr z,.underflow2 - dec a - ld [H_NUMTOPRINT],a - xor a -.finishByte2BorrowFromByte1 - dec a - ld [H_NUMTOPRINT + 1],a - ld a,[H_NUMTOPRINT + 2] -.noBorrowForByte2 - sub b - ld [H_NUMTOPRINT + 2],a - inc c - jr .loop -.underflow2 - ld a,[H_SAVEDNUMTOPRINT + 1] - ld [H_NUMTOPRINT + 1],a -.underflow1 - ld a,[H_SAVEDNUMTOPRINT] - ld [H_NUMTOPRINT],a -.underflow0 - ld a,[H_PASTLEADINGZEROES] - or c - jr z,PrintNumber_PrintLeadingZero - ld a,"0" - add c - ld [hl],a - ld [H_PASTLEADINGZEROES],a - ret - -; prints a leading zero unless they are turned off in the flags -PrintNumber_PrintLeadingZero:: ; 3d83 (0:3d83) - bit 7,d ; print leading zeroes? - ret z - ld [hl],"0" - ret - -; increments the pointer unless leading zeroes are not being printed, -; the number is left-aligned, and no nonzero digits have been printed yet -PrintNumber_AdvancePointer:: ; 3d89 (0:3d89) - bit 7,d ; print leading zeroes? - jr nz,.incrementPointer - bit 6,d ; left alignment or right alignment? - jr z,.incrementPointer - ld a,[H_PASTLEADINGZEROES] - and a - ret z -.incrementPointer - inc hl - ret - -; calls a function from a table of function pointers -; INPUT: -; a = index within table -; hl = address of function pointer table -CallFunctionInTable:: ; 3d97 (0:3d97) - push hl - push de - push bc - add a - ld d,0 - ld e,a - add hl,de - ld a,[hli] - ld h,[hl] - ld l,a - ld de,.returnAddress - push de - jp [hl] -.returnAddress - pop bc - pop de - pop hl - ret - -; searches an array at hl for the value in a. -; skips (de − 1) bytes between reads, so to check every byte, de should be 1. -; if found, returns count in b and sets carry. -IsInArray:: ; 3dab (0:3dab) - ld b,0 - ; fall through - -IsInArrayCummulativeCount:: ; 3dad (0:3dad) - ld c,a -.loop - ld a,[hl] - cp a,$FF - jr z,.NotInArray - cp c - jr z,.InArray - inc b - add hl,de - jr .loop -.NotInArray - and a - ret -.InArray - scf - ret - -Func_3dbe:: ; 3dbe (0:3dbe) - call CleanLCD_OAM - ld a, $1 - ld [$cfcb], a - call Func_3e08 - call LoadScreenTilesFromBuffer2 - call LoadTextBoxTilePatterns - call GoPAL_SET_CF1C - jr Delay3 - -; calls GBPalWhiteOut and then Delay3 -GBPalWhiteOutWithDelay3:: ; 3dd4 (0:3dd4) - call GBPalWhiteOut - -Delay3:: ; 3dd7 (0:3dd7) -; call Delay with a parameter of 3 - ld c,3 - jp DelayFrames - -; resets BGP and OBP0 to their usual colors -GBPalNormal:: ; 3ddc (0:3ddc) - ld a,%11100100 - ld [rBGP],a - ld a,%11010000 - ld [rOBP0],a - ret - -; makes all palette colors white -GBPalWhiteOut:: ; 3de5 (0:3de5) - xor a - ld [rBGP],a - ld [rOBP0],a - ld [rOBP1],a - ret - -GoPAL_SET_CF1C:: ; 3ded (0:3ded) - ld b,$ff -GoPAL_SET:: ; 3def (0:3def) - ld a,[$cf1b] - and a - ret z - ld a,$45 - jp Predef - -; hl points to where the color gets stored -; e contains the number of pixels filled in the health bar (out of 48) -GetHealthBarColor:: ; 3df9 (0:3df9) - ld a, e - cp 27 - ld d, $0 ; green - jr nc, .gotColor - cp 10 - inc d ; yellow - jr nc, .gotColor - inc d ; red -.gotColor - ld [hl], d - ret - -Func_3e08:: ; 3e08 (0:3e08) - ld hl, $cfc4 - ld a, [hl] - push af - res 0, [hl] - push hl - xor a - ld [W_SPRITESETID], a ; $d3a8 - call DisableLCD - callba InitMapSprites - call EnableLCD - pop hl - pop af - ld [hl], a - call LoadPlayerSpriteGraphics - call LoadFontTilePatterns - jp UpdateSprites - -GiveItem:: ; 3e2e (0:3e2e) -; Give player quantity c of item b, and copy item name to $cf4b. -; Set carry on success. If no room in bag, reset carry. - ld a, b - ld [$d11e], a - ld [$cf91], a - ld a, c - ld [$cf96], a - ld hl,wNumBagItems - call AddItemToInventory - ret nc - call GetItemName ; $2fcf - call CopyStringToCF4B - scf - ret - -GivePokemon:: ; 3e48 (0:3e48) - ld a, b - ld [$cf91], a - ld a, c - ld [$d127], a - xor a - ld [$cc49], a - ld b, BANK(_GivePokemon) - ld hl, _GivePokemon - jp Bankswitch - -GenRandom:: ; 3e5c (0:3e5c) -; store a random 8-bit value in a - push hl - push de - push bc - callba GenRandom_ - ld a,[H_RAND1] - pop bc - pop de - pop hl - ret - -Predef:: ; 3e6d (0:3e6d) -; runs a predefined ASM command, where the command ID is read from $D0B7 -; $3E6D grabs the ath pointer from PredefPointers and executes it - - ld [$CC4E],a ; save the predef routine's ID for later - - ld a,[H_LOADEDROMBANK] - ld [$CF12],a - - ; save bank and call 13:7E49 - push af - ld a,BANK(GetPredefPointer) - ld [H_LOADEDROMBANK],a - ld [$2000],a - call GetPredefPointer - - ; call the predef function - ; ($D0B7 has the bank of the predef routine) - ld a,[$D0B7] - ld [H_LOADEDROMBANK],a - ld [$2000],a - ld de,.Return - push de - jp [hl] - ; after the predefined function finishes it returns here -.Return - pop af - ld [H_LOADEDROMBANK],a - ld [$2000],a - ret - -;loads hl from cc4f, de from cc51, and bc from cc53 - -Load16BitRegisters:: ; 3e94 (0:3e94) - ld a, [$cc4f] - ld h, a - ld a, [$cc50] - ld l, a - ld a, [$cc51] - ld d, a - ld a, [$cc52] - ld e, a - ld a, [$cc53] - ld b, a - ld a, [$cc54] - ld c, a - ret - -Func_3ead:: ; 3ead (0:3ead) - ld b, BANK(CinnabarGymQuiz_1eb0a) - ld hl, CinnabarGymQuiz_1eb0a - jp Bankswitch - -Func_3eb5:: ; 3eb5 (0:3eb5) - ld a, [H_LOADEDROMBANK] - push af - ld a, [H_CURRENTPRESSEDBUTTONS] - bit 0, a - jr z, .asm_3eea - ld a, Bank(Func_469a0) - ld [$2000], a - ld [H_LOADEDROMBANK], a - call Func_469a0 - ld a, [$ffee] - and a - jr nz, .asm_3edd - ld a, [$cd3e] - ld [$2000], a - ld [H_LOADEDROMBANK], a - ld de, .asm_3eda - push de - jp [hl] -.asm_3eda - xor a - jr .asm_3eec -.asm_3edd - callba PrintBookshelfText - ld a, [$ffdb] - and a - jr z, .asm_3eec -.asm_3eea - ld a, $ff -.asm_3eec - ld [$ffeb], a - pop af - ld [$2000], a - ld [H_LOADEDROMBANK], a - ret - -PrintPredefTextID:: ; 3ef5 (0:3ef5) - ld [H_DOWNARROWBLINKCNT2], a ; $ff8c - ld hl, PointerTable_3f22 - call Func_3f0f - ld hl, $cf11 - set 0, [hl] - call DisplayTextID - -Func_3f05:: ; 3f05 (0:3f05) - ld hl, W_MAPTEXTPTR ; $d36c - ld a, [$ffec] - ld [hli], a - ld a, [$ffed] - ld [hl], a - ret - -Func_3f0f:: ; 3f0f (0:3f0f) - ld a, [W_MAPTEXTPTR] ; $d36c - ld [$ffec], a - ld a, [$d36d] - ld [$ffed], a - ld a, l - ld [W_MAPTEXTPTR], a ; $d36c - ld a, h - ld [$d36d], a - ret - -PointerTable_3f22:: ; 3f22 (0:3f22) - dw CardKeySuccessText ; id = 01 - dw CardKeyFailText ; id = 02 - dw RedBedroomPC ; id = 03 - dw RedBedroomSNESText ; id = 04 - dw PushStartText ; id = 05 - dw SaveOptionText ; id = 06 - dw StrengthsAndWeaknessesText ; id = 07 - dw OakLabEmailText ; id = 08 - dw AerodactylFossilText ; id = 09 - dw Route15UpstairsBinocularsText ; id = 0A - dw KabutopsFossilText ; id = 0B - dw GymStatueText1 ; id = 0C - dw GymStatueText2 ; id = 0D - dw BookcaseText ; id = 0E - dw ViridianCityPokecenterBenchGuyText ; id = 0F - dw PewterCityPokecenterBenchGuyText ; id = 10 - dw CeruleanCityPokecenterBenchGuyText ; id = 11 - dw LavenderCityPokecenterBenchGuyText ; id = 12 - dw VermilionCityPokecenterBenchGuyText ; id = 13 - dw CeladonCityPokecenterBenchGuyText ; id = 14 - dw CeladonCityHotelText ; id = 15 - dw FuchsiaCityPokecenterBenchGuyText ; id = 16 - dw CinnabarIslandPokecenterBenchGuyText ; id = 17 - dw SaffronCityPokecenterBenchGuyText ; id = 18 - dw MtMoonPokecenterBenchGuyText ; id = 19 - dw RockTunnelPokecenterBenchGuyText ; id = 1A - dw UnusedBenchGuyText1 ; id = 1B - dw UnusedBenchGuyText2 ; id = 1C - dw UnusedBenchGuyText3 ; id = 1D - dw TerminatorText_62508 ; id = 1E - dw PredefText1f ; id = 1F - dw ViridianSchoolNotebook ; id = 20 - dw ViridianSchoolBlackboard ; id = 21 - dw JustAMomentText ; id = 22 - dw PredefText23 ; id = 23 - dw FoundHiddenItemText ; id = 24 - dw HiddenItemBagFullText ; id = 25 - dw VermilionGymTrashText ; id = 26 - dw IndigoPlateauHQText ; id = 27 - dw GameCornerOutOfOrderText ; id = 28 - dw GameCornerOutToLunchText ; id = 29 - dw GameCornerSomeonesKeysText ; id = 2A - dw FoundHiddenCoinsText ; id = 2B - dw DroppedHiddenCoinsText ; id = 2C - dw BillsHouseMonitorText ; id = 2D - dw BillsHouseInitiatedText ; id = 2E - dw BillsHousePokemonList ; id = 2F - dw MagazinesText ; id = 30 - dw CinnabarGymQuiz ; id = 31 - dw GameCornerNoCoinsText ; id = 32 - dw GameCornerCoinCaseText ; id = 33 - dw LinkCableHelp ; id = 34 - dw TMNotebook ; id = 35 - dw FightingDojoText ; id = 36 - dw FightingDojoText_52a10 ; id = 37 - dw FightingDojoText_52a1d ; id = 38 - dw NewBicycleText ; id = 39 - dw IndigoPlateauStatues ; id = 3A - dw VermilionGymTrashSuccesText1 ; id = 3B - dw VermilionGymTrashSuccesText2 ; id = 3C - dw VermilionGymTrashSuccesText3 ; id = 3D - dw VermilionGymTrashFailText ; id = 3E - dw TownMapText ; id = 3F - dw BookOrSculptureText ; id = 40 - dw ElevatorText ; id = 41 - dw PokemonStuffText ; id = 42 SECTION "bank1",ROMX,BANK[$1] -SpriteFacingAndAnimationTable: ; 4000 (1:4000) - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; facing down, walk animation frame 0 - dw SpriteFacingDownAndWalking, SpriteOAMParameters ; facing down, walk animation frame 1 - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; facing down, walk animation frame 2 - dw SpriteFacingDownAndWalking, SpriteOAMParametersFlipped ; facing down, walk animation frame 3 - dw SpriteFacingUpAndStanding, SpriteOAMParameters ; facing up, walk animation frame 0 - dw SpriteFacingUpAndWalking, SpriteOAMParameters ; facing up, walk animation frame 1 - dw SpriteFacingUpAndStanding, SpriteOAMParameters ; facing up, walk animation frame 2 - dw SpriteFacingUpAndWalking, SpriteOAMParametersFlipped ; facing up, walk animation frame 3 - dw SpriteFacingLeftAndStanding, SpriteOAMParameters ; facing left, walk animation frame 0 - dw SpriteFacingLeftAndWalking, SpriteOAMParameters ; facing left, walk animation frame 1 - dw SpriteFacingLeftAndStanding, SpriteOAMParameters ; facing left, walk animation frame 2 - dw SpriteFacingLeftAndWalking, SpriteOAMParameters ; facing left, walk animation frame 3 - dw SpriteFacingLeftAndStanding, SpriteOAMParametersFlipped ; facing right, walk animation frame 0 - dw SpriteFacingLeftAndWalking, SpriteOAMParametersFlipped ; facing right, walk animation frame 1 - dw SpriteFacingLeftAndStanding, SpriteOAMParametersFlipped ; facing right, walk animation frame 2 - dw SpriteFacingLeftAndWalking, SpriteOAMParametersFlipped ; facing right, walk animation frame 3 - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; --- - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; This table is used for sprites $a and $b. - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; All orientation and animation parameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; lead to the same result. Used for immobile - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; sprites like items on the ground - dw SpriteFacingDownAndStanding, SpriteOAMParameters ; --- - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - dw SpriteFacingDownAndStanding, SpriteOAMParameters - -SpriteFacingDownAndStanding: ; 4080 (1:4080) - db $00,$01,$02,$03 -SpriteFacingDownAndWalking: ; 4084 (1:4084) - db $80,$81,$82,$83 -SpriteFacingUpAndStanding: ; 4088 (1:4088) - db $04,$05,$06,$07 -SpriteFacingUpAndWalking: ; 408c (1:408c) - db $84,$85,$86,$87 -SpriteFacingLeftAndStanding: ; 4090 (1:4090) - db $08,$09,$0a,$0b -SpriteFacingLeftAndWalking: ; 4094 (1:4094) - db $88,$89,$8a,$8b - -SpriteOAMParameters: ; 4098 (1:4098) - db $00,$00, $00 ; top left - db $00,$08, $00 ; top right - db $08,$00, OAMFLAG_CANBEMASKED ; bottom left - db $08,$08, OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA ; bottom right -SpriteOAMParametersFlipped: ; 40a4 (1:40a4) - db $00,$08, OAMFLAG_VFLIPPED - db $00,$00, OAMFLAG_VFLIPPED - db $08,$08, OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED - db $08,$00, OAMFLAG_VFLIPPED | OAMFLAG_CANBEMASKED | OAMFLAG_ENDOFDATA - -Func_40b0: ; 40b0 (1:40b0) +INCLUDE "data/facing.asm" + +Func_40b0:: +; Reset player status on blackout. xor a - ld [$cf0b], a - ld [$d700], a - ld [W_ISINBATTLE], a ; $d057 - ld [$d35d], a - ld [$cf10], a - ld [H_CURRENTPRESSEDBUTTONS], a - ld [$cc57], a + ld [wcf0b], a + ld [wd700], a + ld [W_ISINBATTLE], a + ld [wd35d], a + ld [wcf10], a + ld [hJoyHeld], a + ld [wcc57], a ld [wFlags_0xcd60], a + ld [$ff9f], a - ld [$ffa0], a - ld [$ffa1], a + ld [$ff9f + 1], a + ld [$ff9f + 2], a call HasEnoughMoney - jr c, .asm_40ff - ld a, [wPlayerMoney] ; $d347 + jr c, .lostmoney ; never happens + + ; Halve the player's money. + ld a, [wPlayerMoney] ld [$ff9f], a - ld a, [wPlayerMoney + 1] ; $d348 - ld [$ffa0], a - ld a, [wPlayerMoney + 2] ; $d349 - ld [$ffa1], a + ld a, [wPlayerMoney + 1] + ld [$ff9f + 1], a + ld a, [wPlayerMoney + 2] + ld [$ff9f + 2], a xor a ld [$ffa2], a ld [$ffa3], a - ld a, $2 + ld a, 2 ld [$ffa4], a - ld a, $d - call Predef ; indirect jump to Func_f71e (f71e (3:771e)) + predef DivideBCDPredef3 ld a, [$ffa2] - ld [wPlayerMoney], a ; $d347 - ld a, [$ffa3] - ld [wPlayerMoney + 1], a ; $d348 - ld a, [$ffa4] - ld [wPlayerMoney + 2], a ; $d349 -.asm_40ff - ld hl, $d732 + ld [wPlayerMoney], a + ld a, [$ffa2 + 1] + ld [wPlayerMoney + 1], a + ld a, [$ffa2 + 2] + ld [wPlayerMoney + 2], a + +.lostmoney + ld hl, wd732 set 2, [hl] res 3, [hl] set 6, [hl] - ld a, $ff - ld [wJoypadForbiddenButtonsMask], a - ld a, $7 - jp Predef ; indirect jump to HealParty (f6a5 (3:76a5)) + ld a, %11111111 + ld [wJoyIgnore], a + predef_jump HealParty -MewPicFront: ; 4112 (1:4112) - INCBIN "pic/bmon/mew.pic" -MewPicBack: ; 4205 (1:4205) - INCBIN "pic/monback/mewb.pic" +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: ; 45aa (1:45aa) - db "NINTEN@" +NintenText: db "NINTEN@" +SonyText: db "SONY@" -SonyText: ; 45b1 (1:45b1) - db "SONY@" -; loads pokemon data from one of multiple sources to $cf98 -; loads base stats to $d0b8 -; INPUT: -; [$cf92] = index of pokemon within party/box -; [$cc49] = source -; 00: player's party -; 01: enemy's party -; 02: current box -; 03: daycare -; OUTPUT: -; [$cf91] = pokemon ID -; $cf98 = base address of pokemon data -; $d0b8 = base address of base stats -LoadMonData_: ; 45b6 (1:45b6) - ld a,[W_DAYCAREMONDATA] ; daycare pokemon ID - ld [$cf91],a - ld a,[$cc49] - cp a,$03 - jr z,.GetMonHeader - ld a,[wWhichPokemon] - ld e,a +LoadMonData_: +; Load monster [wWhichPokemon] from list [wcc49]: +; 0: partymon +; 1: enemymon +; 2: boxmon +; 3: daycaremon +; Return monster id at wcf91 and its data at wcf98. +; Also load base stats at W_MONHDEXNUM for convenience. + + ld a, [wDayCareMonSpecies] + ld [wcf91], a + ld a, [wcc49] + cp 3 + jr z, .GetMonHeader + + ld a, [wWhichPokemon] + ld e, a callab Func_39c37 ; get pokemon ID + .GetMonHeader - ld a,[$cf91] - ld [$d0b5],a ; input for GetMonHeader - call GetMonHeader ; load base stats to $d0b8 - ld hl,W_PARTYMON1DATA - ld bc,44 - ld a,[$cc49] - cp a,$01 - jr c,.getMonEntry - ld hl,wEnemyMons ; enemy pokemon 1 data - jr z,.getMonEntry - cp a,$02 - ld hl,W_BOXMON1DATA ; box pokemon 1 data - ld bc,33 - jr z,.getMonEntry - ld hl, W_DAYCAREMONDATA ; daycare pokemon data + ld a, [wcf91] + ld [wd0b5], a ; input for GetMonHeader + call GetMonHeader + + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 + ld a, [wcc49] + cp 1 + jr c, .getMonEntry + + ld hl, wEnemyMons + jr z, .getMonEntry + + cp 2 + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 + jr z, .getMonEntry + + ld hl, wDayCareMon jr .copyMonData -.getMonEntry ; add the product of the index and the size of each entry - ld a,[wWhichPokemon] + +.getMonEntry + ld a, [wWhichPokemon] call AddNTimes + .copyMonData - ld de,$cf98 - ld bc,44 + ld de, wcf98 + ld bc, 44 jp CopyData -INCLUDE "data/item_prices.asm" +INCLUDE "data/item_prices.asm" INCLUDE "text/item_names.asm" -UnusedNames: ; 4a92 (1:4a92) +UnusedNames: db "かみなりバッヂ@" db "かいがらバッヂ@" db "おじぞうバッヂ@" @@ -10322,190 +154,14 @@ UnusedNames: ; 4a92 (1:4a92) db "マスター@" db "エクセレント" -; calculates the OAM data for all currently visible sprites and writes it to wOAMBuffer -PrepareOAMData: ; 4b0f (1:4b0f) - ld a, [$cfcb] - dec a - jr z, .asm_4b1e - cp $ff - ret nz - ld [$cfcb], a - jp ResetLCD_OAM -.asm_4b1e - xor a - ld [$ff90], a -.asm_4b21 - ld [$ff8f], a - ld d, $c1 - ld a, [$ff8f] - ld e, a - ld a, [de] ; c1x0 - and a - jp z, .asm_4bad - inc e - inc e - ld a, [de] ; c1x2 read combined orientation and animation info - ld [$d5cd], a - cp $ff - jr nz, .spriteVisible ; $ff -> offscreen, don't draw - call Func_4bd1 - jr .asm_4bad -.spriteVisible - cp $a0 - jr c, .considerOrientation ; if >= $a0, ignore the sprite orientation and animation (by using a different conversion table) - and $f - add $10 - jr .asm_4b48 -.considerOrientation - and $f ; the lower nybble contains orientation and animation info -.asm_4b48 - ld l, a - push de - inc d - ld a, e - add $5 - ld e, a - ld a, [de] ; c2x7 - and $80 - ld [$ff94], a ; temp store bit 7 for later use in OAM flags (draws sprite behind background (used for grass)) - pop de - ld h, $0 - ld bc, SpriteFacingAndAnimationTable - add hl, hl - add hl, hl - add hl, bc ; skip to the table location determined by orientation and animation - ld a, [hli] - ld c, a - ld a, [hli] - ld b, a - ld a, [hli] - ld h, [hl] - ld l, a - call Func_4bd1 - ld a, [$ff90] - ld e, a - ld d, $c3 ; wOAMBuffer+x is buffer for OAM data -.spriteTilesLoop ; loops 4 times for the 4 tiles a sprite consists of - ld a, [$ff92] ; temp for sprite Y position - add $10 ; Y=16 is top of screen (Y=0 is invisible) - add [hl] ; add Y offset from table - ld [de], a ; write new sprite OAM Y position - inc hl - ld a, [$ff91] ; temp for sprite X position - add $8 ; X=8 is left of screen (X=0 is invisible) - add [hl] ; add X offset from table - inc e - ld [de], a ; write new sprite OAM X position - inc e - ld a, [bc] ; read pattern number offset (accomodates orientation (offset 0,4 or 8) and animation (offset 0 or $80)) - inc bc - push bc - ld b, a - ld a, [$d5cd] ; temp copy of c1x2 - swap a ; high nybble determines sprite used (0 is always player sprite, next are some npcs) - and $f - cp $b ; sprites $a and $b have no orientation or animation and therefore only 4 tiles - jr nz, .calcTileOffset ; (instead of 12), so tile b's offset is a special case - ld a, $7c ; = $a * 12 + 4 - jr .doneCalcTileOffset -.calcTileOffset - sla a - sla a - ld c, a - sla a - add c ; a *= 12 (each sprite consists of 12 tiles) -.doneCalcTileOffset - add b ; add orientation and animation offset - pop bc - ld [de], a ; write OAM sprite pattern number - inc hl - inc e - ld a, [hl] - bit 1, a ; bit 1 is ignored for OAM, it's used here as an "always in foregroud" flag. - jr z, .alwaysInForeground - ld a, [$ff94] ; load bit 7 (set to $80 if sprite is in grass and should be drawn behind it) - or [hl] -.alwaysInForeground - inc hl - ld [de], a ; write OAM sprite flags - inc e - bit 0, a ; test for OAMFLAG_ENDOFDATA - jr z, .spriteTilesLoop - ld a, e - ld [$ff90], a -.asm_4bad - ld a, [$ff8f] - add $10 - cp $0 - jp nz, .asm_4b21 - ld a, [$ff90] - ld l, a - ld h, $c3 - ld de, $4 - ld b, $a0 - ld a, [$d736] - bit 6, a - ld a, $a0 - jr z, .clearUnusedOAMEntriesLoop - ld a, $90 -.clearUnusedOAMEntriesLoop - cp l - ret z - ld [hl], b - add hl, de - jr .clearUnusedOAMEntriesLoop +INCLUDE "engine/overworld/oam.asm" +INCLUDE "engine/oam_dma.asm" -Func_4bd1: ; 4bd1 (1:4bd1) - inc e - inc e - ld a, [de] ; c1x4 - ld [$ff92], a - inc e - inc e - ld a, [de] ; c1x6 - ld [$ff91], a - ld a, $4 - add e - ld e, a - ld a, [$ff92] - add $4 - and $f0 - ld [de], a ; c1xa (sprite Y pos (snapped to whole steps (?)) - inc e - ld a, [$ff91] - and $f0 - ld [de], a ; c1xb (sprite X pos (snapped to whole steps (?)) - ret - -; copies DMA routine to HRAM. By GB specifications, all DMA needs to be done in HRAM (no other memory section is available during DMA) -WriteDMACodeToHRAM: ; 4bed (1:4bed) - ld c, $80 - ld b, $a - ld hl, DMARoutine -.copyLoop - ld a, [hli] - ld [$ff00+c], a - inc c - dec b - jr nz, .copyLoop - ret - -; this routine is copied to HRAM and executed there on every VBlank -DMARoutine: ; 4bfb (1:4bfb) - ld a, $c3 - ld [$ff46], a ; start DMA - ld a, $28 -.waitLoop ; wait for DMA to finish - dec a - jr nz, .waitLoop - ret - -PrintWaitingText: ; 4c05 (1:4c05) - FuncCoord 3, 10 ; $c46b - ld hl, Coord +PrintWaitingText: + hlCoord 3, 10 ld b, $1 ld c, $b - ld a, [W_ISINBATTLE] ; $d057 + ld a, [W_ISINBATTLE] and a jr z, .asm_4c17 call TextBoxBorder @@ -10513,20 +169,20 @@ PrintWaitingText: ; 4c05 (1:4c05) .asm_4c17 call Func_5ab3 .asm_4c1a - FuncCoord 4, 11 ; $c480 - ld hl, Coord + hlCoord 4, 11 ld de, WaitingText call PlaceString - ld c, $32 + ld c, 50 jp DelayFrames -WaitingText: ; 4c28 (1:4c28) +WaitingText: db "Waiting...!@" + _UpdateSprites: ; 4c34 (1:4c34) ld h, $c1 inc h - ld a, $e ; $c20e + ld a, $e ; wSpriteStateData2 + $0e .spriteLoop ld l, a sub $e @@ -10553,11 +209,11 @@ _UpdateSprites: ; 4c34 (1:4c34) jp nz, UpdateNonPlayerSprite jp UpdatePlayerSprite -UpdateNonPlayerSprite: ; 4c5c (1:4c5c) +UpdateNonPlayerSprite: dec a swap a ld [$ff93], a ; $10 * sprite# - ld a, [$cf17] ; some sprite offset? + ld a, [wcf17] ; some sprite offset? ld b, a ld a, [H_CURRENTSPRITEOFFSET] cp b @@ -10566,36 +222,46 @@ UpdateNonPlayerSprite: ; 4c5c (1:4c5c) .unequal jp Func_4ed1 -Func_4c70: ; 4c70 (1:4c70) + +Func_4c70: nop - ld h, $c1 + + ld h, wSpriteStateData1 / $100 ld a, [H_CURRENTSPRITEOFFSET] - add $0 + add wSpriteStateData1 % $100 ld l, a + ld a, [hl] and a ret z + ld a, l - add $3 + add 3 ld l, a + ld a, [hli] call Func_4d72 + ld a, [hli] - add $4 + add 4 add b and $f0 or c ld [$ff90], a + ld a, [hli] call Func_4d72 + ld a, [hl] add b and $f0 or c ld [$ff91], a + ld a, l - add $7 + add 7 ld l, a + xor a ld [hld], a ld [hld], a @@ -10605,31 +271,36 @@ Func_4c70: ; 4c70 (1:4c70) ld [hl], a xor a -Func_4ca5: ; 4ca5 (1:4ca5) +.loop ld [$ff8f], a swap a ld e, a ld a, [H_CURRENTSPRITEOFFSET] cp e - jp z, .asm_4d69 + jp z, .next + ld d, h ld a, [de] and a - jp z, .asm_4d69 + jp z, .next + inc e inc e ld a, [de] inc a - jp z, .asm_4d69 + jp z, .next + ld a, [H_CURRENTSPRITEOFFSET] - add $a + add 10 ld l, a inc e + ld a, [de] call Func_4d72 inc e + ld a, [de] - add $4 + add 4 add b and $f0 or c @@ -10639,16 +310,17 @@ Func_4ca5: ; 4ca5 (1:4ca5) inc a .asm_4cd4 ld [$ff90], a + push af rl c pop af ccf rl c - ld b, $7 + ld b, 7 ld a, [hl] and $f jr z, .asm_4ce6 - ld b, $9 + ld b, 9 .asm_4ce6 ld a, [$ff90] sub b @@ -10656,22 +328,25 @@ Func_4ca5: ; 4ca5 (1:4ca5) ld a, b ld [$ff90], a jr c, .asm_4d01 - ld b, $7 + + ld b, 7 dec e ld a, [de] inc e and a jr z, .asm_4cfa - ld b, $9 + ld b, 9 .asm_4cfa ld a, [$ff92] sub b jr z, .asm_4d01 - jr nc, .asm_4d69 + jr nc, .next + .asm_4d01 inc e inc l ld a, [de] + push bc call Func_4d72 inc e @@ -10680,22 +355,24 @@ Func_4ca5: ; 4ca5 (1:4ca5) and $f0 or c pop bc + sub [hl] jr nc, .asm_4d14 cpl inc a .asm_4d14 ld [$ff91], a + push af rl c pop af ccf rl c - ld b, $7 + ld b, 7 ld a, [hl] and $f jr z, .asm_4d26 - ld b, $9 + ld b, 9 .asm_4d26 ld a, [$ff91] sub b @@ -10703,18 +380,19 @@ Func_4ca5: ; 4ca5 (1:4ca5) ld a, b ld [$ff91], a jr c, .asm_4d41 - ld b, $7 + ld b, 7 dec e ld a, [de] inc e and a jr z, .asm_4d3a - ld b, $9 + ld b, 9 .asm_4d3a ld a, [$ff92] sub b jr z, .asm_4d41 - jr nc, .asm_4d69 + jr nc, .next + .asm_4d41 ld a, [$ff91] ld b, a @@ -10722,10 +400,10 @@ Func_4ca5: ; 4ca5 (1:4ca5) inc l cp b jr c, .asm_4d4e - ld b, $c + ld b, 12 jr .asm_4d50 .asm_4d4e - ld b, $3 + ld b, 3 .asm_4d50 ld a, c and b @@ -10735,7 +413,7 @@ Func_4ca5: ; 4ca5 (1:4ca5) inc l inc l ld a, [$ff8f] - ld de, DiagonalLines ; $4d85 + ld de, DiagonalLines add a add e ld e, a @@ -10749,977 +427,86 @@ Func_4ca5: ; 4ca5 (1:4ca5) ld a, [de] or [hl] ld [hl], a -.asm_4d69 + +.next ld a, [$ff8f] inc a cp $10 - jp nz, Func_4ca5 + jp nz, .loop ret -Func_4d72: ; 4d72 (1:4d72) +Func_4d72: and a - ld b, $0 - ld c, $0 - jr z, .asm_4d84 - ld c, $9 - cp $ff - jr z, .asm_4d83 - ld c, $7 - ld a, $0 -.asm_4d83 + 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 -.asm_4d84 +.done ret -DiagonalLines: ; 4d85 (1:4d85) - INCBIN "gfx/diagonal_lines.2bpp" +DiagonalLines: INCBIN "gfx/diagonal_lines.2bpp" + -Func_4da5: ; 4da5 (1:4da5) +TestBattle: ret -Func_4da6: ; 4da6 (1:4da6) +.loop call GBPalNormal - ld a, $80 + + ; Don't mess around + ; with obedience. + ld a, %10000000 ; EARTHBADGE ld [W_OBTAINEDBADGES], a + ld hl, W_FLAGS_D733 set 0, [hl] - ld hl, W_NUMINPARTY + + ; Reset the party. + ld hl, wPartyCount xor a ld [hli], a dec a ld [hl], a - ld a, $1 - ld [$cf91], a + + ; Give the player a + ; level 20 Rhydon. + ld a, RHYDON + ld [wcf91], a ld a, 20 ld [W_CURENEMYLVL], a xor a - ld [$cc49], a + ld [wcc49], a ld [W_CURMAP], a - call AddPokemonToParty + call AddPartyMon + + ; Fight against a + ; level 20 Rhydon. ld a, RHYDON ld [W_CUROPPONENT], a - ld a, $2c - call Predef - ld a, $1 - ld [$cfcb], a - ld [H_AUTOBGTRANSFERENABLED], a - jr Func_4da6 - -PickupItem: ; 4de1 (1:4de1) - call EnableAutoTextBoxDrawing - ld a, [H_DOWNARROWBLINKCNT2] ; $ff8c - ld b, a - ld hl, W_MISSABLEOBJECTLIST -.missableObjectsListLoop - ld a, [hli] - cp $ff - ret z - cp b - jr z, .isMissable - inc hl - jr .missableObjectsListLoop -.isMissable - ld a, [hl] - ld [$ffdb], a - ld hl, W_MAPSPRITEEXTRADATA - ld a, [H_DOWNARROWBLINKCNT2] ; $ff8c - dec a - add a - ld d, $0 - ld e, a - add hl, de ; seek to item data of found item - ld a, [hl] ; read Item type - ld b, a - ld c, 1 ; quantity is 1 - call GiveItem - jr nc, .BagFull - ld a, [$ffdb] - ld [$cc4d], a - ld a, $11 - call Predef ; indirect jump to RemoveMissableObject (f1d7 (3:71d7)) - ld a, $1 - ld [$cc3c], a - ld hl, FoundItemText - jr .printText -.BagFull - ld hl, NoMoreRoomForItemText -.printText - call PrintText - ret - -FoundItemText: ; 4e26 (1:4e26) - TX_FAR _FoundItemText - db $0B - db "@" - -NoMoreRoomForItemText: ; 4e2c (1:4e2c) - TX_FAR _NoMoreRoomForItemText - db "@" - -UpdatePlayerSprite: ; 4e31 (1:4e31) - ld a, [wSpriteStateData2] - and a - jr z, .asm_4e41 - cp $ff - jr z, .asm_4e4a - dec a - ld [wSpriteStateData2], a - jr .asm_4e4a -.asm_4e41 - FuncCoord 8, 9 ; $c45c - ld a, [Coord] - ld [$ff93], a - cp $60 - jr c, .asm_4e50 -.asm_4e4a - ld a, $ff - ld [$c102], a - ret -.asm_4e50 - call Func_4c70 - ld h, $c1 - ld a, [wWalkCounter] ; $cfc5 - and a - jr nz, .asm_4e90 - ld a, [$d528] - bit 2, a - jr z, .asm_4e65 - xor a - jr .asm_4e86 -.asm_4e65 - bit 3, a - jr z, .asm_4e6d - ld a, $4 - jr .asm_4e86 -.asm_4e6d - bit 1, a - jr z, .asm_4e75 - ld a, $8 - jr .asm_4e86 -.asm_4e75 - bit 0, a - jr z, .asm_4e7d - ld a, $c - jr .asm_4e86 -.asm_4e7d - xor a - ld [$c107], a - ld [$c108], a - jr .asm_4eab -.asm_4e86 - ld [$c109], a - ld a, [$cfc4] - bit 0, a - jr nz, .asm_4e7d -.asm_4e90 - ld a, [$d736] - bit 7, a - jr nz, .asm_4eb6 - ld a, [H_CURRENTSPRITEOFFSET] - add $7 - ld l, a - ld a, [hl] - inc a - ld [hl], a - cp $4 - jr nz, .asm_4eab - xor a - ld [hl], a - inc hl - ld a, [hl] - inc a - and $3 - ld [hl], a -.asm_4eab - ld a, [$c108] - ld b, a - ld a, [$c109] - add b - ld [$c102], a -.asm_4eb6 - ld a, [$ff93] - ld c, a - ld a, [W_GRASSTILE] - cp c - ld a, $0 - jr nz, .asm_4ec3 - ld a, $80 -.asm_4ec3 - ld [$c207], a - ret - -Func_4ec7: ; 4ec7 (1:4ec7) - push bc - push af - ld a, [$ffda] - ld c, a - pop af - add c - ld l, a - pop bc - ret - -Func_4ed1: ; 4ed1 (1:4ed1) - ld a, [H_CURRENTSPRITEOFFSET] - swap a - dec a - add a - ld hl, W_MAPSPRITEDATA ; $d4e4 - add l - ld l, a - ld a, [hl] ; read movement byte 2 - ld [wCurSpriteMovement2], a - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - ld l, a - inc l - ld a, [hl] ; c1x1 - and a - jp z, InitializeSpriteStatus - call CheckSpriteAvailability - ret c ; if sprite is invisible, on tile >=$60, in grass or player is currently walking - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - ld l, a - inc l - ld a, [hl] ; c1x1 - bit 7, a - jp nz, InitializeSpriteFacingDirection ; c1x1 >= $80 - ld b, a - ld a, [$cfc4] - bit 0, a - jp nz, notYetMoving - ld a, b - cp $2 - jp z, UpdateSpriteMovementDelay ; c1x1 == 2 - cp $3 - jp z, UpdateSpriteInWalkingAnimation ; c1x1 == 3 - ld a, [wWalkCounter] ; $cfc5 - and a - ret nz ; don't do anything yet if player is currently moving (redundant, already tested in CheckSpriteAvailability) - call InitializeSpriteScreenPosition - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $6 - ld l, a - ld a, [hl] ; c2x6: movement byte 1 - inc a - jr z, .asm_4f59 ; value $FF - inc a - jr z, .asm_4f59 ; value $FE - dec a - ld [hl], a ; (temporarily) increment movement byte 1 - dec a - push hl - ld hl, $cf0f - dec [hl] ; decrement $cf0f - pop hl - ld de, $cc5b - call LoadDEPlusA ; a = [$cc5b + movement byte 1] - cp $e0 - jp z, ChangeFacingDirection - cp $ff - jr nz, .asm_4f4b - ld [hl], a ; reset movement byte 1 to initial value - ld hl, $d730 - res 0, [hl] - xor a - ld [$cd38], a - ld [$cd3a], a - ret -.asm_4f4b - cp $fe - jr nz, .asm_4f5f - ld [hl], $1 ; set movement byte 1 to $1 - ld de, $cc5b - call LoadDEPlusA ; a = [$cc5b + $fe] (?) - jr .asm_4f5f -.asm_4f59 - call getTileSpriteStandsOn - call GenRandom -.asm_4f5f - ld b, a - ld a, [wCurSpriteMovement2] - cp $d0 - jr z, .moveDown ; movement byte 2 = $d0 forces down - cp $d1 - jr z, .moveUp ; movement byte 2 = $d1 forces up - cp $d2 - jr z, .moveLeft ; movement byte 2 = $d2 forces left - cp $d3 - jr z, .moveRight ; movement byte 2 = $d3 forces right - ld a, b - cp $40 ; a < $40: down (or left) - jr nc, .notDown - ld a, [wCurSpriteMovement2] - cp $2 - jr z, .moveLeft ; movement byte 2 = $2 only allows left or right -.moveDown - ld de, 2*20 - add hl, de ; move tile pointer two rows down - ld de, $100 - - ld bc, $400 - jr TryWalking -.notDown - cp $80 ; $40 <= a < $80: up (or right) - jr nc, .notUp - ld a, [wCurSpriteMovement2] - cp $2 - jr z, .moveRight ; movement byte 2 = $2 only allows left or right -.moveUp - ld de, -2*20 ; $ffd8 - add hl, de ; move tile pointer two rows up - ld de, $ff00 - ld bc, $804 - jr TryWalking -.notUp - cp $c0 ; $80 <= a < $c0: left (or up) - jr nc, .notLeft - ld a, [wCurSpriteMovement2] - cp $1 - jr z, .moveUp ; movement byte 2 = $1 only allows up or down -.moveLeft - dec hl - dec hl ; move tile pointer two columns left - ld de, $ff - ld bc, $208 - jr TryWalking -.notLeft ; $c0 <= a: right (or down) - ld a, [wCurSpriteMovement2] - cp $1 - jr z, .moveDown ; movement byte 2 = $1 only allows up or down -.moveRight - inc hl - inc hl ; move tile pointer two columns right - ld de, $1 - ld bc, $10c - jr TryWalking - -; changes facing direction by zeroing the movement delta and calling TryWalking -ChangeFacingDirection: ; 4fc8 (1:4fc8) - ld de, $0 - ; fall through - -; b: direction (1,2,4 or 8) -; c: new facing direction (0,4,8 or $c) -; d: Y movement delta (-1, 0 or 1) -; e: X movement delta (-1, 0 or 1) -; hl: pointer to tile the sprite would wlak onto -; set carry on failure, clears carry on success -TryWalking: ; 4fcb (1:4fcb) - push hl - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $9 - ld l, a - ld [hl], c ; c1x9 (update facing direction) - ld a, [H_CURRENTSPRITEOFFSET] - add $3 - ld l, a - ld [hl], d ; c1x3 (update Y movement delta) - inc l - inc l - ld [hl], e ; c1x5 (update X movement delta) - pop hl - push de - ld c, [hl] ; read tile to walk onto - call CanWalkOntoTile - pop de - ret c ; cannot walk there (reinitialization of delay values already done) - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld a, [hl] ; c2x4: Y position - add d - ld [hli], a ; update Y position - ld a, [hl] ; c2x5: X position - add e - ld [hl], a ; update X position - ld a, [H_CURRENTSPRITEOFFSET] - ld l, a - ld [hl], $10 ; c2x0=16: walk animation counter - dec h - inc l - ld [hl], $3 ; c1x1: set movement status to walking - jp UpdateSpriteImage - -; update the walking animation parameters for a sprite that is currently walking -UpdateSpriteInWalkingAnimation: ; 4ffe (1:4ffe) - ld a, [H_CURRENTSPRITEOFFSET] - add $7 - ld l, a - ld a, [hl] ; c1x7 (counter until next walk animation frame) - inc a - ld [hl], a ; c1x7 += 1 - cp $4 - jr nz, .noNextAnimationFrame - xor a - ld [hl], a ; c1x7 = 0 - inc l - ld a, [hl] ; c1x8 (walk animation frame) - inc a - and $3 - ld [hl], a ; advance to next animation frame every 4 ticks (16 ticks total for one step) -.noNextAnimationFrame - ld a, [H_CURRENTSPRITEOFFSET] - add $3 - ld l, a - ld a, [hli] ; c1x3 (movement Y delta) - ld b, a - ld a, [hl] ; c1x4 (screen Y position) - add b - ld [hli], a ; update screen Y position - ld a, [hli] ; c1x5 (movement X delta) - ld b, a - ld a, [hl] ; c1x6 (screen X position) - add b - ld [hl], a ; update screen X position - ld a, [H_CURRENTSPRITEOFFSET] - ld l, a - inc h - ld a, [hl] ; c2x0 (walk animantion counter) - dec a - ld [hl], a ; update walk animantion counter - ret nz - ld a, $6 ; walking finished, update state - add l - ld l, a - ld a, [hl] ; c2x6 (movement byte 1) - cp $fe - jr nc, .initNextMovementCounter ; values $fe and $ff - ld a, [H_CURRENTSPRITEOFFSET] - inc a - ld l, a - dec h - ld [hl], $1 ; c1x1 = 1 (movement status ready) - ret -.initNextMovementCounter - call GenRandom - ld a, [H_CURRENTSPRITEOFFSET] - add $8 - ld l, a - ld a, [H_RAND1] ; $ffd3 - and $7f - ld [hl], a ; c2x8: set next movement delay to a random value in [0,$7f] - dec h ; note that value 0 actually makes the delay $100 (bug?) - ld a, [H_CURRENTSPRITEOFFSET] - inc a - ld l, a - ld [hl], $2 ; c1x1 = 2 (movement status) - inc l - inc l - xor a - ld b, [hl] ; c1x3 (movement Y delta) - ld [hli], a ; reset movement Y delta - inc l - ld c, [hl] ; c1x5 (movement X delta) - ld [hl], a ; reset movement X delta - ret - -; update delay value (c2x8) for sprites in the delayed state (c1x1) -UpdateSpriteMovementDelay: ; 5057 (1:5057) - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $6 - ld l, a - ld a, [hl] ; c2x6: movement byte 1 - inc l - inc l - cp $fe - jr nc, .tickMoveCounter ; values $fe or $ff - ld [hl], $0 - jr .moving -.tickMoveCounter - dec [hl] ; c2x8: frame counter until next movement - jr nz, notYetMoving -.moving - dec h - ld a, [H_CURRENTSPRITEOFFSET] - inc a - ld l, a - ld [hl], $1 ; c1x1 = 1 (mark as ready to move) -notYetMoving: ; 5073 (1:5073) - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $8 - ld l, a - ld [hl], $0 ; c1x8 = 0 (walk animation frame) - jp UpdateSpriteImage -InitializeSpriteFacingDirection: ; 507f (1:507f) - ld a, [$d72d] - bit 5, a - jr nz, notYetMoving - res 7, [hl] - ld a, [$d52a] - bit 3, a - jr z, .notFacingDown - ld c, $0 ; make sprite face down - jr .facingDirectionDetermined -.notFacingDown - bit 2, a - jr z, .notFacingUp - ld c, $4 ; make sprite face up - jr .facingDirectionDetermined -.notFacingUp - bit 1, a - jr z, .notFacingRight - ld c, $c ; make sprite face right - jr .facingDirectionDetermined -.notFacingRight - ld c, $8 ; make sprite face left -.facingDirectionDetermined - ld a, [H_CURRENTSPRITEOFFSET] - add $9 - ld l, a - ld [hl], c ; c1x9: set facing direction - jr notYetMoving - -InitializeSpriteStatus: ; 50ad (1:50ad) - ld [hl], $1 ; $c1x1: set movement status to ready - inc l - ld [hl], $ff ; $c1x2: set sprite image to $ff (invisible/off screen) - inc h - ld a, [H_CURRENTSPRITEOFFSET] - add $2 - ld l, a - ld a, $8 - ld [hli], a ; $c2x2: set Y displacement to 8 - ld [hl], a ; $c2x3: set X displacement to 8 - ret - -; calculates the spprite's scrren position form its map position and the player position -InitializeSpriteScreenPosition: ; 50bd (1:50bd) - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld a, [W_YCOORD] ; $d361 - ld b, a - ld a, [hl] ; c2x4 (Y position + 4) - sub b ; relative to player position - swap a ; * 16 - sub $4 ; - 4 - dec h - ld [hli], a ; c1x4 (screen Y position) - inc h - ld a, [W_XCOORD] ; $d362 - ld b, a - ld a, [hli] ; c2x6 (X position + 4) - sub b ; relative to player position - swap a ; * 16 - dec h - ld [hl], a ; c1x6 (screen X position) - ret + predef InitOpponent -; tests if sprite is off screen or otherwise unable to do anything -CheckSpriteAvailability: ; 50dc (1:50dc) - ld a, $12 - call Predef ; indirect jump to IsMissableObjectHidden (f1a6 (3:71a6)) - ld a, [$ffe5] - and a - jp nz, .spriteInvisible - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $6 - ld l, a - ld a, [hl] ; c2x6: movement byte 1 - cp $fe - jr c, .skipXVisibilityTest ; movement byte 1 < $fe - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld b, [hl] ; c2x4: Y pos (+4) - ld a, [W_YCOORD] ; $d361 - cp b - jr z, .skipYVisibilityTest - jr nc, .spriteInvisible ; above screen region - add $8 ; screen is 9 tiles high - cp b - jr c, .spriteInvisible ; below screen region -.skipYVisibilityTest - inc l - ld b, [hl] ; c2x5: X pos (+4) - ld a, [W_XCOORD] ; $d362 - cp b - jr z, .skipXVisibilityTest - jr nc, .spriteInvisible ; left of screen region - add $9 ; screen is 10 tiles wide - cp b - jr c, .spriteInvisible ; right of screen region -.skipXVisibilityTest - call getTileSpriteStandsOn - ld d, $60 - ld a, [hli] - cp d - jr nc, .spriteInvisible ; standing on tile with ID >=$60 (bottom left tile) - ld a, [hld] - cp d - jr nc, .spriteInvisible ; standing on tile with ID >=$60 (bottom right tile) - ld bc, -20 ; $ffec - add hl, bc ; go back one row of tiles - ld a, [hli] - cp d - jr nc, .spriteInvisible ; standing on tile with ID >=$60 (top left tile) - ld a, [hl] - cp d - jr c, .spriteVisible ; standing on tile with ID >=$60 (top right tile) -.spriteInvisible - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $2 - ld l, a - ld [hl], $ff ; c1x2 - scf - jr .done -.spriteVisible - ld c, a - ld a, [wWalkCounter] ; $cfc5 - and a - jr nz, .done ; if player is currently walking, we're done - call UpdateSpriteImage - inc h - ld a, [H_CURRENTSPRITEOFFSET] - add $7 - ld l, a - ld a, [W_GRASSTILE] - cp c - ld a, $0 - jr nz, .notInGrass - ld a, $80 -.notInGrass - ld [hl], a ; c2x7 - and a -.done - ret - -UpdateSpriteImage: ; 5157 (1:5157) - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $8 - ld l, a - ld a, [hli] ; c1x8: walk animation frame - ld b, a - ld a, [hl] ; c1x9: facing direction - add b - ld b, a - ld a, [$ff93] ; current sprite offset - add b - ld b, a - ld a, [H_CURRENTSPRITEOFFSET] - add $2 - ld l, a - ld [hl], b ; c1x2: sprite to display - ret - -; tests if sprite can walk the specified direction -; b: direction (1,2,4 or 8) -; c: ID of tile the sprite would walk onto -; d: Y movement delta (-1, 0 or 1) -; e: X movement delta (-1, 0 or 1) -; set carry on failure, clears carry on success -CanWalkOntoTile: ; 516e (1:516e) - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $6 - ld l, a - ld a, [hl] ; c2x6 (movement byte 1) - cp $fe - jr nc, .canMove ; values $fe and $ff - and a - ret -.canMove - ld a, [W_TILESETCOLLISIONPTR] - ld l, a - ld a, [W_TILESETCOLLISIONPTR+1] - ld h, a -.tilePassableLoop - ld a, [hli] - cp $ff - jr z, .impassable - cp c - jr nz, .tilePassableLoop - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $6 - ld l, a - ld a, [hl] ; $c2x6 (movement byte 1) - inc a - jr z, .impassable ; if $ff, no movement allowed (however, changing direction is) - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld a, [hli] ; c1x4 (screen Y pos) - add $4 ; align to blocks (Y pos is always 4 pixels off) - add d ; add Y delta - cp $80 ; if value is >$80, the destination is off screen (either $81 or $FF underflow) - jr nc, .impassable ; don't walk off screen - inc l - ld a, [hl] ; c1x6 (screen X pos) - add e ; add X delta - cp $90 ; if value is >$90, the destination is off screen (either $91 or $FF underflow) - jr nc, .impassable ; don't walk off screen - push de - push bc - call Func_4c70 - pop bc - pop de - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $c - ld l, a - ld a, [hl] ; c1xc (forbidden directions flags(?)) - and b ; check against chosen direction (1,2,4 or 8) - jr nz, .impassable ; direction forbidden, don't go there - ld h, $c2 - ld a, [H_CURRENTSPRITEOFFSET] - add $2 - ld l, a - ld a, [hli] ; c2x2 (sprite Y displacement, initialized at $8, keep track of where a sprite did go) - bit 7, d ; check if going upwards (d=$ff) - jr nz, .upwards - add d - cp $5 - jr c, .impassable ; if c2x2+d < 5, don't go ;bug: this tests probably were supposed to prevent sprites - jr .checkHorizontal ; from walking out too far, but this line makes sprites get stuck -.upwards ; whenever they walked upwards 5 steps - sub $1 ; on the other hand, the amount a sprite can walk out to the - jr c, .impassable ; if d2x2 == 0, don't go ; right of bottom is not limited (until the counter overflows) -.checkHorizontal - ld d, a - ld a, [hl] ; c2x3 (sprite X displacement, initialized at $8, keep track of where a sprite did go) - bit 7, e ; check if going left (e=$ff) - jr nz, .left - add e - cp $5 ; compare, but no conditional jump like in the vertical check above (bug?) - jr .passable -.left - sub $1 - jr c, .impassable ; if d2x3 == 0, don't go -.passable - ld [hld], a ; update c2x3 - ld [hl], d ; update c2x2 - and a ; clear carry (marking success) - ret -.impassable - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - inc a - ld l, a - ld [hl], $2 ; c1x1 = 2 (set movement status to delayed) - inc l - inc l - xor a - ld [hli], a ; c1x3 = 0 (clear Y movement delta) - inc l - ld [hl], a ; c1x5 = 0 (clear X movement delta) - inc h - ld a, [H_CURRENTSPRITEOFFSET] - add $8 - ld l, a - call GenRandom - ld a, [H_RAND1] ; $ffd3 - and $7f - ld [hl], a ; c2x8: set next movement delay to a random value in [0,$7f] (again with delay $100 if value is 0) - scf ; set carry (marking failure to walk) - ret - -; calculates the tile pointer pointing to the tile the current sprite stancs on -; this is always the lower left tile of the 2x2 tile blocks all sprites are snapped to -; hl: output pointer -getTileSpriteStandsOn: ; 5207 (1:5207) - ld h, $c1 - ld a, [H_CURRENTSPRITEOFFSET] - add $4 - ld l, a - ld a, [hli] ; c1x4: screen Y position - add $4 ; align to 2*2 tile blocks (Y position is always off 4 pixels to the top) - and $f0 ; in case object is currently moving - srl a ; screen Y tile * 4 - ld c, a - ld b, $0 - inc l - ld a, [hl] ; c1x6: screen Y position - srl a - srl a - srl a ; screen X tile - add $14 ; screen X tile + 20 - ld d, $0 - ld e, a - ld hl, wTileMap - add hl, bc - add hl, bc - add hl, bc - add hl, bc - add hl, bc - add hl, de ; wTileMap + 20*(screen Y tile + 1) + screen X tile - ret - -; loads [de+a] into a -LoadDEPlusA: ; 522f (1:522f) - add e - ld e, a - jr nc, .noCarry - inc d -.noCarry - ld a, [de] - ret - -Func_5236: ; 5236 (1:5236) - ld a, [$d730] - bit 7, a - ret z - ld hl, $d72e - bit 7, [hl] - set 7, [hl] - jp z, Func_52a6 - ld hl, $cc97 - ld a, [$cd37] - add l - ld l, a - jr nc, .asm_5251 - inc h -.asm_5251 - ld a, [hl] - cp $40 - jr nz, .asm_525f - call Func_52b2 - ld c, $4 - ld a, $fe - jr .asm_5289 -.asm_525f - cp $0 - jr nz, .asm_526c - call Func_52b2 - ld c, $0 - ld a, $2 - jr .asm_5289 -.asm_526c - cp $80 - jr nz, .asm_5279 - call Func_52b7 - ld c, $8 - ld a, $fe - jr .asm_5289 -.asm_5279 - cp $c0 - jr nz, .asm_5286 - call Func_52b7 - ld c, $c - ld a, $2 - jr .asm_5289 -.asm_5286 - cp $ff - ret -.asm_5289 - ld b, a - ld a, [hl] - add b - ld [hl], a - ld a, [H_CURRENTSPRITEOFFSET] - add $9 - ld l, a - ld a, c - ld [hl], a - call Func_52c3 - ld hl, $cf18 - dec [hl] - ret nz - ld a, $8 - ld [$cf18], a - ld hl, $cd37 - inc [hl] - ret - -Func_52a6: ; 52a6 (1:52a6) - xor a - ld [$cd37], a - ld a, $8 - ld [$cf18], a - jp Func_52c3 - -Func_52b2: ; 52b2 (1:52b2) - ld a, $4 - ld b, a - jr asm_52ba - -Func_52b7: ; 52b7 (1:52b7) - ld a, $6 - ld b, a -asm_52ba: ; 52ba (1:52ba) - ld hl, wSpriteStateData1 - ld a, [H_CURRENTSPRITEOFFSET] - add l - add b - ld l, a - ret + ; When the battle ends, + ; do it all again. + ld a, 1 + ld [wcfcb], a + ld [H_AUTOBGTRANSFERENABLED], a + jr .loop -Func_52c3: ; 52c3 (1:52c3) - ld hl, wSpriteStateData2 - ld a, [H_CURRENTSPRITEOFFSET] - add $e - ld l, a - ld a, [hl] - dec a - swap a - ld b, a - ld hl, wSpriteStateData1 - ld a, [H_CURRENTSPRITEOFFSET] - add $9 - ld l, a - ld a, [hl] - cp $0 - jr z, .asm_52ea - cp $4 - jr z, .asm_52ea - cp $8 - jr z, .asm_52ea - cp $c - jr z, .asm_52ea - ret -.asm_52ea - add b - ld b, a - ld [$ffe9], a - call Func_5301 - ld hl, wSpriteStateData1 - ld a, [H_CURRENTSPRITEOFFSET] - add $2 - ld l, a - ld a, [$ffe9] - ld b, a - ld a, [$ffea] - add b - ld [hl], a - ret - -Func_5301: ; 5301 (1:5301) - ld a, [H_CURRENTSPRITEOFFSET] - add $7 - ld l, a - ld a, [hl] - inc a - ld [hl], a - cp $4 - ret nz - xor a - ld [hl], a - inc l - ld a, [hl] - inc a - and $3 - ld [hl], a - ld [$ffea], a - ret +INCLUDE "engine/overworld/item.asm" +INCLUDE "engine/overworld/movement.asm" INCLUDE "engine/cable_club.asm" LoadTrainerInfoTextBoxTiles: ; 5ae6 (1:5ae6) ld de, TrainerInfoTextBoxTileGraphics ; $7b98 - ld hl, $9760 + ld hl, vChars2 + $760 ld bc, (BANK(TrainerInfoTextBoxTileGraphics) << 8) +$09 jp CopyVideoData @@ -11729,13 +516,12 @@ INCLUDE "engine/oak_speech.asm" Func_62ce: ; 62ce (1:62ce) call Func_62ff - ld a,$19 - call Predef - ld hl,$D732 + predef Func_c754 + ld hl,wd732 bit 2,[hl] res 2,[hl] jr z,.next - ld a,[$D71A] + ld a,[wd71a] jr .next2 .next bit 1,[hl] @@ -11745,19 +531,19 @@ Func_62ce: ; 62ce (1:62ce) ld a,0 .next2 ld b,a - ld a,[$D72D] + ld a,[wd72d] and a jr nz,.next4 ld a,b .next4 - ld hl,$D732 + ld hl,wd732 bit 4,[hl] ret nz ld [wLastMap],a ret Func_62ff: ; 62ff (1:62ff) - ld a, [$d72d] + ld a, [wd72d] cp BATTLE_CENTER jr nz, .asm_6314 ld hl, BattleCenterSpec1 ; $6428 @@ -11776,14 +562,14 @@ Func_62ff: ; 62ff (1:62ff) ld hl, TradeCenterSpec2 ; $6440 jr .asm_6334 .asm_6326 - ld a, [$d732] + ld a, [wd732] bit 1, a jr nz, .asm_6346 bit 2, a jr nz, .asm_6346 ld hl, FirstMapSpec ; $6420 .asm_6334 - ld de, W_CURMAP ; $d35e + ld de, W_CURMAP ; W_CURMAP ld c, $7 .asm_6339 ld a, [hli] @@ -11792,12 +578,12 @@ Func_62ff: ; 62ff (1:62ff) dec c jr nz, .asm_6339 ld a, [hli] - ld [W_CURMAPTILESET], a ; $d367 + ld [W_CURMAPTILESET], a ; W_CURMAPTILESET xor a jr .asm_63b3 .asm_6346 ld a, [wLastMap] - ld hl, $d732 + ld hl, wd732 bit 4, [hl] jr nz, .asm_635b bit 6, [hl] @@ -11806,17 +592,17 @@ Func_62ff: ; 62ff (1:62ff) ld a, [wLastBlackoutMap] jr .asm_6391 .asm_635b - ld hl, $d72d + ld hl, wd72d res 4, [hl] - ld a, [$d71d] + ld a, [wd71d] ld b, a - ld [W_CURMAP], a ; $d35e - ld a, [$d71e] + ld [W_CURMAP], a ; W_CURMAP + ld a, [wd71e] ld c, a ld hl, DungeonWarpList ; $63bf ld de, $0 ld a, $6 - ld [$d12f], a + ld [wd12f], a .asm_6376 ld a, [hli] cp b @@ -11828,7 +614,7 @@ Func_62ff: ; 62ff (1:62ff) cp c jr z, .asm_6388 .asm_6381 - ld a, [$d12f] + ld a, [wd12f] add e ld e, a jr .asm_6376 @@ -11837,10 +623,10 @@ Func_62ff: ; 62ff (1:62ff) add hl, de jr .asm_63a4 .asm_638e - ld a, [$d71a] + ld a, [wd71a] .asm_6391 ld b, a - ld [W_CURMAP], a ; $d35e + ld [W_CURMAP], a ; W_CURMAP ld hl, FlyWarpDataPtr ; $6448 .asm_6398 ld a, [hli] @@ -11855,7 +641,7 @@ Func_62ff: ; 62ff (1:62ff) ld h, [hl] ld l, a .asm_63a4 - ld de, $d35f + ld de, wd35f ld c, $6 .asm_63a9 ld a, [hli] @@ -11864,12 +650,12 @@ Func_62ff: ; 62ff (1:62ff) dec c jr nz, .asm_63a9 xor a - ld [W_CURMAPTILESET], a ; $d367 + ld [W_CURMAPTILESET], a ; W_CURMAPTILESET .asm_63b3 - ld [$d4e2], a - ld [$d4e3], a + ld [wd4e2], a + ld [wd4e3], a ld a, $ff - ld [$d42f], a + ld [wd42f], a ret INCLUDE "data/special_warps.asm" @@ -11889,12 +675,12 @@ SetIshiharaTeam: ; 64ca (1:64ca) ld a, [de] cp $ff ret z - ld [$cf91], a + ld [wcf91], a inc de ld a, [de] ld [W_CURENEMYLVL], a inc de - call AddPokemonToParty + call AddPartyMon jr .loop IshiharaTeam: ; 64df (1:64df) @@ -11923,10 +709,9 @@ SubtractAmountPaidFromMoney_: ; 6b21 (1:6b21) ld de,wPlayerMoney + 2 ld hl,$ffa1 ; total price of items ld c,3 ; length of money in bytes - ld a,$0c - call Predef ; subtract total price from money + predef SubBCDPredef ; subtract total price from money ld a,$13 - ld [$d125],a + ld [wd125],a call DisplayTextBoxID ; redraw money text box and a ret @@ -11936,7 +721,7 @@ HandleItemListSwapping: ; 6b44 (1:6b44) cp a,ITEMLISTMENU jp nz,DisplayListMenuIDLoop ; only rearrange item list menus push hl - ld hl,$cf8b + ld hl,wcf8b ld a,[hli] ld h,[hl] ld l,a @@ -11953,7 +738,7 @@ HandleItemListSwapping: ; 6b44 (1:6b44) pop hl inc a jp z,DisplayListMenuIDLoop ; ignore attempts to swap the Cancel menu item - ld a,[$cc35] ; ID of item chosen for swapping (counts from 1) + ld a,[wcc35] ; 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 @@ -11962,7 +747,7 @@ HandleItemListSwapping: ; 6b44 (1:6b44) ld b,a ld a,[wListScrollOffset] ; index of top (visible) menu item within the list add b - ld [$cc35],a ; ID of item chosen for swapping (counts from 1) + ld [wcc35],a ; ID of item chosen for swapping (counts from 1) ld c,20 call DelayFrames jp DisplayListMenuIDLoop @@ -11973,16 +758,16 @@ HandleItemListSwapping: ; 6b44 (1:6b44) ld a,[wListScrollOffset] add b ld b,a - ld a,[$cc35] ; ID of item chosen for swapping (counts from 1) + ld a,[wcc35] ; 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 [$cc35],a ; ID of item chosen for swapping (counts from 1) + ld [wcc35],a ; ID of item chosen for swapping (counts from 1) ld c,20 call DelayFrames push hl push de - ld hl,$cf8b + ld hl,wcf8b ld a,[hli] ld h,[hl] ld l,a @@ -11997,7 +782,7 @@ HandleItemListSwapping: ; 6b44 (1:6b44) ld c,a ld b,0 add hl,bc ; hl = address of currently selected item entry - ld a,[$cc35] ; ID of item chosen for swapping (counts from 1) + ld a,[wcc35] ; ID of item chosen for swapping (counts from 1) add a add e ld e,a @@ -12024,7 +809,7 @@ HandleItemListSwapping: ; 6b44 (1:6b44) ld a,[$ff95] ld [de],a ; put second item ID in first item slot xor a - ld [$cc35],a ; 0 means no item is currently being swapped + ld [wcc35],a ; 0 means no item is currently being swapped pop de pop hl jp DisplayListMenuIDLoop @@ -12044,13 +829,13 @@ HandleItemListSwapping: ; 6b44 (1:6b44) jr .done .combineItemSlots ld [hl],a ; put the sum in the second item slot - ld hl,$cf8b + ld hl,wcf8b ld a,[hli] ld h,[hl] ld l,a dec [hl] ; decrease the number of items ld a,[hl] - ld [$d12a],a ; update number of items variable + ld [wd12a],a ; update number of items variable cp a,1 jr nz,.skipSettingMaxMenuItemID ld [wMaxMenuItem],a ; if the number of items is only one now, update the max menu item ID @@ -12076,7 +861,7 @@ HandleItemListSwapping: ; 6b44 (1:6b44) ld [wCurrentMenuItem],a .done xor a - ld [$cc35],a ; 0 means no item is currently being swapped + ld [wcc35],a ; 0 means no item is currently being swapped pop de pop hl jp DisplayListMenuIDLoop @@ -12120,8 +905,8 @@ SafariZoneRestHouses: ; function that performs initialization for DisplayTextID DisplayTextIDInit: ; 7096 (1:7096) xor a - ld [$cf94],a - ld a,[$cf0c] + ld [wListMenuID],a + ld a,[wcf0c] bit 0,a jr nz,.skipDrawingTextBoxBorder ld a,[$ff8c] ; text ID (or sprite ID) @@ -12130,30 +915,27 @@ DisplayTextIDInit: ; 7096 (1:7096) ; if text ID is 0 (i.e. the start menu) ; Note that the start menu text border is also drawn in the function directly ; below this, so this seems unnecessary. - ld a,[$d74b] + ld a,[wd74b] bit 5,a ; does the player have the pokedex? ; start menu with pokedex - FuncCoord 10, 0 ; $c3aa - ld hl,Coord + hlCoord 10, 0 ld b,$0e ld c,$08 jr nz,.drawTextBoxBorder ; start menu without pokedex - FuncCoord 10, 0 ; $c3aa - ld hl,Coord + hlCoord 10, 0 ld b,$0c ld c,$08 jr .drawTextBoxBorder ; if text ID is not 0 (i.e. not the start menu) then do a standard dialogue text box .notStartMenu - FuncCoord 0, 12 ; $c490 - ld hl,Coord + hlCoord 0, 12 ld b,$04 ld c,$12 .drawTextBoxBorder call TextBoxBorder .skipDrawingTextBoxBorder - ld hl,$cfc4 + ld hl,wcfc4 set 0,[hl] ld hl,wFlags_0xcd60 bit 4,[hl] @@ -12164,7 +946,7 @@ DisplayTextIDInit: ; 7096 (1:7096) ; 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,$c119 + ld hl,wSpriteStateData1 + $19 ld c,$0f ld de,$0010 .spriteFacingDirectionCopyLoop @@ -12177,7 +959,7 @@ DisplayTextIDInit: ; 7096 (1:7096) 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,$c102 + ld hl,wSpriteStateData1 + 2 ld de,$0010 ld c,e .spriteStandStillLoop @@ -12202,37 +984,34 @@ DisplayTextIDInit: ; 7096 (1:7096) ; function that displays the start menu DrawStartMenu: ; 710b (1:710b) - ld a,[$d74b] + ld a,[wd74b] bit 5,a ; does the player have the pokedex? ; menu with pokedex - FuncCoord 10, 0 ; $c3aa - ld hl,Coord + hlCoord 10, 0 ld b,$0e ld c,$08 jr nz,.drawTextBoxBorder ; shorter menu if the player doesn't have the pokedex - FuncCoord 10, 0 ; $c3aa - ld hl,Coord + hlCoord 10, 0 ld b,$0c ld c,$08 .drawTextBoxBorder call TextBoxBorder ld a,%11001011 ; bit mask for down, up, start, B, and A buttons - ld [$cc29],a + ld [wMenuWatchedKeys],a ld a,$02 - ld [$cc24],a ; Y position of first menu choice + ld [wTopMenuItemY],a ; Y position of first menu choice ld a,$0b - ld [$cc25],a ; X position of first menu choice - ld a,[$cc2d] ; remembered menu selection from last time - ld [$cc26],a - ld [$cc2a],a + ld [wTopMenuItemX],a ; X position of first menu choice + ld a,[wcc2d] ; remembered menu selection from last time + ld [wCurrentMenuItem],a + ld [wLastMenuItem],a xor a - ld [$cc37],a - ld hl,$d730 + ld [wcc37],a + ld hl,wd730 set 6,[hl] ; no pauses between printing each letter - FuncCoord 12, 2 ; $c3d4 - ld hl,Coord - ld a,[$d74b] + hlCoord 12, 2 + ld a,[wd74b] bit 5,a ; does the player have the pokedex? ; case for not having pokdex ld a,$06 @@ -12242,14 +1021,14 @@ DrawStartMenu: ; 710b (1:710b) call PrintStartMenuItem ld a,$07 .storeMenuItemCount - ld [$cc28],a ; number of menu items + ld [wMaxMenuItem],a ; number of menu items ld de,StartMenuPokemonText call PrintStartMenuItem ld de,StartMenuItemText call PrintStartMenuItem - ld de,W_PLAYERNAME ; player's name + ld de,wPlayerName ; player's name call PrintStartMenuItem - ld a,[$d72e] + ld a,[wd72e] bit 6,a ; is the player using the link feature? ; case for not using link feature ld de,StartMenuSaveText @@ -12262,7 +1041,7 @@ DrawStartMenu: ; 710b (1:710b) call PrintStartMenuItem ld de,StartMenuExitText call PlaceString - ld hl,$d730 + ld hl,wd730 res 6,[hl] ; turn pauses between printing letters back on ret @@ -12299,9 +1078,9 @@ INCLUDE "engine/overworld/cable_club_npc.asm" ; function to draw various text boxes ; INPUT: -; [$D125] = text box ID +; [wd125] = text box ID DisplayTextBoxID_: ; 72ea (1:72ea) - ld a,[$d125] ; a = text box ID + ld a,[wd125] ; a = text box ID cp a,$14 jp z,DisplayYesNoTextBox ld c,a @@ -12338,14 +1117,14 @@ DisplayTextBoxID_: ; 72ea (1:72ea) call TextBoxBorder pop hl call GetTextBoxIDText - ld a,[$d730] + ld a,[wd730] push af - ld a,[$d730] + ld a,[wd730] set 6,a ; no pauses between printing each letter - ld [$d730],a + ld [wd730],a call PlaceString pop af - ld [$d730],a + ld [wd730],a call UpdateSprites ; move sprites ret @@ -12568,22 +1347,20 @@ JapanesePokedexMenu: ; 74a1 (1:74a1) next "キャンセル@" Func_74ba: ; 74ba (1:74ba) - ld hl, $d730 + ld hl, wd730 set 6, [hl] ld a, $f - ld [$d125], a + ld [wd125], a call DisplayTextBoxID - FuncCoord 13, 1 ; $c3c1 - ld hl, Coord + hlCoord 13, 1 ld b, $1 ld c, $6 call ClearScreenArea - FuncCoord 12, 1 ; $c3c0 - ld hl, Coord - ld de, wPlayerMoney ; $d347 + hlCoord 12, 1 + ld de, wPlayerMoney ; wPlayerMoney ld c, $a3 call PrintBCDNumber - ld hl, $d730 + ld hl, wd730 res 6, [hl] ret @@ -12591,29 +1368,29 @@ CurrencyString: ; 74e2 (1:74e2) db " ¥@" Func_74ea: ; 74ea (1:74ea) - ld a, [$d730] + ld a, [wd730] set 6, a - ld [$d730], a + ld [wd730], a xor a - ld [$d12d], a + ld [wd12d], a ld a, $e - ld [$d125], a + ld [wd125], a call DisplayTextBoxID ld a, $3 - ld [wMenuWatchedKeys], a ; $cc29 + ld [wMenuWatchedKeys], a ; wMenuWatchedKeys ld a, $2 - ld [wMaxMenuItem], a ; $cc28 + ld [wMaxMenuItem], a ; wMaxMenuItem ld a, $1 - ld [wTopMenuItemY], a ; $cc24 + ld [wTopMenuItemY], a ; wTopMenuItemY ld a, $1 - ld [wTopMenuItemX], a ; $cc25 + ld [wTopMenuItemX], a ; wTopMenuItemX xor a - ld [wCurrentMenuItem], a ; $cc26 - ld [wLastMenuItem], a ; $cc2a - ld [$cc37], a - ld a, [$d730] + ld [wCurrentMenuItem], a ; wCurrentMenuItem + ld [wLastMenuItem], a ; wLastMenuItem + ld [wcc37], a + ld a, [wd730] res 6, a - ld [$d730], a + ld [wd730], a call HandleMenuInput call PlaceUnfilledArrowMenuCursor bit 0, a @@ -12621,58 +1398,58 @@ Func_74ea: ; 74ea (1:74ea) bit 1, a jr z, .asm_7539 ld a, $2 - ld [$d12e], a + ld [wd12e], a jr .asm_754c .asm_7539 ld a, $1 - ld [$d12e], a - ld a, [wCurrentMenuItem] ; $cc26 - ld [$d12d], a + ld [wd12e], a + ld a, [wCurrentMenuItem] ; wCurrentMenuItem + ld [wd12d], a ld b, a - ld a, [wMaxMenuItem] ; $cc28 + ld a, [wMaxMenuItem] ; wMaxMenuItem cp b jr z, .asm_754c ret .asm_754c ld a, $2 - ld [$d12e], a - ld a, [wCurrentMenuItem] ; $cc26 - ld [$d12d], a + ld [wd12e], a + ld a, [wCurrentMenuItem] ; wCurrentMenuItem + ld [wd12d], a scf ret DisplayYesNoTextBox: ; 7559 (1:7559) push hl - ld a, [$d730] + ld a, [wd730] set 6, a - ld [$d730], a + ld [wd730], a xor a - ld [$d12d], a - ld [$d12e], a + ld [wd12d], a + ld [wd12e], a ld a, $3 - ld [wMenuWatchedKeys], a ; $cc29 + ld [wMenuWatchedKeys], a ; wMenuWatchedKeys ld a, $1 - ld [wMaxMenuItem], a ; $cc28 + ld [wMaxMenuItem], a ; wMaxMenuItem ld a, b - ld [wTopMenuItemY], a ; $cc24 + ld [wTopMenuItemY], a ; wTopMenuItemY ld a, c - ld [wTopMenuItemX], a ; $cc25 + ld [wTopMenuItemX], a ; wTopMenuItemX xor a - ld [wLastMenuItem], a ; $cc2a - ld [$cc37], a + ld [wLastMenuItem], a ; wLastMenuItem + ld [wcc37], a push hl - ld hl, $d12c + ld hl, wd12c bit 7, [hl] res 7, [hl] jr z, .asm_758d inc a .asm_758d - ld [wCurrentMenuItem], a ; $cc26 + ld [wCurrentMenuItem], a ; wCurrentMenuItem pop hl push hl push hl call Func_763e - ld a, [$d12c] + ld a, [wd12c] ld hl, MenuStrings ; $7671 ld e, a ld d, $0 @@ -12689,7 +1466,7 @@ DisplayYesNoTextBox: ; 7559 (1:7559) ld d, h pop hl push de - ld a, [$d12c] + ld a, [wd12c] cp $5 jr nz, .asm_75b9 call Func_5ab3 @@ -12712,13 +1489,13 @@ DisplayYesNoTextBox: ; 7559 (1:7559) pop hl add hl, bc call PlaceString - ld hl, $d730 + ld hl, wd730 res 6, [hl] - ld a, [$d12c] + ld a, [wd12c] cp $7 jr nz, .asm_7603 xor a - ld [$d12c], a + ld [wd12c], a ld a, [wFlags_0xcd60] push af push hl @@ -12738,18 +1515,18 @@ DisplayYesNoTextBox: ; 7559 (1:7559) jr .asm_760f .asm_7603 xor a - ld [$d12c], a + ld [wd12c], a call HandleMenuInput pop hl bit 1, a jr nz, .asm_7627 .asm_760f - ld a, [wCurrentMenuItem] ; $cc26 - ld [$d12d], a + ld a, [wCurrentMenuItem] ; wCurrentMenuItem + ld [wd12d], a and a jr nz, .asm_7627 ld a, $1 - ld [$d12e], a + ld [wd12e], a ld c, $f call DelayFrames call Func_7656 @@ -12757,10 +1534,10 @@ DisplayYesNoTextBox: ; 7559 (1:7559) ret .asm_7627 ld a, $1 - ld [wCurrentMenuItem], a ; $cc26 - ld [$d12d], a + ld [wCurrentMenuItem], a ; wCurrentMenuItem + ld [wd12d], a ld a, $2 - ld [$d12e], a + ld [wd12e], a ld c, $f call DelayFrames call Func_7656 @@ -12768,7 +1545,7 @@ DisplayYesNoTextBox: ; 7559 (1:7559) ret Func_763e: ; 763e (1:763e) - ld de, $cee9 + ld de, wHPBarMaxHP ld bc, $506 .asm_7644 ld a, [hli] @@ -12786,7 +1563,7 @@ Func_763e: ; 763e (1:763e) ret Func_7656: ; 7656 (1:7656) - ld de, $cee9 + ld de, wHPBarMaxHP ld bc, $506 .asm_765c ld a, [de] @@ -12839,7 +1616,7 @@ MenuStrings: ; 7671 (1:7671) Func_76e1: ; 76e1 (1:36e1) xor a - ld hl, wWhichTrade ; $cd3d + ld hl, wWhichTrade ; wWhichTrade ld [hli], a ld [hli], a ld [hli], a @@ -12847,26 +1624,23 @@ Func_76e1: ; 76e1 (1:36e1) ld [hli], a ld [hl], $c call GetMonFieldMoves - ld a, [$cd41] + ld a, [wTrainerScreenX] and a jr nz, .asm_770f - FuncCoord 11, 11 ; $c487 - ld hl, Coord + hlCoord 11, 11 ld b, $5 ld c, $7 call TextBoxBorder call UpdateSprites ld a, $c ld [$fff7], a - FuncCoord 13, 12 ; $c49d - ld hl, Coord + hlCoord 13, 12 ld de, PokemonMenuEntries ; $77c2 jp PlaceString .asm_770f push af - FuncCoord 0, 11 ; $c47c - ld hl, Coord - ld a, [$cd42] + hlCoord 0, 11 + ld a, [wcd42] dec a ld e, a ld d, $0 @@ -12888,22 +1662,21 @@ Func_76e1: ; 76e1 (1:36e1) inc b call TextBoxBorder call UpdateSprites - FuncCoord 0, 12 ; $c490 - ld hl, Coord - ld a, [$cd42] + hlCoord 0, 12 + ld a, [wcd42] inc a ld e, a ld d, $0 add hl, de ld de, $ffd8 - ld a, [$cd41] + ld a, [wTrainerScreenX] .asm_7747 add hl, de dec a jr nz, .asm_7747 xor a - ld [$cd41], a - ld de, wWhichTrade ; $cd3d + ld [wTrainerScreenX], a + ld de, wWhichTrade ; wWhichTrade .asm_7752 push hl ld hl, FieldMoveNames ; $778d @@ -12934,11 +1707,10 @@ Func_76e1: ; 76e1 (1:36e1) jr .asm_7752 .asm_7776 pop hl - ld a, [$cd42] + ld a, [wcd42] ld [$fff7], a - FuncCoord 0, 12 ; $c490 - ld hl, Coord - ld a, [$cd42] + hlCoord 0, 12 + ld a, [wcd42] inc a ld e, a ld d, $0 @@ -12963,14 +1735,14 @@ PokemonMenuEntries: ; 77c2 (1:77c2) next "CANCEL@" GetMonFieldMoves: ; 77d6 (1:77d6) - ld a, [wWhichPokemon] ; $cf92 - ld hl, W_PARTYMON1_MOVE1 ; $d173 + ld a, [wWhichPokemon] ; wWhichPokemon + ld hl, wPartyMon1Moves ; wPartyMon1Moves ld bc, $2c call AddNTimes ld d, h ld e, l ld c, $5 - ld hl, wWhichTrade ; $cd3d + ld hl, wWhichTrade ; wWhichTrade .asm_77e9 push hl .asm_77ea @@ -12993,21 +1765,21 @@ GetMonFieldMoves: ; 77d6 (1:77d6) jr .asm_77f6 .asm_7802 ld a, b - ld [$cd43], a + ld [wcd43], a ld a, [hli] ld b, [hl] pop hl ld [hli], a - ld a, [$cd41] + ld a, [wTrainerScreenX] inc a - ld [$cd41], a - ld a, [$cd42] + ld [wTrainerScreenX], a + ld a, [wcd42] cp b jr c, .asm_781b ld a, b - ld [$cd42], a + ld [wcd42], a .asm_781b - ld a, [$cd43] + ld a, [wcd43] ld b, a jr .asm_77e9 .asm_7821 @@ -13038,16 +1810,16 @@ INCLUDE "engine/battle/1.asm" INCLUDE "engine/menu/players_pc.asm" _RemovePokemon: ; 7b68 (1:7b68) - ld hl, W_NUMINPARTY ; $d163 - ld a, [$cf95] + ld hl, wPartyCount ; wPartyCount + ld a, [wcf95] and a jr z, .asm_7b74 - ld hl, W_NUMINBOX ; $da80 + ld hl, W_NUMINBOX ; wda80 .asm_7b74 ld a, [hl] dec a ld [hli], a - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon ld c, a ld b, $0 add hl, bc @@ -13060,17 +1832,17 @@ _RemovePokemon: ; 7b68 (1:7b68) ld [hli], a inc a jr nz, .asm_7b81 - ld hl, W_PARTYMON1OT ; $d273 + ld hl, wPartyMonOT ; wd273 ld d, $5 - ld a, [$cf95] + ld a, [wcf95] and a jr z, .asm_7b97 - ld hl, W_BOXMON1OT + ld hl, wBoxMonOT ld d, $13 .asm_7b97 - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon call SkipFixedLengthTextEntries - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon cp d jr nz, .asm_7ba6 ld [hl], $ff @@ -13080,135 +1852,83 @@ _RemovePokemon: ; 7b68 (1:7b68) ld e, l ld bc, $b add hl, bc - ld bc, W_PARTYMON1NAME ; $d2b5 - ld a, [$cf95] + ld bc, wPartyMonNicks ; wPartyMonNicks + ld a, [wcf95] and a jr z, .asm_7bb8 - ld bc, W_BOXMON1NAME + ld bc, wBoxMonNicks .asm_7bb8 call CopyDataUntil - ld hl, W_PARTYMON1_NUM ; $d16b (aliases: W_PARTYMON1DATA) - ld bc, $2c - ld a, [$cf95] + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 + ld a, [wcf95] and a jr z, .asm_7bcd - ld hl, W_BOXMON1DATA - ld bc, $21 + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 .asm_7bcd - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon call AddNTimes ld d, h ld e, l - ld a, [$cf95] + ld a, [wcf95] and a jr z, .asm_7be4 - ld bc, $21 + ld bc, wBoxMon2 - wBoxMon1 add hl, bc - ld bc, W_BOXMON1OT + ld bc, wBoxMonOT jr .asm_7beb .asm_7be4 - ld bc, $2c + ld bc, wPartyMon2 - wPartyMon1 add hl, bc - ld bc, W_PARTYMON1OT ; $d273 + ld bc, wPartyMonOT ; wd273 .asm_7beb call CopyDataUntil - ld hl, W_PARTYMON1NAME ; $d2b5 - ld a, [$cf95] + ld hl, wPartyMonNicks ; wPartyMonNicks + ld a, [wcf95] and a jr z, .asm_7bfa - ld hl, W_BOXMON1NAME + ld hl, wBoxMonNicks .asm_7bfa ld bc, $b - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon call AddNTimes ld d, h ld e, l ld bc, $b add hl, bc - ld bc, wPokedexOwned ; $d2f7 - ld a, [$cf95] + ld bc, wPokedexOwned ; wPokedexOwned + ld a, [wcf95] and a jr z, .asm_7c15 - ld bc, $dee2 + ld bc, wBoxMonNicksEnd .asm_7c15 jp CopyDataUntil Func_7c18: ; 7c18 (1:7c18) - ld hl, $d730 + ld hl, wd730 set 6, [hl] - ld a, $3d - call Predef - ld hl, $d730 + predef ShowPokedexData + ld hl, wd730 res 6, [hl] call ReloadMapData ld c, $a call DelayFrames - ld a, $3a - call Predef - ld a, [$d11e] + predef IndexToPokedex + ld a, [wd11e] dec a ld c, a ld b, $1 ld hl, wPokedexSeen - ld a, $10 - call Predef + predef FlagActionPredef ld a, $1 - ld [$cc3c], a + ld [wcc3c], a ret SECTION "bank3",ROMX,BANK[$3] -_GetJoypadState: ; c000 (3:4000) - ld a, [H_JOYPADSTATE] - cp BTN_A | BTN_B | BTN_SELECT | BTN_START ; soft reset sequence - jp z, HandleJoypadResetButtons - ld b, a - ld a, [H_OLDPRESSEDBUTTONS] - ld e, a - xor b - ld d, a - and e - ld [H_NEWLYRELEASEDBUTTONS], a - ld a, d - and b - ld [H_NEWLYPRESSEDBUTTONS], a - ld a, b - ld [H_OLDPRESSEDBUTTONS], a - ld a, [$d730] - bit 5, a - jr nz, DiscardButtonPresses - ld a, [H_OLDPRESSEDBUTTONS] - ld [H_CURRENTPRESSEDBUTTONS], a - ld a, [wJoypadForbiddenButtonsMask] - and a - ret z - cpl - ld b, a - ld a, [H_CURRENTPRESSEDBUTTONS] - and b - ld [H_CURRENTPRESSEDBUTTONS], a - ld a, [H_NEWLYPRESSEDBUTTONS] - and b - ld [H_NEWLYPRESSEDBUTTONS], a - ret - -; clears all button presses -DiscardButtonPresses: ; c034 (3:4034) - xor a - ld [H_CURRENTPRESSEDBUTTONS], a - ld [H_NEWLYPRESSEDBUTTONS], a - ld [H_NEWLYRELEASEDBUTTONS], a - ret - -HandleJoypadResetButtons: ; c03c (3:403c) - call DelayFrame - ld a, $30 - ld [rJOYP], a ; reset joypad state (to enusre the user really intends to reset) - ld hl, H_SOFTRESETCOUNTER - dec [hl] - jp z, SoftReset - jp GetJoypadState +INCLUDE "engine/joypad.asm" INCLUDE "data/map_songs.asm" @@ -13220,41 +1940,41 @@ Func_c335: ; c335 (3:4335) ld [rWY], a ; $ff4a xor a ld [H_AUTOBGTRANSFERENABLED], a ; $ffba - ld [$d13b], a - ld [W_LONEATTACKNO], a ; $d05c - ld [H_NEWLYPRESSEDBUTTONS], a - ld [H_NEWLYRELEASEDBUTTONS], a - ld [H_CURRENTPRESSEDBUTTONS], a - ld [$cd6a], a - ld [$d5a3], a - ld hl, $d73f + ld [wd13b], a + ld [W_LONEATTACKNO], a ; W_GYMLEADERNO + ld [hJoyPressed], a + ld [hJoyReleased], a + ld [hJoyHeld], a + ld [wcd6a], a + ld [wd5a3], a + ld hl, wd73f ld [hli], a ld [hl], a - ld hl, wWhichTrade ; $cd3d + ld hl, wWhichTrade ; wWhichTrade ld bc, $1e call FillMemory ret Func_c35f: ; c35f (3:435f) - ld a, [$d3ae] + ld a, [wd3ae] and a ret z ld c, a - ld hl, $d3af + ld hl, wd3af .asm_c368 - ld a, [W_YCOORD] ; $d361 + ld a, [W_YCOORD] ; wd361 cp [hl] jr nz, .asm_c383 inc hl - ld a, [W_XCOORD] ; $d362 + ld a, [W_XCOORD] ; wd362 cp [hl] jr nz, .asm_c384 inc hl ld a, [hli] - ld [$d42f], a + ld [wd42f], a ld a, [hl] ld [H_DOWNARROWBLINKCNT1], a ; $ff8b - ld hl, $d736 + ld hl, wd736 set 2, [hl] ret .asm_c383 @@ -13268,7 +1988,7 @@ Func_c35f: ; c35f (3:435f) ret CheckForceBikeOrSurf: ; c38b (3:438b) - ld hl, $D732 + ld hl, wd732 bit 5, [hl] ret nz ld hl, ForcedBikeOrSurfMaps @@ -13301,11 +2021,11 @@ CheckForceBikeOrSurf: ; c38b (3:438b) ld [W_SEAFOAMISLANDS5CURSCRIPT], a jr z, .forceSurfing ;force bike riding - ld hl, $d732 + ld hl, wd732 set 5, [hl] ld a, $1 - ld [$d700], a - ld [$d11a], a + ld [wd700], a + ld [wd11a], a jp ForceBikeOrSurf .incorrectMap inc hl @@ -13314,8 +2034,8 @@ CheckForceBikeOrSurf: ; c38b (3:438b) jr .loop .forceSurfing ld a, $2 - ld [$d700], a - ld [$d11a], a + ld [wd700], a + ld [wd11a], a jp ForceBikeOrSurf INCLUDE "data/force_bike_surf.asm" @@ -13324,7 +2044,7 @@ Func_c3ff: ; c3ff (3:43ff) push hl push de push bc - ld a, [$c109] + ld a, [wSpriteStateData1 + 9] srl a ld c, a ld b, $0 @@ -13333,9 +2053,9 @@ Func_c3ff: ; c3ff (3:43ff) ld a, [hli] ld h, [hl] ld l, a - ld a, [W_YCOORD] ; $d361 + ld a, [W_YCOORD] ; wd361 ld b, a - ld a, [W_XCOORD] ; $d362 + ld a, [W_XCOORD] ; wd362 ld c, a ld de, .asm_c41e ; $441e push de @@ -13353,7 +2073,7 @@ PointerTable_c422: ; c422 (3:4422) dw .asm_4440 .asm_c42a - ld a, [W_CURMAPHEIGHT] ; $d368 + ld a, [W_CURMAPHEIGHT] ; wd368 add a dec a cp b @@ -13373,7 +2093,7 @@ PointerTable_c422: ; c422 (3:4422) jr .resetCarry .asm_4440 - ld a, [W_CURMAPWIDTH] ; $d369 + ld a, [W_CURMAPWIDTH] ; wd369 add a dec a cp c @@ -13391,10 +2111,10 @@ Func_c44e: ; c44e (3:444e) push de push bc call Func_c589 - ld a, [W_CURMAP] ; $d35e + ld a, [W_CURMAP] ; W_CURMAP cp SS_ANNE_5 jr z, .ssAnne5 - ld a, [$c109] + ld a, [wSpriteStateData1 + 9] srl a ld c, a ld b, $0 @@ -13403,7 +2123,7 @@ Func_c44e: ; c44e (3:444e) ld a, [hli] ld h, [hl] ld l, a - ld a, [$cfc6] + ld a, [wcfc6] ld de, $1 call IsInArray .asm_c473 @@ -13431,7 +2151,7 @@ Func_c44e: ; c44e (3:444e) db $0F,$4E,$FF .ssAnne5 - ld a, [$cfc6] + ld a, [wcfc6] cp $15 jr nz, .asm_c49a scf @@ -13446,7 +2166,7 @@ Func_c49d: ; c49d (3:449d) push bc callba HandleDoors jr c, .asm_c4c8 - ld a, [W_CURMAPTILESET] ; $d367 + ld a, [W_CURMAPTILESET] ; W_CURMAPTILESET add a ld c, a ld b, $0 @@ -13456,11 +2176,10 @@ Func_c49d: ; c49d (3:449d) ld h, [hl] ld l, a ld de, $1 - FuncCoord 8, 9 ; $c45c - ld a, [Coord] + aCoord 8, 9 call IsInArray jr nc, .asm_c4c8 - ld hl, $d736 + ld hl, wd736 res 2, [hl] .asm_c4c8 pop bc @@ -13471,7 +2190,7 @@ Func_c49d: ; c49d (3:449d) INCLUDE "data/warp_tile_ids.asm" PrintSafariZoneSteps: ; c52f (3:452f) - ld a, [W_CURMAP] ; $d35e + ld a, [W_CURMAP] ; W_CURMAP cp SAFARI_ZONE_EAST ret c cp UNKNOWN_DUNGEON_2 @@ -13480,30 +2199,25 @@ PrintSafariZoneSteps: ; c52f (3:452f) ld b, $3 ld c, $7 call TextBoxBorder - FuncCoord 1, 1 ; $c3b5 - ld hl, Coord - ld de, wSafariSteps ; $d70d + hlCoord 1, 1 + ld de, wSafariSteps ; wd70d ld bc, $203 call PrintNumber - FuncCoord 4, 1 ; $c3b8 - ld hl, Coord + hlCoord 4, 1 ld de, SafariSteps ; $4579 call PlaceString - FuncCoord 1, 3 ; $c3dd - ld hl, Coord + hlCoord 1, 3 ld de, SafariBallText call PlaceString - ld a, [W_NUMSAFARIBALLS] ; $da47 + ld a, [W_NUMSAFARIBALLS] ; W_NUMSAFARIBALLS cp $a jr nc, .asm_c56d - FuncCoord 5, 3 ; $c3e1 - ld hl, Coord + hlCoord 5, 3 ld a, $7f ld [hl], a .asm_c56d - FuncCoord 6, 3 ; $c3e2 - ld hl, Coord - ld de, W_NUMSAFARIBALLS ; $da47 + hlCoord 6, 3 + ld de, W_NUMSAFARIBALLS ; W_NUMSAFARIBALLS ld bc, $102 jp PrintNumber @@ -13514,59 +2228,54 @@ SafariBallText: ; c57e (3:457e) db "BALL×× @" Func_c586: ; c586 (3:4586) - call Load16BitRegisters + call GetPredefRegisters Func_c589: ; c589 (3:4589) - ld a, [W_YCOORD] ; $d361 + ld a, [W_YCOORD] ; wd361 ld d, a - ld a, [W_XCOORD] ; $d362 + ld a, [W_XCOORD] ; wd362 ld e, a - ld a, [$c109] + ld a, [wSpriteStateData1 + 9] and a jr nz, .asm_c59d - FuncCoord 8, 11 ; $c484 - ld a, [Coord] + aCoord 8, 11 inc d jr .asm_c5b9 .asm_c59d cp $4 jr nz, .asm_c5a7 - FuncCoord 8, 7 ; $c434 - ld a, [Coord] + aCoord 8, 7 dec d jr .asm_c5b9 .asm_c5a7 cp $8 jr nz, .asm_c5b1 - FuncCoord 6, 9 ; $c45a - ld a, [Coord] + aCoord 6, 9 dec e jr .asm_c5b9 .asm_c5b1 cp $c jr nz, .asm_c5b9 - FuncCoord 10, 9 ; $c45e - ld a, [Coord] + aCoord 10, 9 inc e .asm_c5b9 ld c, a - ld [$cfc6], a + ld [wcfc6], a ret Func_c5be: ; c5be (3:45be) xor a ld [$ffdb], a - ld hl, W_YCOORD ; $d361 + ld hl, W_YCOORD ; wd361 ld a, [hli] ld d, a ld e, [hl] - ld a, [$c109] + ld a, [wSpriteStateData1 + 9] and a jr nz, .asm_c5d8 ld hl, $ffdb set 0, [hl] - FuncCoord 8, 13 ; $c4ac - ld a, [Coord] + aCoord 8, 13 inc d jr .asm_c603 .asm_c5d8 @@ -13574,8 +2283,7 @@ Func_c5be: ; c5be (3:45be) jr nz, .asm_c5e7 ld hl, $ffdb set 1, [hl] - FuncCoord 8, 5 ; $c40c - ld a, [Coord] + aCoord 8, 5 dec d jr .asm_c603 .asm_c5e7 @@ -13583,8 +2291,7 @@ Func_c5be: ; c5be (3:45be) jr nz, .asm_c5f6 ld hl, $ffdb set 2, [hl] - FuncCoord 4, 9 ; $c458 - ld a, [Coord] + aCoord 4, 9 dec e jr .asm_c603 .asm_c5f6 @@ -13592,18 +2299,17 @@ Func_c5be: ; c5be (3:45be) jr nz, .asm_c603 ld hl, $ffdb set 3, [hl] - FuncCoord 12, 9 ; $c460 - ld a, [Coord] + aCoord 12, 9 inc e .asm_c603 ld c, a - ld [$d71c], a - ld [$cfc6], a + ld [wd71c], a + ld [wcfc6], a ret Func_c60b: ; c60b (3:460b) call Func_c5be - ld hl, $d530 + ld hl, W_TILESETCOLLISIONPTR ld a, [hli] ld h, [hl] ld l, a @@ -13617,31 +2323,31 @@ Func_c60b: ; c60b (3:460b) call Func_c44 ld a, $ff jr c, .asm_c632 - ld a, [$d71c] + ld a, [wd71c] cp $15 ld a, $ff jr z, .asm_c632 call Func_c636 .asm_c632 - ld [$d71c], a + ld [wd71c], a ret Func_c636: ; c636 (3:4636) - ld a, [$d718] + ld a, [wd718] dec a swap a ld d, $0 ld e, a - ld hl, $c214 + ld hl, wSpriteStateData2 + $14 add hl, de ld a, [hli] ld [$ffdc], a ld a, [hl] ld [$ffdd], a - ld a, [W_NUMSPRITES] ; $d4e1 + ld a, [W_NUMSPRITES] ; W_NUMSPRITES ld c, a ld de, $f - ld hl, $c214 + ld hl, wSpriteStateData2 + $14 ld a, [$ffdb] and $3 jr z, .asm_c678 @@ -13702,19 +2408,19 @@ Func_c636: ; c636 (3:4636) ret Func_c69c: ; c69c (3:469c) - ld a, [$d730] + ld a, [wd730] add a jp c, .asm_c74f - ld a, [W_NUMINPARTY] ; $d163 + ld a, [wPartyCount] ; wPartyCount and a jp z, .asm_c74f call Func_c8de - ld a, [$d13b] + ld a, [wd13b] and $3 jp nz, .asm_c74f - ld [wWhichPokemon], a ; $cf92 - ld hl, W_PARTYMON1_STATUS ; $d16f - ld de, W_PARTYMON1 ; $d164 + ld [wWhichPokemon], a ; wWhichPokemon + ld hl, wPartyMon1Status ; wPartyMon1Status + ld de, wPartySpecies ; wPartySpecies .asm_c6be ld a, [hl] and $8 @@ -13743,13 +2449,13 @@ Func_c69c: ; c69c (3:469c) inc hl ld [hl], a ld a, [de] - ld [$d11e], a + ld [wd11e], a push de - ld a, [wWhichPokemon] ; $cf92 - ld hl, W_PARTYMON1NAME ; $d2b5 + ld a, [wWhichPokemon] ; wWhichPokemon + ld hl, wPartyMonNicks ; wPartyMonNicks call GetPartyMonName xor a - ld [wJoypadForbiddenButtonsMask], a + ld [wJoyIgnore], a call EnableAutoTextBoxDrawing ld a, $d0 ld [H_DOWNARROWBLINKCNT2], a ; $ff8c @@ -13767,13 +2473,13 @@ Func_c69c: ; c69c (3:469c) ld bc, $2c add hl, bc push hl - ld hl, wWhichPokemon ; $cf92 + ld hl, wWhichPokemon ; wWhichPokemon inc [hl] pop hl jr .asm_c6be .asm_c70e - ld hl, W_PARTYMON1_STATUS ; $d16f - ld a, [W_NUMINPARTY] ; $d163 + ld hl, wPartyMon1Status ; wPartyMon1Status + ld a, [wPartyCount] ; wPartyCount ld d, a ld e, $0 .asm_c717 @@ -13789,13 +2495,11 @@ Func_c69c: ; c69c (3:469c) and a jr z, .asm_c733 ld b, $2 - ld a, $1f - call Predef ; indirect jump to Func_480eb (480eb (12:40eb)) + predef Func_480eb ld a, (SFX_02_43 - SFX_Headers_02) / 3 call PlaySound .asm_c733 - ld a, $14 - call Predef ; indirect jump to AnyPlayerPokemonAliveCheck (3ca83 (f:4a83)) + predef AnyPartyAlive ld a, d and a jr nz, .asm_c74f @@ -13803,21 +2507,21 @@ Func_c69c: ; c69c (3:469c) ld a, $d1 ld [H_DOWNARROWBLINKCNT2], a ; $ff8c call DisplayTextID - ld hl, $d72e + ld hl, wd72e set 5, [hl] ld a, $ff jr .asm_c750 .asm_c74f xor a .asm_c750 - ld [$d12d], a + ld [wd12d], a ret Func_c754: ; c754 (3:4754) - call Load16BitRegisters + call GetPredefRegisters push hl ld d, $0 - ld a, [W_CURMAPTILESET] ; $d367 + ld a, [W_CURMAPTILESET] ; W_CURMAPTILESET add a add a ld b, a @@ -13829,7 +2533,7 @@ Func_c754: ; c754 (3:4754) ld e, a ld hl, Tilesets add hl, de - ld de, $d52b + ld de, W_TILESETBANK ld c, $b .asm_c76f ld a, [hli] @@ -13842,7 +2546,7 @@ Func_c754: ; c754 (3:4754) xor a ld [$ffd8], a pop hl - ld a, [W_CURMAPTILESET] ; $d367 + ld a, [W_CURMAPTILESET] ; W_CURMAPTILESET push hl push de ld hl, DungeonTilesets ; $47b2 @@ -13851,22 +2555,22 @@ Func_c754: ; c754 (3:4754) pop de pop hl jr c, .asm_c797 - ld a, [W_CURMAPTILESET] ; $d367 + ld a, [W_CURMAPTILESET] ; W_CURMAPTILESET ld b, a ld a, [H_DOWNARROWBLINKCNT1] ; $ff8b cp b jr z, .asm_c7b1 .asm_c797 - ld a, [$d42f] + ld a, [wd42f] cp $ff jr z, .asm_c7b1 call LoadDestinationWarpPosition - ld a, [W_YCOORD] ; $d361 + ld a, [W_YCOORD] ; wd361 and $1 - ld [W_YBLOCKCOORD], a ; $d363 - ld a, [W_XCOORD] ; $d362 + ld [W_YBLOCKCOORD], a ; wd363 + ld a, [W_XCOORD] ; wd362 and $1 - ld [W_XBLOCKCOORD], a ; $d364 + ld [W_XBLOCKCOORD], a ; wd364 .asm_c7b1 ret @@ -13878,7 +2582,7 @@ Func_c8de: ; c8de (3:48de) ld a, [W_DAYCARE_IN_USE] and a ret z - ld hl, $da6f + ld hl, wDayCareMonExp + 2 inc [hl] ret nz dec hl @@ -13895,8 +2599,8 @@ Func_c8de: ; c8de (3:48de) INCLUDE "data/hide_show_data.asm" -PrintUsedStrengthText: ; cd99 (3:4d99) - ld hl, $d728 +PrintStrengthTxt: ; cd99 (3:4d99) + ld hl, wd728 set 0, [hl] ld hl, UsedStrengthText call PrintText @@ -13906,7 +2610,7 @@ PrintUsedStrengthText: ; cd99 (3:4d99) UsedStrengthText: ; cdaa (3:4daa) TX_FAR _UsedStrengthText db $08 ; asm - ld a, [$cf91] + ld a, [wcf91] call PlayCry call Delay3 jp TextScriptEnd @@ -13916,27 +2620,27 @@ CanMoveBouldersText: ; cdbb (3:4dbb) db "@" CheckForForcedBikeSurf: ; cdc0 (3:4dc0) - ld hl, $d728 + ld hl, wd728 set 1, [hl] - ld a, [$d732] + ld a, [wd732] bit 5, a jr nz, .asm_cdec - ld a, [W_CURMAP] ; $d35e + ld a, [W_CURMAP] ; W_CURMAP cp SEAFOAM_ISLANDS_5 ret nz - ld a, [$d881] + ld a, [wd881] and $3 cp $3 ret z ld hl, CoordsData_cdf7 ; $4df7 call ArePlayerCoordsInArray ret nc - ld hl, $d728 + ld hl, wd728 res 1, [hl] ld hl, CurrentTooFastText jp PrintText .asm_cdec - ld hl, $d728 + ld hl, wd728 res 1, [hl] ld hl, CyclingIsFunText jp PrintText @@ -13955,11 +2659,11 @@ CyclingIsFunText: ; cdff (3:4dff) ; 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) -; [$CF91] = item ID -; [$CF96] = item quantity +; [wcf91] = item ID +; [wcf96] = item quantity ; sets carry flag if successful, unsets carry flag if unsuccessful AddItemToInventory_: ; ce04 (3:4e04) - ld a,[$cf96] ; a = item quantity + ld a,[wcf96] ; a = item quantity push af push bc push de @@ -13984,7 +2688,7 @@ AddItemToInventory_: ; ce04 (3:4e04) .loop ld a,[hli] ld b,a ; b = ID of current item in table - ld a,[$cf91] ; a = ID of item being added + 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 @@ -14004,14 +2708,14 @@ AddItemToInventory_: ; ce04 (3:4e04) ld c,a ld b,0 add hl,bc ; hl = address to store the item - ld a,[$cf91] + ld a,[wcf91] ld [hli],a ; store item ID - ld a,[$cf96] + ld a,[wcf96] ld [hli],a ; store item quantity ld [hl],$ff ; store terminator jp .success .increaseItemQuantity ; increase the quantity of an item already in the inventory - ld a,[$cf96] + ld a,[wcf96] ld b,a ; b = quantity to add ld a,[hl] ; a = existing item quantity add b ; a = new item quantity @@ -14020,7 +2724,7 @@ AddItemToInventory_: ; ce04 (3:4e04) ; 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 [$cf96],a ; a = amount left over (to put in the new slot) + ld [wcf96],a ; a = amount left over (to put in the new slot) ld a,d and a ; is there room for a new item slot? jr z,.increaseItemQuantityFailed @@ -14043,14 +2747,14 @@ AddItemToInventory_: ; ce04 (3:4e04) pop bc pop bc ld a,b - ld [$cf96],a ; restore the initial value from when the function was called + ld [wcf96],a ; restore the initial value from when the function was called ret ; function to remove an item (in varying quantities) from the player's bag or PC box ; INPUT: ; hl = address of inventory (either wNumBagItems or wNumBoxItems) -; [$CF92] = index (within the inventory) of the item to remove -; [$CF96] = quantity to remove +; [wWhichPokemon] = index (within the inventory) of the item to remove +; [wcf96] = quantity to remove RemoveItemFromInventory_: ; ce74 (3:4e74) push hl inc hl @@ -14062,12 +2766,12 @@ RemoveItemFromInventory_: ; ce74 (3:4e74) inc h .noCarry inc hl - ld a,[$cf96] ; quantity being removed + ld a,[wcf96] ; quantity being removed ld e,a ld a,[hl] ; a = current quantity sub e ld [hld],a ; store new quantity - ld [$cf97],a + ld [wcf97],a and a jr nz,.skipMovingUpSlots ; if the remaining quantity is 0, @@ -14087,13 +2791,13 @@ RemoveItemFromInventory_: ; ce74 (3:4e74) xor a ld [wListScrollOffset],a ld [wCurrentMenuItem],a - ld [$cc2c],a - ld [$d07e],a + ld [wcc2c],a + ld [wd07e],a pop hl ld a,[hl] ; a = number of items in inventory dec a ; decrement the number of items ld [hl],a ; store new number of items - ld [$d12a],a + ld [wd12a],a cp a,2 jr c,.done ld [wMaxMenuItem],a @@ -14149,20 +2853,20 @@ DrawBadges: ; ea03 (3:6a03) ; Instead of removing relevant code, the name graphics were erased. ; Tile ids for face/badge graphics. - ld de, $cd3f + ld de, wTrainerFacingDirection ld hl, .FaceBadgeTiles ld bc, 8 call CopyData ; Booleans for each badge. - ld hl, $cd49 + ld hl, wcd49 ld bc, 8 xor a call FillMemory ; Alter these based on owned badges. - ld de, $cd49 - ld hl, $cd3f + ld de, wcd49 + ld hl, wTrainerFacingDirection ld a, [W_OBTAINEDBADGES] ld b, a ld c, 8 @@ -14181,19 +2885,17 @@ DrawBadges: ; ea03 (3:6a03) jr nz, .CheckBadge ; Draw two rows of badges. - ld hl, $cd3d + ld hl, wWhichTrade ld a, $d8 ; [1] ld [hli], a ld [hl], $60 ; First name - FuncCoord 2, 11 - ld hl, Coord - ld de, $cd49 + hlCoord 2, 11 + ld de, wcd49 call .DrawBadgeRow - FuncCoord 2, 14 - ld hl, Coord - ld de, $cd49 + 4 + hlCoord 2, 14 + ld de, wcd49 + 4 ; call .DrawBadgeRow ; ret @@ -14206,15 +2908,15 @@ DrawBadges: ; ea03 (3:6a03) push hl ; Badge no. - ld a, [$cd3d] + ld a, [wWhichTrade] ld [hli], a inc a - ld [$cd3d], a + ld [wWhichTrade], a ; Names aren't printed if the badge is owned. ld a, [de] and a - ld a, [$cd3e] + ld a, [wTrainerEngageDistance] jr nz, .SkipName call .PlaceTiles jr .PlaceBadge @@ -14225,18 +2927,18 @@ DrawBadges: ; ea03 (3:6a03) inc hl .PlaceBadge - ld [$cd3e], a + ld [wTrainerEngageDistance], a ld de, 20 - 1 add hl, de - ld a, [$cd3f] + ld a, [wTrainerFacingDirection] call .PlaceTiles add hl, de call .PlaceTiles ; Shift badge array back one byte. push bc - ld hl, $cd3f + 1 - ld de, $cd3f + ld hl, wTrainerFacingDirection + 1 + ld de, wTrainerFacingDirection ld bc, 8 call CopyData pop bc @@ -14262,12 +2964,12 @@ DrawBadges: ; ea03 (3:6a03) db $20, $28, $30, $38, $40, $48, $50, $58 GymLeaderFaceAndBadgeTileGraphics: ; ea9e (3:6a9e) - INCBIN "gfx/badges.w16.2bpp" + INCBIN "gfx/badges.2bpp" Func_ee9e: ; ee9e (3:6e9e) - call Load16BitRegisters - ld hl, $c6e8 - ld a, [W_CURMAPWIDTH] ; $d369 + call GetPredefRegisters + ld hl, wOverworldMap + ld a, [W_CURMAPWIDTH] ; wd369 add $6 ld e, a ld d, $0 @@ -14286,11 +2988,11 @@ Func_ee9e: ; ee9e (3:6e9e) jr nz, .asm_eeb7 .asm_eebb add hl, bc - ld a, [$d09f] + ld a, [wd09f] ld [hl], a - ld a, [$d35f] + ld a, [wd35f] ld c, a - ld a, [$d360] + ld a, [wd360] ld b, a call Func_ef4e ret c @@ -14308,7 +3010,7 @@ Func_ee9e: ; ee9e (3:6e9e) ret c Func_eedc: ; eedc (3:6edc) - ld a, [W_ISINBATTLE] ; $d057 + ld a, [W_ISINBATTLE] ; W_ISINBATTLE inc a ret z ld a, [H_AUTOBGTRANSFERENABLED] ; $ffba @@ -14320,7 +3022,7 @@ Func_eedc: ; eedc (3:6edc) ld [$ffd7], a call LoadCurrentMapView call GoPAL_SET_CF1C - ld hl, $d526 + ld hl, wd526 ld a, [hli] ld h, [hl] ld l, a @@ -14330,9 +3032,9 @@ Func_eedc: ; eedc (3:6edc) and $3 or $98 ld a, l - ld [$cee9], a + ld [wHPBarMaxHP], a ld a, h - ld [$ceea], a + ld [wHPBarMaxHP + 1], a ld a, $2 ld [$ffbe], a ld c, $9 @@ -14340,7 +3042,7 @@ Func_eedc: ; eedc (3:6edc) push bc push hl push hl - ld hl, $c378 + ld hl, wOAMBuffer + $78 ld de, $14 ld a, [$ffbe] .asm_ef1a @@ -14389,17 +3091,16 @@ Func_ef4e: ; ef4e (3:6f4e) INCLUDE "engine/overworld/cut.asm" Func_f113: ; f113 (3:7113) - ld a, [W_CURMAP] ; $d35e + ld a, [W_CURMAP] ; W_CURMAP cp ROUTE_1 jr nc, .notInTown ld c, a ld b, $1 ld hl, W_TOWNVISITEDFLAG ; mark town as visited (for flying) - ld a, $10 - call Predef ; indirect jump to HandleBitArray (f666 (3:7666)) + predef FlagActionPredef .notInTown ld hl, MapHSPointers - ld a, [W_CURMAP] ; $d35e + ld a, [W_CURMAP] ; W_CURMAP ld b, $0 ld c, a add hl, bc @@ -14431,7 +3132,7 @@ Func_f132: ; f132 (3:7132) ld [H_DIVISOR], a ld b, $2 call Divide ; divide difference by 3, resulting in the global offset (number of missable items before ours) - ld a, [W_CURMAP] ; $d35e + ld a, [W_CURMAP] ; W_CURMAP ld b, a ld a, [H_DIVIDEND+3] ld c, a ; store global offset in c @@ -14464,7 +3165,7 @@ InitializeMissableObjectsFlags: ; f175 (3:7175) call FillMemory ; clear missable objects flags ld hl, MapHS00 xor a - ld [$d048], a + ld [wd048], a .missableObjectsLoop ld a, [hli] cp $ff ; end of list @@ -14475,12 +3176,12 @@ InitializeMissableObjectsFlags: ; f175 (3:7175) cp Hide jr nz, .asm_f19d ld hl, W_MISSABLEOBJECTFLAGS - ld a, [$d048] + ld a, [wd048] ld c, a ld b, $1 - call HandleBitArray2 ; set flag iff Item is hidden + call MissableObjectFlagAction ; set flag iff Item is hidden .asm_f19d - ld hl, $d048 + ld hl, wd048 inc [hl] pop hl inc hl @@ -14488,7 +3189,7 @@ InitializeMissableObjectsFlags: ; f175 (3:7175) jr .missableObjectsLoop ; tests if current sprite is a missable object that is hidden/has been removed -IsMissableObjectHidden: ; f1a6 (3:71a6) +IsObjectHidden: ; f1a6 (3:71a6) ld a, [H_CURRENTSPRITEOFFSET] swap a ld b, a @@ -14503,7 +3204,7 @@ IsMissableObjectHidden: ; f1a6 (3:71a6) ld c, a ld b, $2 ld hl, W_MISSABLEOBJECTFLAGS - call HandleBitArray2 + call MissableObjectFlagAction ld a, c and a jr nz, .hidden @@ -14514,69 +3215,75 @@ IsMissableObjectHidden: ; f1a6 (3:71a6) ret ; adds missable object (items, leg. pokemon, etc.) to the map -; [$cc4d]: index of the missable object to be added (global index) -AddMissableObject: ; f1c8 (3:71c8) +; [wcc4d]: index of the missable object to be added (global index) +ShowObject: ; f1c8 (3:71c8) +ShowObject2: ld hl, W_MISSABLEOBJECTFLAGS - ld a, [$cc4d] + ld a, [wcc4d] ld c, a ld b, $0 - call HandleBitArray2 ; reset "removed" flag + call MissableObjectFlagAction ; reset "removed" flag jp UpdateSprites ; removes missable object (items, leg. pokemon, etc.) from the map -; [$cc4d]: index of the missable object to be removed (global index) -RemoveMissableObject: ; f1d7 (3:71d7) +; [wcc4d]: index of the missable object to be removed (global index) +HideObject: ; f1d7 (3:71d7) ld hl, W_MISSABLEOBJECTFLAGS - ld a, [$cc4d] + ld a, [wcc4d] ld c, a ld b, $1 - call HandleBitArray2 ; set "removed" flag + call MissableObjectFlagAction ; set "removed" flag jp UpdateSprites -; functionally identical to _HandleBitArray, but with less optimized instructions -; executes operations on a field of bits -; b = 0 -> reset bit -; b = 1 -> set bit -; b = 2 -> read bit (into c and z-flag) -; hl: base address -; c: bit index -HandleBitArray2: ; f1e6 (3:71e6) +MissableObjectFlagAction: +; identical to FlagAction + push hl push de push bc + + ; bit ld a, c ld d, a - and $7 - ld e, a ; store bit offset in e + and 7 + ld e, a + + ; byte ld a, d srl a srl a - srl a ; calc byte offset + srl a add l ld l, a - jr nc, .noCarry + jr nc, .ok inc h -.noCarry +.ok + + ; d = 1 << e (bitmask) inc e - ld d, $1 -.shiftLeftLoop ; d = 1 << e, bitmask for the used bit + ld d, 1 +.shift dec e - jr z, .operationSelect + jr z, .shifted sla d - jr .shiftLeftLoop -.operationSelect + jr .shift +.shifted + ld a, b and a - jr z, .resetBit - cp $2 - jr z, .readBit - ld a, [hl] ; set bit + 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 -.resetBit + +.reset ld a, [hl] ld b, a ld a, d @@ -14584,11 +3291,13 @@ HandleBitArray2: ; f1e6 (3:71e6) and b ld [hl], a jr .done -.readBit + +.read ld a, [hl] ld b, a ld a, d and b + .done pop bc pop de @@ -14597,7 +3306,7 @@ HandleBitArray2: ; f1e6 (3:71e6) ret Func_f225: ; f225 (3:7225) - ld a, [$d728] + ld a, [wd728] bit 0, a ret z ld a, [wFlags_0xcd60] @@ -14607,10 +3316,10 @@ Func_f225: ; f225 (3:7225) ld [H_DOWNARROWBLINKCNT2], a ; $ff8c call IsSpriteInFrontOfPlayer ld a, [H_DOWNARROWBLINKCNT2] ; $ff8c - ld [$d718], a + ld [wd718], a and a jp z, Func_f2dd - ld hl, $c101 + ld hl, wSpriteStateData1 + 1 ld d, $0 ld a, [H_DOWNARROWBLINKCNT2] ; $ff8c swap a @@ -14625,17 +3334,16 @@ Func_f225: ; f225 (3:7225) bit 6, [hl] set 6, [hl] ret z - ld a, [H_CURRENTPRESSEDBUTTONS] + ld a, [hJoyHeld] and $f0 ret z - ld a, $5a - call Predef ; indirect jump to Func_c60b (c60b (3:460b)) - ld a, [$d71c] + predef Func_c60b + ld a, [wd71c] and a jp nz, Func_f2dd - ld a, [H_CURRENTPRESSEDBUTTONS] + ld a, [hJoyHeld] ld b, a - ld a, [$c109] + ld a, [wSpriteStateData1 + 9] cp $4 jr z, .asm_f289 cp $8 @@ -14681,15 +3389,15 @@ MovementData_f2b3: ; f2b3 (3:72b3) db $C0,$FF Func_f2b5: ; f2b5 (3:72b5) - ld a, [$d730] + ld a, [wd730] bit 0, a ret nz callab Func_79f54 call DiscardButtonPresses - ld [wJoypadForbiddenButtonsMask], a + ld [wJoyIgnore], a call Func_f2dd set 7, [hl] - ld a, [$d718] + ld a, [wd718] ld [H_DOWNARROWBLINKCNT2], a ; $ff8c call GetSpriteMovementByte2Pointer ld [hl], $10 @@ -14702,12 +3410,12 @@ Func_f2dd: ; f2dd (3:72dd) res 6, [hl] ret -_AddPokemonToParty: ; f2e5 (3:72e5) - ld de, W_NUMINPARTY ; $d163 - ld a, [$cc49] +_AddPartyMon: ; f2e5 (3:72e5) + ld de, wPartyCount ; wPartyCount + ld a, [wcc49] and $f jr z, .asm_f2f2 - ld de, wEnemyPartyCount ; $d89c + ld de, wEnemyPartyCount ; wEnemyPartyCount .asm_f2f2 ld a, [de] inc a @@ -14721,52 +3429,51 @@ _AddPokemonToParty: ; f2e5 (3:72e5) jr nc, .asm_f300 inc d .asm_f300 - ld a, [$cf91] + ld a, [wcf91] ld [de], a inc de ld a, $ff ld [de], a - ld hl, W_PARTYMON1OT ; $d273 - ld a, [$cc49] + ld hl, wPartyMonOT ; wd273 + ld a, [wcc49] and $f jr z, .asm_f315 - ld hl, W_ENEMYMON1OT + ld hl, wEnemyMonOT .asm_f315 ld a, [$ffe4] dec a call SkipFixedLengthTextEntries ld d, h ld e, l - ld hl, W_PLAYERNAME ; $d158 + ld hl, wPlayerName ; wd158 ld bc, $b call CopyData - ld a, [$cc49] + ld a, [wcc49] and a jr nz, .asm_f33f - ld hl, W_PARTYMON1NAME ; $d2b5 + ld hl, wPartyMonNicks ; wPartyMonNicks ld a, [$ffe4] dec a call SkipFixedLengthTextEntries ld a, $2 - ld [$d07d], a - ld a, $4e - call Predef ; indirect jump to Func_64eb (64eb (1:64eb)) + ld [wd07d], a + predef AskName .asm_f33f - ld hl, W_PARTYMON1_NUM ; $d16b (aliases: W_PARTYMON1DATA) - ld a, [$cc49] + ld hl, wPartyMons + ld a, [wcc49] and $f jr z, .asm_f34c - ld hl, wEnemyMons ; $d8a4 + ld hl, wEnemyMons .asm_f34c ld a, [$ffe4] dec a - ld bc, $2c + ld bc, wPartyMon2 - wPartyMon1 call AddNTimes ld e, l ld d, h push hl - ld a, [$cf91] - ld [$d0b5], a + ld a, [wcf91] + ld [wd0b5], a call GetMonHeader ld hl, W_MONHEADER ld a, [hli] @@ -14774,42 +3481,41 @@ _AddPokemonToParty: ; f2e5 (3:72e5) inc de pop hl push hl - ld a, [$cc49] + ld a, [wcc49] and $f ld a, $98 ; set enemy trainer mon IVs to fixed average values ld b, $88 jr nz, .writeFreshMonData - ld a, [$cf91] - ld [$d11e], a + ld a, [wcf91] + ld [wd11e], a push de - ld a, $3a - call Predef ; indirect jump to IndexToPokedex (41010 (10:5010)) + predef IndexToPokedex pop de - ld a, [$d11e] + ld a, [wd11e] dec a ld c, a ld b, $2 - ld hl, wPokedexOwned ; $d2f7 - call _HandleBitArray + ld hl, wPokedexOwned ; wPokedexOwned + call FlagAction ld a, c - ld [$d153], a - ld a, [$d11e] + ld [wd153], a + ld a, [wd11e] dec a ld c, a ld b, $1 push bc - call _HandleBitArray + call FlagAction pop bc - ld hl, wPokedexSeen ; $d30a - call _HandleBitArray + ld hl, wPokedexSeen ; wd30a + call FlagAction pop hl push hl - ld a, [W_ISINBATTLE] ; $d057 + ld a, [W_ISINBATTLE] ; W_ISINBATTLE and a jr nz, .copyEnemyMonData - call GenRandom ; generate random IVs + call Random ; generate random IVs ld b, a - call GenRandom + call Random .writeFreshMonData ; f3b3 push bc ld bc, $1b @@ -14839,20 +3545,20 @@ _AddPokemonToParty: ; f2e5 (3:72e5) .copyEnemyMonData ld bc, $1b add hl, bc - ld a, [W_ENEMYMONATKDEFIV] ; copy IVs from cur enemy mon + ld a, [wEnemyMonDVs] ; copy IVs from cur enemy mon ld [hli], a - ld a, [W_ENEMYMONSPDSPCIV] + ld a, [wEnemyMonDVs + 1] ld [hl], a - ld a, [W_ENEMYMONCURHP] ; copy HP from cur enemy mon + ld a, [wEnemyMonHP] ; copy HP from cur enemy mon ld [de], a inc de - ld a, [W_ENEMYMONCURHP+1] + ld a, [wEnemyMonHP+1] ld [de], a inc de xor a ld [de], a ; level (?) inc de - ld a, [W_ENEMYMONSTATUS] ; copy status ailments from cur enemy mon + ld a, [wEnemyMonStatus] ; copy status ailments from cur enemy mon ld [de], a inc de .copyMonTypesAndMoves @@ -14884,9 +3590,8 @@ _AddPokemonToParty: ; f2e5 (3:72e5) dec de dec de xor a - ld [$cee9], a - ld a, $3e - call Predef ; indirect jump to WriteMonMoves (3afb8 (e:6fb8)) + ld [wHPBarMaxHP], a + predef WriteMonMoves pop de ld a, [wPlayerID] ; set trainer ID to player ID inc de @@ -14918,15 +3623,15 @@ _AddPokemonToParty: ; f2e5 (3:72e5) inc de inc de pop hl - call AddPokemonToParty_WriteMovePP + call AddPartyMon_WriteMovePP inc de - ld a, [W_CURENEMYLVL] ; $d127 + ld a, [W_CURENEMYLVL] ; W_CURENEMYLVL ld [de], a inc de - ld a, [W_ISINBATTLE] ; $d057 + ld a, [W_ISINBATTLE] ; W_ISINBATTLE dec a jr nz, .calcFreshStats - ld hl, W_ENEMYMONMAXHP ; $cff4 + ld hl, wEnemyMonMaxHP ; wEnemyMonMaxHP ld bc, $a call CopyData ; copy stats of cur enemy mon pop hl @@ -14942,9 +3647,9 @@ _AddPokemonToParty: ; f2e5 (3:72e5) ret LoadMovePPs: ; f473 (3:7473) - call Load16BitRegisters + call GetPredefRegisters ; fallthrough -AddPokemonToParty_WriteMovePP: ; f476 (3:7476) +AddPartyMon_WriteMovePP: ; f476 (3:7476) ld b, $4 .pploop ld a, [hli] ; read move ID @@ -14957,13 +3662,13 @@ AddPokemonToParty_WriteMovePP: ; f476 (3:7476) ld hl, Moves ld bc, $6 call AddNTimes - ld de, $cd6d + ld de, wcd6d ld a, BANK(Moves) call FarCopyData pop bc pop de pop hl - ld a, [$cd72] ; sixth move byte = pp + ld a, [wcd72] ; sixth move byte = pp .empty inc de ld [de], a @@ -14971,10 +3676,10 @@ AddPokemonToParty_WriteMovePP: ; f476 (3:7476) jr nz, .pploop ; there are still moves to read ret -; adds enemy mon [$cf91] (at position [$cf92] in enemy list) to own party +; adds enemy mon [wcf91] (at position [wWhichPokemon] in enemy list) to own party ; used in the cable club trade center _AddEnemyMonToPlayerParty: ; f49d (3:749d) - ld hl, W_NUMINPARTY + ld hl, wPartyCount ld a, [hl] cp $6 scf @@ -14984,73 +3689,72 @@ _AddEnemyMonToPlayerParty: ; f49d (3:749d) ld c, a ld b, $0 add hl, bc - ld a, [$cf91] + ld a, [wcf91] ld [hli], a ; add mon as last list entry ld [hl], $ff ; write new sentinel - ld hl, W_PARTYMON1DATA - ld a, [W_NUMINPARTY] + ld hl, wPartyMons + ld a, [wPartyCount] dec a - ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA + ld bc, wPartyMon2 - wPartyMon1 call AddNTimes ld e, l ld d, h - ld hl, $cf98 - call CopyData ; write new mon's data (from $cf98) - ld hl, W_PARTYMON1OT - ld a, [W_NUMINPARTY] + ld hl, wcf98 + call CopyData ; write new mon's data (from wcf98) + ld hl, wPartyMonOT + ld a, [wPartyCount] dec a call SkipFixedLengthTextEntries ld d, h ld e, l - ld hl, W_ENEMYMON1OT + ld hl, wEnemyMonOT ld a, [wWhichPokemon] call SkipFixedLengthTextEntries ld bc, $000b call CopyData ; write new mon's OT name (from an enemy mon) - ld hl, W_PARTYMON1NAME - ld a, [W_NUMINPARTY] + ld hl, wPartyMonNicks + ld a, [wPartyCount] dec a call SkipFixedLengthTextEntries ld d, h ld e, l - ld hl, W_ENEMYMON1NAME + ld hl, wEnemyMonNicks ld a, [wWhichPokemon] call SkipFixedLengthTextEntries ld bc, $000b call CopyData ; write new mon's nickname (from an enemy mon) - ld a, [$cf91] - ld [$d11e], a - ld a, $3a - call Predef - ld a, [$d11e] + ld a, [wcf91] + ld [wd11e], a + predef IndexToPokedex + ld a, [wd11e] dec a ld c, a ld b, $1 ld hl, wPokedexOwned push bc - call _HandleBitArray ; add to owned pokemon + call FlagAction ; add to owned pokemon pop bc ld hl, wPokedexSeen - call _HandleBitArray ; add to seen pokemon + call FlagAction ; add to seen pokemon and a ret ; return success Func_f51e: ; f51e (3:751e) - ld a, [$cf95] + ld a, [wcf95] and a jr z, .checkPartyMonSlots cp $2 jr z, .checkPartyMonSlots cp $3 - ld hl, W_DAYCAREMONDATA + ld hl, wDayCareMon jr z, .asm_f575 - ld hl, W_NUMINBOX ; $da80 + ld hl, W_NUMINBOX ; wda80 ld a, [hl] cp $14 jr nz, .partyOrBoxNotFull jr .boxFull .checkPartyMonSlots - ld hl, W_NUMINPARTY ; $d163 + ld hl, wPartyCount ; wPartyCount ld a, [hl] cp $6 jr nz, .partyOrBoxNotFull @@ -15063,23 +3767,23 @@ Func_f51e: ; f51e (3:751e) ld c, a ld b, $0 add hl, bc - ld a, [$cf95] + ld a, [wcf95] cp $2 - ld a, [W_DAYCAREMONDATA] + ld a, [wDayCareMon] jr z, .asm_f556 - ld a, [$cf91] + ld a, [wcf91] .asm_f556 ld [hli], a ; write new mon ID ld [hl], $ff ; write new sentinel - ld a, [$cf95] + ld a, [wcf95] dec a - ld hl, W_PARTYMON1DATA ; $d16b - ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA ; $2c - ld a, [W_NUMINPARTY] ; $d163 + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 ; $2c + ld a, [wPartyCount] ; wPartyCount jr nz, .skipToNewMonEntry - ld hl, W_BOXMON1DATA - ld bc, W_BOXMON2DATA - W_BOXMON1DATA ; $21 - ld a, [W_NUMINBOX] ; $da80 + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 ; $21 + ld a, [W_NUMINBOX] ; wda80 .skipToNewMonEntry dec a call AddNTimes @@ -15087,32 +3791,32 @@ Func_f51e: ; f51e (3:751e) push hl ld e, l ld d, h - ld a, [$cf95] + ld a, [wcf95] and a - ld hl, W_BOXMON1DATA - ld bc, W_BOXMON2DATA - W_BOXMON1DATA ; $21 + ld hl, wBoxMons + ld bc, wBoxMon2 - wBoxMon1 ; $21 jr z, .asm_f591 cp $2 - ld hl, W_DAYCAREMONDATA + ld hl, wDayCareMon jr z, .asm_f597 - ld hl, W_PARTYMON1DATA ; $d16b - ld bc, W_PARTYMON2DATA - W_PARTYMON1DATA ; $2c + ld hl, wPartyMons + ld bc, wPartyMon2 - wPartyMon1 ; $2c .asm_f591 - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon call AddNTimes .asm_f597 push hl push de - ld bc, $21 + ld bc, wBoxMon2 - wBoxMon1 call CopyData pop de pop hl - ld a, [$cf95] + ld a, [wcf95] and a jr z, .asm_f5b4 cp $2 jr z, .asm_f5b4 - ld bc, $21 + ld bc, wBoxMon2 - wBoxMon1 add hl, bc ld a, [hl] inc de @@ -15120,68 +3824,68 @@ Func_f51e: ; f51e (3:751e) inc de ld [de], a .asm_f5b4 - ld a, [$cf95] + ld a, [wcf95] cp $3 ld de, W_DAYCAREMONOT jr z, .asm_f5d3 dec a - ld hl, W_PARTYMON1OT ; $d273 - ld a, [W_NUMINPARTY] ; $d163 + ld hl, wPartyMonOT ; wd273 + ld a, [wPartyCount] ; wPartyCount jr nz, .asm_f5cd - ld hl, W_BOXMON1OT - ld a, [W_NUMINBOX] ; $da80 + ld hl, wBoxMonOT + ld a, [W_NUMINBOX] ; wda80 .asm_f5cd dec a call SkipFixedLengthTextEntries ld d, h ld e, l .asm_f5d3 - ld hl, W_BOXMON1OT - ld a, [$cf95] + ld hl, wBoxMonOT + ld a, [wcf95] and a jr z, .asm_f5e6 ld hl, W_DAYCAREMONOT cp $2 jr z, .asm_f5ec - ld hl, W_PARTYMON1OT ; $d273 + ld hl, wPartyMonOT ; wd273 .asm_f5e6 - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon call SkipFixedLengthTextEntries .asm_f5ec ld bc, $b call CopyData - ld a, [$cf95] + ld a, [wcf95] cp $3 ld de, W_DAYCAREMONNAME jr z, .asm_f611 dec a - ld hl, W_PARTYMON1NAME ; $d2b5 - ld a, [W_NUMINPARTY] ; $d163 + ld hl, wPartyMonNicks ; wPartyMonNicks + ld a, [wPartyCount] ; wPartyCount jr nz, .asm_f60b - ld hl, W_BOXMON1NAME - ld a, [W_NUMINBOX] ; $da80 + ld hl, wBoxMonNicks + ld a, [W_NUMINBOX] ; wda80 .asm_f60b dec a call SkipFixedLengthTextEntries ld d, h ld e, l .asm_f611 - ld hl, W_BOXMON1NAME - ld a, [$cf95] + ld hl, wBoxMonNicks + ld a, [wcf95] and a jr z, .asm_f624 ld hl, W_DAYCAREMONNAME cp $2 jr z, .asm_f62a - ld hl, W_PARTYMON1NAME ; $d2b5 + ld hl, wPartyMonNicks ; wPartyMonNicks .asm_f624 - ld a, [wWhichPokemon] ; $cf92 + ld a, [wWhichPokemon] ; wWhichPokemon call SkipFixedLengthTextEntries .asm_f62a ld bc, $b call CopyData pop hl - ld a, [$cf95] + ld a, [wcf95] cp $1 jr z, .asm_f664 cp $3 @@ -15189,11 +3893,11 @@ Func_f51e: ; f51e (3:751e) push hl srl a add $2 - ld [$cc49], a + ld [wcc49], a call LoadMonData callba Func_58f43 ld a, d - ld [W_CURENEMYLVL], a ; $d127 + ld [W_CURENEMYLVL], a ; W_CURENEMYLVL pop hl ld bc, $21 add hl, bc @@ -15208,59 +3912,71 @@ Func_f51e: ; f51e (3:751e) and a ret -; predef $10 -; executes operations on a field of bits -; b = 0 -> reset bit -; b = 1 -> set bit -; b = 2 -> read bit (into c and z-flag) -; hl: base address -; c: bit index -HandleBitArray: ; f666 (3:7666) - call Load16BitRegisters - -_HandleBitArray: ; f669 (3:7669) + +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 ; store bit offset in e + and 7 + ld e, a + + ; byte ld a, d srl a srl a - srl a ; calc byte offset + srl a add l ld l, a - jr nc, .noCarry + jr nc, .ok inc h -.noCarry +.ok + + ; d = 1 << e (bitmask) inc e - ld d, $1 -.shiftLeftLoop ; d = 1 << e, bitmask for the used bit + ld d, 1 +.shift dec e - jr z, .operationSelect + jr z, .shifted sla d - jr .shiftLeftLoop -.operationSelect + jr .shift +.shifted + ld a, b and a - jr z, .resetBit - cp $2 - jr z, .readBit - ld b, [hl] ; set bit + jr z, .reset + cp 2 + jr z, .read + +.set + ld b, [hl] ld a, d or b ld [hl], a jr .done -.resetBit + +.reset ld b, [hl] ld a, d xor $ff and b ld [hl], a jr .done -.readBit + +.read ld b, [hl] ld a, d and b @@ -15271,43 +3987,55 @@ _HandleBitArray: ; f669 (3:7669) ld c, a ret -HealParty: ; f6a5 (3:76a5) - ld hl, W_PARTYMON1 - ld de, W_PARTYMON1_HP -.HealPokemon: ; f6ab (3:76ab) + +HealParty: +; Restore HP and PP. + + ld hl, wPartySpecies + ld de, wPartyMon1HP +.healmon ld a, [hli] cp $ff - jr z, .DoneHealing ; End if there's no Pokémon + jr z, .done + push hl push de - ld hl, $0003 ; Status offset + + ld hl, wPartyMon1Status - wPartyMon1HP add hl, de xor a - ld [hl], a ; Clean status conditions + ld [hl], a + push de - ld b, $4 ; A Pokémon has 4 moves -.RestorePP: ; f6bb (3:76bb) - ld hl, $0007 ; Move offset + 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, .HealNext ; Skip if there's no move here + jr z, .nextmove + dec a - ld hl, $001c ; PP offset + ld hl, wPartyMon1PP - wPartyMon1HP add hl, de + push hl push de push bc + ld hl, Moves ld bc, $0006 call AddNTimes - ld de, $cd6d + ld de, wcd6d ld a, BANK(Moves) - call FarCopyData ; copy move header to memory - ld a, [$cd72] ; get default PP + call FarCopyData + ld a, [wcd72] ; default pp + pop bc pop de pop hl + inc de push bc ld b, a @@ -15316,50 +4044,58 @@ HealParty: ; f6a5 (3:76a5) add b ld [hl], a pop bc -.HealNext: ; f6eb (3:76eb) + +.nextmove dec b - jr nz, .RestorePP ; Continue if there's still moves + jr nz, .pp pop de - ld hl, $0021 ; Max HP offset + + ld hl, wPartyMon1MaxHP - wPartyMon1HP add hl, de ld a, [hli] ld [de], a inc de ld a, [hl] - ld [de], a ; Restore full HP + ld [de], a + pop de pop hl + push hl - ld bc, $002c + ld bc, wPartyMon2 - wPartyMon1 ld h, d ld l, e add hl, bc ld d, h ld e, l pop hl - jr .HealPokemon ; Next Pokémon -.DoneHealing + jr .healmon + +.done xor a ld [wWhichPokemon], a - ld [$d11e], a - ld a, [W_NUMINPARTY] + ld [wd11e], a + + ld a, [wPartyCount] ld b, a -.restoreBonusPPLoop ; loop to restore bonus PP from PP Ups +.ppup push bc call RestoreBonusPP pop bc ld hl, wWhichPokemon inc [hl] dec b - jr nz,.restoreBonusPPLoop + jr nz, .ppup ret -; predef $9 -; predef $a -; predef $d -; predef $e -Func_f71e: ; f71e (3:771e) - call Load16BitRegisters + +DivideBCDPredef:: +DivideBCDPredef2:: +DivideBCDPredef3:: +DivideBCDPredef4:: + call GetPredefRegisters + +DivideBCD:: xor a ld [$ffa5], a ld [$ffa6], a @@ -15507,15 +4243,18 @@ Func_f800: ; f800 (3:7800) ld de, $ffa1 ld hl, $ffa4 push bc - call Func_f839 + call SubBCD pop bc jr .asm_f803 -Func_f81d: ; f81d (3:781d) - call Load16BitRegisters + +AddBCDPredef:: + call GetPredefRegisters + +AddBCD:: and a ld b, c -.asm_f822 +.add ld a, [de] adc [hl] daa @@ -15523,25 +4262,26 @@ Func_f81d: ; f81d (3:781d) dec de dec hl dec c - jr nz, .asm_f822 - jr nc, .asm_f835 + jr nz, .add + jr nc, .done ld a, $99 inc de -.asm_f830 +.fill ld [de], a inc de dec b - jr nz, .asm_f830 -.asm_f835 + jr nz, .fill +.done ret -Func_f836: ; f836 (3:7836) - call Load16BitRegisters -Func_f839: ; f839 (3:7839) +SubBCDPredef:: + call GetPredefRegisters + +SubBCD:: and a ld b, c -.asm_f83b +.sub ld a, [de] sbc [hl] daa @@ -15549,66 +4289,80 @@ Func_f839: ; f839 (3:7839) dec de dec hl dec c - jr nz, .asm_f83b - jr nc, .asm_f84f - ld a, $0 + jr nz, .sub + jr nc, .done + ld a, $00 inc de -.asm_f849 +.fill ld [de], a inc de dec b - jr nz, .asm_f849 + jr nz, .fill scf -.asm_f84f +.done ret -InitializePlayerData: ; f850 (3:7850) - call GenRandom - ld a, [H_RAND2] - ld [wPlayerID], a ; set player trainer id - call GenRandom - ld a, [H_RAND1] + +InitPlayerData: +InitPlayerData2: + + call Random + ld a, [hRandomSub] + ld [wPlayerID], a + + call Random + ld a, [hRandomAdd] ld [wPlayerID + 1], a + ld a, $ff - ld [$d71b], a ; XXX what's this? - ld hl, W_NUMINPARTY ; $d163 - call InitializeEmptyList ; no party mons - ld hl, W_NUMINBOX ; $da80 - call InitializeEmptyList ; no boxed mons - ld hl, wNumBagItems ; $d31d - call InitializeEmptyList ; no items - ld hl, wNumBoxItems ; $d53a - call InitializeEmptyList ; no boxed items - ld hl, wPlayerMoney + 1 ; $d348 - ld a, $30 - ld [hld], a ; set money to 00 30 00 (3000) + ld [wd71b], a ; XXX what's this? + + ld hl, wPartyCount + call InitializeEmptyList + ld hl, W_NUMINBOX + call InitializeEmptyList + ld hl, wNumBagItems + call InitializeEmptyList + ld hl, wNumBoxItems + call InitializeEmptyList + +START_MONEY EQU $3000 + ld hl, wPlayerMoney + 1 + ld a, START_MONEY / $100 + ld [hld], a xor a ld [hli], a inc hl ld [hl], a - ld [$cc49], a ; XXX what's this? + + ld [wcc49], a + ld hl, W_OBTAINEDBADGES - ld [hli], a ; no badges obtained - ld [hl], a ; XXX what's this? - ld hl, wPlayerCoins ; $d5a4 - ld [hli], a ; no coins + ld [hli], a + + ld [hl], a + + ld hl, wPlayerCoins + ld [hli], a ld [hl], a - ld hl, W_GAMEPROGRESSFLAGS ; $d5f0 + + ld hl, W_GAMEPROGRESSFLAGS ld bc, $c8 - call FillMemory ; clear all game progress flags + call FillMemory ; clear all game progress flags + jp InitializeMissableObjectsFlags -; writes two bytes $00 $ff to hl -InitializeEmptyList: ; f8a0 (3:78a0) - xor a +InitializeEmptyList: + xor a ; count ld [hli], a - dec a + dec a ; terminator ld [hl], a ret + IsItemInBag_: ; f8a5 (3:78a5) - call Load16BitRegisters - ld hl, wNumBagItems ; $d31d + call GetPredefRegisters + ld hl, wNumBagItems ; wNumBagItems .asm_f8ab inc hl ld a, [hli] @@ -15630,7 +4384,7 @@ Func_f8ba: ; f8ba (3:78ba) ld [hli], a ld [hli], a ld [hl], a - ld hl, $cc97 + ld hl, wcc97 ld de, $0 Func_f8c8: ; f8c8 (3:78c8) @@ -15700,9 +4454,9 @@ Func_f8c8: ; f8c8 (3:78c8) Func_f929: ; f929 (3:7929) xor a ld [$ff9d], a - ld a, [$c104] + ld a, [wSpriteStateData1 + 4] ld d, a - ld a, [$c106] + ld a, [wSpriteStateData1 + 6] ld e, a ld hl, wSpriteStateData1 ld a, [H_DIVIDEND] ; $ff95 (aliases: H_PRODUCT, H_PASTLEADINGZEROES, H_QUOTIENT) @@ -15774,10 +4528,10 @@ Func_f929: ; f929 (3:7929) Func_f9a0: ; f9a0 (3:79a0) ld a, [$ff95] - ld [$cd37], a + ld [wcd37], a dec a - ld de, $ccd3 - ld hl, $cc97 + ld de, wccd3 + ld hl, wcc97 add l ld l, a jr nc, .asm_f9b1 @@ -15821,393 +4575,235 @@ INCLUDE "engine/hp_bar.asm" INCLUDE "engine/hidden_object_functions3.asm" -SECTION "bank4",ROMX,BANK[$4] - -OakAideSprite: ; 10000 (4:4000) - INCBIN "gfx/sprites/oak_aide.2bpp" -RockerSprite: ; 10180 (4:4180) - INCBIN "gfx/sprites/rocker.2bpp" -SwimmerSprite: ; 10300 (4:4300) - INCBIN "gfx/sprites/swimmer.2bpp" -WhitePlayerSprite: ; 10480 (4:4480) - INCBIN "gfx/sprites/white_player.2bpp" -GymHelperSprite: ; 10540 (4:4540) - INCBIN "gfx/sprites/gym_helper.2bpp" -OldPersonSprite: ; 10600 (4:4600) - INCBIN "gfx/sprites/old_person.2bpp" -MartGuySprite: ; 106c0 (4:46c0) - INCBIN "gfx/sprites/mart_guy.2bpp" -FisherSprite: ; 10780 (4:4780) - INCBIN "gfx/sprites/fisher.2bpp" -OldMediumWomanSprite: ; 10840 (4:4840) - INCBIN "gfx/sprites/old_medium_woman.2bpp" -NurseSprite: ; 10900 (4:4900) - INCBIN "gfx/sprites/nurse.2bpp" -CableClubWomanSprite: ; 109c0 (4:49c0) - INCBIN "gfx/sprites/cable_club_woman.2bpp" -MrMasterballSprite: ; 10a80 (4:4a80) - INCBIN "gfx/sprites/mr_masterball.2bpp" -LaprasGiverSprite: ; 10b40 (4:4b40) - INCBIN "gfx/sprites/lapras_giver.2bpp" -WardenSprite: ; 10c00 (4:4c00) - INCBIN "gfx/sprites/warden.2bpp" -SsCaptainSprite: ; 10cc0 (4:4cc0) - INCBIN "gfx/sprites/ss_captain.2bpp" -Fisher2Sprite: ; 10d80 (4:4d80) - INCBIN "gfx/sprites/fisher2.2bpp" -BlackbeltSprite: ; 10f00 (4:4f00) - INCBIN "gfx/sprites/blackbelt.2bpp" -GuardSprite: ; 11080 (4:5080) - INCBIN "gfx/sprites/guard.2bpp" -BallSprite: ; 11140 (4:5140) - INCBIN "gfx/sprites/ball.2bpp" -OmanyteSprite: ; 11180 (4:5180) - INCBIN "gfx/sprites/omanyte.2bpp" -BoulderSprite: ; 111c0 (4:51c0) - INCBIN "gfx/sprites/boulder.2bpp" -PaperSheetSprite: ; 11200 (4:5200) - INCBIN "gfx/sprites/paper_sheet.2bpp" -BookMapDexSprite: ; 11240 (4:5240) - INCBIN "gfx/sprites/book_map_dex.2bpp" -ClipboardSprite: ; 11280 (4:5280) - INCBIN "gfx/sprites/clipboard.2bpp" -SnorlaxSprite: ; 112c0 (4:52c0) - INCBIN "gfx/sprites/snorlax.2bpp" -OldAmberSprite: ; 11300 (4:5300) - INCBIN "gfx/sprites/old_amber.2bpp" -LyingOldManSprite: ; 11340 (4:5340) - INCBIN "gfx/sprites/lying_old_man.2bpp" - -PokemonLogoGraphics: ; 11380 (4:5380) - INCBIN "gfx/pokemon_logo.w128.2bpp" - -FontGraphics: ; 11a80 (4:5a80) - INCBIN "gfx/font.w128.1bpp" - -ABTiles: ; 11e80 (4:5e80) - INCBIN "gfx/AB.2bpp" - -HpBarAndStatusGraphics: ; 11ea0 (4:5ea0) - INCBIN "gfx/hp_bar_and_status.2bpp" - -BattleHudTiles1: ; 12080 (4:6080) - INCBIN "gfx/battle_hud1.1bpp" - -BattleHudTiles2: ; 12098 (4:6098) - INCBIN "gfx/battle_hud2.1bpp" - -BattleHudTiles3: ; 120b0 (4:60b0) - INCBIN "gfx/battle_hud3.1bpp" - -NintendoCopyrightLogoGraphics: ; 120c8 (4:60c8) - INCBIN "gfx/copyright.h8.2bpp" - -GamefreakLogoGraphics: ; 121f8 (4:61f8) - INCBIN "gfx/gamefreak.h8.2bpp" - -TextBoxGraphics: ; 12288 (4:6288) - INCBIN "gfx/text_box.2bpp" - -PokedexTileGraphics: ; 12488 (4:6488) - INCBIN "gfx/pokedex.2bpp" - -WorldMapTileGraphics: ; 125a8 (4:65a8) - INCBIN "gfx/town_map.2bpp" - -PlayerCharacterTitleGraphics: ; 126a8 (4:66a8) - INCBIN "gfx/player_title.2bpp" -INCLUDE "engine/battle/4.asm" +SECTION "NPC Sprites 1", ROMX, BANK[NPC_SPRITES_1] + +OakAideSprite: INCBIN "gfx/sprites/oak_aide.2bpp" +RockerSprite: INCBIN "gfx/sprites/rocker.2bpp" +SwimmerSprite: INCBIN "gfx/sprites/swimmer.2bpp" +WhitePlayerSprite: INCBIN "gfx/sprites/white_player.2bpp" +GymHelperSprite: INCBIN "gfx/sprites/gym_helper.2bpp" +OldPersonSprite: INCBIN "gfx/sprites/old_person.2bpp" +MartGuySprite: INCBIN "gfx/sprites/mart_guy.2bpp" +FisherSprite: INCBIN "gfx/sprites/fisher.2bpp" +OldMediumWomanSprite: INCBIN "gfx/sprites/old_medium_woman.2bpp" +NurseSprite: INCBIN "gfx/sprites/nurse.2bpp" +CableClubWomanSprite: INCBIN "gfx/sprites/cable_club_woman.2bpp" +MrMasterballSprite: INCBIN "gfx/sprites/mr_masterball.2bpp" +LaprasGiverSprite: INCBIN "gfx/sprites/lapras_giver.2bpp" +WardenSprite: INCBIN "gfx/sprites/warden.2bpp" +SsCaptainSprite: INCBIN "gfx/sprites/ss_captain.2bpp" +Fisher2Sprite: INCBIN "gfx/sprites/fisher2.2bpp" +BlackbeltSprite: INCBIN "gfx/sprites/blackbelt.2bpp" +GuardSprite: INCBIN "gfx/sprites/guard.2bpp" +BallSprite: INCBIN "gfx/sprites/ball.2bpp" +OmanyteSprite: INCBIN "gfx/sprites/omanyte.2bpp" +BoulderSprite: INCBIN "gfx/sprites/boulder.2bpp" +PaperSheetSprite: INCBIN "gfx/sprites/paper_sheet.2bpp" +BookMapDexSprite: INCBIN "gfx/sprites/book_map_dex.2bpp" +ClipboardSprite: INCBIN "gfx/sprites/clipboard.2bpp" +SnorlaxSprite: INCBIN "gfx/sprites/snorlax.2bpp" +OldAmberSprite: INCBIN "gfx/sprites/old_amber.2bpp" +LyingOldManSprite: INCBIN "gfx/sprites/lying_old_man.2bpp" + + +SECTION "Graphics", ROMX, BANK[GFX] + +PokemonLogoGraphics: INCBIN "gfx/pokemon_logo.2bpp" +FontGraphics: INCBIN "gfx/font.1bpp" +ABTiles: INCBIN "gfx/AB.2bpp" +HpBarAndStatusGraphics: INCBIN "gfx/hp_bar_and_status.2bpp" +BattleHudTiles1: INCBIN "gfx/battle_hud1.1bpp" +BattleHudTiles2: INCBIN "gfx/battle_hud2.1bpp" +BattleHudTiles3: INCBIN "gfx/battle_hud3.1bpp" +NintendoCopyrightLogoGraphics: INCBIN "gfx/copyright.2bpp" +GamefreakLogoGraphics: INCBIN "gfx/gamefreak.2bpp" +TextBoxGraphics: INCBIN "gfx/text_box.2bpp" +PokedexTileGraphics: INCBIN "gfx/pokedex.2bpp" +WorldMapTileGraphics: INCBIN "gfx/town_map.2bpp" +PlayerCharacterTitleGraphics: INCBIN "gfx/player_title.2bpp" + + +SECTION "Battle (bank 4)", ROMX, BANK[$4] +INCLUDE "engine/battle/4.asm" INCLUDE "engine/menu/status_screen.asm" - INCLUDE "engine/menu/party_menu.asm" -RedPicFront: ; 12ede (4:6ede) - INCBIN "pic/trainer/red.pic" -ShrinkPic1: ; 12fe8 (4:6fe8) - INCBIN "pic/trainer/shrink1.pic" -ShrinkPic2: ; 13042 (4:7042) - INCBIN "pic/trainer/shrink2.pic" +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/4_2.asm" - -INCLUDE "engine/rng.asm" - -SECTION "bank5",ROMX,BANK[$5] - -RedCyclingSprite: ; 14000 (5:4000) - INCBIN "gfx/sprites/cycling.2bpp" -RedSprite: ; 14180 (5:4180) - INCBIN "gfx/sprites/red.2bpp" -BlueSprite: ; 14300 (5:4300) - INCBIN "gfx/sprites/blue.2bpp" -OakSprite: ; 14480 (5:4480) - INCBIN "gfx/sprites/oak.2bpp" -BugCatcherSprite: ; 14600 (5:4600) - INCBIN "gfx/sprites/bug_catcher.2bpp" -SlowbroSprite: ; 14780 (5:4780) - INCBIN "gfx/sprites/slowbro.2bpp" -LassSprite: ; 14900 (5:4900) - INCBIN "gfx/sprites/lass.2bpp" -BlackHairBoy1Sprite: ; 14a80 (5:4a80) - INCBIN "gfx/sprites/black_hair_boy_1.2bpp" -LittleGirlSprite: ; 14c00 (5:4c00) - INCBIN "gfx/sprites/little_girl.2bpp" -BirdSprite: ; 14d80 (5:4d80) - INCBIN "gfx/sprites/bird.2bpp" -FatBaldGuySprite: ; 14f00 (5:4f00) - INCBIN "gfx/sprites/fat_bald_guy.2bpp" -GamblerSprite: ; 15080 (5:5080) - INCBIN "gfx/sprites/gambler.2bpp" -BlackHairBoy2Sprite: ; 15200 (5:5200) - INCBIN "gfx/sprites/black_hair_boy_2.2bpp" -GirlSprite: ; 15380 (5:5380) - INCBIN "gfx/sprites/girl.2bpp" -HikerSprite: ; 15500 (5:5500) - INCBIN "gfx/sprites/hiker.2bpp" -FoulardWomanSprite: ; 15680 (5:5680) - INCBIN "gfx/sprites/foulard_woman.2bpp" -GentlemanSprite: ; 15800 (5:5800) - INCBIN "gfx/sprites/gentleman.2bpp" -DaisySprite: ; 15980 (5:5980) - INCBIN "gfx/sprites/daisy.2bpp" -BikerSprite: ; 15b00 (5:5b00) - INCBIN "gfx/sprites/biker.2bpp" -SailorSprite: ; 15c80 (5:5c80) - INCBIN "gfx/sprites/sailor.2bpp" -CookSprite: ; 15e00 (5:5e00) - INCBIN "gfx/sprites/cook.2bpp" -BikeShopGuySprite: ; 15f80 (5:5f80) - INCBIN "gfx/sprites/bike_shop_guy.2bpp" -MrFujiSprite: ; 16040 (5:6040) - INCBIN "gfx/sprites/mr_fuji.2bpp" -GiovanniSprite: ; 161c0 (5:61c0) - INCBIN "gfx/sprites/giovanni.2bpp" -RocketSprite: ; 16340 (5:6340) - INCBIN "gfx/sprites/rocket.2bpp" -MediumSprite: ; 164c0 (5:64c0) - INCBIN "gfx/sprites/medium.2bpp" -WaiterSprite: ; 16640 (5:6640) - INCBIN "gfx/sprites/waiter.2bpp" -ErikaSprite: ; 167c0 (5:67c0) - INCBIN "gfx/sprites/erika.2bpp" -MomGeishaSprite: ; 16940 (5:6940) - INCBIN "gfx/sprites/mom_geisha.2bpp" -BrunetteGirlSprite: ; 16ac0 (5:6ac0) - INCBIN "gfx/sprites/brunette_girl.2bpp" -LanceSprite: ; 16c40 (5:6c40) - INCBIN "gfx/sprites/lance.2bpp" -MomSprite: ; 16dc0 (5:6dc0) - INCBIN "gfx/sprites/mom.2bpp" -BaldingGuySprite: ; 16e80 (5:6e80) - INCBIN "gfx/sprites/balding_guy.2bpp" -YoungBoySprite: ; 16f40 (5:6f40) - INCBIN "gfx/sprites/young_boy.2bpp" -GameboyKidSprite: ; 17000 (5:7000) - INCBIN "gfx/sprites/gameboy_kid.2bpp" -ClefairySprite: ; 170c0 (5:70c0) - INCBIN "gfx/sprites/clefairy.2bpp" -AgathaSprite: ; 17240 (5:7240) - INCBIN "gfx/sprites/agatha.2bpp" -BrunoSprite: ; 173c0 (5:73c0) - INCBIN "gfx/sprites/bruno.2bpp" -LoreleiSprite: ; 17540 (5:7540) - INCBIN "gfx/sprites/lorelei.2bpp" -SeelSprite: ; 176c0 (5:76c0) - INCBIN "gfx/sprites/seel.2bpp" +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/5.asm" - INCLUDE "engine/menu/pc.asm" + SECTION "bank6",ROMX,BANK[$6] INCLUDE "data/mapHeaders/celadoncity.asm" - INCLUDE "data/mapObjects/celadoncity.asm" - -CeladonCityBlocks: ; 180df (6:40df) - INCBIN "maps/celadoncity.blk" +CeladonCityBlocks: INCBIN "maps/celadoncity.blk" INCLUDE "data/mapHeaders/pallettown.asm" - INCLUDE "data/mapObjects/pallettown.asm" - -PalletTownBlocks: ; 182fd (6:42fd) - INCBIN "maps/pallettown.blk" +PalletTownBlocks: INCBIN "maps/pallettown.blk" INCLUDE "data/mapHeaders/viridiancity.asm" - INCLUDE "data/mapObjects/viridiancity.asm" - -ViridianCityBlocks: ; 183ec (6:43ec) - INCBIN "maps/viridiancity.blk" +ViridianCityBlocks: INCBIN "maps/viridiancity.blk" INCLUDE "data/mapHeaders/pewtercity.asm" - INCLUDE "data/mapObjects/pewtercity.asm" - -PewterCityBlocks: ; 185e6 (6:45e6) - INCBIN "maps/pewtercity.blk" +PewterCityBlocks: INCBIN "maps/pewtercity.blk" INCLUDE "data/mapHeaders/ceruleancity.asm" - INCLUDE "data/mapObjects/ceruleancity.asm" - -CeruleanCityBlocks: ; 18830 (6:4830) - INCBIN "maps/ceruleancity.blk" +CeruleanCityBlocks: INCBIN "maps/ceruleancity.blk" INCLUDE "data/mapHeaders/vermilioncity.asm" - INCLUDE "data/mapObjects/vermilioncity.asm" - -VermilionCityBlocks: ; 18a3f (6:4a3f) - INCBIN "maps/vermilioncity.blk" +VermilionCityBlocks: INCBIN "maps/vermilioncity.blk" INCLUDE "data/mapHeaders/fuchsiacity.asm" - INCLUDE "data/mapObjects/fuchsiacity.asm" - -FuchsiaCityBlocks: ; 18c86 (6:4c86) - INCBIN "maps/fuchsiacity.blk" +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: ; 19bf6 (6:5bf6) - INCBIN "maps/blueshouse.blk" +BluesHouseBlocks: INCBIN "maps/blueshouse.blk" INCLUDE "data/mapHeaders/vermilionhouse3.asm" - INCLUDE "scripts/vermilionhouse3.asm" - INCLUDE "data/mapObjects/vermilionhouse3.asm" - -VermilionHouse3Blocks: ; 19c3f (6:5c3f) - INCBIN "maps/vermilionhouse3.blk" +VermilionHouse3Blocks: INCBIN "maps/vermilionhouse3.blk" INCLUDE "data/mapHeaders/indigoplateaulobby.asm" - INCLUDE "scripts/indigoplateaulobby.asm" - INCLUDE "data/mapObjects/indigoplateaulobby.asm" - -IndigoPlateauLobbyBlocks: ; 19ccf (6:5ccf) - INCBIN "maps/indigoplateaulobby.blk" +IndigoPlateauLobbyBlocks: INCBIN "maps/indigoplateaulobby.blk" INCLUDE "data/mapHeaders/silphco4.asm" - INCLUDE "scripts/silphco4.asm" - INCLUDE "data/mapObjects/silphco4.asm" - -SilphCo4Blocks: ; 19ea4 (6:5ea4) - INCBIN "maps/silphco4.blk" +SilphCo4Blocks: INCBIN "maps/silphco4.blk" INCLUDE "data/mapHeaders/silphco5.asm" - INCLUDE "scripts/silphco5.asm" - INCLUDE "data/mapObjects/silphco5.asm" - -SilphCo5Blocks: ; 1a116 (6:6116) - INCBIN "maps/silphco5.blk" +SilphCo5Blocks: INCBIN "maps/silphco5.blk" INCLUDE "data/mapHeaders/silphco6.asm" - INCLUDE "scripts/silphco6.asm" - INCLUDE "data/mapObjects/silphco6.asm" - -SilphCo6Blocks: ; 1a36b (6:636b) - INCBIN "maps/silphco6.blk" +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: ; 1c069 (7:4069) - INCBIN "maps/cinnabarisland.blk" +CinnabarIslandBlocks: INCBIN "maps/cinnabarisland.blk" INCLUDE "data/mapHeaders/route1.asm" - INCLUDE "data/mapObjects/route1.asm" +Route1Blocks: INCBIN "maps/route1.blk" -Route1Blocks: ; 1c0fc (7:40fc) - INCBIN "maps/route1.blk" +UndergroundPathEntranceRoute8Blocks: INCBIN "maps/undergroundpathentranceroute8.blk" -UndergroundPathEntranceRoute8Blocks: ; 1c1b0 (7:41b0) - INCBIN "maps/undergroundpathentranceroute8.blk" +OaksLabBlocks: INCBIN "maps/oakslab.blk" -OaksLabBlocks: ; 1c1c0 (7:41c0) - INCBIN "maps/oakslab.blk" +Route16HouseBlocks: +Route2HouseBlocks: +SaffronHouse1Blocks: +SaffronHouse2Blocks: +VermilionHouse1Blocks: +NameRaterBlocks: +LavenderHouse1Blocks: +LavenderHouse2Blocks: +CeruleanHouse1Blocks: +PewterHouse1Blocks: +PewterHouse2Blocks: +ViridianHouseBlocks: INCBIN "maps/viridianhouse.blk" -Route16HouseBlocks: ; 1c1de (7:41de) -Route2HouseBlocks: ; 1c1de (7:41de) -SaffronHouse1Blocks: ; 1c1de (7:41de) -SaffronHouse2Blocks: ; 1c1de (7:41de) -VermilionHouse1Blocks: ; 1c1de (7:41de) -NameRaterBlocks: ; 1c1de (7:41de) -LavenderHouse1Blocks: ; 1c1de (7:41de) -LavenderHouse2Blocks: ; 1c1de (7:41de) -CeruleanHouse1Blocks: ; 1c1de (7:41de) -PewterHouse1Blocks: ; 1c1de (7:41de) -PewterHouse2Blocks: ; 1c1de (7:41de) -ViridianHouseBlocks: ; 0x1c1de 41DE size=16 - INCBIN "maps/viridianhouse.blk" +CeladonMansion5Blocks: +SchoolBlocks: INCBIN "maps/school.blk" -CeladonMansion5Blocks: ; 1c1ee (7:41ee) -SchoolBlocks: ; 0x1c1ee 41EE size=16 - INCBIN "maps/school.blk" +CeruleanHouseTrashedBlocks: INCBIN "maps/ceruleanhousetrashed.blk" -CeruleanHouseTrashedBlocks: ; 0x1c1fe size=16 - INCBIN "maps/ceruleanhousetrashed.blk" - -DiglettsCaveEntranceRoute11Blocks: ; 1c20e (7:420e) -DiglettsCaveRoute2Blocks: ; 0x1c20e size=16 - INCBIN "maps/diglettscaveroute2.blk" +DiglettsCaveEntranceRoute11Blocks: +DiglettsCaveRoute2Blocks: INCBIN "maps/diglettscaveroute2.blk" INCLUDE "text/monster_names.asm" @@ -16220,1691 +4816,992 @@ 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: ; 1d530 (7:5530) - INCBIN "maps/viridianmart.blk" +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: ; 1d88c (7:588c) - INCBIN "maps/bikeshop.blk" +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: ; 1dcda (7:5cda) - INCBIN "maps/vermiliondock.blk" +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: ; 1ddc1 (7:5dc1) - INCBIN "maps/fuchsiamart.blk" +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: ; 1e025 (7:6025) - INCBIN "maps/route5gate.blk" +Route5GateBlocks: INCBIN "maps/route5gate.blk" INCLUDE "data/mapHeaders/route6gate.asm" - INCLUDE "scripts/route6gate.asm" - INCLUDE "data/mapObjects/route6gate.asm" - -Route6GateBlocks: ; 1e0e8 (7:60e8) - INCBIN "maps/route6gate.blk" +Route6GateBlocks: INCBIN "maps/route6gate.blk" INCLUDE "data/mapHeaders/route7gate.asm" - INCLUDE "scripts/route7gate.asm" - INCLUDE "data/mapObjects/route7gate.asm" - -Route7GateBlocks: ; 1e1af (7:61af) - INCBIN "maps/route7gate.blk" +Route7GateBlocks: INCBIN "maps/route7gate.blk" INCLUDE "data/mapHeaders/route8gate.asm" - INCLUDE "scripts/route8gate.asm" - INCLUDE "data/mapObjects/route8gate.asm" - -Route8GateBlocks: ; 1e271 (7:6271) - INCBIN "maps/route8gate.blk" +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: ; 1e446 (7:6446) - INCBIN "maps/powerplant.blk" +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: ; 1e74a (7:674a) - INCBIN "maps/route22gate.blk" +Route22GateBlocks: INCBIN "maps/route22gate.blk" INCLUDE "data/mapHeaders/billshouse.asm" - INCLUDE "scripts/billshouse.asm" - INCLUDE "data/mapObjects/billshouse.asm" - -BillsHouseBlocks: ; 1e905 (7:6905) - INCBIN "maps/billshouse.blk" +BillsHouseBlocks: INCBIN "maps/billshouse.blk" INCLUDE "engine/menu/oaks_pc.asm" INCLUDE "engine/hidden_object_functions7.asm" -SECTION "bank9",ROMX,BANK[$9] - -RhydonPicFront: ; 24000 (9:4000) - INCBIN "pic/bmon/rhydon.pic" -RhydonPicBack: ; 24202 (9:4202) - INCBIN "pic/monback/rhydonb.pic" -KangaskhanPicFront: ; 2429a (9:429a) - INCBIN "pic/bmon/kangaskhan.pic" -KangaskhanPicBack: ; 244a6 (9:44a6) - INCBIN "pic/monback/kangaskhanb.pic" -NidoranMPicFront: ; 2453c (9:453c) - INCBIN "pic/bmon/nidoranm.pic" -NidoranMPicBack: ; 24623 (9:4623) - INCBIN "pic/monback/nidoranmb.pic" -ClefairyPicFront: ; 24682 (9:4682) - INCBIN "pic/bmon/clefairy.pic" -ClefairyPicBack: ; 24785 (9:4785) - INCBIN "pic/monback/clefairyb.pic" -SpearowPicFront: ; 247df (9:47df) - INCBIN "pic/bmon/spearow.pic" -SpearowPicBack: ; 248c2 (9:48c2) - INCBIN "pic/monback/spearowb.pic" -VoltorbPicFront: ; 24911 (9:4911) - INCBIN "pic/bmon/voltorb.pic" -VoltorbPicBack: ; 2499a (9:499a) - INCBIN "pic/monback/voltorbb.pic" -NidokingPicFront: ; 249f8 (9:49f8) - INCBIN "pic/bmon/nidoking.pic" -NidokingPicBack: ; 24c60 (9:4c60) - INCBIN "pic/monback/nidokingb.pic" -SlowbroPicFront: ; 24d0a (9:4d0a) - INCBIN "pic/bmon/slowbro.pic" -SlowbroPicBack: ; 24f87 (9:4f87) - INCBIN "pic/monback/slowbrob.pic" -IvysaurPicFront: ; 2502b (9:502b) - INCBIN "pic/bmon/ivysaur.pic" -IvysaurPicBack: ; 25157 (9:5157) - INCBIN "pic/monback/ivysaurb.pic" -ExeggutorPicFront: ; 251d6 (9:51d6) - INCBIN "pic/bmon/exeggutor.pic" -ExeggutorPicBack: ; 253f8 (9:53f8) - INCBIN "pic/monback/exeggutorb.pic" -LickitungPicFront: ; 254a7 (9:54a7) - INCBIN "pic/bmon/lickitung.pic" -LickitungPicBack: ; 2563e (9:563e) - INCBIN "pic/monback/lickitungb.pic" -ExeggcutePicFront: ; 256d7 (9:56d7) - INCBIN "pic/bmon/exeggcute.pic" -ExeggcutePicBack: ; 258f0 (9:58f0) - INCBIN "pic/monback/exeggcuteb.pic" -GrimerPicFront: ; 25973 (9:5973) - INCBIN "pic/bmon/grimer.pic" -GrimerPicBack: ; 25ab0 (9:5ab0) - INCBIN "pic/monback/grimerb.pic" -GengarPicFront: ; 25b76 (9:5b76) - INCBIN "pic/bmon/gengar.pic" -GengarPicBack: ; 25cc6 (9:5cc6) - INCBIN "pic/monback/gengarb.pic" -NidoranFPicFront: ; 25d28 (9:5d28) - INCBIN "pic/bmon/nidoranf.pic" -NidoranFPicBack: ; 25dc2 (9:5dc2) - INCBIN "pic/monback/nidoranfb.pic" -NidoqueenPicFront: ; 25e09 (9:5e09) - INCBIN "pic/bmon/nidoqueen.pic" -NidoqueenPicBack: ; 25fef (9:5fef) - INCBIN "pic/monback/nidoqueenb.pic" -CubonePicFront: ; 260a8 (9:60a8) - INCBIN "pic/bmon/cubone.pic" -CubonePicBack: ; 26196 (9:6196) - INCBIN "pic/monback/cuboneb.pic" -RhyhornPicFront: ; 26208 (9:6208) - INCBIN "pic/bmon/rhyhorn.pic" -RhyhornPicBack: ; 2640f (9:640f) - INCBIN "pic/monback/rhyhornb.pic" -LaprasPicFront: ; 264c1 (9:64c1) - INCBIN "pic/bmon/lapras.pic" -LaprasPicBack: ; 2667c (9:667c) - INCBIN "pic/monback/laprasb.pic" -ArcaninePicFront: ; 266ff (9:66ff) - INCBIN "pic/bmon/arcanine.pic" -ArcaninePicBack: ; 2693d (9:693d) - INCBIN "pic/monback/arcanineb.pic" -GyaradosPicFront: ; 269d4 (9:69d4) - INCBIN "pic/bmon/gyarados.pic" -GyaradosPicBack: ; 26c25 (9:6c25) - INCBIN "pic/monback/gyaradosb.pic" -ShellderPicFront: ; 26cb6 (9:6cb6) - INCBIN "pic/bmon/shellder.pic" -ShellderPicBack: ; 26dc3 (9:6dc3) - INCBIN "pic/monback/shellderb.pic" -TentacoolPicFront: ; 26e2a (9:6e2a) - INCBIN "pic/bmon/tentacool.pic" -TentacoolPicBack: ; 26f1c (9:6f1c) - INCBIN "pic/monback/tentacoolb.pic" -GastlyPicFront: ; 26f77 (9:6f77) - INCBIN "pic/bmon/gastly.pic" -GastlyPicBack: ; 27190 (9:7190) - INCBIN "pic/monback/gastlyb.pic" -ScytherPicFront: ; 2721c (9:721c) - INCBIN "pic/bmon/scyther.pic" -ScytherPicBack: ; 2743c (9:743c) - INCBIN "pic/monback/scytherb.pic" -StaryuPicFront: ; 274e0 (9:74e0) - INCBIN "pic/bmon/staryu.pic" -StaryuPicBack: ; 275ec (9:75ec) - INCBIN "pic/monback/staryub.pic" -BlastoisePicFront: ; 27637 (9:7637) - INCBIN "pic/bmon/blastoise.pic" -BlastoisePicBack: ; 27851 (9:7851) - INCBIN "pic/monback/blastoiseb.pic" -PinsirPicFront: ; 278da (9:78da) - INCBIN "pic/bmon/pinsir.pic" -PinsirPicBack: ; 27aaa (9:7aaa) - INCBIN "pic/monback/pinsirb.pic" -TangelaPicFront: ; 27b39 (9:7b39) - INCBIN "pic/bmon/tangela.pic" -TangelaPicBack: ; 27ce7 (9:7ce7) - INCBIN "pic/monback/tangelab.pic" +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/9.asm" -SECTION "bankA",ROMX,BANK[$A] -GrowlithePicFront: ; 28000 (a:4000) - INCBIN "pic/bmon/growlithe.pic" -GrowlithePicBack: ; 28101 (a:4101) - INCBIN "pic/monback/growlitheb.pic" -OnixPicFront: ; 28164 (a:4164) - INCBIN "pic/bmon/onix.pic" -OnixPicBack: ; 28300 (a:4300) - INCBIN "pic/monback/onixb.pic" -FearowPicFront: ; 28383 (a:4383) - INCBIN "pic/bmon/fearow.pic" -FearowPicBack: ; 28529 (a:4529) - INCBIN "pic/monback/fearowb.pic" -PidgeyPicFront: ; 285a7 (a:45a7) - INCBIN "pic/bmon/pidgey.pic" -PidgeyPicBack: ; 2865b (a:465b) - INCBIN "pic/monback/pidgeyb.pic" -SlowpokePicFront: ; 286a0 (a:46a0) - INCBIN "pic/bmon/slowpoke.pic" -SlowpokePicBack: ; 287c2 (a:47c2) - INCBIN "pic/monback/slowpokeb.pic" -KadabraPicFront: ; 28830 (a:4830) - INCBIN "pic/bmon/kadabra.pic" -KadabraPicBack: ; 289b9 (a:49b9) - INCBIN "pic/monback/kadabrab.pic" -GravelerPicFront: ; 28a4c (a:4a4c) - INCBIN "pic/bmon/graveler.pic" -GravelerPicBack: ; 28c00 (a:4c00) - INCBIN "pic/monback/gravelerb.pic" -ChanseyPicFront: ; 28cae (a:4cae) - INCBIN "pic/bmon/chansey.pic" -ChanseyPicBack: ; 28e21 (a:4e21) - INCBIN "pic/monback/chanseyb.pic" -MachokePicFront: ; 28e85 (a:4e85) - INCBIN "pic/bmon/machoke.pic" -MachokePicBack: ; 29063 (a:5063) - INCBIN "pic/monback/machokeb.pic" -MrMimePicFront: ; 290f3 (a:50f3) - INCBIN "pic/bmon/mr.mime.pic" -MrMimePicBack: ; 29247 (a:5247) - INCBIN "pic/monback/mr.mimeb.pic" -HitmonleePicFront: ; 292bf (a:52bf) - INCBIN "pic/bmon/hitmonlee.pic" -HitmonleePicBack: ; 2945e (a:545e) - INCBIN "pic/monback/hitmonleeb.pic" -HitmonchanPicFront: ; 294bc (a:54bc) - INCBIN "pic/bmon/hitmonchan.pic" -HitmonchanPicBack: ; 29643 (a:5643) - INCBIN "pic/monback/hitmonchanb.pic" -ArbokPicFront: ; 296b4 (a:56b4) - INCBIN "pic/bmon/arbok.pic" -ArbokPicBack: ; 29911 (a:5911) - INCBIN "pic/monback/arbokb.pic" -ParasectPicFront: ; 299a8 (a:59a8) - INCBIN "pic/bmon/parasect.pic" -ParasectPicBack: ; 29b8c (a:5b8c) - INCBIN "pic/monback/parasectb.pic" -PsyduckPicFront: ; 29c0a (a:5c0a) - INCBIN "pic/bmon/psyduck.pic" -PsyduckPicBack: ; 29d3e (a:5d3e) - INCBIN "pic/monback/psyduckb.pic" -DrowzeePicFront: ; 29da9 (a:5da9) - INCBIN "pic/bmon/drowzee.pic" -DrowzeePicBack: ; 29f05 (a:5f05) - INCBIN "pic/monback/drowzeeb.pic" -GolemPicFront: ; 29f74 (a:5f74) - INCBIN "pic/bmon/golem.pic" -GolemPicBack: ; 2a0f2 (a:60f2) - INCBIN "pic/monback/golemb.pic" -MagmarPicFront: ; 2a161 (a:6161) - INCBIN "pic/bmon/magmar.pic" -MagmarPicBack: ; 2a2bf (a:62bf) - INCBIN "pic/monback/magmarb.pic" -ElectabuzzPicFront: ; 2a367 (a:6367) - INCBIN "pic/bmon/electabuzz.pic" -ElectabuzzPicBack: ; 2a4ef (a:64ef) - INCBIN "pic/monback/electabuzzb.pic" -MagnetonPicFront: ; 2a588 (a:6588) - INCBIN "pic/bmon/magneton.pic" -MagnetonPicBack: ; 2a723 (a:6723) - INCBIN "pic/monback/magnetonb.pic" -KoffingPicFront: ; 2a7a6 (a:67a6) - INCBIN "pic/bmon/koffing.pic" -KoffingPicBack: ; 2a974 (a:6974) - INCBIN "pic/monback/koffingb.pic" -MankeyPicFront: ; 2aa11 (a:6a11) - INCBIN "pic/bmon/mankey.pic" -MankeyPicBack: ; 2ab16 (a:6b16) - INCBIN "pic/monback/mankeyb.pic" -SeelPicFront: ; 2ab84 (a:6b84) - INCBIN "pic/bmon/seel.pic" -SeelPicBack: ; 2ace8 (a:6ce8) - INCBIN "pic/monback/seelb.pic" -DiglettPicFront: ; 2ad33 (a:6d33) - INCBIN "pic/bmon/diglett.pic" -DiglettPicBack: ; 2ae10 (a:6e10) - INCBIN "pic/monback/diglettb.pic" -TaurosPicFront: ; 2ae7e (a:6e7e) - INCBIN "pic/bmon/tauros.pic" -TaurosPicBack: ; 2b054 (a:7054) - INCBIN "pic/monback/taurosb.pic" -FarfetchdPicFront: ; 2b0e9 (a:70e9) - INCBIN "pic/bmon/farfetchd.pic" -FarfetchdPicBack: ; 2b2c6 (a:72c6) - INCBIN "pic/monback/farfetchdb.pic" -VenonatPicFront: ; 2b357 (a:7357) - INCBIN "pic/bmon/venonat.pic" -VenonatPicBack: ; 2b45c (a:745c) - INCBIN "pic/monback/venonatb.pic" -DragonitePicFront: ; 2b4aa (a:74aa) - INCBIN "pic/bmon/dragonite.pic" -DragonitePicBack: ; 2b67f (a:767f) - INCBIN "pic/monback/dragoniteb.pic" -DoduoPicFront: ; 2b72c (a:772c) - INCBIN "pic/bmon/doduo.pic" -DoduoPicBack: ; 2b80d (a:780d) - INCBIN "pic/monback/doduob.pic" -PoliwagPicFront: ; 2b875 (a:7875) - INCBIN "pic/bmon/poliwag.pic" -PoliwagPicBack: ; 2b947 (a:7947) - INCBIN "pic/monback/poliwagb.pic" -JynxPicFront: ; 2b98e (a:798e) - INCBIN "pic/bmon/jynx.pic" -JynxPicBack: ; 2bb42 (a:7b42) - INCBIN "pic/monback/jynxb.pic" -MoltresPicFront: ; 2bbac (a:7bac) - INCBIN "pic/bmon/moltres.pic" -MoltresPicBack: ; 2be02 (a:7e02) - INCBIN "pic/monback/moltresb.pic" +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/a.asm" -SECTION "bankB",ROMX,BANK[$B] -ArticunoPicFront: ; 2c000 (b:4000) - INCBIN "pic/bmon/articuno.pic" -ArticunoPicBack: ; 2c238 (b:4238) - INCBIN "pic/monback/articunob.pic" -ZapdosPicFront: ; 2c29d (b:429d) - INCBIN "pic/bmon/zapdos.pic" -ZapdosPicBack: ; 2c484 (b:4484) - INCBIN "pic/monback/zapdosb.pic" -DittoPicFront: ; 2c514 (b:4514) - INCBIN "pic/bmon/ditto.pic" -DittoPicBack: ; 2c5bd (b:45bd) - INCBIN "pic/monback/dittob.pic" -MeowthPicFront: ; 2c609 (b:4609) - INCBIN "pic/bmon/meowth.pic" -MeowthPicBack: ; 2c71f (b:471f) - INCBIN "pic/monback/meowthb.pic" -KrabbyPicFront: ; 2c777 (b:4777) - INCBIN "pic/bmon/krabby.pic" -KrabbyPicBack: ; 2c8b0 (b:48b0) - INCBIN "pic/monback/krabbyb.pic" -VulpixPicFront: ; 2c924 (b:4924) - INCBIN "pic/bmon/vulpix.pic" -VulpixPicBack: ; 2ca9a (b:4a9a) - INCBIN "pic/monback/vulpixb.pic" -NinetalesPicFront: ; 2caff (b:4aff) - INCBIN "pic/bmon/ninetales.pic" -NinetalesPicBack: ; 2ccfb (b:4cfb) - INCBIN "pic/monback/ninetalesb.pic" -PikachuPicFront: ; 2cd7d (b:4d7d) - INCBIN "pic/bmon/pikachu.pic" -PikachuPicBack: ; 2ce8b (b:4e8b) - INCBIN "pic/monback/pikachub.pic" -RaichuPicFront: ; 2cf03 (b:4f03) - INCBIN "pic/bmon/raichu.pic" -RaichuPicBack: ; 2d0c3 (b:50c3) - INCBIN "pic/monback/raichub.pic" -DratiniPicFront: ; 2d151 (b:5151) - INCBIN "pic/bmon/dratini.pic" -DratiniPicBack: ; 2d234 (b:5234) - INCBIN "pic/monback/dratinib.pic" -DragonairPicFront: ; 2d297 (b:5297) - INCBIN "pic/bmon/dragonair.pic" -DragonairPicBack: ; 2d3d9 (b:53d9) - INCBIN "pic/monback/dragonairb.pic" -KabutoPicFront: ; 2d464 (b:5464) - INCBIN "pic/bmon/kabuto.pic" -KabutoPicBack: ; 2d529 (b:5529) - INCBIN "pic/monback/kabutob.pic" -KabutopsPicFront: ; 2d583 (b:5583) - INCBIN "pic/bmon/kabutops.pic" -KabutopsPicBack: ; 2d73c (b:573c) - INCBIN "pic/monback/kabutopsb.pic" -HorseaPicFront: ; 2d7c1 (b:57c1) - INCBIN "pic/bmon/horsea.pic" -HorseaPicBack: ; 2d873 (b:5873) - INCBIN "pic/monback/horseab.pic" -SeadraPicFront: ; 2d8c4 (b:58c4) - INCBIN "pic/bmon/seadra.pic" -SeadraPicBack: ; 2da2b (b:5a2b) - INCBIN "pic/monback/seadrab.pic" -SandshrewPicFront: ; 2dac9 (b:5ac9) - INCBIN "pic/bmon/sandshrew.pic" -SandshrewPicBack: ; 2dbe7 (b:5be7) - INCBIN "pic/monback/sandshrewb.pic" -SandslashPicFront: ; 2dc6b (b:5c6b) - INCBIN "pic/bmon/sandslash.pic" -SandslashPicBack: ; 2de04 (b:5e04) - INCBIN "pic/monback/sandslashb.pic" -OmanytePicFront: ; 2de9d (b:5e9d) - INCBIN "pic/bmon/omanyte.pic" -OmanytePicBack: ; 2df76 (b:5f76) - INCBIN "pic/monback/omanyteb.pic" -OmastarPicFront: ; 2dfd3 (b:5fd3) - INCBIN "pic/bmon/omastar.pic" -OmastarPicBack: ; 2e18b (b:618b) - INCBIN "pic/monback/omastarb.pic" -JigglypuffPicFront: ; 2e22f (b:622f) - INCBIN "pic/bmon/jigglypuff.pic" -JigglypuffPicBack: ; 2e30f (b:630f) - INCBIN "pic/monback/jigglypuffb.pic" -WigglytuffPicFront: ; 2e348 (b:6348) - INCBIN "pic/bmon/wigglytuff.pic" -WigglytuffPicBack: ; 2e4bf (b:64bf) - INCBIN "pic/monback/wigglytuffb.pic" -EeveePicFront: ; 2e531 (b:6531) - INCBIN "pic/bmon/eevee.pic" -EeveePicBack: ; 2e625 (b:6625) - INCBIN "pic/monback/eeveeb.pic" -FlareonPicFront: ; 2e68d (b:668d) - INCBIN "pic/bmon/flareon.pic" -FlareonPicBack: ; 2e806 (b:6806) - INCBIN "pic/monback/flareonb.pic" -JolteonPicFront: ; 2e88f (b:688f) - INCBIN "pic/bmon/jolteon.pic" -JolteonPicBack: ; 2ea0a (b:6a0a) - INCBIN "pic/monback/jolteonb.pic" -VaporeonPicFront: ; 2eaae (b:6aae) - INCBIN "pic/bmon/vaporeon.pic" -VaporeonPicBack: ; 2ec02 (b:6c02) - INCBIN "pic/monback/vaporeonb.pic" -MachopPicFront: ; 2ec9f (b:6c9f) - INCBIN "pic/bmon/machop.pic" -MachopPicBack: ; 2eda2 (b:6da2) - INCBIN "pic/monback/machopb.pic" -ZubatPicFront: ; 2ee0c (b:6e0c) - INCBIN "pic/bmon/zubat.pic" -ZubatPicBack: ; 2ef17 (b:6f17) - INCBIN "pic/monback/zubatb.pic" -EkansPicFront: ; 2ef6b (b:6f6b) - INCBIN "pic/bmon/ekans.pic" -EkansPicBack: ; 2f06d (b:706d) - INCBIN "pic/monback/ekansb.pic" -ParasPicFront: ; 2f0b4 (b:70b4) - INCBIN "pic/bmon/paras.pic" -ParasPicBack: ; 2f177 (b:7177) - INCBIN "pic/monback/parasb.pic" -PoliwhirlPicFront: ; 2f1ed (b:71ed) - INCBIN "pic/bmon/poliwhirl.pic" -PoliwhirlPicBack: ; 2f35e (b:735e) - INCBIN "pic/monback/poliwhirlb.pic" -PoliwrathPicFront: ; 2f3c1 (b:73c1) - INCBIN "pic/bmon/poliwrath.pic" -PoliwrathPicBack: ; 2f52c (b:752c) - INCBIN "pic/monback/poliwrathb.pic" -WeedlePicFront: ; 2f57d (b:757d) - INCBIN "pic/bmon/weedle.pic" -WeedlePicBack: ; 2f624 (b:7624) - INCBIN "pic/monback/weedleb.pic" -KakunaPicFront: ; 2f677 (b:7677) - INCBIN "pic/bmon/kakuna.pic" -KakunaPicBack: ; 2f736 (b:7736) - INCBIN "pic/monback/kakunab.pic" -BeedrillPicFront: ; 2f788 (b:7788) - INCBIN "pic/bmon/beedrill.pic" -BeedrillPicBack: ; 2f980 (b:7980) - INCBIN "pic/monback/beedrillb.pic" -FossilKabutopsPic: ; 2f9e8 (b:79e8) - INCBIN "pic/bmon/fossilkabutops.pic" - -INCLUDE "engine/battle/b.asm" - -TrainerInfoTextBoxTileGraphics: ; 2fb98 (b:7b98) - INCBIN "gfx/trainer_info.2bpp" -BlankLeaderNames: ; 2fc28 (b:7c28) - INCBIN "gfx/blank_leader_names.2bpp" +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] -CircleTile: ; 2fd88 (b:7d88) - INCBIN "gfx/circle_tile.2bpp" +INCLUDE "engine/battle/b.asm" -BadgeNumbersTileGraphics: ; 2fd98 (b:7d98) - INCBIN "gfx/badge_numbers.2bpp" +TrainerInfoTextBoxTileGraphics: INCBIN "gfx/trainer_info.2bpp" +BlankLeaderNames: INCBIN "gfx/blank_leader_names.2bpp" +CircleTile: INCBIN "gfx/circle_tile.2bpp" +BadgeNumbersTileGraphics: INCBIN "gfx/badge_numbers.2bpp" INCLUDE "engine/items/tmhm.asm" - INCLUDE "engine/battle/b_2.asm" - INCLUDE "engine/game_corner_slots2.asm" -SECTION "bankC",ROMX,BANK[$C] -DodrioPicFront: ; 30000 (c:4000) - INCBIN "pic/bmon/dodrio.pic" -DodrioPicBack: ; 301a2 (c:41a2) - INCBIN "pic/monback/dodriob.pic" -PrimeapePicFront: ; 30247 (c:4247) - INCBIN "pic/bmon/primeape.pic" -PrimeapePicBack: ; 30408 (c:4408) - INCBIN "pic/monback/primeapeb.pic" -DugtrioPicFront: ; 30480 (c:4480) - INCBIN "pic/bmon/dugtrio.pic" -DugtrioPicBack: ; 3062a (c:462a) - INCBIN "pic/monback/dugtriob.pic" -VenomothPicFront: ; 306a9 (c:46a9) - INCBIN "pic/bmon/venomoth.pic" -VenomothPicBack: ; 30841 (c:4841) - INCBIN "pic/monback/venomothb.pic" -DewgongPicFront: ; 30899 (c:4899) - INCBIN "pic/bmon/dewgong.pic" -DewgongPicBack: ; 309e2 (c:49e2) - INCBIN "pic/monback/dewgongb.pic" -CaterpiePicFront: ; 30a49 (c:4a49) - INCBIN "pic/bmon/caterpie.pic" -CaterpiePicBack: ; 30ae1 (c:4ae1) - INCBIN "pic/monback/caterpieb.pic" -MetapodPicFront: ; 30b3a (c:4b3a) - INCBIN "pic/bmon/metapod.pic" -MetapodPicBack: ; 30bc8 (c:4bc8) - INCBIN "pic/monback/metapodb.pic" -ButterfreePicFront: ; 30c37 (c:4c37) - INCBIN "pic/bmon/butterfree.pic" -ButterfreePicBack: ; 30e0e (c:4e0e) - INCBIN "pic/monback/butterfreeb.pic" -MachampPicFront: ; 30e93 (c:4e93) - INCBIN "pic/bmon/machamp.pic" -MachampPicBack: ; 3108c (c:508c) - INCBIN "pic/monback/machampb.pic" -GolduckPicFront: ; 31108 (c:5108) - INCBIN "pic/bmon/golduck.pic" -GolduckPicBack: ; 312c2 (c:52c2) - INCBIN "pic/monback/golduckb.pic" -HypnoPicFront: ; 3135d (c:535d) - INCBIN "pic/bmon/hypno.pic" -HypnoPicBack: ; 31552 (c:5552) - INCBIN "pic/monback/hypnob.pic" -GolbatPicFront: ; 315e0 (c:55e0) - INCBIN "pic/bmon/golbat.pic" -GolbatPicBack: ; 3180a (c:580a) - INCBIN "pic/monback/golbatb.pic" -MewtwoPicFront: ; 3187f (c:587f) - INCBIN "pic/bmon/mewtwo.pic" -MewtwoPicBack: ; 31a85 (c:5a85) - INCBIN "pic/monback/mewtwob.pic" -SnorlaxPicFront: ; 31b19 (c:5b19) - INCBIN "pic/bmon/snorlax.pic" -SnorlaxPicBack: ; 31ce5 (c:5ce5) - INCBIN "pic/monback/snorlaxb.pic" -MagikarpPicFront: ; 31d31 (c:5d31) - INCBIN "pic/bmon/magikarp.pic" -MagikarpPicBack: ; 31ec3 (c:5ec3) - INCBIN "pic/monback/magikarpb.pic" -MukPicFront: ; 31f56 (c:5f56) - INCBIN "pic/bmon/muk.pic" -MukPicBack: ; 3215f (c:615f) - INCBIN "pic/monback/mukb.pic" -KinglerPicFront: ; 321ec (c:61ec) - INCBIN "pic/bmon/kingler.pic" -KinglerPicBack: ; 323de (c:63de) - INCBIN "pic/monback/kinglerb.pic" -CloysterPicFront: ; 3247f (c:647f) - INCBIN "pic/bmon/cloyster.pic" -CloysterPicBack: ; 326ab (c:66ab) - INCBIN "pic/monback/cloysterb.pic" -ElectrodePicFront: ; 32760 (c:6760) - INCBIN "pic/bmon/electrode.pic" -ElectrodePicBack: ; 32827 (c:6827) - INCBIN "pic/monback/electrodeb.pic" -ClefablePicFront: ; 3288c (c:688c) - INCBIN "pic/bmon/clefable.pic" -ClefablePicBack: ; 329b8 (c:69b8) - INCBIN "pic/monback/clefableb.pic" -WeezingPicFront: ; 32a44 (c:6a44) - INCBIN "pic/bmon/weezing.pic" -WeezingPicBack: ; 32c76 (c:6c76) - INCBIN "pic/monback/weezingb.pic" -PersianPicFront: ; 32d1e (c:6d1e) - INCBIN "pic/bmon/persian.pic" -PersianPicBack: ; 32f04 (c:6f04) - INCBIN "pic/monback/persianb.pic" -MarowakPicFront: ; 32f8f (c:6f8f) - INCBIN "pic/bmon/marowak.pic" -MarowakPicBack: ; 33101 (c:7101) - INCBIN "pic/monback/marowakb.pic" -HaunterPicFront: ; 3318a (c:718a) - INCBIN "pic/bmon/haunter.pic" -HaunterPicBack: ; 33345 (c:7345) - INCBIN "pic/monback/haunterb.pic" -AbraPicFront: ; 333cc (c:73cc) - INCBIN "pic/bmon/abra.pic" -AbraPicBack: ; 334cf (c:74cf) - INCBIN "pic/monback/abrab.pic" -AlakazamPicFront: ; 3355a (c:755a) - INCBIN "pic/bmon/alakazam.pic" -AlakazamPicBack: ; 33779 (c:7779) - INCBIN "pic/monback/alakazamb.pic" -PidgeottoPicFront: ; 3380a (c:780a) - INCBIN "pic/bmon/pidgeotto.pic" -PidgeottoPicBack: ; 3395b (c:795b) - INCBIN "pic/monback/pidgeottob.pic" -PidgeotPicFront: ; 339c2 (c:79c2) - INCBIN "pic/bmon/pidgeot.pic" -PidgeotPicBack: ; 33b79 (c:7b79) - INCBIN "pic/monback/pidgeotb.pic" -StarmiePicFront: ; 33c1c (c:7c1c) - INCBIN "pic/bmon/starmie.pic" -StarmiePicBack: ; 33dac (c:7dac) - INCBIN "pic/monback/starmieb.pic" -RedPicBack: ; 33e0a (c:7e0a) - INCBIN "pic/trainer/redb.pic" -OldManPic: ; 33e9a (c:7e9a) - INCBIN "pic/trainer/oldman.pic" +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/c.asm" -SECTION "bankD",ROMX,BANK[$D] -BulbasaurPicFront: ; 34000 (d:4000) - INCBIN "pic/bmon/bulbasaur.pic" -BulbasaurPicBack: ; 340e5 (d:40e5) - INCBIN "pic/monback/bulbasaurb.pic" -VenusaurPicFront: ; 34162 (d:4162) - INCBIN "pic/bmon/venusaur.pic" -VenusaurPicBack: ; 34397 (d:4397) - INCBIN "pic/monback/venusaurb.pic" -TentacruelPicFront: ; 34455 (d:4455) - INCBIN "pic/bmon/tentacruel.pic" -TentacruelPicBack: ; 345c3 (d:45c3) - INCBIN "pic/monback/tentacruelb.pic" -GoldeenPicFront: ; 3466f (d:466f) - INCBIN "pic/bmon/goldeen.pic" -GoldeenPicBack: ; 34796 (d:4796) - INCBIN "pic/monback/goldeenb.pic" -SeakingPicFront: ; 34803 (d:4803) - INCBIN "pic/bmon/seaking.pic" -SeakingPicBack: ; 34a03 (d:4a03) - INCBIN "pic/monback/seakingb.pic" -PonytaPicFront: ; 34ab1 (d:4ab1) - INCBIN "pic/bmon/ponyta.pic" -RapidashPicFront: ; 34c10 (d:4c10) - INCBIN "pic/bmon/rapidash.pic" -PonytaPicBack: ; 34e32 (d:4e32) - INCBIN "pic/monback/ponytab.pic" -RapidashPicBack: ; 34eba (d:4eba) - INCBIN "pic/monback/rapidashb.pic" -RattataPicFront: ; 34f6a (d:4f6a) - INCBIN "pic/bmon/rattata.pic" -RattataPicBack: ; 35041 (d:5041) - INCBIN "pic/monback/rattatab.pic" -RaticatePicFront: ; 3507a (d:507a) - INCBIN "pic/bmon/raticate.pic" -RaticatePicBack: ; 3520d (d:520d) - INCBIN "pic/monback/raticateb.pic" -NidorinoPicFront: ; 35282 (d:5282) - INCBIN "pic/bmon/nidorino.pic" -NidorinoPicBack: ; 353f0 (d:53f0) - INCBIN "pic/monback/nidorinob.pic" -NidorinaPicFront: ; 3548b (d:548b) - INCBIN "pic/bmon/nidorina.pic" -NidorinaPicBack: ; 355c8 (d:55c8) - INCBIN "pic/monback/nidorinab.pic" -GeodudePicFront: ; 3564f (d:564f) - INCBIN "pic/bmon/geodude.pic" -GeodudePicBack: ; 35729 (d:5729) - INCBIN "pic/monback/geodudeb.pic" -PorygonPicFront: ; 35784 (d:5784) - INCBIN "pic/bmon/porygon.pic" -PorygonPicBack: ; 358d1 (d:58d1) - INCBIN "pic/monback/porygonb.pic" -AerodactylPicFront: ; 35931 (d:5931) - INCBIN "pic/bmon/aerodactyl.pic" -AerodactylPicBack: ; 35aec (d:5aec) - INCBIN "pic/monback/aerodactylb.pic" -MagnemitePicFront: ; 35b87 (d:5b87) - INCBIN "pic/bmon/magnemite.pic" -MagnemitePicBack: ; 35c0d (d:5c0d) - INCBIN "pic/monback/magnemiteb.pic" -CharmanderPicFront: ; 35c5c (d:5c5c) - INCBIN "pic/bmon/charmander.pic" -CharmanderPicBack: ; 35d5c (d:5d5c) - INCBIN "pic/monback/charmanderb.pic" -SquirtlePicFront: ; 35db8 (d:5db8) - INCBIN "pic/bmon/squirtle.pic" -SquirtlePicBack: ; 35e8f (d:5e8f) - INCBIN "pic/monback/squirtleb.pic" -CharmeleonPicFront: ; 35f0c (d:5f0c) - INCBIN "pic/bmon/charmeleon.pic" -CharmeleonPicBack: ; 36048 (d:6048) - INCBIN "pic/monback/charmeleonb.pic" -WartortlePicFront: ; 360b1 (d:60b1) - INCBIN "pic/bmon/wartortle.pic" -WartortlePicBack: ; 361f1 (d:61f1) - INCBIN "pic/monback/wartortleb.pic" -CharizardPicFront: ; 36286 (d:6286) - INCBIN "pic/bmon/charizard.pic" -CharizardPicBack: ; 36495 (d:6495) - INCBIN "pic/monback/charizardb.pic" -FossilAerodactylPic: ; 36536 (d:6536) - INCBIN "pic/bmon/fossilaerodactyl.pic" -GhostPic: ; 366b5 (d:66b5) - INCBIN "pic/other/ghost.pic" -OddishPicFront: ; 3680b (d:680b) - INCBIN "pic/bmon/oddish.pic" -OddishPicBack: ; 368a9 (d:68a9) - INCBIN "pic/monback/oddishb.pic" -GloomPicFront: ; 36941 (d:6941) - INCBIN "pic/bmon/gloom.pic" -GloomPicBack: ; 36a78 (d:6a78) - INCBIN "pic/monback/gloomb.pic" -VileplumePicFront: ; 36b21 (d:6b21) - INCBIN "pic/bmon/vileplume.pic" -VileplumePicBack: ; 36c82 (d:6c82) - INCBIN "pic/monback/vileplumeb.pic" -BellsproutPicFront: ; 36d00 (d:6d00) - INCBIN "pic/bmon/bellsprout.pic" -BellsproutPicBack: ; 36dba (d:6dba) - INCBIN "pic/monback/bellsproutb.pic" -WeepinbellPicFront: ; 36e30 (d:6e30) - INCBIN "pic/bmon/weepinbell.pic" -WeepinbellPicBack: ; 36f6f (d:6f6f) - INCBIN "pic/monback/weepinbellb.pic" -VictreebelPicFront: ; 36fea (d:6fea) - INCBIN "pic/bmon/victreebel.pic" -VictreebelPicBack: ; 371b2 (d:71b2) - INCBIN "pic/monback/victreebelb.pic" -INCLUDE "engine/titlescreen2.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/d.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" - -INCLUDE "data/base_stats.asm" - +BaseStats: INCLUDE "data/base_stats.asm" INCLUDE "data/cries.asm" - INCLUDE "engine/battle/e.asm" -; tiles for gameboy and link cable graphics used for trading sequence animation -TradingAnimationGraphics: ; 3a9be (e:69be) +TradingAnimationGraphics: INCBIN "gfx/game_boy.norepeat.2bpp" INCBIN "gfx/link_cable.2bpp" -; 4 tiles for actual wire transfer animation (pokeball wandering inside wire) -TradingAnimationGraphics2: ; 3acce (e:6cce) +TradingAnimationGraphics2: +; Pokeball traveling through the link cable. INCBIN "gfx/trade2.2bpp" INCLUDE "engine/evos_moves.asm" - INCLUDE "engine/battle/e_2.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" -LavenderTownBlocks: ; 44085 (11:4085) - INCBIN "maps/lavendertown.blk" - -ViridianPokecenterBlocks: ; 440df (11:40df) - INCBIN "maps/viridianpokecenter.blk" +ViridianPokecenterBlocks: INCBIN "maps/viridianpokecenter.blk" -SafariZoneRestHouse1Blocks: ; 440fb (11:40fb) -SafariZoneRestHouse2Blocks: ; 440fb (11:40fb) -SafariZoneRestHouse3Blocks: ; 440fb (11:40fb) -SafariZoneRestHouse4Blocks: ; 440fb (11:40fb) - INCBIN "maps/safarizoneresthouse1.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: ; 443fe (11:43fe) - INCBIN "maps/mansion1.blk" +Mansion1Blocks: INCBIN "maps/mansion1.blk" INCLUDE "data/mapHeaders/rocktunnel1.asm" - INCLUDE "scripts/rocktunnel1.asm" - INCLUDE "data/mapObjects/rocktunnel1.asm" - -RockTunnel1Blocks: ; 44675 (11:4675) - INCBIN "maps/rocktunnel1.blk" +RockTunnel1Blocks: INCBIN "maps/rocktunnel1.blk" INCLUDE "data/mapHeaders/seafoamislands1.asm" - INCLUDE "scripts/seafoamislands1.asm" - INCLUDE "data/mapObjects/seafoamislands1.asm" - -SeafoamIslands1Blocks: ; 4489f (11:489f) - INCBIN "maps/seafoamislands1.blk" +SeafoamIslands1Blocks: INCBIN "maps/seafoamislands1.blk" INCLUDE "data/mapHeaders/ssanne3.asm" - INCLUDE "scripts/ssanne3.asm" - INCLUDE "data/mapObjects/ssanne3.asm" - -SSAnne3Blocks: ; 44956 (11:4956) - INCBIN "maps/ssanne3.blk" +SSAnne3Blocks: INCBIN "maps/ssanne3.blk" INCLUDE "data/mapHeaders/victoryroad3.asm" - INCLUDE "scripts/victoryroad3.asm" - INCLUDE "data/mapObjects/victoryroad3.asm" - -VictoryRoad3Blocks: ; 44b37 (11:4b37) - INCBIN "maps/victoryroad3.blk" +VictoryRoad3Blocks: INCBIN "maps/victoryroad3.blk" INCLUDE "data/mapHeaders/rockethideout1.asm" - INCLUDE "scripts/rockethideout1.asm" - INCLUDE "data/mapObjects/rockethideout1.asm" - -RocketHideout1Blocks: ; 44d49 (11:4d49) - INCBIN "maps/rockethideout1.blk" +RocketHideout1Blocks: INCBIN "maps/rockethideout1.blk" INCLUDE "data/mapHeaders/rockethideout2.asm" - INCLUDE "scripts/rockethideout2.asm" - INCLUDE "data/mapObjects/rockethideout2.asm" - -RocketHideout2Blocks: ; 45147 (11:5147) - INCBIN "maps/rockethideout2.blk" +RocketHideout2Blocks: INCBIN "maps/rockethideout2.blk" INCLUDE "data/mapHeaders/rockethideout3.asm" - INCLUDE "scripts/rockethideout3.asm" - INCLUDE "data/mapObjects/rockethideout3.asm" - -RocketHideout3Blocks: ; 4537f (11:537f) - INCBIN "maps/rockethideout3.blk" +RocketHideout3Blocks: INCBIN "maps/rockethideout3.blk" INCLUDE "data/mapHeaders/rockethideout4.asm" - INCLUDE "scripts/rockethideout4.asm" - INCLUDE "data/mapObjects/rockethideout4.asm" - -RocketHideout4Blocks: ; 45650 (11:5650) - INCBIN "maps/rockethideout4.blk" +RocketHideout4Blocks: INCBIN "maps/rockethideout4.blk" INCLUDE "data/mapHeaders/rockethideoutelevator.asm" - INCLUDE "scripts/rockethideoutelevator.asm" - INCLUDE "data/mapObjects/rockethideoutelevator.asm" - -RocketHideoutElevatorBlocks: ; 457a8 (11:57a8) - INCBIN "maps/rockethideoutelevator.blk" +RocketHideoutElevatorBlocks: INCBIN "maps/rockethideoutelevator.blk" INCLUDE "data/mapHeaders/silphcoelevator.asm" - INCLUDE "scripts/silphcoelevator.asm" - INCLUDE "data/mapObjects/silphcoelevator.asm" - -SilphCoElevatorBlocks: ; 4585b (11:585b) - INCBIN "maps/silphcoelevator.blk" +SilphCoElevatorBlocks: INCBIN "maps/silphcoelevator.blk" INCLUDE "data/mapHeaders/safarizoneeast.asm" - INCLUDE "scripts/safarizoneeast.asm" - INCLUDE "data/mapObjects/safarizoneeast.asm" - -SafariZoneEastBlocks: ; 458dc (11:58dc) - INCBIN "maps/safarizoneeast.blk" +SafariZoneEastBlocks: INCBIN "maps/safarizoneeast.blk" INCLUDE "data/mapHeaders/safarizonenorth.asm" - INCLUDE "scripts/safarizonenorth.asm" - INCLUDE "data/mapObjects/safarizonenorth.asm" - -SafariZoneNorthBlocks: ; 45a3e (11:5a3e) - INCBIN "maps/safarizonenorth.blk" +SafariZoneNorthBlocks: INCBIN "maps/safarizonenorth.blk" INCLUDE "data/mapHeaders/safarizonecenter.asm" - INCLUDE "scripts/safarizonecenter.asm" - INCLUDE "data/mapObjects/safarizonecenter.asm" - -SafariZoneCenterBlocks: ; 45c1e (11:5c1e) - INCBIN "maps/safarizonecenter.blk" +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: ; 45e5d (11:5e5d) - INCBIN "maps/unknowndungeon2.blk" +UnknownDungeon2Blocks: INCBIN "maps/unknowndungeon2.blk" INCLUDE "data/mapHeaders/unknowndungeon3.asm" - INCLUDE "scripts/unknowndungeon3.asm" - INCLUDE "data/mapObjects/unknowndungeon3.asm" - -UnknownDungeon3Blocks: ; 45f58 (11:5f58) - INCBIN "maps/unknowndungeon3.blk" +UnknownDungeon3Blocks: INCBIN "maps/unknowndungeon3.blk" INCLUDE "data/mapHeaders/rocktunnel2.asm" - INCLUDE "scripts/rocktunnel2.asm" - INCLUDE "data/mapObjects/rocktunnel2.asm" - -RockTunnel2Blocks: ; 461a1 (11:61a1) - INCBIN "maps/rocktunnel2.blk" +RockTunnel2Blocks: INCBIN "maps/rocktunnel2.blk" INCLUDE "data/mapHeaders/seafoamislands2.asm" - INCLUDE "scripts/seafoamislands2.asm" - INCLUDE "data/mapObjects/seafoamislands2.asm" - -SeafoamIslands2Blocks: ; 463be (11:63be) - INCBIN "maps/seafoamislands2.blk" +SeafoamIslands2Blocks: INCBIN "maps/seafoamislands2.blk" INCLUDE "data/mapHeaders/seafoamislands3.asm" - INCLUDE "scripts/seafoamislands3.asm" - INCLUDE "data/mapObjects/seafoamislands3.asm" - -SeafoamIslands3Blocks: ; 464fa (11:64fa) - INCBIN "maps/seafoamislands3.blk" +SeafoamIslands3Blocks: INCBIN "maps/seafoamislands3.blk" INCLUDE "data/mapHeaders/seafoamislands4.asm" - INCLUDE "scripts/seafoamislands4.asm" - INCLUDE "data/mapObjects/seafoamislands4.asm" - -SeafoamIslands4Blocks: ; 46706 (11:6706) - INCBIN "maps/seafoamislands4.blk" +SeafoamIslands4Blocks: INCBIN "maps/seafoamislands4.blk" INCLUDE "data/mapHeaders/seafoamislands5.asm" - INCLUDE "scripts/seafoamislands5.asm" - INCLUDE "data/mapObjects/seafoamislands5.asm" - -SeafoamIslands5Blocks: ; 468fa (11:68fa) - INCBIN "maps/seafoamislands5.blk" +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" -Route7Blocks: ; 48051 (12:4051) - INCBIN "maps/route7.blk" - -CeladonPokecenterBlocks: ; 480ab (12:40ab) -RockTunnelPokecenterBlocks: ; 480ab (12:40ab) -MtMoonPokecenterBlocks: ; 480ab (12:40ab) - INCBIN "maps/mtmoonpokecenter.blk" +CeladonPokecenterBlocks: +RockTunnelPokecenterBlocks: +MtMoonPokecenterBlocks: INCBIN "maps/mtmoonpokecenter.blk" -Route18GateBlocks: ; 480c7 (12:40c7) -Route15GateBlocks: ; 480c7 (12:40c7) -Route11GateBlocks: ; 480c7 (12:40c7) - INCBIN "maps/route11gate.blk" +Route18GateBlocks: +Route15GateBlocks: +Route11GateBlocks: INCBIN "maps/route11gate.blk" -Route18GateUpstairsBlocks: ; 480db (12:40db) -Route16GateUpstairsBlocks: ; 480db (12:40db) -Route12GateUpstairsBlocks: ; 480db (12:40db) -Route15GateUpstairsBlocks: ; 480db (12:40db) -Route11GateUpstairsBlocks: ; 480db (12:40db) - INCBIN "maps/route11gateupstairs.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: ; 48209 (12:4209) - INCBIN "maps/redshouse1f.blk" +RedsHouse1FBlocks: INCBIN "maps/redshouse1f.blk" INCLUDE "data/mapHeaders/celadonmart3.asm" - INCLUDE "scripts/celadonmart3.asm" - INCLUDE "data/mapObjects/celadonmart3.asm" - -CeladonMart3Blocks: ; 48322 (12:4322) - INCBIN "maps/celadonmart3.blk" +CeladonMart3Blocks: INCBIN "maps/celadonmart3.blk" INCLUDE "data/mapHeaders/celadonmart4.asm" - INCLUDE "scripts/celadonmart4.asm" - INCLUDE "data/mapObjects/celadonmart4.asm" - -CeladonMart4Blocks: ; 483a1 (12:43a1) - INCBIN "maps/celadonmart4.blk" +CeladonMart4Blocks: INCBIN "maps/celadonmart4.blk" INCLUDE "data/mapHeaders/celadonmartroof.asm" - INCLUDE "scripts/celadonmartroof.asm" - INCLUDE "data/mapObjects/celadonmartroof.asm" - -CeladonMartRoofBlocks: ; 485cc (12:45cc) - INCBIN "maps/celadonmartroof.blk" +CeladonMartRoofBlocks: INCBIN "maps/celadonmartroof.blk" INCLUDE "data/mapHeaders/celadonmartelevator.asm" - INCLUDE "scripts/celadonmartelevator.asm" - INCLUDE "data/mapObjects/celadonmartelevator.asm" - -CeladonMartElevatorBlocks: ; 48684 (12:4684) - INCBIN "maps/celadonmartelevator.blk" +CeladonMartElevatorBlocks: INCBIN "maps/celadonmartelevator.blk" INCLUDE "data/mapHeaders/celadonmansion1.asm" - INCLUDE "scripts/celadonmansion1.asm" - INCLUDE "data/mapObjects/celadonmansion1.asm" - -CeladonMansion1Blocks: ; 48716 (12:4716) - INCBIN "maps/celadonmansion1.blk" +CeladonMansion1Blocks: INCBIN "maps/celadonmansion1.blk" INCLUDE "data/mapHeaders/celadonmansion2.asm" - INCLUDE "scripts/celadonmansion2.asm" - INCLUDE "data/mapObjects/celadonmansion2.asm" - -CeladonMansion2Blocks: ; 4876c (12:476c) - INCBIN "maps/celadonmansion2.blk" +CeladonMansion2Blocks: INCBIN "maps/celadonmansion2.blk" INCLUDE "data/mapHeaders/celadonmansion3.asm" - INCLUDE "scripts/celadonmansion3.asm" - INCLUDE "data/mapObjects/celadonmansion3.asm" - -CeladonMansion3Blocks: ; 48847 (12:4847) - INCBIN "maps/celadonmansion3.blk" +CeladonMansion3Blocks: INCBIN "maps/celadonmansion3.blk" INCLUDE "data/mapHeaders/celadonmansion4.asm" - INCLUDE "scripts/celadonmansion4.asm" - INCLUDE "data/mapObjects/celadonmansion4.asm" - -CeladonMansion4Blocks: ; 48894 (12:4894) - INCBIN "maps/celadonmansion4.blk" +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: ; 48b84 (12:4b84) - INCBIN "maps/celadongym.blk" +CeladonGymBlocks: INCBIN "maps/celadongym.blk" INCLUDE "data/mapHeaders/celadongamecorner.asm" - INCLUDE "scripts/celadongamecorner.asm" - INCLUDE "data/mapObjects/celadongamecorner.asm" - -CeladonGameCornerBlocks: ; 49003 (12:5003) - INCBIN "maps/celadongamecorner.blk" +CeladonGameCornerBlocks: INCBIN "maps/celadongamecorner.blk" INCLUDE "data/mapHeaders/celadonmart5.asm" - INCLUDE "scripts/celadonmart5.asm" - INCLUDE "data/mapObjects/celadonmart5.asm" - -CeladonMart5Blocks: ; 490bc (12:50bc) - INCBIN "maps/celadonmart5.blk" +CeladonMart5Blocks: INCBIN "maps/celadonmart5.blk" INCLUDE "data/mapHeaders/celadonprizeroom.asm" - INCLUDE "scripts/celadonprizeroom.asm" - INCLUDE "data/mapObjects/celadonprizeroom.asm" - -CeladonPrizeRoomBlocks: ; 49131 (12:5131) - INCBIN "maps/celadonprizeroom.blk" +CeladonPrizeRoomBlocks: INCBIN "maps/celadonprizeroom.blk" INCLUDE "data/mapHeaders/celadondiner.asm" - INCLUDE "scripts/celadondiner.asm" - INCLUDE "data/mapObjects/celadondiner.asm" - -CeladonDinerBlocks: ; 491ee (12:51ee) - INCBIN "maps/celadondiner.blk" +CeladonDinerBlocks: INCBIN "maps/celadondiner.blk" INCLUDE "data/mapHeaders/celadonhouse.asm" - INCLUDE "scripts/celadonhouse.asm" - INCLUDE "data/mapObjects/celadonhouse.asm" - -CeladonHouseBlocks: ; 4924d (12:524d) - INCBIN "maps/celadonhouse.blk" +CeladonHouseBlocks: INCBIN "maps/celadonhouse.blk" INCLUDE "data/mapHeaders/celadonhotel.asm" - INCLUDE "scripts/celadonhotel.asm" - INCLUDE "data/mapObjects/celadonhotel.asm" - -CeladonHotelBlocks: ; 492a7 (12:52a7) - INCBIN "maps/celadonhotel.blk" +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: ; 49540 (12:5540) - INCBIN "maps/route12gate.blk" +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: ; 497e3 (12:57e3) - INCBIN "maps/route16gate.blk" +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: ; 49b97 (12:5b97) - INCBIN "maps/mtmoon1.blk" +MtMoon1Blocks: INCBIN "maps/mtmoon1.blk" INCLUDE "data/mapHeaders/mtmoon3.asm" - INCLUDE "scripts/mtmoon3.asm" - INCLUDE "data/mapObjects/mtmoon3.asm" - -MtMoon3Blocks: ; 4a041 (12:6041) - INCBIN "maps/mtmoon3.blk" +MtMoon3Blocks: INCBIN "maps/mtmoon3.blk" INCLUDE "data/mapHeaders/safarizonewest.asm" - INCLUDE "scripts/safarizonewest.asm" - INCLUDE "data/mapObjects/safarizonewest.asm" - -SafariZoneWestBlocks: ; 4a248 (12:6248) - INCBIN "maps/safarizonewest.blk" +SafariZoneWestBlocks: INCBIN "maps/safarizonewest.blk" INCLUDE "data/mapHeaders/safarizonesecrethouse.asm" - INCLUDE "scripts/safarizonesecrethouse.asm" - INCLUDE "data/mapObjects/safarizonesecrethouse.asm" +SafariZoneSecretHouseBlocks: INCBIN "maps/safarizonesecrethouse.blk" -SafariZoneSecretHouseBlocks: ; 4a37f (12:637f) - INCBIN "maps/safarizonesecrethouse.blk" SECTION "bank13",ROMX,BANK[$13] -TrainerPics: - -YoungsterPic: ; 4c000 (13:4000) - INCBIN "pic/trainer/youngster.pic" -BugCatcherPic: ; 4c0c6 (13:40c6) - INCBIN "pic/trainer/bugcatcher.pic" -LassPic: ; 4c200 (13:4200) - INCBIN "pic/trainer/lass.pic" -SailorPic: ; 4c2db (13:42db) - INCBIN "pic/trainer/sailor.pic" -JrTrainerMPic: ; 4c450 (13:4450) - INCBIN "pic/trainer/jr.trainerm.pic" -JrTrainerFPic: ; 4c588 (13:4588) - INCBIN "pic/trainer/jr.trainerf.pic" -PokemaniacPic: ; 4c6c9 (13:46c9) - INCBIN "pic/trainer/pokemaniac.pic" -SuperNerdPic: ; 4c7f1 (13:47f1) - INCBIN "pic/trainer/supernerd.pic" -HikerPic: ; 4c8e7 (13:48e7) - INCBIN "pic/trainer/hiker.pic" -BikerPic: ; 4cabe (13:4abe) - INCBIN "pic/trainer/biker.pic" -BurglarPic: ; 4cc91 (13:4c91) - INCBIN "pic/trainer/burglar.pic" -EngineerPic: ; 4ce0a (13:4e0a) - INCBIN "pic/trainer/engineer.pic" -FisherPic: ; 4cf87 (13:4f87) - INCBIN "pic/trainer/fisher.pic" -SwimmerPic: ; 4d133 (13:5133) - INCBIN "pic/trainer/swimmer.pic" -CueBallPic: ; 4d24f (13:524f) - INCBIN "pic/trainer/cueball.pic" -GamblerPic: ; 4d421 (13:5421) - INCBIN "pic/trainer/gambler.pic" -BeautyPic: ; 4d5df (13:55df) - INCBIN "pic/trainer/beauty.pic" -PsychicPic: ; 4d728 (13:5728) - INCBIN "pic/trainer/psychic.pic" -RockerPic: ; 4d843 (13:5843) - INCBIN "pic/trainer/rocker.pic" -JugglerPic: ; 4d97d (13:597d) - INCBIN "pic/trainer/juggler.pic" -TamerPic: ; 4db4e (13:5b4e) - INCBIN "pic/trainer/tamer.pic" -BirdKeeperPic: ; 4dcdb (13:5cdb) - INCBIN "pic/trainer/birdkeeper.pic" -BlackbeltPic: ; 4de76 (13:5e76) - INCBIN "pic/trainer/blackbelt.pic" -Rival1Pic: ; 4e049 (13:6049) - INCBIN "pic/trainer/rival1.pic" -ProfOakPic: ; 4e15f (13:615f) - INCBIN "pic/trainer/prof.oak.pic" -ChiefPic: ; 4e27d (13:627d) -ScientistPic: ; 4e27d (13:627d) - INCBIN "pic/trainer/scientist.pic" -GiovanniPic: ; 4e3be (13:63be) - INCBIN "pic/trainer/giovanni.pic" -RocketPic: ; 4e49f (13:649f) - INCBIN "pic/trainer/rocket.pic" -CooltrainerMPic: ; 4e635 (13:6635) - INCBIN "pic/trainer/cooltrainerm.pic" -CooltrainerFPic: ; 4e7be (13:67be) - INCBIN "pic/trainer/cooltrainerf.pic" -BrunoPic: ; 4e943 (13:6943) - INCBIN "pic/trainer/bruno.pic" -BrockPic: ; 4eb3e (13:6b3e) - INCBIN "pic/trainer/brock.pic" -MistyPic: ; 4ec40 (13:6c40) - INCBIN "pic/trainer/misty.pic" -LtSurgePic: ; 4ed30 (13:6d30) - INCBIN "pic/trainer/lt.surge.pic" -ErikaPic: ; 4eeb5 (13:6eb5) - INCBIN "pic/trainer/erika.pic" -KogaPic: ; 4efd6 (13:6fd6) - INCBIN "pic/trainer/koga.pic" -BlainePic: ; 4f150 (13:7150) - INCBIN "pic/trainer/blaine.pic" -SabrinaPic: ; 4f252 (13:7252) - INCBIN "pic/trainer/sabrina.pic" -GentlemanPic: ; 4f3d0 (13:73d0) - INCBIN "pic/trainer/gentleman.pic" -Rival2Pic: ; 4f4cf (13:74cf) - INCBIN "pic/trainer/rival2.pic" -Rival3Pic: ; 4f623 (13:7623) - INCBIN "pic/trainer/rival3.pic" -LoreleiPic: ; 4f779 (13:7779) - INCBIN "pic/trainer/lorelei.pic" -ChannelerPic: ; 4f8a4 (13:78a4) - INCBIN "pic/trainer/channeler.pic" -AgathaPic: ; 4fa71 (13:7a71) - INCBIN "pic/trainer/agatha.pic" -LancePic: ; 4fba2 (13:7ba2) - INCBIN "pic/trainer/lance.pic" +TrainerPics:: +YoungsterPic:: INCBIN "pic/trainer/youngster.pic" +BugCatcherPic:: INCBIN "pic/trainer/bugcatcher.pic" +LassPic:: INCBIN "pic/trainer/lass.pic" +SailorPic:: INCBIN "pic/trainer/sailor.pic" +JrTrainerMPic:: INCBIN "pic/trainer/jr.trainerm.pic" +JrTrainerFPic:: INCBIN "pic/trainer/jr.trainerf.pic" +PokemaniacPic:: INCBIN "pic/trainer/pokemaniac.pic" +SuperNerdPic:: INCBIN "pic/trainer/supernerd.pic" +HikerPic:: INCBIN "pic/trainer/hiker.pic" +BikerPic:: INCBIN "pic/trainer/biker.pic" +BurglarPic:: INCBIN "pic/trainer/burglar.pic" +EngineerPic:: INCBIN "pic/trainer/engineer.pic" +FisherPic:: INCBIN "pic/trainer/fisher.pic" +SwimmerPic:: INCBIN "pic/trainer/swimmer.pic" +CueBallPic:: INCBIN "pic/trainer/cueball.pic" +GamblerPic:: INCBIN "pic/trainer/gambler.pic" +BeautyPic:: INCBIN "pic/trainer/beauty.pic" +PsychicPic:: INCBIN "pic/trainer/psychic.pic" +RockerPic:: INCBIN "pic/trainer/rocker.pic" +JugglerPic:: INCBIN "pic/trainer/juggler.pic" +TamerPic:: INCBIN "pic/trainer/tamer.pic" +BirdKeeperPic:: INCBIN "pic/trainer/birdkeeper.pic" +BlackbeltPic:: INCBIN "pic/trainer/blackbelt.pic" +Rival1Pic:: INCBIN "pic/trainer/rival1.pic" +ProfOakPic:: INCBIN "pic/trainer/prof.oak.pic" +ChiefPic:: +ScientistPic:: INCBIN "pic/trainer/scientist.pic" +GiovanniPic:: INCBIN "pic/trainer/giovanni.pic" +RocketPic:: INCBIN "pic/trainer/rocket.pic" +CooltrainerMPic:: INCBIN "pic/trainer/cooltrainerm.pic" +CooltrainerFPic:: INCBIN "pic/trainer/cooltrainerf.pic" +BrunoPic:: INCBIN "pic/trainer/bruno.pic" +BrockPic:: INCBIN "pic/trainer/brock.pic" +MistyPic:: INCBIN "pic/trainer/misty.pic" +LtSurgePic:: INCBIN "pic/trainer/lt.surge.pic" +ErikaPic:: INCBIN "pic/trainer/erika.pic" +KogaPic:: INCBIN "pic/trainer/koga.pic" +BlainePic:: INCBIN "pic/trainer/blaine.pic" +SabrinaPic:: INCBIN "pic/trainer/sabrina.pic" +GentlemanPic:: INCBIN "pic/trainer/gentleman.pic" +Rival2Pic:: INCBIN "pic/trainer/rival2.pic" +Rival3Pic:: INCBIN "pic/trainer/rival3.pic" +LoreleiPic:: INCBIN "pic/trainer/lorelei.pic" +ChannelerPic:: INCBIN "pic/trainer/channeler.pic" +AgathaPic:: INCBIN "pic/trainer/agatha.pic" +LancePic:: INCBIN "pic/trainer/lance.pic" INCLUDE "data/mapHeaders/battlecenterm.asm" - INCLUDE "scripts/battlecenterm.asm" - INCLUDE "data/mapObjects/battlecenterm.asm" - -BattleCenterMBlocks: ; 4fd5d (13:7d5d) - INCBIN "maps/battlecenterm.blk" +BattleCenterMBlocks: INCBIN "maps/battlecenterm.blk" INCLUDE "data/mapHeaders/tradecenterm.asm" - INCLUDE "scripts/tradecenterm.asm" - INCLUDE "data/mapObjects/tradecenterm.asm" - -TradeCenterMBlocks: ; 4fd91 (13:7d91) - INCBIN "maps/tradecenterm.blk" +TradeCenterMBlocks: INCBIN "maps/tradecenterm.blk" INCLUDE "engine/give_pokemon.asm" INCLUDE "engine/predefs.asm" + SECTION "bank14",ROMX,BANK[$14] INCLUDE "data/mapHeaders/route22.asm" - INCLUDE "data/mapObjects/route22.asm" - -Route22Blocks: ; 5003d (14:403d) - INCBIN "maps/route22.blk" +Route22Blocks: INCBIN "maps/route22.blk" INCLUDE "data/mapHeaders/route20.asm" - INCLUDE "data/mapObjects/route20.asm" - -Route20Blocks: ; 5017d (14:417d) - INCBIN "maps/route20.blk" +Route20Blocks: INCBIN "maps/route20.blk" INCLUDE "data/mapHeaders/route23.asm" - INCLUDE "data/mapObjects/route23.asm" - -Route23Blocks: ; 503b2 (14:43b2) - INCBIN "maps/route23.blk" +Route23Blocks: INCBIN "maps/route23.blk" INCLUDE "data/mapHeaders/route24.asm" - INCLUDE "data/mapObjects/route24.asm" - -Route24Blocks: ; 506e7 (14:46e7) - INCBIN "maps/route24.blk" +Route24Blocks: INCBIN "maps/route24.blk" INCLUDE "data/mapHeaders/route25.asm" - INCLUDE "data/mapObjects/route25.asm" - -Route25Blocks: ; 50810 (14:4810) - INCBIN "maps/route25.blk" +Route25Blocks: INCBIN "maps/route25.blk" INCLUDE "data/mapHeaders/indigoplateau.asm" - INCLUDE "scripts/indigoplateau.asm" - INCLUDE "data/mapObjects/indigoplateau.asm" - -IndigoPlateauBlocks: ; 5094a (14:494a) - INCBIN "maps/indigoplateau.blk" +IndigoPlateauBlocks: INCBIN "maps/indigoplateau.blk" INCLUDE "data/mapHeaders/saffroncity.asm" - INCLUDE "data/mapObjects/saffroncity.asm" - -SaffronCityBlocks: ; 50a98 (14:4a98) - INCBIN "maps/saffroncity.blk" - +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: ; 519af (14:59af) - INCBIN "maps/victoryroad2.blk" +VictoryRoad2Blocks: INCBIN "maps/victoryroad2.blk" INCLUDE "data/mapHeaders/mtmoon2.asm" - INCLUDE "scripts/mtmoon2.asm" - INCLUDE "data/mapObjects/mtmoon2.asm" - -MtMoon2Blocks: ; 51a91 (14:5a91) - INCBIN "maps/mtmoon2.blk" +MtMoon2Blocks: INCBIN "maps/mtmoon2.blk" INCLUDE "data/mapHeaders/silphco7.asm" - INCLUDE "scripts/silphco7.asm" - INCLUDE "data/mapObjects/silphco7.asm" - -SilphCo7Blocks: ; 51f57 (14:5f57) - INCBIN "maps/silphco7.blk" +SilphCo7Blocks: INCBIN "maps/silphco7.blk" INCLUDE "data/mapHeaders/mansion2.asm" - INCLUDE "scripts/mansion2.asm" - INCLUDE "data/mapObjects/mansion2.asm" - -Mansion2Blocks: ; 52110 (14:6110) - INCBIN "maps/mansion2.blk" +Mansion2Blocks: INCBIN "maps/mansion2.blk" INCLUDE "data/mapHeaders/mansion3.asm" - INCLUDE "scripts/mansion3.asm" - INCLUDE "data/mapObjects/mansion3.asm" - -Mansion3Blocks: ; 52326 (14:6326) - INCBIN "maps/mansion3.blk" +Mansion3Blocks: INCBIN "maps/mansion3.blk" INCLUDE "data/mapHeaders/mansion4.asm" - INCLUDE "scripts/mansion4.asm" - INCLUDE "data/mapObjects/mansion4.asm" - -Mansion4Blocks: ; 524dd (14:64dd) - INCBIN "maps/mansion4.blk" +Mansion4Blocks: INCBIN "maps/mansion4.blk" INCLUDE "engine/battle/14.asm" @@ -17914,211 +5811,132 @@ 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: ; 5407e (15:407e) - INCBIN "maps/route2.blk" +Route2Blocks: INCBIN "maps/route2.blk" INCLUDE "data/mapHeaders/route3.asm" - INCLUDE "data/mapObjects/route3.asm" - -Route3Blocks: ; 54255 (15:4255) - INCBIN "maps/route3.blk" +Route3Blocks: INCBIN "maps/route3.blk" INCLUDE "data/mapHeaders/route4.asm" - INCLUDE "data/mapObjects/route4.asm" - -Route4Blocks: ; 543ec (15:43ec) - INCBIN "maps/route4.blk" +Route4Blocks: INCBIN "maps/route4.blk" INCLUDE "data/mapHeaders/route5.asm" - INCLUDE "data/mapObjects/route5.asm" - -Route5Blocks: ; 545d2 (15:45d2) - INCBIN "maps/route5.blk" +Route5Blocks: INCBIN "maps/route5.blk" INCLUDE "data/mapHeaders/route9.asm" - INCLUDE "data/mapObjects/route9.asm" - -Route9Blocks: ; 546fe (15:46fe) - INCBIN "maps/route9.blk" +Route9Blocks: INCBIN "maps/route9.blk" INCLUDE "data/mapHeaders/route13.asm" - INCLUDE "data/mapObjects/route13.asm" - -Route13Blocks: ; 5488b (15:488b) - INCBIN "maps/route13.blk" +Route13Blocks: INCBIN "maps/route13.blk" INCLUDE "data/mapHeaders/route14.asm" - INCLUDE "data/mapObjects/route14.asm" - -Route14Blocks: ; 54a12 (15:4a12) - INCBIN "maps/route14.blk" +Route14Blocks: INCBIN "maps/route14.blk" INCLUDE "data/mapHeaders/route17.asm" - INCLUDE "data/mapObjects/route17.asm" - -Route17Blocks: ; 54ba8 (15:4ba8) - INCBIN "maps/route17.blk" +Route17Blocks: INCBIN "maps/route17.blk" INCLUDE "data/mapHeaders/route19.asm" - INCLUDE "data/mapObjects/route19.asm" - -Route19Blocks: ; 54ef1 (15:4ef1) - INCBIN "maps/route19.blk" +Route19Blocks: INCBIN "maps/route19.blk" INCLUDE "data/mapHeaders/route21.asm" - INCLUDE "data/mapObjects/route21.asm" +Route21Blocks: INCBIN "maps/route21.blk" -Route21Blocks: ; 5506d (15:506d) - INCBIN "maps/route21.blk" +VermilionHouse2Blocks: +Route12HouseBlocks: +DayCareMBlocks: INCBIN "maps/daycarem.blk" -VermilionHouse2Blocks: ; 5522f (15:522f) -Route12HouseBlocks: ; 5522f (15:522f) -DayCareMBlocks: ; 5522f (15:522f) - INCBIN "maps/daycarem.blk" - -FuchsiaHouse3Blocks: ; 5523f (15:523f) - INCBIN "maps/fuchsiahouse3.blk" +FuchsiaHouse3Blocks: INCBIN "maps/fuchsiahouse3.blk" INCLUDE "engine/battle/15.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: ; 56148 (15:6148) - INCBIN "maps/celadonmart2.blk" +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: ; 5666d (15:666d) - INCBIN "maps/silphco8.blk" +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: ; 58079 (16:4079) - INCBIN "maps/route6.blk" +Route6Blocks: INCBIN "maps/route6.blk" INCLUDE "data/mapHeaders/route8.asm" - INCLUDE "data/mapObjects/route8.asm" - -Route8Blocks: ; 581c6 (16:41c6) - INCBIN "maps/route8.blk" +Route8Blocks: INCBIN "maps/route8.blk" INCLUDE "data/mapHeaders/route10.asm" - INCLUDE "data/mapObjects/route10.asm" - -Route10Blocks: ; 58356 (16:4356) - INCBIN "maps/route10.blk" +Route10Blocks: INCBIN "maps/route10.blk" INCLUDE "data/mapHeaders/route11.asm" - INCLUDE "data/mapObjects/route11.asm" - -Route11Blocks: ; 5855f (16:455f) - INCBIN "maps/route11.blk" +Route11Blocks: INCBIN "maps/route11.blk" INCLUDE "data/mapHeaders/route12.asm" - INCLUDE "data/mapObjects/route12.asm" - -Route12Blocks: ; 58710 (16:4710) - INCBIN "maps/route12.blk" +Route12Blocks: INCBIN "maps/route12.blk" INCLUDE "data/mapHeaders/route15.asm" - INCLUDE "data/mapObjects/route15.asm" - -Route15Blocks: ; 589cc (16:49cc) - INCBIN "maps/route15.blk" +Route15Blocks: INCBIN "maps/route15.blk" INCLUDE "data/mapHeaders/route16.asm" - INCLUDE "data/mapObjects/route16.asm" - -Route16Blocks: ; 58b84 (16:4b84) - INCBIN "maps/route16.blk" +Route16Blocks: INCBIN "maps/route16.blk" INCLUDE "data/mapHeaders/route18.asm" - INCLUDE "data/mapObjects/route18.asm" - -Route18Blocks: ; 58c9c (16:4c9c) - INCBIN "maps/route18.blk" +Route18Blocks: INCBIN "maps/route18.blk" INCBIN "maps/unusedblocks58d7d.blk" @@ -18129,666 +5947,434 @@ 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: ; 59cd5 (16:5cd5) +FanClubBlocks: INCBIN "maps/fanclub.blk" INCLUDE "data/mapHeaders/silphco2.asm" - INCLUDE "scripts/silphco2.asm" - INCLUDE "data/mapObjects/silphco2.asm" - -SilphCo2Blocks: ; 59ec8 (16:5ec8) +SilphCo2Blocks: INCBIN "maps/silphco2.blk" INCLUDE "data/mapHeaders/silphco3.asm" - INCLUDE "scripts/silphco3.asm" - INCLUDE "data/mapObjects/silphco3.asm" - -SilphCo3Blocks: ; 5a0a6 (16:60a6) +SilphCo3Blocks: INCBIN "maps/silphco3.blk" INCLUDE "data/mapHeaders/silphco10.asm" - INCLUDE "scripts/silphco10.asm" - INCLUDE "data/mapObjects/silphco10.asm" - -SilphCo10Blocks: ; 5a25a (16:625a) +SilphCo10Blocks: INCBIN "maps/silphco10.blk" INCLUDE "data/mapHeaders/lance.asm" - INCLUDE "scripts/lance.asm" - INCLUDE "data/mapObjects/lance.asm" - -LanceBlocks: ; 5a3e9 (16:63e9) +LanceBlocks: INCBIN "maps/lance.blk" INCLUDE "data/mapHeaders/halloffameroom.asm" - INCLUDE "scripts/halloffameroom.asm" - INCLUDE "data/mapObjects/halloffameroom.asm" - -HallofFameRoomBlocks: ; 5a58b (16:658b) +HallofFameRoomBlocks: INCBIN "maps/halloffameroom.blk" INCLUDE "engine/overworld/saffron_guards.asm" + SECTION "bank17",ROMX,BANK[$17] -SaffronMartBlocks: ; 5c000 (17:4000) -LavenderMartBlocks: ; 5c000 (17:4000) -CeruleanMartBlocks: ; 5c000 (17:4000) -VermilionMartBlocks: ; 5c000 (17:4000) - INCBIN "maps/vermilionmart.blk" +SaffronMartBlocks: +LavenderMartBlocks: +CeruleanMartBlocks: +VermilionMartBlocks: INCBIN "maps/vermilionmart.blk" -CopycatsHouse2FBlocks: ; 5c010 (17:4010) -RedsHouse2FBlocks: ; 0x5c010 16? - INCBIN "maps/redshouse2f.blk" +CopycatsHouse2FBlocks: +RedsHouse2FBlocks: INCBIN "maps/redshouse2f.blk" -Museum1FBlocks: ; 5c020 (17:4020) - INCBIN "maps/museum1f.blk" +Museum1FBlocks: INCBIN "maps/museum1f.blk" -Museum2FBlocks: ; 5c048 (17:4048) - INCBIN "maps/museum2f.blk" +Museum2FBlocks: INCBIN "maps/museum2f.blk" -SaffronPokecenterBlocks: ; 5c064 (17:4064) -VermilionPokecenterBlocks: ; 5c064 (17:4064) -LavenderPokecenterBlocks: ; 5c064 (17:4064) -PewterPokecenterBlocks: ; 5c064 (17:4064) - INCBIN "maps/pewterpokecenter.blk" +SaffronPokecenterBlocks: +VermilionPokecenterBlocks: +LavenderPokecenterBlocks: +PewterPokecenterBlocks: INCBIN "maps/pewterpokecenter.blk" -UndergroundPathEntranceRoute7Blocks: ; 5c080 (17:4080) -UndergroundPathEntranceRoute7CopyBlocks: ; 5c080 (17:4080) -UndergroundPathEntranceRoute6Blocks: ; 5c080 (17:4080) -UndergroundPathEntranceRoute5Blocks: ; 5c080 (17:4080) - INCBIN "maps/undergroundpathentranceroute5.blk" +UndergroundPathEntranceRoute7Blocks: +UndergroundPathEntranceRoute7CopyBlocks: +UndergroundPathEntranceRoute6Blocks: +UndergroundPathEntranceRoute5Blocks: INCBIN "maps/undergroundpathentranceroute5.blk" -Route2GateBlocks: ; 5c090 (17:4090) -ViridianForestEntranceBlocks: ; 5c090 (17:4090) -ViridianForestExitBlocks: ; 5c090 (17:4090) - INCBIN "maps/viridianforestexit.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: ; 5c558 (17:4558) - INCBIN "maps/pewtergym.blk" +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: ; 5c68b (17:468b) - INCBIN "maps/ceruleanpokecenter.blk" +CeruleanPokecenterBlocks: INCBIN "maps/ceruleanpokecenter.blk" INCLUDE "data/mapHeaders/ceruleangym.asm" - INCLUDE "scripts/ceruleangym.asm" - INCLUDE "data/mapObjects/ceruleangym.asm" - -CeruleanGymBlocks: ; 5c866 (17:4866) - INCBIN "maps/ceruleangym.blk" +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: ; 5cc38 (17:4c38) - INCBIN "maps/vermiliongym.blk" +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: ; 5cfe3 (17:4fe3) - INCBIN "maps/fightingdojo.blk" +FightingDojoBlocks: INCBIN "maps/fightingdojo.blk" INCLUDE "data/mapHeaders/saffrongym.asm" - INCLUDE "scripts/saffrongym.asm" - INCLUDE "data/mapObjects/saffrongym.asm" - -SaffronGymBlocks: ; 5d3a3 (17:53a3) - INCBIN "maps/saffrongym.blk" +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: ; 5d4a2 (17:54a2) - INCBIN "maps/silphco1.blk" +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: ; 5d989 (17:5989) - INCBIN "maps/silphco9.blk" +SilphCo9Blocks: INCBIN "maps/silphco9.blk" INCLUDE "data/mapHeaders/victoryroad1.asm" - INCLUDE "scripts/victoryroad1.asm" - INCLUDE "data/mapObjects/victoryroad1.asm" - -VictoryRoad1Blocks: ; 5db04 (17:5b04) - INCBIN "maps/victoryroad1.blk" +VictoryRoad1Blocks: INCBIN "maps/victoryroad1.blk" INCLUDE "engine/predefs17_2.asm" INCLUDE "engine/hidden_object_functions17.asm" -SECTION "bank18",ROMX,BANK[$18] - -ViridianForestBlocks: ; 60000 (18:4000) - INCBIN "maps/viridianforest.blk" -UndergroundPathNSBlocks: ; 60198 (18:4198) - INCBIN "maps/undergroundpathns.blk" +SECTION "bank18",ROMX,BANK[$18] -UndergroundPathWEBlocks: ; 601f4 (18:41f4) - INCBIN "maps/undergroundpathwe.blk" +ViridianForestBlocks: INCBIN "maps/viridianforest.blk" +UndergroundPathNSBlocks: INCBIN "maps/undergroundpathns.blk" +UndergroundPathWEBlocks: INCBIN "maps/undergroundpathwe.blk" INCBIN "maps/unusedblocks60258.blk" -SSAnne10Blocks: ; 603c0 (18:43c0) -SSAnne9Blocks: ; 603c0 (18:43c0) - INCBIN "maps/ssanne9.blk" +SSAnne10Blocks: +SSAnne9Blocks: INCBIN "maps/ssanne9.blk" INCLUDE "data/mapHeaders/pokemontower1.asm" - INCLUDE "scripts/pokemontower1.asm" - INCLUDE "data/mapObjects/pokemontower1.asm" - -PokemonTower1Blocks: ; 6048c (18:448c) - INCBIN "maps/pokemontower1.blk" +PokemonTower1Blocks: INCBIN "maps/pokemontower1.blk" INCLUDE "data/mapHeaders/pokemontower2.asm" - INCLUDE "scripts/pokemontower2.asm" - INCLUDE "data/mapObjects/pokemontower2.asm" - -PokemonTower2Blocks: ; 60666 (18:4666) - INCBIN "maps/pokemontower2.blk" +PokemonTower2Blocks: INCBIN "maps/pokemontower2.blk" INCLUDE "data/mapHeaders/pokemontower3.asm" - INCLUDE "scripts/pokemontower3.asm" - INCLUDE "data/mapObjects/pokemontower3.asm" - -PokemonTower3Blocks: ; 60790 (18:4790) - INCBIN "maps/pokemontower3.blk" +PokemonTower3Blocks: INCBIN "maps/pokemontower3.blk" INCLUDE "data/mapHeaders/pokemontower4.asm" - INCLUDE "scripts/pokemontower4.asm" - INCLUDE "data/mapObjects/pokemontower4.asm" - -PokemonTower4Blocks: ; 608cc (18:48cc) - INCBIN "maps/pokemontower4.blk" +PokemonTower4Blocks: INCBIN "maps/pokemontower4.blk" INCLUDE "data/mapHeaders/pokemontower5.asm" - INCLUDE "scripts/pokemontower5.asm" - INCLUDE "data/mapObjects/pokemontower5.asm" - -PokemonTower5Blocks: ; 60a89 (18:4a89) - INCBIN "maps/pokemontower5.blk" +PokemonTower5Blocks: INCBIN "maps/pokemontower5.blk" INCLUDE "data/mapHeaders/pokemontower6.asm" - INCLUDE "scripts/pokemontower6.asm" - INCLUDE "data/mapObjects/pokemontower6.asm" - -PokemonTower6Blocks: ; 60c95 (18:4c95) - INCBIN "maps/pokemontower6.blk" +PokemonTower6Blocks: INCBIN "maps/pokemontower6.blk" INCBIN "maps/unusedblocks60cef.blk" INCLUDE "data/mapHeaders/pokemontower7.asm" - INCLUDE "scripts/pokemontower7.asm" - INCLUDE "data/mapObjects/pokemontower7.asm" - -PokemonTower7Blocks: ; 60f20 (18:4f20) - INCBIN "maps/pokemontower7.blk" +PokemonTower7Blocks: INCBIN "maps/pokemontower7.blk" INCLUDE "data/mapHeaders/celadonmart1.asm" - INCLUDE "scripts/celadonmart1.asm" - INCLUDE "data/mapObjects/celadonmart1.asm" - -CeladonMart1Blocks: ; 60fde (18:4fde) - INCBIN "maps/celadonmart1.blk" +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: ; 612df (18:52df) - INCBIN "maps/ssanne1.blk" +SSAnne1Blocks: INCBIN "maps/ssanne1.blk" INCLUDE "data/mapHeaders/ssanne2.asm" - INCLUDE "scripts/ssanne2.asm" - INCLUDE "data/mapObjects/ssanne2.asm" - -SSAnne2Blocks: ; 6156e (18:556e) - INCBIN "maps/ssanne2.blk" +SSAnne2Blocks: INCBIN "maps/ssanne2.blk" INCLUDE "data/mapHeaders/ssanne4.asm" - INCLUDE "scripts/ssanne4.asm" - INCLUDE "data/mapObjects/ssanne4.asm" - -SSAnne4Blocks: ; 61666 (18:5666) - INCBIN "maps/ssanne4.blk" +SSAnne4Blocks: INCBIN "maps/ssanne4.blk" INCLUDE "data/mapHeaders/ssanne5.asm" - INCLUDE "scripts/ssanne5.asm" - INCLUDE "data/mapObjects/ssanne5.asm" - -SSAnne5Blocks: ; 61761 (18:5761) - INCBIN "maps/ssanne5.blk" +SSAnne5Blocks: INCBIN "maps/ssanne5.blk" INCLUDE "data/mapHeaders/ssanne6.asm" - INCLUDE "scripts/ssanne6.asm" - INCLUDE "data/mapObjects/ssanne6.asm" - -SSAnne6Blocks: ; 61851 (18:5851) - INCBIN "maps/ssanne6.blk" +SSAnne6Blocks: INCBIN "maps/ssanne6.blk" INCLUDE "data/mapHeaders/ssanne7.asm" - INCLUDE "scripts/ssanne7.asm" - INCLUDE "data/mapObjects/ssanne7.asm" - -SSAnne7Blocks: ; 6195e (18:595e) - INCBIN "maps/ssanne7.blk" +SSAnne7Blocks: INCBIN "maps/ssanne7.blk" INCLUDE "data/mapHeaders/ssanne8.asm" - INCLUDE "scripts/ssanne8.asm" - INCLUDE "data/mapObjects/ssanne8.asm" - -SSAnne8Blocks: ; 61adf (18:5adf) - INCBIN "maps/ssanne8.blk" +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: ; 61f86 (18:5f86) - INCBIN "maps/diglettscave.blk" +DiglettsCaveBlocks: INCBIN "maps/diglettscave.blk" INCLUDE "data/mapHeaders/silphco11.asm" - INCLUDE "scripts/silphco11.asm" - INCLUDE "data/mapObjects/silphco11.asm" - -SilphCo11Blocks: ; 623c8 (18:63c8) - INCBIN "maps/silphco11.blk" +SilphCo11Blocks: INCBIN "maps/silphco11.blk" INCLUDE "engine/hidden_object_functions18.asm" + SECTION "bank19",ROMX,BANK[$19] -Overworld_GFX: ; 64000 (19:4000) - INCBIN "gfx/tilesets/overworld.w128.t2.2bpp" -Overworld_Block: ; 645e0 (19:45e0) - INCBIN "gfx/blocksets/overworld.bst" +Overworld_GFX: INCBIN "gfx/tilesets/overworld.t2.2bpp" +Overworld_Block: INCBIN "gfx/blocksets/overworld.bst" + RedsHouse1_GFX: -RedsHouse2_GFX: ; 64de0 (19:4de0) - INCBIN "gfx/tilesets/reds_house.w128.t7.2bpp" +RedsHouse2_GFX: INCBIN "gfx/tilesets/reds_house.t7.2bpp" RedsHouse1_Block: -RedsHouse2_Block: ; 65270 (19:5270) - INCBIN "gfx/blocksets/reds_house.bst" -House_GFX: ; 653a0 (19:53a0) - INCBIN "gfx/tilesets/house.w128.t2.2bpp" -House_Block: ; 65980 (19:5980) - INCBIN "gfx/blocksets/house.bst" -Mansion_GFX: ; 65bb0 (19:5bb0) - INCBIN "gfx/tilesets/mansion.w128.t2.2bpp" -Mansion_Block: ; 66190 (19:6190) - INCBIN "gfx/blocksets/mansion.bst" -ShipPort_GFX: ; 66610 (19:6610) - INCBIN "gfx/tilesets/ship_port.w128.t2.2bpp" -ShipPort_Block: ; 66bf0 (19:6bf0) - INCBIN "gfx/blocksets/ship_port.bst" -Interior_GFX: ; 66d60 (19:6d60) - INCBIN "gfx/tilesets/interior.w128.t1.2bpp" -Interior_Block: ; 67350 (19:7350) - INCBIN "gfx/blocksets/interior.bst" -Plateau_GFX: ; 676f0 (19:76f0) - INCBIN "gfx/tilesets/plateau.w128.t10.2bpp" -Plateau_Block: ; 67b50 (19:7b50) - INCBIN "gfx/blocksets/plateau.bst" +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/1a.asm" -Version_GFX: ; 6802f (1a:402f) +Version_GFX: IF _RED - INCBIN "gfx/red/redgreenversion.h8.1bpp" - ; 80 bytes + INCBIN "gfx/red/redgreenversion.1bpp" ; 10 tiles ENDC IF _BLUE - INCBIN "gfx/blue/blueversion.h8.1bpp" - ; 64 bytes + INCBIN "gfx/blue/blueversion.1bpp" ; 8 tiles ENDC Dojo_GFX: -Gym_GFX: ; 6807f (1a:407f) - INCBIN "gfx/tilesets/gym.w128.2bpp" +Gym_GFX: INCBIN "gfx/tilesets/gym.2bpp" Dojo_Block: -Gym_Block: ; 6867f (1a:467f) - INCBIN "gfx/blocksets/gym.bst" +Gym_Block: INCBIN "gfx/blocksets/gym.bst" + Mart_GFX: -Pokecenter_GFX: ; 68dbf (1a:4dbf) - INCBIN "gfx/tilesets/pokecenter.w128.2bpp" +Pokecenter_GFX: INCBIN "gfx/tilesets/pokecenter.2bpp" Mart_Block: -Pokecenter_Block: ; 693bf (1a:53bf) - INCBIN "gfx/blocksets/pokecenter.bst" +Pokecenter_Block: INCBIN "gfx/blocksets/pokecenter.bst" + ForestGate_GFX: Museum_GFX: -Gate_GFX: ; 6960f (1a:560f) - INCBIN "gfx/tilesets/gate.w128.t1.2bpp" +Gate_GFX: INCBIN "gfx/tilesets/gate.t1.2bpp" ForestGate_Block: Museum_Block: -Gate_Block: ; 69bff (1a:5bff) - INCBIN "gfx/blocksets/gate.bst" -Forest_GFX: ; 6a3ff (1a:63ff) - INCBIN "gfx/tilesets/forest.w128.2bpp" -Forest_Block: ; 6a9ff (1a:69ff) - INCBIN "gfx/blocksets/forest.bst" -Facility_GFX: ; 6b1ff (1a:71ff) - INCBIN "gfx/tilesets/facility.w128.2bpp" -Facility_Block: ; 6b7ff (1a:77ff) - INCBIN "gfx/blocksets/facility.bst" +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: ; 6c000 (1b:4000) - INCBIN "gfx/tilesets/cemetery.w128.t4.2bpp" -Cemetery_Block: ; 6c5c0 (1b:45c0) - INCBIN "gfx/blocksets/cemetery.bst" -Cavern_GFX: ; 6cca0 (1b:4ca0) - INCBIN "gfx/tilesets/cavern.w128.t14.2bpp" -Cavern_Block: ; 6d0c0 (1b:50c0) - INCBIN "gfx/blocksets/cavern.bst" -Lobby_GFX: ; 6d8c0 (1b:58c0) - INCBIN "gfx/tilesets/lobby.w128.t2.2bpp" -Lobby_Block: ; 6dea0 (1b:5ea0) - INCBIN "gfx/blocksets/lobby.bst" -Ship_GFX: ; 6e390 (1b:6390) - INCBIN "gfx/tilesets/ship.w128.t6.2bpp" -Ship_Block: ; 6e930 (1b:6930) - INCBIN "gfx/blocksets/ship.bst" -Lab_GFX: ; 6ed10 (1b:6d10) - INCBIN "gfx/tilesets/lab.w128.t4.2bpp" -Lab_Block: ; 6f2d0 (1b:72d0) - INCBIN "gfx/blocksets/lab.bst" -Club_GFX: ; 6f670 (1b:7670) - INCBIN "gfx/tilesets/club.w128.t5.2bpp" -Club_Block: ; 6fb20 (1b:7b20) - INCBIN "gfx/blocksets/club.bst" -Underground_GFX: ; 6fd60 (1b:7d60) - INCBIN "gfx/tilesets/underground.w128.t7.2bpp" -Underground_Block: ; 6fef0 (1b:7ef0) - INCBIN "gfx/blocksets/underground.bst" +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/1c.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: ; 74000 (1d:4000) - INCBIN "maps/copycatshouse1f.blk" +CopycatsHouse1FBlocks: INCBIN "maps/copycatshouse1f.blk" -CinnabarMartBlocks: ; 74010 (1d:4010) -PewterMartBlocks: ; 74010 (1d:4010) - INCBIN "maps/pewtermart.blk" +CinnabarMartBlocks: +PewterMartBlocks: INCBIN "maps/pewtermart.blk" -FuchsiaHouse1Blocks: ; 74020 (1d:4020) - INCBIN "maps/fuchsiahouse1.blk" +FuchsiaHouse1Blocks: INCBIN "maps/fuchsiahouse1.blk" -CinnabarPokecenterBlocks: ; 74030 (1d:4030) -FuchsiaPokecenterBlocks: ; 74030 (1d:4030) - INCBIN "maps/fuchsiapokecenter.blk" +CinnabarPokecenterBlocks: +FuchsiaPokecenterBlocks: INCBIN "maps/fuchsiapokecenter.blk" -CeruleanHouse2Blocks: ; 7404c (1d:404c) - INCBIN "maps/ceruleanhouse2.blk" +CeruleanHouse2Blocks: INCBIN "maps/ceruleanhouse2.blk" INCLUDE "engine/HoF_room_pc.asm" @@ -18799,188 +6385,115 @@ INCLUDE "engine/items/itemfinder.asm" INCLUDE "scripts/ceruleancity2.asm" INCLUDE "data/mapHeaders/viridiangym.asm" - INCLUDE "scripts/viridiangym.asm" - INCLUDE "data/mapObjects/viridiangym.asm" - -ViridianGymBlocks: ; 74c47 (1d:4c47) - INCBIN "maps/viridiangym.blk" +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: ; 74d76 (1d:4d76) - INCBIN "maps/unknowndungeon1.blk" +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: ; 751ad (1d:51ad) - INCBIN "maps/fuchsiahouse2.blk" +FuchsiaHouse2Blocks: INCBIN "maps/fuchsiahouse2.blk" INCLUDE "data/mapHeaders/safarizoneentrance.asm" - INCLUDE "scripts/safarizoneentrance.asm" - INCLUDE "data/mapObjects/safarizoneentrance.asm" - -SafariZoneEntranceBlocks: ; 75425 (1d:5425) - INCBIN "maps/safarizoneentrance.blk" +SafariZoneEntranceBlocks: INCBIN "maps/safarizoneentrance.blk" INCLUDE "data/mapHeaders/fuchsiagym.asm" - INCLUDE "scripts/fuchsiagym.asm" - INCLUDE "data/mapObjects/fuchsiagym.asm" - -FuchsiaGymBlocks: ; 756aa (1d:56aa) - INCBIN "maps/fuchsiagym.blk" +FuchsiaGymBlocks: INCBIN "maps/fuchsiagym.blk" INCLUDE "data/mapHeaders/fuchsiameetingroom.asm" - INCLUDE "scripts/fuchsiameetingroom.asm" - INCLUDE "data/mapObjects/fuchsiameetingroom.asm" - -FuchsiaMeetingRoomBlocks: ; 75722 (1d:5722) - INCBIN "maps/fuchsiameetingroom.blk" +FuchsiaMeetingRoomBlocks: INCBIN "maps/fuchsiameetingroom.blk" INCLUDE "data/mapHeaders/cinnabargym.asm" - INCLUDE "scripts/cinnabargym.asm" - INCLUDE "data/mapObjects/cinnabargym.asm" - -CinnabarGymBlocks: ; 75b26 (1d:5b26) - INCBIN "maps/cinnabargym.blk" +CinnabarGymBlocks: INCBIN "maps/cinnabargym.blk" INCLUDE "data/mapHeaders/lab1.asm" - INCLUDE "scripts/lab1.asm" - INCLUDE "data/mapObjects/lab1.asm" - -Lab1Blocks: ; 75bf1 (1d:5bf1) - INCBIN "maps/lab1.blk" +Lab1Blocks: INCBIN "maps/lab1.blk" INCLUDE "data/mapHeaders/lab2.asm" - INCLUDE "scripts/lab2.asm" - INCLUDE "data/mapObjects/lab2.asm" - -Lab2Blocks: ; 75c6b (1d:5c6b) - INCBIN "maps/lab2.blk" +Lab2Blocks: INCBIN "maps/lab2.blk" INCLUDE "data/mapHeaders/lab3.asm" - INCLUDE "scripts/lab3.asm" - INCLUDE "data/mapObjects/lab3.asm" - -Lab3Blocks: ; 75d15 (1d:5d15) - INCBIN "maps/lab3.blk" +Lab3Blocks: INCBIN "maps/lab3.blk" INCLUDE "data/mapHeaders/lab4.asm" - INCLUDE "scripts/lab4.asm" - INCLUDE "data/mapObjects/lab4.asm" - -Lab4Blocks: ; 75e10 (1d:5e10) - INCBIN "maps/lab4.blk" +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: ; 7615f (1d:615f) - INCBIN "maps/gary.blk" +GaryBlocks: INCBIN "maps/gary.blk" INCLUDE "data/mapHeaders/lorelei.asm" - INCLUDE "scripts/lorelei.asm" - INCLUDE "data/mapObjects/lorelei.asm" - -LoreleiBlocks: ; 762ac (1d:62ac) - INCBIN "maps/lorelei.blk" +LoreleiBlocks: INCBIN "maps/lorelei.blk" INCLUDE "data/mapHeaders/bruno.asm" - INCLUDE "scripts/bruno.asm" - INCLUDE "data/mapObjects/bruno.asm" - -BrunoBlocks: ; 76403 (1d:6403) - INCBIN "maps/bruno.blk" +BrunoBlocks: INCBIN "maps/bruno.blk" INCLUDE "data/mapHeaders/agatha.asm" - INCLUDE "scripts/agatha.asm" - INCLUDE "data/mapObjects/agatha.asm" - -AgathaBlocks: ; 76560 (1d:6560) - INCBIN "maps/agatha.blk" +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" @@ -18989,17 +6502,10 @@ INCLUDE "engine/overworld/cut2.asm" INCLUDE "engine/overworld/ssanne.asm" -RedFishingTilesFront: ; 79fed (1e:5fed) - INCBIN "gfx/red_fishing_tile_front.2bpp" - -RedFishingTilesBack: ; 7a00d (1e:600d) - INCBIN "gfx/red_fishing_tile_back.2bpp" - -RedFishingTilesSide: ; 7a02d (1e:602d) - INCBIN "gfx/red_fishing_tile_side.2bpp" - -RedFishingRodTiles: ; 7a04d (1e:604d) - INCBIN "gfx/red_fishingrod_tiles.2bpp" +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" |