summaryrefslogtreecommitdiff
path: root/home/map.asm
diff options
context:
space:
mode:
authorPikalaxALT <PikalaxALT@gmail.com>2016-01-29 18:36:31 -0500
committerPikalaxALT <PikalaxALT@gmail.com>2016-01-29 18:36:31 -0500
commit2bf93c5905319e9181f87b3f83cd3bce7b9feeca (patch)
tree3ebf17c8879e5d6243d81aac8f1c36eb226fac26 /home/map.asm
parented3f9395f6d45f6554ed9d9c49c41ea86a8e2447 (diff)
Import stuff from pokecrystal; diff gold and silver
Diffstat (limited to 'home/map.asm')
-rw-r--r--home/map.asm2385
1 files changed, 2385 insertions, 0 deletions
diff --git a/home/map.asm b/home/map.asm
new file mode 100644
index 00000000..c51f9c48
--- /dev/null
+++ b/home/map.asm
@@ -0,0 +1,2385 @@
+; Functions dealing with rendering and interacting with maps.
+
+Clearwc7e8:: ; 210f
+ ld hl, wc7e8
+ ld bc, 24
+ ld a, $0
+ call ByteFill
+ ret
+; 211b
+
+CheckTriggers:: ; 211b
+; Checks wCurrentMapTriggerPointer. If it's empty, returns -1 in a. Otherwise, returns the active trigger ID in a.
+ push hl
+ ld hl, wCurrentMapTriggerPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ or h
+ ld a, [hl]
+ jr nz, .triggerexists
+ ld a, -1
+
+.triggerexists
+ pop hl
+ ret
+; 212a
+
+GetCurrentMapTrigger:: ; 212a
+; Grabs the wram map trigger pointer for the current map and loads it into wCurrentMapTriggerPointer.
+; If there are no triggers, both bytes of wCurrentMapTriggerPointer are wiped clean.
+; Copy the current map group and number into bc. This is needed for GetMapTrigger.
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+; Blank out wCurrentMapTriggerPointer; this is the default scenario.
+ xor a
+ ld [wCurrentMapTriggerPointer], a
+ ld [wCurrentMapTriggerPointer + 1], a
+ call GetMapTrigger
+ ret c ; The map is not in the trigger table
+; Load the trigger table pointer from de into wCurrentMapTriggerPointer
+ ld a, e
+ ld [wCurrentMapTriggerPointer], a
+ ld a, d
+ ld [wCurrentMapTriggerPointer + 1], a
+ xor a
+ ret
+; 2147
+
+GetMapTrigger:: ; 2147
+; Searches the trigger table for the map group and number loaded in bc, and returns the wram pointer in de.
+; If the map is not in the trigger table, returns carry.
+ push bc
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(MapTriggers)
+ rst Bankswitch
+
+ ld hl, MapTriggers
+.loop
+ push hl
+ ld a, [hli] ; map group, or terminator
+ cp -1
+ jr z, .end ; the current map is not in the trigger table
+ cp b
+ jr nz, .next ; map group did not match
+ ld a, [hli] ; map number
+ cp c
+ jr nz, .next ; map number did not match
+ jr .found ; we found our map
+
+.next
+ pop hl
+ ld de, 4 ; size of an entry in the trigger table
+ add hl, de
+ jr .loop
+
+.end
+ scf
+ jr .done
+
+.found
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+
+.done
+ pop hl
+ pop bc
+ ld a, b
+ rst Bankswitch
+
+ pop bc
+ ret
+; 2173
+
+OverworldTextModeSwitch:: ; 2173
+ call LoadMapPart
+ call FarCallSwapTextboxPalettes
+ ret
+; 217a
+
+LoadMapPart:: ; 217a
+ ld a, [hROMBank]
+ push af
+
+ ld a, [TilesetBlocksBank]
+ rst Bankswitch
+
+ call LoadMetatiles
+ ld a, $60
+ hlcoord 0, 0
+ ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
+ call ByteFill
+
+ ld a, BANK(_LoadMapPart)
+ rst Bankswitch
+ call _LoadMapPart
+
+ pop af
+ rst Bankswitch
+ ret
+; 2198
+
+LoadMetatiles:: ; 2198
+ ; de <- wOverworldMapAnchor
+ ld a, [wOverworldMapAnchor]
+ ld e, a
+ ld a, [wOverworldMapAnchor + 1]
+ ld d, a
+ ld hl, wMisc
+ ld b, WMISC_HEIGHT / 4 ; 5
+
+.row
+ push de
+ push hl
+ ld c, WMISC_WIDTH / 4 ; 6
+
+.col
+ push de
+ push hl
+ ; Load the current map block.
+ ; If the current map block is a border block, load the border block.
+ ld a, [de]
+ and a
+ jr nz, .ok
+ ld a, [MapBorderBlock]
+
+.ok
+ ; Load the current wMisc address into de.
+ ld e, l
+ ld d, h
+ ; Set hl to the address of the current metatile data ([TilesetBlocksAddress] + (a) tiles).
+ add a
+ ld l, a
+ ld h, 0
+rept 3
+ add hl, hl
+endr
+ ld a, [TilesetBlocksAddress]
+ add l
+ ld l, a
+ ld a, [TilesetBlocksAddress + 1]
+ adc h
+ ld h, a
+
+ ; copy the 4x4 metatile
+rept 3
+rept 4
+ ld a, [hli]
+ ld [de], a
+ inc de
+endr
+ ld a, e
+ add WMISC_WIDTH - 4
+ ld e, a
+ jr nc, .next\@
+ inc d
+.next\@
+endr
+rept 4
+ ld a, [hli]
+ ld [de], a
+ inc de
+endr
+ ; Next metatile
+ pop hl
+ ld de, 4
+ add hl, de
+ pop de
+ inc de
+ dec c
+ jp nz, .col
+ ; Next metarow
+ pop hl
+ ld de, WMISC_WIDTH * 4
+ add hl, de
+ pop de
+ ld a, [MapWidth]
+ add 6
+ add e
+ ld e, a
+ jr nc, .ok2
+ inc d
+.ok2
+ dec b
+ jp nz, .row
+ ret
+; 222a
+
+ReturnToMapFromSubmenu:: ; 222a
+ ld a, MAPSETUP_SUBMENU
+ ld [hMapEntryMethod], a
+ callba RunMapSetupScript
+ xor a
+ ld [hMapEntryMethod], a
+ ret
+; 2238
+
+CheckWarpTile:: ; 2238
+ call GetDestinationWarpNumber
+ ret nc
+
+ push bc
+ callba CheckDirectionalWarp
+ pop bc
+ ret nc
+
+ call CopyWarpData
+ scf
+ ret
+; 224a
+
+WarpCheck:: ; 224a
+ call GetDestinationWarpNumber
+ ret nc
+ call CopyWarpData
+ ret
+; 2252
+
+GetDestinationWarpNumber:: ; 2252
+ callba CheckWarpCollision
+ ret nc
+
+ ld a, [hROMBank]
+ push af
+
+ call SwitchToMapScriptHeaderBank
+ call .GetDestinationWarpNumber
+
+ pop de
+ ld a, d
+ rst Bankswitch
+ ret
+; 2266
+
+.GetDestinationWarpNumber ; 2266
+ ld a, [PlayerStandingMapY]
+ sub $4
+ ld e, a
+ ld a, [PlayerStandingMapX]
+ sub $4
+ ld d, a
+ ld a, [wCurrMapWarpCount]
+ and a
+ ret z
+
+ ld c, a
+ ld hl, wCurrMapWarpHeaderPointer
+ 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, 5
+ 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, [wCurrMapWarpCount]
+ inc a
+ sub c
+ ld c, a
+ scf
+ ret
+
+.IncreaseHLTwice
+ inc hl
+ inc hl
+ scf
+ ret
+; 22a7
+
+CopyWarpData:: ; 22a7
+ ld a, [hROMBank]
+ push af
+
+ call SwitchToMapScriptHeaderBank
+ call .CopyWarpData
+
+ pop af
+ rst Bankswitch
+ scf
+ ret
+; 22b4
+
+.CopyWarpData ; 22b4
+ push bc
+ ld hl, wCurrMapWarpHeaderPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, c
+ dec a
+ ld bc, 5 ; warp size
+ call AddNTimes
+ ld bc, 2 ; warp number
+ add hl, bc
+ ld a, [hli]
+ cp $ff
+ jr nz, .skip
+ ld hl, BackupWarpNumber
+ 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, [MapGroup]
+ ld [wPrevMapGroup], a
+ ld a, [MapNumber]
+ ld [wPrevMapNumber], a
+ scf
+ ret
+; 22ee
+
+CheckOutdoorMap:: ; 22ee
+ cp ROUTE
+ ret z
+ cp TOWN
+ ret
+; 22f4
+
+CheckIndoorMap:: ; 22f4
+ cp INDOOR
+ ret z
+ cp CAVE
+ ret z
+ cp DUNGEON
+ ret z
+ cp GATE
+ ret
+; 2300
+
+; XXX
+ cp INDOOR
+ ret z
+ cp GATE
+ ret z
+ cp PERM_5
+ ret
+; 2309
+
+LoadMapAttributes:: ; 2309
+ call CopyMapHeaders
+ call SwitchToMapScriptHeaderBank
+ call ReadMapScripts
+ xor a
+ call ReadMapEventHeader
+ ret
+; 2317
+
+LoadMapAttributes_SkipPeople:: ; 2317
+ call CopyMapHeaders
+ call SwitchToMapScriptHeaderBank
+ call ReadMapScripts
+ ld a, $1
+ call ReadMapEventHeader
+ ret
+; 2326
+
+CopyMapHeaders:: ; 2326
+ call PartiallyCopyMapHeader
+ call SwitchToMapBank
+ call GetSecondaryMapHeaderPointer
+ call CopySecondMapHeader
+ call GetMapConnections
+ ret
+; 2336
+
+ReadMapEventHeader:: ; 2336
+ push af
+ ld hl, MapEventHeaderPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+ inc hl
+ call ReadWarps
+ call ReadCoordEvents
+ call ReadSignposts
+
+ pop af
+ and a
+ ret nz
+
+ call ReadObjectEvents
+ ret
+; 234f
+
+ReadMapScripts:: ; 234f
+ ld hl, MapScriptHeaderPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call ReadMapTriggers
+ call ReadMapCallbacks
+ ret
+; 235c
+
+CopySecondMapHeader:: ; 235c
+ ld de, MapHeader
+ ld c, 12 ; size of the second map header
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ ret
+; 2368
+
+GetMapConnections:: ; 2368
+ ld a, $ff
+ ld [NorthConnectedMapGroup], a
+ ld [SouthConnectedMapGroup], a
+ ld [WestConnectedMapGroup], a
+ ld [EastConnectedMapGroup], a
+
+ ld a, [MapConnections]
+ ld b, a
+
+ bit NORTH_F, b
+ jr z, .no_north
+ ld de, NorthMapConnection
+ call GetMapConnection
+.no_north
+
+ bit SOUTH_F, b
+ jr z, .no_south
+ ld de, SouthMapConnection
+ call GetMapConnection
+.no_south
+
+ bit WEST_F, b
+ jr z, .no_west
+ ld de, WestMapConnection
+ call GetMapConnection
+.no_west
+
+ bit EAST_F, b
+ jr z, .no_east
+ ld de, EastMapConnection
+ call GetMapConnection
+.no_east
+
+ ret
+; 23a3
+
+GetMapConnection:: ; 23a3
+; Load map connection struct at hl into de.
+ ld c, SouthMapConnection - NorthMapConnection
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ ret
+; 23ac
+
+ReadMapTriggers:: ; 23ac
+ ld a, [hli] ; trigger count
+ ld c, a
+ ld [wCurrMapTriggerCount], a ; current map trigger count
+ ld a, l
+ ld [wCurrMapTriggerHeaderPointer], a ; map trigger pointer
+ ld a, h
+ ld [wCurrMapTriggerHeaderPointer + 1], a
+ ld a, c
+ and a
+ ret z
+
+ ld bc, 4 ; size of a map trigger header entry
+ call AddNTimes
+ ret
+; 23c3
+
+ReadMapCallbacks:: ; 23c3
+ ld a, [hli]
+ ld c, a
+ ld [wCurrMapCallbackCount], a
+ ld a, l
+ ld [wCurrMapCallbackHeaderPointer], a
+ ld a, h
+ ld [wCurrMapCallbackHeaderPointer + 1], a
+ ld a, c
+ and a
+ ret z
+
+ ld bc, 3
+ call AddNTimes
+ ret
+; 23da
+
+ReadWarps:: ; 23da
+ ld a, [hli]
+ ld c, a
+ ld [wCurrMapWarpCount], a
+ ld a, l
+ ld [wCurrMapWarpHeaderPointer], a
+ ld a, h
+ ld [wCurrMapWarpHeaderPointer + 1], a
+ ld a, c
+ and a
+ ret z
+ ld bc, 5
+ call AddNTimes
+ ret
+; 23f1
+
+ReadCoordEvents:: ; 23f1
+ ld a, [hli]
+ ld c, a
+ ld [wCurrentMapXYTriggerCount], a
+ ld a, l
+ ld [wCurrentMapXYTriggerHeaderPointer], a
+ ld a, h
+ ld [wCurrentMapXYTriggerHeaderPointer + 1], a
+
+ ld a, c
+ and a
+ ret z
+
+ ld bc, 8
+ call AddNTimes
+ ret
+; 2408
+
+ReadSignposts:: ; 2408
+ ld a, [hli]
+ ld c, a
+ ld [wCurrentMapSignpostCount], a
+ ld a, l
+ ld [wCurrentMapSignpostHeaderPointer], a
+ ld a, h
+ ld [wCurrentMapSignpostHeaderPointer + 1], a
+
+ ld a, c
+ and a
+ ret z
+
+ ld bc, 5
+ call AddNTimes
+ ret
+; 241f
+
+ReadObjectEvents:: ; 241f
+ push hl
+ call ClearObjectStructs
+ pop de
+ ld hl, Map1Object
+ ld a, [de]
+ inc de
+ ld [wCurrentMapPersonEventCount], a
+ ld a, e
+ ld [wCurrentMapPersonEventHeaderPointer], a
+ ld a, d
+ ld [wCurrentMapPersonEventHeaderPointer + 1], a
+
+ ld a, [wCurrentMapPersonEventCount]
+ call CopyMapObjectHeaders
+
+; get NUM_OBJECTS - [wCurrentMapPersonEventCount]
+ ld a, [wCurrentMapPersonEventCount]
+ ld c, a
+ ld a, NUM_OBJECTS ; - 1
+ sub c
+ jr z, .skip
+ ; jr c, .skip
+
+; stupid waste of time and space
+ ld bc, 1
+ add hl, bc
+; Fill the remaining sprite IDs and y coords with 0 and -1, respectively.
+; Bleeds into wObjectMasks due to a bug. Uncomment the above subtraction
+; to fix.
+ ld bc, OBJECT_LENGTH
+.loop
+ ld [hl], 0
+ inc hl
+ ld [hl], -1
+ dec hl
+ add hl, bc
+ dec a
+ jr nz, .loop
+
+.skip
+ ld h, d
+ ld l, e
+ ret
+; 2457
+
+CopyMapObjectHeaders:: ; 2457
+ and a
+ ret z
+
+ ld c, a
+.loop
+ push bc
+ push hl
+ ld a, $ff
+ ld [hli], a
+ ld b, MAPOBJECT_E - MAPOBJECT_SPRITE
+.loop2
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec b
+ jr nz, .loop2
+
+ pop hl
+ ld bc, OBJECT_LENGTH
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .loop
+ ret
+; 2471
+
+ClearObjectStructs:: ; 2471
+ ld hl, Object1Struct
+ ld bc, OBJECT_STRUCT_LENGTH * (NUM_OBJECT_STRUCTS - 1)
+ xor a
+ call ByteFill
+
+; Just to make sure (this is rather pointless)
+ ld hl, Object1Struct
+ ld de, OBJECT_STRUCT_LENGTH
+ ld c, NUM_OBJECT_STRUCTS - 1
+ xor a
+.loop
+ ld [hl], a
+ add hl, de
+ dec c
+ jr nz, .loop
+ ret
+; 248a
+
+RestoreFacingAfterWarp:: ; 248a
+ call GetMapScriptHeaderBank
+ rst Bankswitch
+
+ ld hl, MapEventHeaderPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+rept 3
+ inc hl ; get to the warp coords
+endr
+ ld a, [WarpNumber]
+ dec a
+ ld c, a
+ ld b, 0
+ ld a, 5
+ call AddNTimes
+ ld a, [hli]
+ ld [YCoord], a
+ ld a, [hli]
+ ld [XCoord], a
+ ; destination warp number
+ ld a, [hli]
+ cp $ff
+ jr nz, .skip
+ call .backup
+
+.skip
+ callba GetCoordOfUpperLeftCorner
+ ret
+; 24ba
+
+.backup
+ ld a, [wPrevWarp]
+ ld [BackupWarpNumber], a
+ ld a, [wPrevMapGroup]
+ ld [BackupMapGroup], a
+ ld a, [wPrevMapNumber]
+ ld [BackupMapNumber], a
+ ret
+; 24cd
+
+LoadBlockData:: ; 24cd
+ ld hl, OverworldMap
+ ld bc, OverworldMapEnd - OverworldMap
+ ld a, 0
+ call ByteFill
+ call ChangeMap
+ call FillMapConnections
+ ld a, MAPCALLBACK_TILES
+ call RunMapCallback
+ ret
+; 24e4
+
+ChangeMap:: ; 24e4
+ ld a, [hROMBank]
+ push af
+
+ ld hl, OverworldMap
+ ld a, [MapWidth]
+ ld [hConnectedMapWidth], a
+ add $6
+ ld [hConnectionStripLength], a
+ ld c, a
+ ld b, 0
+rept 3
+ add hl, bc
+endr
+ ld c, 3
+ add hl, bc
+ ld a, [MapBlockDataBank]
+ rst Bankswitch
+
+ ld a, [MapBlockDataPointer]
+ ld e, a
+ ld a, [MapBlockDataPointer+1]
+ ld d, a
+ ld a, [MapHeight]
+ ld b, a
+.row
+ push hl
+ ld a, [hConnectedMapWidth]
+ ld c, a
+.col
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .col
+ pop hl
+ ld a, [hConnectionStripLength]
+ add l
+ ld l, a
+ jr nc, .okay
+ inc h
+.okay
+ dec b
+ jr nz, .row
+
+ pop af
+ rst Bankswitch
+ ret
+; 2524
+
+FillMapConnections:: ; 2524
+
+; North
+ ld a, [NorthConnectedMapGroup]
+ cp $ff
+ jr z, .South
+ ld b, a
+ ld a, [NorthConnectedMapNumber]
+ ld c, a
+ call GetAnyMapBlockdataBank
+
+ ld a, [NorthConnectionStripPointer]
+ ld l, a
+ ld a, [NorthConnectionStripPointer + 1]
+ ld h, a
+ ld a, [NorthConnectionStripLocation]
+ ld e, a
+ ld a, [NorthConnectionStripLocation + 1]
+ ld d, a
+ ld a, [NorthConnectionStripLength]
+ ld [hConnectionStripLength], a
+ ld a, [NorthConnectedMapWidth]
+ ld [hConnectedMapWidth], a
+ call FillNorthConnectionStrip
+
+.South
+ ld a, [SouthConnectedMapGroup]
+ cp $ff
+ jr z, .West
+ ld b, a
+ ld a, [SouthConnectedMapNumber]
+ ld c, a
+ call GetAnyMapBlockdataBank
+
+ ld a, [SouthConnectionStripPointer]
+ ld l, a
+ ld a, [SouthConnectionStripPointer + 1]
+ ld h, a
+ ld a, [SouthConnectionStripLocation]
+ ld e, a
+ ld a, [SouthConnectionStripLocation + 1]
+ ld d, a
+ ld a, [SouthConnectionStripLength]
+ ld [hConnectionStripLength], a
+ ld a, [SouthConnectedMapWidth]
+ ld [hConnectedMapWidth], a
+ call FillSouthConnectionStrip
+
+.West
+ ld a, [WestConnectedMapGroup]
+ cp $ff
+ jr z, .East
+ ld b, a
+ ld a, [WestConnectedMapNumber]
+ ld c, a
+ call GetAnyMapBlockdataBank
+
+ ld a, [WestConnectionStripPointer]
+ ld l, a
+ ld a, [WestConnectionStripPointer + 1]
+ ld h, a
+ ld a, [WestConnectionStripLocation]
+ ld e, a
+ ld a, [WestConnectionStripLocation + 1]
+ ld d, a
+ ld a, [WestConnectionStripLength]
+ ld b, a
+ ld a, [WestConnectedMapWidth]
+ ld [hConnectionStripLength], a
+ call FillWestConnectionStrip
+
+.East
+ ld a, [EastConnectedMapGroup]
+ cp $ff
+ jr z, .Done
+ ld b, a
+ ld a, [EastConnectedMapNumber]
+ ld c, a
+ call GetAnyMapBlockdataBank
+
+ ld a, [EastConnectionStripPointer]
+ ld l, a
+ ld a, [EastConnectionStripPointer + 1]
+ ld h, a
+ ld a, [EastConnectionStripLocation]
+ ld e, a
+ ld a, [EastConnectionStripLocation + 1]
+ ld d, a
+ ld a, [EastConnectionStripLength]
+ ld b, a
+ ld a, [EastConnectedMapWidth]
+ ld [hConnectionStripLength], a
+ call FillEastConnectionStrip
+
+.Done
+ ret
+; 25d3
+
+FillNorthConnectionStrip::
+FillSouthConnectionStrip:: ; 25d3
+
+ ld c, 3
+.y
+ push de
+
+ push hl
+ ld a, [hConnectionStripLength]
+ ld b, a
+.x
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .x
+ pop hl
+
+ ld a, [hConnectedMapWidth]
+ ld e, a
+ ld d, 0
+ add hl, de
+ pop de
+
+ ld a, [MapWidth]
+ add 6
+ add e
+ ld e, a
+ jr nc, .okay
+ inc d
+.okay
+ dec c
+ jr nz, .y
+ ret
+; 25f6
+
+FillWestConnectionStrip::
+FillEastConnectionStrip:: ; 25f6
+
+.loop
+ ld a, [MapWidth]
+ add 6
+ ld [hConnectedMapWidth], a
+
+ push de
+
+ push hl
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ inc de
+ pop hl
+
+ ld a, [hConnectionStripLength]
+ ld e, a
+ ld d, 0
+ add hl, de
+ pop de
+
+ ld a, [hConnectedMapWidth]
+ add e
+ ld e, a
+ jr nc, .okay
+ inc d
+.okay
+ dec b
+ jr nz, .loop
+ ret
+; 261b
+
+LoadMapStatus:: ; 261b
+ ld [MapStatus], a
+ ret
+; 261f
+
+CallScript:: ; 261f
+; Call a script at a:hl.
+
+ ld [ScriptBank], a
+ ld a, l
+ ld [ScriptPos], a
+ ld a, h
+ ld [ScriptPos + 1], a
+
+ ld a, PLAYEREVENT_MAPSCRIPT
+ ld [ScriptRunning], a
+
+ scf
+ ret
+; 2631
+
+CallMapScript:: ; 2631
+; Call a script at hl in the current bank if there isn't already a script running
+ ld a, [ScriptRunning]
+ and a
+ ret nz
+ call GetMapScriptHeaderBank
+ jr CallScript
+; 263b
+
+RunMapCallback:: ; 263b
+; Will run the first callback found in the map header with execution index equal to a.
+ ld b, a
+ ld a, [hROMBank]
+ push af
+ call SwitchToMapScriptHeaderBank
+ call .FindCallback
+ jr nc, .done
+
+ call GetMapScriptHeaderBank
+ ld b, a
+ ld d, h
+ ld e, l
+ call ExecuteCallbackScript
+
+.done
+ pop af
+ rst Bankswitch
+ ret
+; 2653
+
+.FindCallback: ; 2653
+ ld a, [wCurrMapCallbackCount]
+ ld c, a
+ and a
+ ret z
+ ld hl, wCurrMapCallbackHeaderPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ or h
+ ret z
+ ld de, 3
+.loop
+ ld a, [hl]
+ cp b
+ jr z, .found
+ add hl, de
+ dec c
+ jr nz, .loop
+ xor a
+ ret
+
+.found
+ inc hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ scf
+ ret
+; 2674
+
+ExecuteCallbackScript:: ; 2674
+; Do map callback de and return to script bank b.
+ callba CallCallback
+ ld a, [ScriptMode]
+ push af
+ ld hl, ScriptFlags
+ ld a, [hl]
+ push af
+ set 1, [hl]
+ callba EnableScriptMode
+ callba ScriptEvents
+ pop af
+ ld [ScriptFlags], a
+ pop af
+ ld [ScriptMode], a
+ ret
+; 269a
+
+MapTextbox:: ; 269a
+ ld a, [hROMBank]
+ push af
+
+ ld a, b
+ rst Bankswitch
+
+ push hl
+ call SpeechTextBox
+ call Function2e31
+ ld a, 1
+ ld [hOAMUpdate], a
+ call ApplyTilemap
+ pop hl
+ call PrintTextBoxText
+ xor a
+ ld [hOAMUpdate], a
+
+ pop af
+ rst Bankswitch
+ ret
+; 26b7
+
+Call_a_de:: ; 26b7
+; Call a:de.
+
+ ld [hBuffer], a
+ ld a, [hROMBank]
+ push af
+ ld a, [hBuffer]
+ rst Bankswitch
+
+ call .de
+
+ pop af
+ rst Bankswitch
+ ret
+
+.de
+ push de
+ ret
+; 26c7
+
+GetMovementData:: ; 26c7
+; Initialize the movement data for person c at b:hl
+ ld a, [hROMBank]
+ push af
+ ld a, b
+ rst Bankswitch
+
+ ld a, c
+ call LoadMovementDataPointer
+
+ pop hl
+ ld a, h
+ rst Bankswitch
+ ret
+; 26d4
+
+GetScriptByte:: ; 0x26d4
+; Return byte at ScriptBank:ScriptPos in a.
+
+ push hl
+ push bc
+ ld a, [hROMBank]
+ push af
+ ld a, [ScriptBank]
+ rst Bankswitch
+
+ ld hl, ScriptPos
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+
+ ld a, [bc]
+
+ inc bc
+ ld [hl], b
+ dec hl
+ ld [hl], c
+
+ ld b, a
+ pop af
+ rst Bankswitch
+ ld a, b
+ pop bc
+ pop hl
+ ret
+; 0x26ef
+
+ObjectEvent:: ; 0x26ef
+ jumptextfaceplayer ObjectEventText
+; 0x26f2
+
+ObjectEventText::
+ text_jump _ObjectEventText
+ db "@"
+; 0x26f7
+
+BGEvent:: ; 26f7
+ jumptext BGEventText
+; 26fa
+
+BGEventText:: ; 26fa
+ text_jump UnknownText_0x1c46fc
+ db "@"
+; 26ff
+
+CoordinatesEvent:: ; 26ff
+ jumptext CoordinatesEventText
+; 2702
+
+CoordinatesEventText:: ; 2702
+ text_jump UnknownText_0x1c4706
+ db "@"
+; 2707
+
+CheckObjectMask:: ; 2707
+ ld a, [hMapObjectIndexBuffer]
+ ld e, a
+ ld d, $0
+ ld hl, wObjectMasks
+ add hl, de
+ ld a, [hl]
+ ret
+; 2712
+
+MaskObject:: ; 2712
+ ld a, [hMapObjectIndexBuffer]
+ ld e, a
+ ld d, $0
+ ld hl, wObjectMasks
+ add hl, de
+ ld [hl], -1 ; , masked
+ ret
+; 271e
+
+UnmaskObject:: ; 271e
+ ld a, [hMapObjectIndexBuffer]
+ ld e, a
+ ld d, $0
+ ld hl, wObjectMasks
+ add hl, de
+ ld [hl], 0 ; unmasked
+ ret
+; 272a
+
+ScrollMapDown:: ; 272a
+ hlcoord 0, 0
+ ld de, BGMapBuffer
+ call BackupBGMapRow
+ ld c, 2 * SCREEN_WIDTH
+ call FarCallScrollBGMapPalettes
+ ld a, [wBGMapAnchor]
+ ld e, a
+ ld a, [wBGMapAnchor + 1]
+ ld d, a
+ call UpdateBGMapRow
+ ld a, $1
+ ld [hBGMapUpdate], a
+ ret
+; 2748
+
+ScrollMapUp:: ; 2748
+ hlcoord 0, SCREEN_HEIGHT - 2
+ ld de, BGMapBuffer
+ call BackupBGMapRow
+ ld c, 2 * SCREEN_WIDTH
+ call FarCallScrollBGMapPalettes
+ ld a, [wBGMapAnchor]
+ ld l, a
+ ld a, [wBGMapAnchor + 1]
+ ld h, a
+ ld bc, $0200
+ add hl, bc
+; cap d at VBGMap1 / $100
+ ld a, h
+ and %00000011
+ or VBGMap0 / $100
+ ld e, l
+ ld d, a
+ call UpdateBGMapRow
+ ld a, $1
+ ld [hBGMapUpdate], a
+ ret
+; 2771
+
+ScrollMapRight:: ; 2771
+ hlcoord 0, 0
+ ld de, BGMapBuffer
+ call BackupBGMapColumn
+ ld c, 2 * SCREEN_HEIGHT
+ call FarCallScrollBGMapPalettes
+ ld a, [wBGMapAnchor]
+ ld e, a
+ ld a, [wBGMapAnchor + 1]
+ ld d, a
+ call UpdateBGMapColumn
+ ld a, $1
+ ld [hBGMapUpdate], a
+ ret
+; 278f
+
+ScrollMapLeft:: ; 278f
+ hlcoord SCREEN_WIDTH - 2, 0
+ ld de, BGMapBuffer
+ call BackupBGMapColumn
+ ld c, 2 * SCREEN_HEIGHT
+ call FarCallScrollBGMapPalettes
+ ld a, [wBGMapAnchor]
+ ld e, a
+ and %11100000
+ ld b, a
+ ld a, e
+ add SCREEN_HEIGHT
+ and %00011111
+ or b
+ ld e, a
+ ld a, [wBGMapAnchor + 1]
+ ld d, a
+ call UpdateBGMapColumn
+ ld a, $1
+ ld [hBGMapUpdate], a
+ ret
+; 27b7
+
+BackupBGMapRow:: ; 27b7
+ ld c, 2 * SCREEN_WIDTH
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .loop
+ ret
+; 27c0
+
+BackupBGMapColumn:: ; 27c0
+ ld c, SCREEN_HEIGHT
+.loop
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+ inc de
+ ld a, SCREEN_WIDTH - 1
+ add l
+ ld l, a
+ jr nc, .skip
+ inc h
+
+.skip
+ dec c
+ jr nz, .loop
+ ret
+; 27d3
+
+UpdateBGMapRow:: ; 27d3
+ ld hl, BGMapBufferPtrs
+ push de
+ call .iteration
+ pop de
+ ld a, $20
+ add e
+ ld e, a
+
+.iteration
+ ld c, 10
+.loop
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ ld a, e
+ inc a
+ inc a
+ and $1f
+ ld b, a
+ ld a, e
+ and $e0
+ or b
+ ld e, a
+ dec c
+ jr nz, .loop
+ ld a, SCREEN_WIDTH
+ ld [hFFDC], a
+ ret
+; 27f8
+
+UpdateBGMapColumn:: ; 27f8
+ ld hl, BGMapBufferPtrs
+ ld c, SCREEN_HEIGHT
+.loop
+ ld a, e
+ ld [hli], a
+ ld a, d
+ ld [hli], a
+ ld a, $20
+ add e
+ ld e, a
+ jr nc, .skip
+ inc d
+; cap d at VBGMap1 / $100
+ ld a, d
+ and $3
+ or VBGMap0 / $100
+ ld d, a
+
+.skip
+ dec c
+ jr nz, .loop
+ ld a, SCREEN_HEIGHT
+ ld [hFFDC], a
+ ret
+; 2816
+
+; unreferenced
+ ld hl, BGMapBuffer
+ ld bc, SGBPredef - BGMapBuffer
+ xor a
+ call ByteFill
+ ret
+; 2821
+
+LoadTileset:: ; 2821
+ ld hl, TilesetAddress
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [TilesetBank]
+ ld e, a
+
+ ld a, [rSVBK]
+ push af
+ ld a, $6
+ ld [rSVBK], a
+
+ ld a, e
+ ld de, wDecompressScratch
+ call FarDecompress
+
+ ld hl, wDecompressScratch
+ ld de, VTiles2
+ ld bc, $60 tiles
+ call CopyBytes
+
+ ld a, [rVBK]
+ push af
+ ld a, $1
+ ld [rVBK], a
+
+ ld hl, w6_d600
+ ld de, VTiles2
+ ld bc, $60 tiles
+ call CopyBytes
+
+ pop af
+ ld [rVBK], a
+
+ pop af
+ ld [rSVBK], a
+
+ ld a, [wTileset]
+ cp TILESET_JOHTO_1
+ jr z, .load_roof
+ cp TILESET_JOHTO_2
+ jr z, .load_roof
+ cp TILESET_BATTLE_TOWER_OUTSIDE
+ jr z, .load_roof
+ jr .skip_roof
+
+.load_roof
+ callba LoadMapGroupRoof
+
+.skip_roof
+ xor a
+ ld [hTileAnimFrame], a
+ ret
+; 2879
+
+BufferScreen:: ; 2879
+ ld hl, wOverworldMapAnchor
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, wScreenSave
+ ld c, $5
+ ld b, $6
+.row
+ push bc
+ push hl
+.col
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .col
+ pop hl
+ ld a, [MapWidth]
+ add $6
+ ld c, a
+ ld b, $0
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .row
+ ret
+; 289d
+
+SaveScreen:: ; 289d
+ ld hl, wOverworldMapAnchor
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, wScreenSave
+ ld a, [MapWidth]
+ add 6
+ ld [hMapObjectIndexBuffer], a
+ ld a, [wPlayerStepDirection]
+ and a
+ jr z, .down
+ cp UP
+ jr z, .up
+ cp LEFT
+ jr z, .left
+ cp RIGHT
+ jr z, .right
+ ret
+
+.up
+ ld de, wScreenSave + 6
+ ld a, [hMapObjectIndexBuffer]
+ ld c, a
+ ld b, $0
+ add hl, bc
+ jr .vertical
+
+.down
+ ld de, wScreenSave
+.vertical
+ ld b, 6
+ ld c, 4
+ jr SaveScreen_LoadNeighbor
+
+.left
+ ld de, wScreenSave + 1
+ inc hl
+ jr .horizontal
+
+.right
+ ld de, wScreenSave
+.horizontal
+ ld b, 5
+ ld c, 5
+ jr SaveScreen_LoadNeighbor
+
+LoadNeighboringBlockData:: ; 28e3
+ ld hl, wOverworldMapAnchor
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [MapWidth]
+ add 6
+ ld [hConnectionStripLength], a
+ ld de, wScreenSave
+ ld b, 6
+ ld c, 5
+
+SaveScreen_LoadNeighbor:: ; 28f7
+.row
+ push bc
+ push hl
+ push de
+.col
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec b
+ jr nz, .col
+ pop de
+ ld a, e
+ add 6
+ ld e, a
+ jr nc, .okay
+ inc d
+
+.okay
+ pop hl
+ ld a, [hConnectionStripLength]
+ ld c, a
+ ld b, 0
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .row
+ ret
+; 2914
+
+GetMovementPermissions:: ; 2914
+ xor a
+ ld [TilePermissions], a
+ call .LeftRight
+ call .UpDown
+; get coords of current tile
+ ld a, [PlayerStandingMapX]
+ ld d, a
+ ld a, [PlayerStandingMapY]
+ ld e, a
+ call GetCoordTile
+ ld [PlayerStandingTile], a
+ call .CheckHiNybble
+ ret nz
+
+ ld a, [PlayerStandingTile]
+ and 7
+ ld hl, .MovementPermissionsData
+ add l
+ ld l, a
+ ld a, 0
+ adc h
+ ld h, a
+ ld a, [hl]
+ ld hl, TilePermissions
+ or [hl]
+ ld [hl], a
+ ret
+; 2945
+
+.MovementPermissionsData ; 2945
+ db 1, 2, 4, 8, 9, 10, 5, 6
+; 294d
+
+.UpDown
+ ld a, [PlayerStandingMapX]
+ ld d, a
+ ld a, [PlayerStandingMapY]
+ ld e, a
+
+ push de
+ inc e
+ call GetCoordTile
+ ld [TileDown], a
+ call .Down
+
+ pop de
+ dec e
+ call GetCoordTile
+ ld [TileUp], a
+ call .Up
+ ret
+; 296c
+
+.LeftRight
+ ld a, [PlayerStandingMapX]
+ ld d, a
+ ld a, [PlayerStandingMapY]
+ ld e, a
+
+ push de
+ dec d
+ call GetCoordTile
+ ld [TileLeft], a
+ call .Left
+
+ pop de
+ inc d
+ call GetCoordTile
+ ld [TileRight], a
+ call .Right
+ ret
+; 298b
+
+.Down
+ call .CheckHiNybble
+ ret nz
+ ld a, [TileDown]
+ and 7
+ cp $2
+ jr z, .ok_down
+ cp $6
+ jr z, .ok_down
+ cp $7
+ ret nz
+
+.ok_down
+ ld a, [TilePermissions]
+ or FACE_DOWN
+ ld [TilePermissions], a
+ ret
+; 29a8
+
+.Up
+ call .CheckHiNybble
+ ret nz
+ ld a, [TileUp]
+ and 7
+ cp $3
+ jr z, .ok_up
+ cp $4
+ jr z, .ok_up
+ cp $5
+ ret nz
+
+.ok_up
+ ld a, [TilePermissions]
+ or FACE_UP
+ ld [TilePermissions], a
+ ret
+; 29c5
+
+.Right
+ call .CheckHiNybble
+ ret nz
+ ld a, [TileRight]
+ and 7
+ cp $1
+ jr z, .ok_right
+ cp $5
+ jr z, .ok_right
+ cp $7
+ ret nz
+
+.ok_right
+ ld a, [TilePermissions]
+ or FACE_RIGHT
+ ld [TilePermissions], a
+ ret
+; 29e2
+
+.Left
+ call .CheckHiNybble
+ ret nz
+ ld a, [TileLeft]
+ and 7
+ cp $0
+ jr z, .ok_left
+ cp $4
+ jr z, .ok_left
+ cp $6
+ ret nz
+
+.ok_left
+ ld a, [TilePermissions]
+ or FACE_LEFT
+ ld [TilePermissions], a
+ ret
+; 29ff
+
+.CheckHiNybble
+ and $f0
+ cp $b0
+ ret z
+ cp $c0
+ ret
+; 2a07
+
+GetFacingTileCoord:: ; 2a07
+; Return map coordinates in (d, e) and tile id in a
+; of the tile the player is facing.
+
+ ld a, [PlayerDirection]
+ and %1100
+ srl a
+ srl a
+ ld l, a
+ ld h, 0
+ add hl, hl
+ add hl, hl
+ ld de, .Directions
+ add hl, de
+
+ ld d, [hl]
+ inc hl
+ ld e, [hl]
+ inc hl
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+
+ ld a, [PlayerStandingMapX]
+ add d
+ ld d, a
+ ld a, [PlayerStandingMapY]
+ add e
+ ld e, a
+ ld a, [hl]
+ ret
+
+.Directions
+ ; x, y
+ db 0, 1
+ dw TileDown
+ db 0, -1
+ dw TileUp
+ db -1, 0
+ dw TileLeft
+ db 1, 0
+ dw TileRight
+; 2a3c
+
+GetCoordTile:: ; 2a3c
+; Get the collision byte for tile d, e
+ call GetBlockLocation
+ ld a, [hl]
+ and a
+ jr z, .nope
+ ld l, a
+ ld h, $0
+ add hl, hl
+ add hl, hl
+ ld a, [TilesetCollisionAddress]
+ ld c, a
+ ld a, [TilesetCollisionAddress + 1]
+ ld b, a
+ add hl, bc
+ rr d
+ jr nc, .nocarry
+ inc hl
+
+.nocarry
+ rr e
+ jr nc, .nocarry2
+ inc hl
+ inc hl
+
+.nocarry2
+ ld a, [TilesetCollisionBank]
+ call GetFarByte
+ ret
+
+.nope
+ ld a, -1
+ ret
+; 2a66
+
+GetBlockLocation:: ; 2a66
+ ld a, [MapWidth]
+ add 6
+ ld c, a
+ ld b, 0
+ ld hl, wc801
+ add hl, bc
+ ld a, e
+ srl a
+ jr z, .nope
+ and a
+.loop
+ srl a
+ jr nc, .ok
+ add hl, bc
+
+.ok
+ sla c
+ rl b
+ and a
+ jr nz, .loop
+
+.nope
+ ld c, d
+ srl c
+ ld b, 0
+ add hl, bc
+ ret
+; 2a8b
+
+CheckFacingSign:: ; 2a8b
+ call GetFacingTileCoord
+; Load facing into b.
+ ld b, a
+; Convert the coordinates at de to within-boundaries coordinates.
+ ld a, d
+ sub 4
+ ld d, a
+ ld a, e
+ sub 4
+ ld e, a
+; If there are no signposts, we don't need to be here.
+ ld a, [wCurrentMapSignpostCount]
+ and a
+ ret z
+
+ ld c, a
+ ld a, [hROMBank]
+ push af
+ call SwitchToMapScriptHeaderBank
+ call CheckIfFacingTileCoordIsSign
+ pop hl
+ ld a, h
+ rst Bankswitch
+ ret
+; 2aaa
+
+CheckIfFacingTileCoordIsSign:: ; 2aaa
+; Checks to see if you are facing a signpost. If so, copies it into EngineBuffer1 and sets carry.
+ ld hl, wCurrentMapSignpostHeaderPointer
+ 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 .copysign
+
+.next
+ pop hl
+ ld a, 5 ; signpost event length
+ add l
+ ld l, a
+ jr nc, .nocarry
+ inc h
+
+.nocarry
+ dec c
+ jr nz, .loop
+ xor a
+ ret
+
+.copysign
+ pop hl
+ ld de, wCurSignpostYCoord
+ ld bc, 5 ; signpost event length
+ call CopyBytes
+ scf
+ ret
+; 2ad4
+
+CheckCurrentMapXYTriggers:: ; 2ad4
+; If there are no xy triggers, we don't need to be here.
+ ld a, [wCurrentMapXYTriggerCount]
+ and a
+ ret z
+; Copy the trigger count into c.
+ ld c, a
+ ld a, [hROMBank]
+ push af
+ call SwitchToMapScriptHeaderBank
+ call .TriggerCheck
+ pop hl
+ ld a, h
+ rst Bankswitch
+ ret
+
+.TriggerCheck
+; Checks to see if you are standing on an xy-trigger. If yes, copies the trigger to EngineBuffer1 and sets carry.
+ ld hl, wCurrentMapXYTriggerHeaderPointer
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+; Load the active trigger ID into b
+ call CheckTriggers
+ ld b, a
+; Load your current coordinates into de. This will be used to check if your position is in the xy-trigger table for the current map.
+ ld a, [PlayerStandingMapX]
+ sub 4
+ ld d, a
+ ld a, [PlayerStandingMapY]
+ sub 4
+ ld e, a
+
+.loop
+ push hl
+ ld a, [hli]
+ cp b
+ jr z, .got_id
+ cp -1
+ jr nz, .next
+
+.got_id
+ ld a, [hli]
+ cp e
+ jr nz, .next
+ ld a, [hli]
+ cp d
+ jr nz, .next
+ jr .copytrigger
+
+.next
+ pop hl
+ ld a, $8 ; xy-trigger size
+ add l
+ ld l, a
+ jr nc, .nocarry
+ inc h
+
+.nocarry
+ dec c
+ jr nz, .loop
+ xor a
+ ret
+
+.copytrigger
+ pop hl
+ ld de, wCurCoordEventTriggerID
+ ld bc, 8 ; xy-trigger size
+ call CopyBytes
+ scf
+ ret
+; 2b29
+
+FadeToMenu:: ; 2b29
+ xor a
+ ld [hBGMapMode], a
+ call LoadStandardMenuDataHeader
+ callba FadeOutPalettes
+ call ClearSprites
+ call DisableSpriteUpdates
+ ret
+; 2b3c
+
+CloseSubmenu:: ; 2b3c
+ call ClearBGPalettes
+ call ReloadTilesetAndPalettes
+ call UpdateSprites
+ call Call_ExitMenu
+ call ret_d90
+ jr FinishExitMenu
+; 2b4d
+
+ExitAllMenus:: ; 2b4d
+ call ClearBGPalettes
+ call Call_ExitMenu
+ call ReloadTilesetAndPalettes
+ call UpdateSprites
+ call ret_d90
+FinishExitMenu:: ; 2b5c
+ ld b, SCGB_MAPPALS
+ call GetSGBLayout
+ callba LoadOW_BGPal7
+ call WaitBGMap2
+ callba FadeInPalettes
+ call EnableSpriteUpdates
+ ret
+; 2b74
+
+ReturnToMapWithSpeechTextbox:: ; 0x2b74
+ push af
+ ld a, $1
+ ld [wSpriteUpdatesEnabled], a
+ call ClearBGPalettes
+ call ClearSprites
+ call ReloadTilesetAndPalettes
+ hlcoord 0, 12
+ lb bc, 4, 18
+ call TextBox
+ ld hl, VramState
+ set 0, [hl]
+ call UpdateSprites
+ call WaitBGMap2
+ ld b, SCGB_MAPPALS
+ call GetSGBLayout
+ callba LoadOW_BGPal7
+ call UpdateTimePals
+ call DelayFrame
+ ld a, $1
+ ld [hMapAnims], a
+ pop af
+ ret
+; 0x2bae
+
+ReloadTilesetAndPalettes:: ; 2bae
+ call DisableLCD
+ call ClearSprites
+ callba RefreshSprites
+ call LoadStandardFont
+ call LoadFontsExtra
+ ld a, [hROMBank]
+ push af
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+ call SwitchToAnyMapBank
+ callba UpdateTimeOfDayPal
+ call OverworldTextModeSwitch
+ call LoadTileset
+ ld a, 9
+ call SkipMusic
+ pop af
+ rst Bankswitch
+
+ call EnableLCD
+ ret
+; 2be5
+
+GetMapHeaderPointer:: ; 2be5
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+GetAnyMapHeaderPointer:: ; 0x2bed
+; Prior to calling this function, you must have switched banks so that
+; MapGroupPointers is visible.
+
+; inputs:
+; b = map group, c = map number
+; XXX de = ???
+
+; outputs:
+; hl points to the map header
+ push bc ; save map number for later
+
+ ; get pointer to map group
+ dec b
+ ld c, b
+ ld b, 0
+ ld hl, MapGroupPointers
+ add hl, bc
+ add hl, bc
+
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop bc ; restore map number
+
+ ; find the cth map header
+ dec c
+ ld b, 0
+ ld a, 9
+ call AddNTimes
+ ret
+; 0x2c04
+
+GetMapHeaderMember:: ; 0x2c04
+; Extract data from the current map's header.
+
+; inputs:
+; de = offset of desired data within the mapheader
+
+; outputs:
+; bc = data from the current map's header
+; (e.g., de = $0003 would return a pointer to the secondary map header)
+
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+GetAnyMapHeaderMember:: ; 0x2c0c
+ ; bankswitch
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(MapGroupPointers)
+ rst Bankswitch
+
+ call GetAnyMapHeaderPointer
+ add hl, de
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+
+ ; bankswitch back
+ pop af
+ rst Bankswitch
+ ret
+; 0x2c1c
+
+SwitchToMapBank:: ; 2c1c
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+SwitchToAnyMapBank:: ; 2c24
+ call GetAnyMapBank
+ rst Bankswitch
+ ret
+; 2c29
+
+GetMapBank:: ; 2c29
+ ld a, [MapGroup]
+ ld b, a
+ ld a, [MapNumber]
+ ld c, a
+GetAnyMapBank:: ; 2c31
+ push hl
+ push de
+ ld de, 0
+ call GetAnyMapHeaderMember
+ ld a, c
+ pop de
+ pop hl
+ ret
+; 2c3d
+
+PartiallyCopyMapHeader:: ; 2c3d
+; Copy second map header bank, tileset, permission, and second map header address
+; from the current map's map header.
+ ld a, [hROMBank]
+ push af
+ ld a, BANK(MapGroupPointers)
+ rst Bankswitch
+
+ call GetMapHeaderPointer
+ ld de, wSecondMapHeaderBank
+ ld bc, MapHeader - wSecondMapHeaderBank
+ call CopyBytes
+
+ pop af
+ rst Bankswitch
+ ret
+; 2c52
+
+SwitchToMapScriptHeaderBank:: ; 2c52
+ ld a, [MapScriptHeaderBank]
+ rst Bankswitch
+ ret
+; 2c57
+
+GetMapScriptHeaderBank:: ; 2c57
+ ld a, [MapScriptHeaderBank]
+ ret
+; 2c5b
+
+GetAnyMapBlockdataBank:: ; 2c5b
+; Return the blockdata bank for group b map c.
+ push hl
+ push de
+ push bc
+
+ push bc
+ ld de, 3 ; second map header pointer
+ call GetAnyMapHeaderMember
+ ld l, c
+ ld h, b
+ pop bc
+
+ push hl
+ ld de, 0 ; second map header bank
+ call GetAnyMapHeaderMember
+ pop hl
+
+ ld de, 3 ; blockdata bank
+ add hl, de
+ ld a, c
+ call GetFarByte
+ rst Bankswitch
+
+ pop bc
+ pop de
+ pop hl
+ ret
+; 2c7d
+
+GetSecondaryMapHeaderPointer:: ; 0x2c7d
+; returns the current map's secondary map header pointer in hl.
+ push bc
+ push de
+ ld de, 3 ; secondary map header pointer (offset within header)
+ call GetMapHeaderMember
+ ld l, c
+ ld h, b
+ pop de
+ pop bc
+ ret
+; 2c8a
+
+GetMapPermission:: ; 2c8a
+ push hl
+ push de
+ push bc
+ ld de, 2 ; permission
+ call GetMapHeaderMember
+ ld a, c
+ pop bc
+ pop de
+ pop hl
+ ret
+; 2c98
+
+ ret ; XXX
+; 2c99
+
+GetAnyMapPermission:: ; 2c99
+ push hl
+ push de
+ push bc
+ ld de, 2 ; permission
+ call GetAnyMapHeaderMember
+ ld a, c
+ pop bc
+ pop de
+ pop hl
+ ret
+; 2ca7
+
+GetAnyMapTileset:: ; 2ca7
+ ld de, 1 ; tileset
+ call GetAnyMapHeaderMember
+ ld a, c
+ ret
+; 2caf
+
+GetWorldMapLocation:: ; 0x2caf
+; given a map group/id in bc, return its location on the Pokégear map.
+ push hl
+ push de
+ push bc
+
+ ld de, 5 ; landmark
+ call GetAnyMapHeaderMember
+ ld a, c
+
+ pop bc
+ pop de
+ pop hl
+ ret
+; 0x2cbd
+
+GetMapHeaderMusic:: ; 2cbd
+RADIO_TOWER_MUSIC EQU 7
+
+ push hl
+ push bc
+ ld de, 6 ; music
+ call GetMapHeaderMember
+ ld a, c
+ cp MUSIC_MAHOGANY_MART
+ jr z, .mahoganymart
+ bit RADIO_TOWER_MUSIC, c
+ jr nz, .radiotower
+ callba Function8b342
+ ld e, c
+ ld d, 0
+.done
+ pop bc
+ pop hl
+ ret
+
+.radiotower
+ ld a, [StatusFlags2]
+ bit 0, a
+ jr z, .clearedradiotower
+ ld de, MUSIC_ROCKET_OVERTURE
+ jr .done
+
+.clearedradiotower
+ ; the rest of the byte
+ ld a, c
+ and 1 << RADIO_TOWER_MUSIC - 1
+ ld e, a
+ ld d, 0
+ jr .done
+
+.mahoganymart
+ ld a, [StatusFlags2]
+ bit 7, a
+ jr z, .clearedmahogany
+ ld de, MUSIC_ROCKET_HIDEOUT
+ jr .done
+
+.clearedmahogany
+ ld de, MUSIC_CHERRYGROVE_CITY
+ jr .done
+; 2cff
+
+GetMapHeaderTimeOfDayNybble:: ; 2cff
+ call GetPhoneServiceTimeOfDayByte
+ and $f
+ ret
+; 2d05
+
+GetMapHeaderPhoneServiceNybble:: ; 2d05
+ call GetPhoneServiceTimeOfDayByte
+ and $f0
+ swap a
+ ret
+; 2d0d
+
+GetPhoneServiceTimeOfDayByte:: ; 2d0d
+ push hl
+ push bc
+
+ ld de, 7 ; phone service and time of day
+ call GetMapHeaderMember
+ ld a, c
+
+ pop bc
+ pop hl
+ ret
+; 2d19
+
+GetFishingGroup:: ; 2d19
+ push de
+ push hl
+ push bc
+
+ ld de, 8 ; fishing group
+ call GetMapHeaderMember
+ ld a, c
+
+ pop bc
+ pop hl
+ pop de
+ ret
+; 2d27
+
+LoadTilesetHeader:: ; 2d27
+ push hl
+ push bc
+
+ ld hl, Tilesets
+ ld bc, Tileset01 - Tileset00
+ ld a, [wTileset]
+ call AddNTimes
+
+ ld de, TilesetBank
+ ld bc, Tileset01 - Tileset00
+
+ ld a, BANK(Tilesets)
+ call FarCopyBytes
+
+ pop bc
+ pop hl
+ ret
+; 2d43