diff options
Diffstat (limited to 'home')
-rw-r--r-- | home/audio.asm | 1 | ||||
-rw-r--r-- | home/copy.asm | 1 | ||||
-rw-r--r-- | home/init.asm | 4 | ||||
-rw-r--r-- | home/map.asm | 513 | ||||
-rw-r--r-- | home/palettes.asm | 14 | ||||
-rwxr-xr-x | home/pokemon.asm | 1 | ||||
-rw-r--r-- | home/serial.asm | 12 | ||||
-rw-r--r-- | home/text.asm | 5 | ||||
-rwxr-xr-x | home/tilemap.asm | 4 | ||||
-rw-r--r-- | home/vblank.asm | 2 | ||||
-rw-r--r-- | home/warp_connection.asm | 506 | ||||
-rw-r--r-- | home/window.asm | 6 |
12 files changed, 536 insertions, 533 deletions
diff --git a/home/audio.asm b/home/audio.asm index 726d758c..9e982331 100644 --- a/home/audio.asm +++ b/home/audio.asm @@ -333,6 +333,7 @@ PlayMapMusic:: ret PlayMapMusicBike:: +; If the player's on a bike, play the bike music instead of the map music push hl push de push bc diff --git a/home/copy.asm b/home/copy.asm index 5f4ea079..c623d335 100644 --- a/home/copy.asm +++ b/home/copy.asm @@ -54,7 +54,6 @@ GetFarHalfword:: rst Bankswitch ret - ByteFill:: ; fill bc bytes with the value of a, starting at hl inc b ; we bail the moment b hits 0, so include the last run diff --git a/home/init.asm b/home/init.asm index e5f57e1c..497e13c7 100644 --- a/home/init.asm +++ b/home/init.asm @@ -108,9 +108,9 @@ Init:: ld a, CONNECTION_NOT_ESTABLISHED ldh [hSerialConnectionStatus], a - ld h, $98 + ld h, HIGH(vBGMap0) call BlankBGMap - ld h, $9c + ld h, HIGH(vBGMap1) call BlankBGMap callfar InitCGBPals diff --git a/home/map.asm b/home/map.asm index 5f34070e..d3a67c71 100644 --- a/home/map.asm +++ b/home/map.asm @@ -213,512 +213,7 @@ ReturnToMapFromSubmenu:: ldh [hMapEntryMethod], a ret -HandleNewMap:: - call ClearUnusedMapBuffer - call ResetMapBufferEventFlags - call ResetFlashIfOutOfCave - call GetCurrentMapSceneID - call ResetBikeFlags - ld a, MAPCALLBACK_NEWMAP - call RunMapCallback -HandleContinueMap:: - farcall ClearCmdQueue - ld a, MAPCALLBACK_CMDQUEUE - call RunMapCallback - call GetMapTimeOfDay - ld [wMapTimeOfDay], a - ret - -LoadMapTimeOfDay:: - ld a, $1 - ld [wSpriteUpdatesEnabled], a - farcall ReplaceTimeOfDayPals - farcall UpdateTimeOfDayPal - call OverworldTextModeSwitch - call .ClearBGMap - call .PushAttrmap - ret - -.ClearBGMap: - ld a, HIGH(vBGMap0) - ld [wBGMapAnchor + 1], a - xor a ; LOW(vBGMap0) - ld [wBGMapAnchor], a - ldh [hSCY], a - ldh [hSCX], a - farcall ApplyBGMapAnchorToObjects - - ld a, "■" - ld bc, vBGMap1 - vBGMap0 - hlbgcoord 0, 0 - call ByteFill - ret - -.PushAttrmap: - decoord 0, 0 - call .copy - ldh a, [hCGB] - and a - ret z - - decoord 0, 0, wAttrmap - ld a, $1 - ldh [rVBK], a -.copy - hlbgcoord 0, 0 - ld c, SCREEN_WIDTH - ld b, SCREEN_HEIGHT -.row - push bc -.column - ld a, [de] - inc de - ld [hli], a - dec c - jr nz, .column - ld bc, BG_MAP_WIDTH - SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .row - ld a, $0 - ldh [rVBK], a - ret - -LoadMapGraphics:: - call LoadMapTileset - call LoadTilesetGFX - xor a - ldh [hMapAnims], a - xor a - ldh [hTileAnimFrame], a - farcall RefreshSprites - call LoadFontsExtra - ret - -LoadMapPalettes:: - ld b, $9 - jp GetSGBLayout - -RefreshMapSprites:: - call ClearSprites - call ResetBGWindow - call GetMovementPermissions - farcall RefreshPlayerSprite - farcall CheckReplaceChrisSprite - ld hl, wPlayerSpriteSetupFlags - bit PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] - jr nz, .skip - ld hl, wVramState - set 0, [hl] - call SafeUpdateSprites -.skip - xor a - ld [wPlayerSpriteSetupFlags], a - ret - -CheckMovingOffEdgeOfMap:: - ld a, [wPlayerStepDirection] - cp STANDING - ret z - and a ; DOWN - jr z, .down - cp UP - jr z, .up - cp LEFT - jr z, .left - cp RIGHT - jr z, .right - and a - ret - -.down - ld a, [wPlayerStandingMapY] - sub 4 - ld b, a - ld a, [wMapHeight] - add a - cp b - jr z, .ok - and a - ret - -.up - ld a, [wPlayerStandingMapY] - sub 4 - cp -1 - jr z, .ok - and a - ret - -.left - ld a, [wPlayerStandingMapX] - sub 4 - cp -1 - jr z, .ok - and a - ret - -.right - ld a, [wPlayerStandingMapX] - sub 4 - ld b, a - ld a, [wMapWidth] - add a - cp b - jr z, .ok - and a - ret - -.ok - scf - ret - -EnterMapConnection:: -; Return carry if a connection has been entered. - ld a, [wPlayerStepDirection] - and a ; DOWN - jp z, .south - cp UP - jp z, .north - cp LEFT - jp z, .west - cp RIGHT - jp z, .east - ret - -.west - ld a, [wWestConnectedMapGroup] - ld [wMapGroup], a - ld a, [wWestConnectedMapNumber] - ld [wMapNumber], a - ld a, [wWestConnectionStripXOffset] - ld [wXCoord], a - ld a, [wWestConnectionStripYOffset] - ld hl, wYCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wWestConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - srl c - jr z, .skip_to_load - ld a, [wWestConnectedMapWidth] - add 6 - ld e, a - ld d, 0 - -.loop - add hl, de - dec c - jr nz, .loop - -.skip_to_load - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - jp .done - -.east - ld a, [wEastConnectedMapGroup] - ld [wMapGroup], a - ld a, [wEastConnectedMapNumber] - ld [wMapNumber], a - ld a, [wEastConnectionStripXOffset] - ld [wXCoord], a - ld a, [wEastConnectionStripYOffset] - ld hl, wYCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wEastConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - srl c - jr z, .skip_to_load2 - ld a, [wEastConnectedMapWidth] - add 6 - ld e, a - ld d, 0 - -.loop2 - add hl, de - dec c - jr nz, .loop2 - -.skip_to_load2 - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - jp .done - -.north - ld a, [wNorthConnectedMapGroup] - ld [wMapGroup], a - ld a, [wNorthConnectedMapNumber] - ld [wMapNumber], a - ld a, [wNorthConnectionStripYOffset] - ld [wYCoord], a - ld a, [wNorthConnectionStripXOffset] - ld hl, wXCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wNorthConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - ld b, 0 - srl c - add hl, bc - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a - jp .done - -.south - ld a, [wSouthConnectedMapGroup] - ld [wMapGroup], a - ld a, [wSouthConnectedMapNumber] - ld [wMapNumber], a - ld a, [wSouthConnectionStripYOffset] - ld [wYCoord], a - ld a, [wSouthConnectionStripXOffset] - ld hl, wXCoord - add [hl] - ld [hl], a - ld c, a - ld hl, wSouthConnectionWindow - ld a, [hli] - ld h, [hl] - ld l, a - ld b, 0 - srl c - add hl, bc - ld a, l - ld [wOverworldMapAnchor], a - ld a, h - ld [wOverworldMapAnchor + 1], a -.done - scf - ret - -CheckWarpTile:: - call GetDestinationWarpNumber - ret nc - - push bc - farcall CheckDirectionalWarp - pop bc - ret nc - - call CopyWarpData - scf - ret - -WarpCheck:: - call GetDestinationWarpNumber - ret nc - call CopyWarpData - ret - -GetDestinationWarpNumber:: - farcall CheckWarpCollision - ret nc - - ldh a, [hROMBank] - push af - - call SwitchToMapScriptsBank - call .GetDestinationWarpNumber - - pop de - ld a, d - rst Bankswitch - ret - -.GetDestinationWarpNumber: - ld a, [wPlayerStandingMapY] - sub 4 - ld e, a - ld a, [wPlayerStandingMapX] - sub 4 - ld d, a - ld a, [wCurMapWarpCount] - and a - ret z - - ld c, a - ld hl, wCurMapWarpsPointer - ld a, [hli] - ld h, [hl] - ld l, a -.loop - push hl - ld a, [hli] - cp e - jr nz, .next - ld a, [hli] - cp d - jr nz, .next - jr .found_warp - -.next - pop hl - ld a, WARP_EVENT_SIZE - add l - ld l, a - jr nc, .okay - inc h - -.okay - dec c - jr nz, .loop - xor a - ret - -.found_warp - pop hl - call .IncreaseHLTwice - ret nc ; never encountered - - ld a, [wCurMapWarpCount] - inc a - sub c - ld c, a - scf - ret - -.IncreaseHLTwice: - inc hl - inc hl - scf - ret - -CopyWarpData:: - ldh a, [hROMBank] - push af - - call SwitchToMapScriptsBank - call .CopyWarpData - - pop af - rst Bankswitch - scf - ret - -.CopyWarpData: - push bc - ld hl, wCurMapWarpsPointer - ld a, [hli] - ld h, [hl] - ld l, a - ld a, c - dec a - ld bc, WARP_EVENT_SIZE - call AddNTimes - ld bc, 2 ; warp number - add hl, bc - ld a, [hli] - cp -1 - jr nz, .skip - ld hl, wBackupWarpNumber - ld a, [hli] - -.skip - pop bc - ld [wNextWarp], a - ld a, [hli] - ld [wNextMapGroup], a - ld a, [hli] - ld [wNextMapNumber], a - - ld a, c - ld [wPrevWarp], a - ld a, [wMapGroup] - ld [wPrevMapGroup], a - ld a, [wMapNumber] - ld [wPrevMapNumber], a - scf - ret - -EnterMapWarp:: - call .SaveDigWarp - call .SetSpawn - ld a, [wNextWarp] - ld [wWarpNumber], a - ld a, [wNextMapGroup] - ld [wMapGroup], a - ld a, [wNextMapNumber] - ld [wMapNumber], a - ret - -.SaveDigWarp:: - call GetMapEnvironment - call CheckOutdoorMap - ret nz - ld a, [wNextMapGroup] - ld b, a - ld a, [wNextMapNumber] - ld c, a - call GetAnyMapEnvironment - call CheckIndoorMap - ret nz - -; MOUNT_MOON_SQUARE and TIN_TOWER_ROOF are outdoor maps within indoor maps. -; Dig and Escape Rope should not take you to them. - ld a, [wPrevMapGroup] - cp GROUP_MOUNT_MOON_SQUARE ; aka GROUP_TIN_TOWER_ROOF - jr nz, .not_mt_moon_or_tin_tower - ld a, [wPrevMapNumber] - cp MAP_MOUNT_MOON_SQUARE - ret z - cp MAP_TIN_TOWER_ROOF - ret z -.not_mt_moon_or_tin_tower - - ld a, [wPrevWarp] - ld [wDigWarpNumber], a - ld a, [wPrevMapGroup] - ld [wDigMapGroup], a - ld a, [wPrevMapNumber] - ld [wDigMapNumber], a - ret - -.SetSpawn: - call GetMapEnvironment - call CheckOutdoorMap - ret nz - ld a, [wNextMapGroup] - ld b, a - ld a, [wNextMapNumber] - ld c, a - call GetAnyMapEnvironment - call CheckIndoorMap - ret nz - ld a, [wNextMapGroup] - ld b, a - ld a, [wNextMapNumber] - ld c, a - -; Respawn in Pokémon Centers. - call GetAnyMapTileset - ld a, c - cp TILESET_POKECENTER - ret nz - -.pokecenter - ld a, [wPrevMapGroup] - ld [wLastSpawnMapGroup], a - ld a, [wPrevMapNumber] - ld [wLastSpawnMapNumber], a - ret +INCLUDE "home/warp_connection.asm" CheckOutdoorMap:: cp ROUTE @@ -2277,7 +1772,7 @@ CloseSubmenu:: call ReloadTilesetAndPalettes call UpdateSprites call Call_ExitMenu - call Functiond2a + call ReloadPalettes jr FinishExitMenu ExitAllMenus:: @@ -2285,7 +1780,7 @@ ExitAllMenus:: call Call_ExitMenu call ReloadTilesetAndPalettes call UpdateSprites - call Functiond2a + call ReloadPalettes FinishExitMenu:: ld b, SCGB_MAPPALS call GetSGBLayout @@ -2320,7 +1815,7 @@ ReturnToMapWithSpeechTextbox:: ReloadTilesetAndPalettes:: call DisableLCD call ClearSprites - farcall _ClearSprites + farcall _RefreshSprites call LoadStandardFont call LoadFontsExtra ldh a, [hROMBank] diff --git a/home/palettes.asm b/home/palettes.asm index 665a86ae..41cbbde9 100644 --- a/home/palettes.asm +++ b/home/palettes.asm @@ -257,22 +257,22 @@ ClearVBank1:: ldh [rVBK], a ret -Functiond2a:: +ReloadPalettes:: hlcoord 0, 0 - ld de, wAttrmap + decoord 0, 0, wAttrmap ld bc, SCREEN_WIDTH * SCREEN_HEIGHT -.asm_d33 +.loop ld a, [hli] cp $60 - jr c, .asm_d3b - ld a, $7 + jr c, .pal_map + ld a, 7 ld [de], a -.asm_d3b +.pal_map inc de dec bc ld a, b or c - jr nz, .asm_d33 + jr nz, .loop ret ReloadSpritesNoPalettes:: diff --git a/home/pokemon.asm b/home/pokemon.asm index 9bc54b2d..d035a2e4 100755 --- a/home/pokemon.asm +++ b/home/pokemon.asm @@ -64,6 +64,7 @@ PrepMonFrontpic:: _PrepMonFrontpic:: ld a, [wCurPartySpecies] +; is a pokemon? and a jr z, .not_pokemon cp EGG diff --git a/home/serial.asm b/home/serial.asm index f2924384..78814317 100644 --- a/home/serial.asm +++ b/home/serial.asm @@ -57,7 +57,6 @@ Serial:: bit 7, a jr nz, .wait_bit_7 - ; Cycle the serial controller ld a, (0 << rSC_ON) | (0 << rSC_CLOCK) ldh [rSC], a ld a, (1 << rSC_ON) | (0 << rSC_CLOCK) @@ -82,7 +81,7 @@ Serial:: reti Serial_ExchangeBytes:: - ld a, 1 + ld a, $1 ldh [hSerialIgnoringInitialData], a .loop ld a, [hl] @@ -121,20 +120,19 @@ Serial_ExchangeByte:: xor a ldh [hSerialReceivedNewData], a ldh a, [hSerialConnectionStatus] - cp 2 + cp USING_INTERNAL_CLOCK jr nz, .not_player_2 ld a, (0 << rSC_ON) | (1 << rSC_CLOCK) ldh [rSC], a ld a, (1 << rSC_ON) | (1 << rSC_CLOCK) ldh [rSC], a - .not_player_2 .loop2 ldh a, [hSerialReceivedNewData] and a jr nz, .reset_ffcc ldh a, [hSerialConnectionStatus] - cp 1 + cp USING_EXTERNAL_CLOCK jr nz, .not_player_1_or_wLinkTimeoutFrames_zero call CheckwLinkTimeoutFramesNonzero jr z, .not_player_1_or_wLinkTimeoutFrames_zero @@ -166,7 +164,7 @@ Serial_ExchangeByte:: ld [wce5d + 1], a jr nz, .loop2 ldh a, [hSerialConnectionStatus] - cp 1 + cp USING_EXTERNAL_CLOCK jr z, .reset_ffcc ld a, 255 @@ -256,7 +254,7 @@ Serial_ExchangeLinkMenuSelection:: inc hl ldh a, [hSerialIgnoringInitialData] and a - ld a, 0 + ld a, FALSE ldh [hSerialIgnoringInitialData], a jr nz, .asm_7f8 ld a, b diff --git a/home/text.asm b/home/text.asm index 5af9f921..61cc371e 100644 --- a/home/text.asm +++ b/home/text.asm @@ -166,7 +166,8 @@ PlaceNextChar:: ld c, l pop hl ret - pop de + + pop de ; unused NextChar:: inc de @@ -399,10 +400,12 @@ LineChar:: Paragraph:: push de + ld a, [wLinkMode] cp LINK_COLOSSEUM jr z, .linkbattle call LoadBlinkingCursor + .linkbattle call Text_WaitBGMap call PromptButton diff --git a/home/tilemap.asm b/home/tilemap.asm index 981dd95c..176d5be2 100755 --- a/home/tilemap.asm +++ b/home/tilemap.asm @@ -52,11 +52,11 @@ ApplyTilemap:: call DelayFrames ret -OpenAndCloseMenu_HDMATransferTilemapAndAttrmap:: +CGBOnly_CopyTilemapAtOnce:: ldh a, [hCGB] and a jr z, WaitBGMap - +; fall through CopyTilemapAtOnce:: ldh a, [hBGMapMode] push af diff --git a/home/vblank.asm b/home/vblank.asm index ce82f2cd..d6dfc825 100644 --- a/home/vblank.asm +++ b/home/vblank.asm @@ -38,7 +38,7 @@ VBlank:: dw VBlank3 dw VBlank4 dw VBlank5 - dw VBlank0 + dw VBlank0 ; just in case dw VBlank0 ; just in case VBlank0:: diff --git a/home/warp_connection.asm b/home/warp_connection.asm new file mode 100644 index 00000000..7207208e --- /dev/null +++ b/home/warp_connection.asm @@ -0,0 +1,506 @@ +HandleNewMap:: + call ClearUnusedMapBuffer + call ResetMapBufferEventFlags + call ResetFlashIfOutOfCave + call GetCurrentMapSceneID + call ResetBikeFlags + ld a, MAPCALLBACK_NEWMAP + call RunMapCallback +HandleContinueMap:: + farcall ClearCmdQueue + ld a, MAPCALLBACK_CMDQUEUE + call RunMapCallback + call GetMapTimeOfDay + ld [wMapTimeOfDay], a + ret + +LoadMapTimeOfDay:: + ld a, $1 + ld [wSpriteUpdatesEnabled], a + farcall ReplaceTimeOfDayPals + farcall UpdateTimeOfDayPal + call OverworldTextModeSwitch + call .ClearBGMap + call .PushAttrmap + ret + +.ClearBGMap: + ld a, HIGH(vBGMap0) + ld [wBGMapAnchor + 1], a + xor a ; LOW(vBGMap0) + ld [wBGMapAnchor], a + ldh [hSCY], a + ldh [hSCX], a + farcall ApplyBGMapAnchorToObjects + + ld a, "■" + ld bc, vBGMap1 - vBGMap0 + hlbgcoord 0, 0 + call ByteFill + ret + +.PushAttrmap: + decoord 0, 0 + call .copy + ldh a, [hCGB] + and a + ret z + + decoord 0, 0, wAttrmap + ld a, $1 + ldh [rVBK], a +.copy + hlbgcoord 0, 0 + ld c, SCREEN_WIDTH + ld b, SCREEN_HEIGHT +.row + push bc +.column + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .column + ld bc, BG_MAP_WIDTH - SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .row + ld a, $0 + ldh [rVBK], a + ret + +LoadMapGraphics:: + call LoadMapTileset + call LoadTilesetGFX + xor a + ldh [hMapAnims], a + xor a + ldh [hTileAnimFrame], a + farcall RefreshSprites + call LoadFontsExtra + ret + +LoadMapPalettes:: + ld b, $9 + jp GetSGBLayout + +RefreshMapSprites:: + call ClearSprites + call ResetBGWindow + call GetMovementPermissions + farcall RefreshPlayerSprite + farcall CheckReplaceChrisSprite + ld hl, wPlayerSpriteSetupFlags + bit PLAYERSPRITESETUP_SKIP_RELOAD_GFX_F, [hl] + jr nz, .skip + ld hl, wVramState + set 0, [hl] + call SafeUpdateSprites +.skip + xor a + ld [wPlayerSpriteSetupFlags], a + ret + +CheckMovingOffEdgeOfMap:: + ld a, [wPlayerStepDirection] + cp STANDING + ret z + and a ; DOWN + jr z, .down + cp UP + jr z, .up + cp LEFT + jr z, .left + cp RIGHT + jr z, .right + and a + ret + +.down + ld a, [wPlayerStandingMapY] + sub 4 + ld b, a + ld a, [wMapHeight] + add a + cp b + jr z, .ok + and a + ret + +.up + ld a, [wPlayerStandingMapY] + sub 4 + cp -1 + jr z, .ok + and a + ret + +.left + ld a, [wPlayerStandingMapX] + sub 4 + cp -1 + jr z, .ok + and a + ret + +.right + ld a, [wPlayerStandingMapX] + sub 4 + ld b, a + ld a, [wMapWidth] + add a + cp b + jr z, .ok + and a + ret + +.ok + scf + ret + +EnterMapConnection:: +; Return carry if a connection has been entered. + ld a, [wPlayerStepDirection] + and a ; DOWN + jp z, .south + cp UP + jp z, .north + cp LEFT + jp z, .west + cp RIGHT + jp z, .east + ret + +.west + ld a, [wWestConnectedMapGroup] + ld [wMapGroup], a + ld a, [wWestConnectedMapNumber] + ld [wMapNumber], a + ld a, [wWestConnectionStripXOffset] + ld [wXCoord], a + ld a, [wWestConnectionStripYOffset] + ld hl, wYCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wWestConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + srl c + jr z, .skip_to_load + ld a, [wWestConnectedMapWidth] + add 6 + ld e, a + ld d, 0 + +.loop + add hl, de + dec c + jr nz, .loop + +.skip_to_load + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + jp .done + +.east + ld a, [wEastConnectedMapGroup] + ld [wMapGroup], a + ld a, [wEastConnectedMapNumber] + ld [wMapNumber], a + ld a, [wEastConnectionStripXOffset] + ld [wXCoord], a + ld a, [wEastConnectionStripYOffset] + ld hl, wYCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wEastConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + srl c + jr z, .skip_to_load2 + ld a, [wEastConnectedMapWidth] + add 6 + ld e, a + ld d, 0 + +.loop2 + add hl, de + dec c + jr nz, .loop2 + +.skip_to_load2 + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + jp .done + +.north + ld a, [wNorthConnectedMapGroup] + ld [wMapGroup], a + ld a, [wNorthConnectedMapNumber] + ld [wMapNumber], a + ld a, [wNorthConnectionStripYOffset] + ld [wYCoord], a + ld a, [wNorthConnectionStripXOffset] + ld hl, wXCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wNorthConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + ld b, 0 + srl c + add hl, bc + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a + jp .done + +.south + ld a, [wSouthConnectedMapGroup] + ld [wMapGroup], a + ld a, [wSouthConnectedMapNumber] + ld [wMapNumber], a + ld a, [wSouthConnectionStripYOffset] + ld [wYCoord], a + ld a, [wSouthConnectionStripXOffset] + ld hl, wXCoord + add [hl] + ld [hl], a + ld c, a + ld hl, wSouthConnectionWindow + ld a, [hli] + ld h, [hl] + ld l, a + ld b, 0 + srl c + add hl, bc + ld a, l + ld [wOverworldMapAnchor], a + ld a, h + ld [wOverworldMapAnchor + 1], a +.done + scf + ret + +CheckWarpTile:: + call GetDestinationWarpNumber + ret nc + + push bc + farcall CheckDirectionalWarp + pop bc + ret nc + + call CopyWarpData + scf + ret + +WarpCheck:: + call GetDestinationWarpNumber + ret nc + call CopyWarpData + ret + +GetDestinationWarpNumber:: + farcall CheckWarpCollision + ret nc + + ldh a, [hROMBank] + push af + + call SwitchToMapScriptsBank + call .GetDestinationWarpNumber + + pop de + ld a, d + rst Bankswitch + ret + +.GetDestinationWarpNumber: + ld a, [wPlayerStandingMapY] + sub 4 + ld e, a + ld a, [wPlayerStandingMapX] + sub 4 + ld d, a + ld a, [wCurMapWarpCount] + and a + ret z + + ld c, a + ld hl, wCurMapWarpsPointer + ld a, [hli] + ld h, [hl] + ld l, a +.loop + push hl + ld a, [hli] + cp e + jr nz, .next + ld a, [hli] + cp d + jr nz, .next + jr .found_warp + +.next + pop hl + ld a, WARP_EVENT_SIZE + add l + ld l, a + jr nc, .okay + inc h + +.okay + dec c + jr nz, .loop + xor a + ret + +.found_warp + pop hl + call .IncreaseHLTwice + ret nc ; never encountered + + ld a, [wCurMapWarpCount] + inc a + sub c + ld c, a + scf + ret + +.IncreaseHLTwice: + inc hl + inc hl + scf + ret + +CopyWarpData:: + ldh a, [hROMBank] + push af + + call SwitchToMapScriptsBank + call .CopyWarpData + + pop af + rst Bankswitch + scf + ret + +.CopyWarpData: + push bc + ld hl, wCurMapWarpsPointer + ld a, [hli] + ld h, [hl] + ld l, a + ld a, c + dec a + ld bc, WARP_EVENT_SIZE + call AddNTimes + ld bc, 2 ; warp number + add hl, bc + ld a, [hli] + cp -1 + jr nz, .skip + ld hl, wBackupWarpNumber + ld a, [hli] + +.skip + pop bc + ld [wNextWarp], a + ld a, [hli] + ld [wNextMapGroup], a + ld a, [hli] + ld [wNextMapNumber], a + + ld a, c + ld [wPrevWarp], a + ld a, [wMapGroup] + ld [wPrevMapGroup], a + ld a, [wMapNumber] + ld [wPrevMapNumber], a + scf + ret + +EnterMapWarp:: + call .SaveDigWarp + call .SetSpawn + ld a, [wNextWarp] + ld [wWarpNumber], a + ld a, [wNextMapGroup] + ld [wMapGroup], a + ld a, [wNextMapNumber] + ld [wMapNumber], a + ret + +.SaveDigWarp:: + call GetMapEnvironment + call CheckOutdoorMap + ret nz + ld a, [wNextMapGroup] + ld b, a + ld a, [wNextMapNumber] + ld c, a + call GetAnyMapEnvironment + call CheckIndoorMap + ret nz + +; MOUNT_MOON_SQUARE and TIN_TOWER_ROOF are outdoor maps within indoor maps. +; Dig and Escape Rope should not take you to them. + ld a, [wPrevMapGroup] + cp GROUP_MOUNT_MOON_SQUARE ; aka GROUP_TIN_TOWER_ROOF + jr nz, .not_mt_moon_or_tin_tower + ld a, [wPrevMapNumber] + cp MAP_MOUNT_MOON_SQUARE + ret z + cp MAP_TIN_TOWER_ROOF + ret z +.not_mt_moon_or_tin_tower + + ld a, [wPrevWarp] + ld [wDigWarpNumber], a + ld a, [wPrevMapGroup] + ld [wDigMapGroup], a + ld a, [wPrevMapNumber] + ld [wDigMapNumber], a + ret + +.SetSpawn: + call GetMapEnvironment + call CheckOutdoorMap + ret nz + ld a, [wNextMapGroup] + ld b, a + ld a, [wNextMapNumber] + ld c, a + call GetAnyMapEnvironment + call CheckIndoorMap + ret nz + ld a, [wNextMapGroup] + ld b, a + ld a, [wNextMapNumber] + ld c, a + +; Respawn in Pokémon Centers. + call GetAnyMapTileset + ld a, c + cp TILESET_POKECENTER + ret nz + +.pokecenter + ld a, [wPrevMapGroup] + ld [wLastSpawnMapGroup], a + ld a, [wPrevMapNumber] + ld [wLastSpawnMapNumber], a + ret diff --git a/home/window.asm b/home/window.asm index 9dda3479..41893a98 100644 --- a/home/window.asm +++ b/home/window.asm @@ -36,7 +36,7 @@ CloseText:: call SafeUpdateSprites ld a, $90 ldh [hWY], a - farcall _RefreshSprites + farcall _ClearSprites call ReplaceChrisSprite ld hl, wEnteredMapFromContinue res 7, [hl] @@ -62,10 +62,10 @@ OpenText:: _OpenAndCloseMenu_HDMATransferTilemapAndAttrmap:: ldh a, [hOAMUpdate] push af - ld a, 1 + ld a, $1 ldh [hOAMUpdate], a - call OpenAndCloseMenu_HDMATransferTilemapAndAttrmap + call CGBOnly_CopyTilemapAtOnce pop af ldh [hOAMUpdate], a |