summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
Diffstat (limited to 'home')
-rw-r--r--home/audio.asm1
-rw-r--r--home/copy.asm1
-rw-r--r--home/init.asm4
-rw-r--r--home/map.asm513
-rw-r--r--home/palettes.asm14
-rwxr-xr-xhome/pokemon.asm1
-rw-r--r--home/serial.asm12
-rw-r--r--home/text.asm5
-rwxr-xr-xhome/tilemap.asm4
-rw-r--r--home/vblank.asm2
-rw-r--r--home/warp_connection.asm506
-rw-r--r--home/window.asm6
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