summaryrefslogtreecommitdiff
path: root/home/warp_connection.asm
diff options
context:
space:
mode:
Diffstat (limited to 'home/warp_connection.asm')
-rw-r--r--home/warp_connection.asm506
1 files changed, 506 insertions, 0 deletions
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