pokecrystal-board/home/map.asm

2394 lines
33 KiB
NASM
Raw Normal View History

; Functions dealing with rendering and interacting with maps.
Clearwc7e8:: ; 210f
2015-02-10 15:14:41 -08:00
ld hl, wc7e8
2018-01-17 22:28:51 -08:00
ld bc, wc7e8_End - wc7e8
ld a, 0
call ByteFill
ret
; 211b
CheckScenes:: ; 211b
; Checks wCurrMapSceneScriptPointer. If it's empty, returns -1 in a. Otherwise, returns the active scene ID in a.
push hl
ld hl, wCurrMapSceneScriptPointer
ld a, [hli]
ld h, [hl]
ld l, a
or h
ld a, [hl]
jr nz, .scene_exists
ld a, -1
.scene_exists
pop hl
ret
; 212a
GetCurrentMapSceneID:: ; 212a
; Grabs the wram map scene script pointer for the current map and loads it into wCurrMapSceneScriptPointer.
; If there is no scene, both bytes of wCurrMapSceneScriptPointer are wiped clean.
; Copy the current map group and number into bc. This is needed for GetMapSceneID.
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
ld c, a
; Blank out wCurrMapSceneScriptPointer; this is the default scenario.
xor a
ld [wCurrMapSceneScriptPointer], a
ld [wCurrMapSceneScriptPointer + 1], a
call GetMapSceneID
ret c ; The map is not in the scene script table
; Load the scene script pointer from de into wCurrMapSceneScriptPointer
ld a, e
ld [wCurrMapSceneScriptPointer], a
ld a, d
ld [wCurrMapSceneScriptPointer + 1], a
xor a
ret
; 2147
GetMapSceneID:: ; 2147
; Searches the scene script table for the map group and number loaded in bc, and returns the wram pointer in de.
; If the map is not in the scene script table, returns carry.
push bc
ld a, [hROMBank]
push af
ld a, BANK(MapScenes)
rst Bankswitch
ld hl, MapScenes
.loop
push hl
ld a, [hli] ; map group, or terminator
cp -1
jr z, .end ; the current map is not in the scene script 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 ; scene_script size
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
2015-11-11 11:12:46 -08:00
OverworldTextModeSwitch:: ; 2173
2015-11-05 11:06:03 -08:00
call LoadMapPart
call FarCallSwapTextboxPalettes
ret
; 217a
2015-11-05 11:06:03 -08:00
LoadMapPart:: ; 217a
ld a, [hROMBank]
push af
2018-01-23 14:39:09 -08:00
ld a, [wTilesetBlocksBank]
rst Bankswitch
2015-11-05 11:06:03 -08:00
call LoadMetatiles
ld a, $60
hlcoord 0, 0
2015-11-02 09:54:27 -08:00
ld bc, SCREEN_WIDTH * SCREEN_HEIGHT
call ByteFill
2015-12-14 08:12:18 -08:00
ld a, BANK(_LoadMapPart)
rst Bankswitch
2015-12-14 08:12:18 -08:00
call _LoadMapPart
pop af
rst Bankswitch
ret
; 2198
2015-11-05 11:06:03 -08:00
LoadMetatiles:: ; 2198
2015-12-14 08:12:18 -08:00
; de <- wOverworldMapAnchor
2015-12-13 17:33:56 -08:00
ld a, [wOverworldMapAnchor]
ld e, a
2015-12-13 17:33:56 -08:00
ld a, [wOverworldMapAnchor + 1]
ld d, a
2015-11-05 11:06:03 -08:00
ld hl, wMisc
2015-12-14 08:12:18 -08:00
ld b, WMISC_HEIGHT / 4 ; 5
2015-12-14 08:12:18 -08:00
.row
push de
push hl
2015-12-14 08:12:18 -08:00
ld c, WMISC_WIDTH / 4 ; 6
2015-12-14 08:12:18 -08:00
.col
push de
push hl
2015-12-14 08:12:18 -08:00
; Load the current map block.
; If the current map block is a border block, load the border block.
ld a, [de]
and a
2015-11-05 11:06:03 -08:00
jr nz, .ok
2018-01-23 14:39:09 -08:00
ld a, [wMapBorderBlock]
2015-11-05 11:06:03 -08:00
.ok
2015-12-14 08:12:18 -08:00
; Load the current wMisc address into de.
ld e, l
ld d, h
2018-01-23 14:39:09 -08:00
; Set hl to the address of the current metatile data ([wTilesetBlocksAddress] + (a) tiles).
2017-12-12 20:05:30 -08:00
; This is buggy; it wraps around past 128 blocks.
; To fix, uncomment the line below.
add a ; Comment or delete this line to fix the above bug.
ld l, a
ld h, 0
2017-12-12 20:05:30 -08:00
; add hl, hl
2015-12-14 08:12:18 -08:00
add hl, hl
add hl, hl
add hl, hl
2018-01-23 14:39:09 -08:00
ld a, [wTilesetBlocksAddress]
add l
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wTilesetBlocksAddress + 1]
adc h
ld h, a
2015-12-14 08:12:18 -08:00
; copy the 4x4 metatile
rept 3
rept 4
ld a, [hli]
ld [de], a
inc de
endr
ld a, e
2015-12-14 08:12:18 -08:00
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
2015-12-14 08:12:18 -08:00
; Next metatile
pop hl
2015-11-05 11:06:03 -08:00
ld de, 4
add hl, de
pop de
inc de
dec c
2015-12-14 08:12:18 -08:00
jp nz, .col
; Next metarow
pop hl
2015-12-14 08:12:18 -08:00
ld de, WMISC_WIDTH * 4
add hl, de
pop de
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
2015-11-05 11:06:03 -08:00
add 6
add e
ld e, a
2015-11-05 11:06:03 -08:00
jr nc, .ok2
inc d
2015-11-05 11:06:03 -08:00
.ok2
dec b
2015-12-14 08:12:18 -08:00
jp nz, .row
ret
; 222a
2015-11-11 20:38:57 -08:00
ReturnToMapFromSubmenu:: ; 222a
ld a, MAPSETUP_SUBMENU
ld [hMapEntryMethod], a
2017-12-24 09:47:30 -08:00
farcall RunMapSetupScript
xor a
ld [hMapEntryMethod], a
ret
; 2238
2015-10-24 16:49:19 -07:00
CheckWarpTile:: ; 2238
2015-11-12 08:10:19 -08:00
call GetDestinationWarpNumber
ret nc
2015-11-12 08:10:19 -08:00
push bc
2017-12-24 09:47:30 -08:00
farcall CheckDirectionalWarp
pop bc
ret nc
2015-11-12 08:10:19 -08:00
call CopyWarpData
scf
ret
; 224a
2015-11-12 08:10:19 -08:00
WarpCheck:: ; 224a
call GetDestinationWarpNumber
ret nc
2015-11-12 08:10:19 -08:00
call CopyWarpData
ret
; 2252
2015-11-12 08:10:19 -08:00
GetDestinationWarpNumber:: ; 2252
2017-12-24 09:47:30 -08:00
farcall CheckWarpCollision
ret nc
ld a, [hROMBank]
push af
call SwitchToMapScriptsBank
2015-11-12 08:10:19 -08:00
call .GetDestinationWarpNumber
pop de
ld a, d
rst Bankswitch
ret
; 2266
.GetDestinationWarpNumber: ; 2266
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapY]
sub $4
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapX]
sub $4
ld d, a
2015-10-24 16:49:19 -07:00
ld a, [wCurrMapWarpCount]
and a
ret z
2015-11-12 08:10:19 -08:00
ld c, a
ld hl, wCurrMapWarpsPointer
ld a, [hli]
ld h, [hl]
ld l, a
2015-11-12 08:10:19 -08:00
.loop
push hl
ld a, [hli]
cp e
2015-11-12 08:10:19 -08:00
jr nz, .next
ld a, [hli]
cp d
2015-11-12 08:10:19 -08:00
jr nz, .next
jr .found_warp
2015-11-12 08:10:19 -08:00
.next
pop hl
2015-11-12 08:10:19 -08:00
ld a, 5
add l
ld l, a
2015-11-12 08:10:19 -08:00
jr nc, .okay
inc h
2015-11-12 08:10:19 -08:00
.okay
dec c
2015-11-12 08:10:19 -08:00
jr nz, .loop
xor a
ret
2015-11-12 08:10:19 -08:00
.found_warp
pop hl
2015-11-12 08:10:19 -08:00
call .IncreaseHLTwice
ret nc ; never encountered
2015-10-24 16:49:19 -07:00
ld a, [wCurrMapWarpCount]
inc a
sub c
ld c, a
scf
ret
.IncreaseHLTwice:
inc hl
2016-01-06 04:44:50 -08:00
inc hl
scf
ret
; 22a7
2015-11-12 08:10:19 -08:00
CopyWarpData:: ; 22a7
ld a, [hROMBank]
push af
call SwitchToMapScriptsBank
2015-11-12 08:10:19 -08:00
call .CopyWarpData
pop af
rst Bankswitch
scf
ret
; 22b4
.CopyWarpData: ; 22b4
push bc
ld hl, wCurrMapWarpsPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld a, c
dec a
2015-11-12 08:10:19 -08:00
ld bc, 5 ; warp size
call AddNTimes
2015-11-12 08:10:19 -08:00
ld bc, 2 ; warp number
add hl, bc
ld a, [hli]
cp $ff
2015-11-12 08:10:19 -08:00
jr nz, .skip
2018-01-23 14:39:09 -08:00
ld hl, wBackupWarpNumber
ld a, [hli]
2015-11-12 08:10:19 -08:00
.skip
pop bc
2015-11-12 08:10:19 -08:00
ld [wNextWarp], a
ld a, [hli]
2015-11-12 08:10:19 -08:00
ld [wNextMapGroup], a
ld a, [hli]
2015-11-12 08:10:19 -08:00
ld [wNextMapNumber], a
ld a, c
2015-11-12 08:10:19 -08:00
ld [wPrevWarp], a
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
2015-11-12 08:10:19 -08:00
ld [wPrevMapGroup], a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
2015-11-12 08:10:19 -08:00
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
; unused
cp INDOOR
ret z
cp GATE
ret z
cp ENVIRONMENT_5
ret
; 2309
LoadMapAttributes:: ; 2309
call CopyMapDefAndData
call SwitchToMapScriptsBank
2015-11-12 08:10:19 -08:00
call ReadMapScripts
xor a ; do not skip object_events
call ReadMapEvents
ret
; 2317
2015-11-12 08:10:19 -08:00
LoadMapAttributes_SkipPeople:: ; 2317
call CopyMapDefAndData
call SwitchToMapScriptsBank
2015-11-12 08:10:19 -08:00
call ReadMapScripts
ld a, TRUE ; skip object events
call ReadMapEvents
ret
; 2326
CopyMapDefAndData:: ; 2326
call PartialCopyMapDef
call SwitchToMapDataBank
call GetMapDataPointer
call CopyMapData
2015-11-12 08:10:19 -08:00
call GetMapConnections
ret
; 2336
ReadMapEvents:: ; 2336
push af
2018-01-23 14:39:09 -08:00
ld hl, wMapEventsPointer
ld a, [hli]
ld h, [hl]
ld l, a
inc hl
2016-01-06 04:44:50 -08:00
inc hl
2015-07-26 00:11:33 -07:00
call ReadWarps
call ReadCoordEvents
call ReadBGEvents
2015-11-12 08:10:19 -08:00
pop af
and a ; skip object events?
ret nz
2015-11-12 08:10:19 -08:00
2015-07-26 00:11:33 -07:00
call ReadObjectEvents
ret
; 234f
2015-11-12 08:10:19 -08:00
ReadMapScripts:: ; 234f
2018-01-23 14:39:09 -08:00
ld hl, wMapScriptsPointer
ld a, [hli]
ld h, [hl]
ld l, a
call ReadMapSceneScripts
2015-10-24 16:49:19 -07:00
call ReadMapCallbacks
ret
; 235c
CopyMapData:: ; 235c
ld de, wMapData
ld c, wMapDataEnd - wMapData
2015-11-12 08:10:19 -08:00
.loop
ld a, [hli]
ld [de], a
inc de
dec c
2015-11-12 08:10:19 -08:00
jr nz, .loop
ret
; 2368
2015-11-12 08:10:19 -08:00
GetMapConnections:: ; 2368
ld a, $ff
2018-01-23 14:39:09 -08:00
ld [wNorthConnectedMapGroup], a
ld [wSouthConnectedMapGroup], a
ld [wWestConnectedMapGroup], a
ld [wEastConnectedMapGroup], a
2018-01-23 14:39:09 -08:00
ld a, [wMapConnections]
ld b, a
2015-11-12 08:10:19 -08:00
bit NORTH_F, b
jr z, .no_north
2018-01-23 14:39:09 -08:00
ld de, wNorthMapConnection
call GetMapConnection
2015-11-12 08:10:19 -08:00
.no_north
2015-11-12 08:10:19 -08:00
bit SOUTH_F, b
jr z, .no_south
2018-01-23 14:39:09 -08:00
ld de, wSouthMapConnection
call GetMapConnection
2015-11-12 08:10:19 -08:00
.no_south
2015-11-12 08:10:19 -08:00
bit WEST_F, b
jr z, .no_west
2018-01-23 14:39:09 -08:00
ld de, wWestMapConnection
call GetMapConnection
2015-11-12 08:10:19 -08:00
.no_west
2015-11-12 08:10:19 -08:00
bit EAST_F, b
jr z, .no_east
2018-01-23 14:39:09 -08:00
ld de, wEastMapConnection
call GetMapConnection
2015-11-12 08:10:19 -08:00
.no_east
ret
; 23a3
GetMapConnection:: ; 23a3
; Load map connection struct at hl into de.
2018-01-23 14:39:09 -08:00
ld c, wSouthMapConnection - wNorthMapConnection
.loop
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .loop
ret
; 23ac
ReadMapSceneScripts:: ; 23ac
ld a, [hli] ; scene script count
ld c, a
ld [wCurrMapSceneScriptCount], a ; current map scene script count
ld a, l
ld [wCurrMapSceneScriptsPointer], a ; map scene script pointer
ld a, h
ld [wCurrMapSceneScriptsPointer + 1], a
ld a, c
and a
ret z
2015-10-24 07:34:19 -07:00
ld bc, 4 ; scene_script size
call AddNTimes
ret
; 23c3
2015-10-24 16:49:19 -07:00
ReadMapCallbacks:: ; 23c3
ld a, [hli]
ld c, a
2015-10-24 16:49:19 -07:00
ld [wCurrMapCallbackCount], a
ld a, l
ld [wCurrMapCallbacksPointer], a
ld a, h
ld [wCurrMapCallbacksPointer + 1], a
ld a, c
and a
ret z
2015-10-24 07:34:19 -07:00
ld bc, 3
call AddNTimes
ret
; 23da
2015-07-26 00:11:33 -07:00
ReadWarps:: ; 23da
ld a, [hli]
ld c, a
2015-10-24 16:49:19 -07:00
ld [wCurrMapWarpCount], a
ld a, l
ld [wCurrMapWarpsPointer], a
ld a, h
ld [wCurrMapWarpsPointer + 1], a
ld a, c
and a
ret z
2016-01-12 09:46:18 -08:00
ld bc, 5
call AddNTimes
ret
; 23f1
2015-07-26 00:11:33 -07:00
ReadCoordEvents:: ; 23f1
ld a, [hli]
ld c, a
ld [wCurrMapCoordEventCount], a
ld a, l
ld [wCurrMapCoordEventsPointer], a
ld a, h
ld [wCurrMapCoordEventsPointer + 1], a
2015-11-12 08:10:19 -08:00
ld a, c
and a
ret z
2015-11-12 08:10:19 -08:00
ld bc, 8
call AddNTimes
ret
; 2408
ReadBGEvents:: ; 2408
ld a, [hli]
ld c, a
ld [wCurrMapBGEventCount], a
ld a, l
ld [wCurrMapBGEventsPointer], a
ld a, h
ld [wCurrMapBGEventsPointer + 1], a
2015-11-12 08:10:19 -08:00
ld a, c
and a
ret z
2015-11-12 08:10:19 -08:00
ld bc, 5
call AddNTimes
ret
; 241f
2015-07-26 00:11:33 -07:00
ReadObjectEvents:: ; 241f
push hl
2015-11-12 08:10:19 -08:00
call ClearObjectStructs
pop de
2018-01-23 14:39:09 -08:00
ld hl, wMap1Object
ld a, [de]
inc de
ld [wCurrMapObjectEventCount], a
ld a, e
ld [wCurrMapObjectEventsPointer], a
ld a, d
ld [wCurrMapObjectEventsPointer + 1], a
2015-11-12 08:10:19 -08:00
ld a, [wCurrMapObjectEventCount]
call CopyMapObjectEvents
2015-11-12 08:10:19 -08:00
; get NUM_OBJECTS - [wCurrMapObjectEventCount]
ld a, [wCurrMapObjectEventCount]
ld c, a
2015-11-12 08:10:19 -08:00
ld a, NUM_OBJECTS ; - 1
sub c
2015-11-12 08:10:19 -08:00
jr z, .skip
; jr c, .skip
; stupid waste of time and space
ld bc, 1
add hl, bc
2015-11-12 08:10:19 -08:00
; 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
2015-11-12 08:10:19 -08:00
ld [hl], -1
dec hl
add hl, bc
dec a
2015-11-12 08:10:19 -08:00
jr nz, .loop
2015-11-12 08:10:19 -08:00
.skip
ld h, d
ld l, e
ret
; 2457
CopyMapObjectEvents:: ; 2457
and a
ret z
2015-11-12 08:10:19 -08:00
ld c, a
2015-11-12 08:10:19 -08:00
.loop
push bc
push hl
ld a, $ff
ld [hli], a
2015-11-12 08:10:19 -08:00
ld b, MAPOBJECT_E - MAPOBJECT_SPRITE
.loop2
ld a, [de]
inc de
ld [hli], a
dec b
2015-11-12 08:10:19 -08:00
jr nz, .loop2
pop hl
2015-11-12 08:10:19 -08:00
ld bc, OBJECT_LENGTH
add hl, bc
pop bc
dec c
2015-11-12 08:10:19 -08:00
jr nz, .loop
ret
; 2471
2015-11-12 08:10:19 -08:00
ClearObjectStructs:: ; 2471
2018-01-23 14:39:09 -08:00
ld hl, wObject1Struct
2015-07-26 00:11:33 -07:00
ld bc, OBJECT_STRUCT_LENGTH * (NUM_OBJECT_STRUCTS - 1)
xor a
call ByteFill
2015-11-12 08:10:19 -08:00
; Just to make sure (this is rather pointless)
2018-01-23 14:39:09 -08:00
ld hl, wObject1Struct
2015-07-26 00:11:33 -07:00
ld de, OBJECT_STRUCT_LENGTH
ld c, NUM_OBJECT_STRUCTS - 1
xor a
2015-11-12 08:10:19 -08:00
.loop
ld [hl], a
add hl, de
dec c
2015-11-12 08:10:19 -08:00
jr nz, .loop
ret
; 248a
RestoreFacingAfterWarp:: ; 248a
call GetMapScriptsBank
rst Bankswitch
2018-01-23 14:39:09 -08:00
ld hl, wMapEventsPointer
ld a, [hli]
ld h, [hl]
ld l, a
2015-11-12 08:10:19 -08:00
inc hl ; get to the warp coords
inc hl ; get to the warp coords
inc hl ; get to the warp coords
2018-01-23 14:39:09 -08:00
ld a, [wWarpNumber]
dec a
ld c, a
2015-11-12 08:10:19 -08:00
ld b, 0
ld a, 5
call AddNTimes
ld a, [hli]
2018-01-23 14:39:09 -08:00
ld [wYCoord], a
ld a, [hli]
2018-01-23 14:39:09 -08:00
ld [wXCoord], a
2015-11-12 08:10:19 -08:00
; destination warp number
ld a, [hli]
cp $ff
2015-11-12 08:10:19 -08:00
jr nz, .skip
call .backup
2015-11-12 08:10:19 -08:00
.skip
2017-12-24 09:47:30 -08:00
farcall GetCoordOfUpperLeftCorner
ret
; 24ba
2015-11-12 08:10:19 -08:00
.backup
ld a, [wPrevWarp]
2018-01-23 14:39:09 -08:00
ld [wBackupWarpNumber], a
2015-11-12 08:10:19 -08:00
ld a, [wPrevMapGroup]
2018-01-23 14:39:09 -08:00
ld [wBackupMapGroup], a
2015-11-12 08:10:19 -08:00
ld a, [wPrevMapNumber]
2018-01-23 14:39:09 -08:00
ld [wBackupMapNumber], a
ret
; 24cd
LoadBlockData:: ; 24cd
2018-01-23 14:39:09 -08:00
ld hl, wOverworldMap
ld bc, wOverworldMapEnd - wOverworldMap
ld a, 0
call ByteFill
call ChangeMap
call FillMapConnections
2016-01-06 04:44:50 -08:00
ld a, MAPCALLBACK_TILES
call RunMapCallback
ret
; 24e4
ChangeMap:: ; 24e4
ld a, [hROMBank]
push af
2018-01-23 14:39:09 -08:00
ld hl, wOverworldMap
ld a, [wMapWidth]
2015-11-02 09:54:27 -08:00
ld [hConnectedMapWidth], a
add $6
2015-11-02 09:54:27 -08:00
ld [hConnectionStripLength], a
ld c, a
ld b, 0
add hl, bc
add hl, bc
add hl, bc
ld c, 3
add hl, bc
2018-01-23 14:39:09 -08:00
ld a, [wMapBlocksBank]
rst Bankswitch
2018-01-23 14:39:09 -08:00
ld a, [wMapBlocksPointer]
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wMapBlocksPointer + 1]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wMapHeight]
ld b, a
2016-01-12 09:46:18 -08:00
.row
push hl
2015-11-02 09:54:27 -08:00
ld a, [hConnectedMapWidth]
ld c, a
2016-01-12 09:46:18 -08:00
.col
ld a, [de]
inc de
ld [hli], a
dec c
2016-01-12 09:46:18 -08:00
jr nz, .col
pop hl
2015-11-02 09:54:27 -08:00
ld a, [hConnectionStripLength]
add l
ld l, a
2016-01-12 09:46:18 -08:00
jr nc, .okay
inc h
2016-01-12 09:46:18 -08:00
.okay
dec b
2016-01-12 09:46:18 -08:00
jr nz, .row
pop af
rst Bankswitch
ret
; 2524
FillMapConnections:: ; 2524
; North
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectedMapGroup]
cp $ff
jr z, .South
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectedMapNumber]
ld c, a
call GetAnyMapBlocksBank
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectionStripPointer]
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectionStripPointer + 1]
ld h, a
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectionStripLocation]
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectionStripLocation + 1]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectionStripLength]
2015-11-02 09:54:27 -08:00
ld [hConnectionStripLength], a
2018-01-23 14:39:09 -08:00
ld a, [wNorthConnectedMapWidth]
2015-11-02 09:54:27 -08:00
ld [hConnectedMapWidth], a
call FillNorthConnectionStrip
.South:
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectedMapGroup]
cp $ff
jr z, .West
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectedMapNumber]
ld c, a
call GetAnyMapBlocksBank
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectionStripPointer]
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectionStripPointer + 1]
ld h, a
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectionStripLocation]
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectionStripLocation + 1]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectionStripLength]
2015-11-02 09:54:27 -08:00
ld [hConnectionStripLength], a
2018-01-23 14:39:09 -08:00
ld a, [wSouthConnectedMapWidth]
2015-11-02 09:54:27 -08:00
ld [hConnectedMapWidth], a
call FillSouthConnectionStrip
.West:
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectedMapGroup]
cp $ff
jr z, .East
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectedMapNumber]
ld c, a
call GetAnyMapBlocksBank
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectionStripPointer]
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectionStripPointer + 1]
ld h, a
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectionStripLocation]
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectionStripLocation + 1]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectionStripLength]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wWestConnectedMapWidth]
2015-11-02 09:54:27 -08:00
ld [hConnectionStripLength], a
call FillWestConnectionStrip
.East:
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectedMapGroup]
cp $ff
jr z, .Done
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectedMapNumber]
ld c, a
call GetAnyMapBlocksBank
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectionStripPointer]
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectionStripPointer + 1]
ld h, a
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectionStripLocation]
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectionStripLocation + 1]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectionStripLength]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wEastConnectedMapWidth]
2015-11-02 09:54:27 -08:00
ld [hConnectionStripLength], a
call FillEastConnectionStrip
.Done:
ret
; 25d3
FillNorthConnectionStrip::
FillSouthConnectionStrip:: ; 25d3
ld c, 3
.y
push de
push hl
2015-11-02 09:54:27 -08:00
ld a, [hConnectionStripLength]
ld b, a
.x
ld a, [hli]
ld [de], a
inc de
dec b
jr nz, .x
pop hl
2015-11-02 09:54:27 -08:00
ld a, [hConnectedMapWidth]
ld e, a
ld d, 0
add hl, de
pop de
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
add 6
add e
ld e, a
2016-01-12 09:46:18 -08:00
jr nc, .okay
inc d
2016-01-12 09:46:18 -08:00
.okay
dec c
jr nz, .y
ret
; 25f6
FillWestConnectionStrip::
FillEastConnectionStrip:: ; 25f6
2016-01-12 09:46:18 -08:00
.loop
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
add 6
2015-11-02 09:54:27 -08:00
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
2015-11-02 09:54:27 -08:00
ld a, [hConnectionStripLength]
ld e, a
ld d, 0
add hl, de
pop de
2015-11-02 09:54:27 -08:00
ld a, [hConnectedMapWidth]
add e
ld e, a
2016-01-12 09:46:18 -08:00
jr nc, .okay
inc d
2016-01-12 09:46:18 -08:00
.okay
dec b
2016-01-12 09:46:18 -08:00
jr nz, .loop
ret
; 261b
LoadMapStatus:: ; 261b
2018-01-23 14:39:09 -08:00
ld [wMapStatus], a
ret
; 261f
CallScript:: ; 261f
; Call a script at a:hl.
2018-01-23 14:39:09 -08:00
ld [wScriptBank], a
ld a, l
2018-01-23 14:39:09 -08:00
ld [wScriptPos], a
ld a, h
2018-01-23 14:39:09 -08:00
ld [wScriptPos + 1], a
2015-11-05 12:08:00 -08:00
ld a, PLAYEREVENT_MAPSCRIPT
2018-01-23 14:39:09 -08:00
ld [wScriptRunning], a
scf
ret
; 2631
2015-11-05 12:08:00 -08:00
CallMapScript:: ; 2631
; Call a script at hl in the current bank if there isn't already a script running
2018-01-23 14:39:09 -08:00
ld a, [wScriptRunning]
and a
ret nz
call GetMapScriptsBank
jr CallScript
; 263b
RunMapCallback:: ; 263b
; Will run the first callback found with execution index equal to a.
ld b, a
ld a, [hROMBank]
push af
call SwitchToMapScriptsBank
2015-11-05 12:08:00 -08:00
call .FindCallback
jr nc, .done
call GetMapScriptsBank
ld b, a
ld d, h
ld e, l
call ExecuteCallbackScript
.done
pop af
rst Bankswitch
ret
; 2653
2015-11-05 12:08:00 -08:00
.FindCallback: ; 2653
2015-10-24 16:49:19 -07:00
ld a, [wCurrMapCallbackCount]
ld c, a
and a
ret z
ld hl, wCurrMapCallbacksPointer
ld a, [hli]
ld h, [hl]
ld l, a
or h
ret z
ld de, 3
.loop
ld a, [hl]
cp b
2015-11-05 12:08:00 -08:00
jr z, .found
add hl, de
dec c
jr nz, .loop
xor a
ret
2015-11-05 12:08:00 -08:00
.found
inc hl
ld a, [hli]
ld h, [hl]
ld l, a
scf
ret
; 2674
ExecuteCallbackScript:: ; 2674
2015-11-05 12:08:00 -08:00
; Do map callback de and return to script bank b.
2017-12-24 09:47:30 -08:00
farcall CallCallback
2018-01-23 14:39:09 -08:00
ld a, [wScriptMode]
push af
2018-01-23 14:39:09 -08:00
ld hl, wScriptFlags
ld a, [hl]
push af
set 1, [hl]
2017-12-24 09:47:30 -08:00
farcall EnableScriptMode
farcall ScriptEvents
pop af
2018-01-23 14:39:09 -08:00
ld [wScriptFlags], a
pop af
2018-01-23 14:39:09 -08:00
ld [wScriptMode], a
ret
; 269a
MapTextbox:: ; 269a
ld a, [hROMBank]
push af
ld a, b
rst Bankswitch
push hl
call SpeechTextBox
call SafeUpdateSprites
ld a, 1
ld [hOAMUpdate], a
2015-11-25 07:16:29 -08:00
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 object c at b:hl
ld a, [hROMBank]
push af
ld a, b
rst Bankswitch
ld a, c
2015-11-11 20:38:57 -08:00
call LoadMovementDataPointer
pop hl
ld a, h
rst Bankswitch
ret
; 26d4
GetScriptByte:: ; 0x26d4
2018-01-23 14:39:09 -08:00
; Return byte at wScriptBank:wScriptPos in a.
push hl
push bc
ld a, [hROMBank]
push af
2018-01-23 14:39:09 -08:00
ld a, [wScriptBank]
rst Bankswitch
2018-01-23 14:39:09 -08:00
ld hl, wScriptPos
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
2013-12-01 14:54:09 -08:00
text_jump UnknownText_0x1c46fc
db "@"
; 26ff
CoordinatesEvent:: ; 26ff
jumptext CoordinatesEventText
; 2702
CoordinatesEventText:: ; 2702
2013-12-01 14:54:09 -08:00
text_jump UnknownText_0x1c4706
db "@"
; 2707
2015-11-01 18:17:46 -08:00
CheckObjectMask:: ; 2707
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
ld e, a
ld d, $0
2015-11-01 18:17:46 -08:00
ld hl, wObjectMasks
add hl, de
ld a, [hl]
ret
; 2712
2015-11-01 18:17:46 -08:00
MaskObject:: ; 2712
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
ld e, a
ld d, $0
2015-11-01 18:17:46 -08:00
ld hl, wObjectMasks
add hl, de
2016-01-06 04:44:50 -08:00
ld [hl], -1 ; , masked
ret
; 271e
2015-11-01 18:17:46 -08:00
UnmaskObject:: ; 271e
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
ld e, a
ld d, $0
2015-11-01 18:17:46 -08:00
ld hl, wObjectMasks
add hl, de
2015-11-01 18:17:46 -08:00
ld [hl], 0 ; unmasked
ret
; 272a
2015-11-12 21:49:27 -08:00
ScrollMapDown:: ; 272a
hlcoord 0, 0
2018-01-23 14:39:09 -08:00
ld de, wBGMapBuffer
2015-11-12 21:49:27 -08:00
call BackupBGMapRow
ld c, 2 * SCREEN_WIDTH
call FarCallScrollBGMapPalettes
ld a, [wBGMapAnchor]
ld e, a
ld a, [wBGMapAnchor + 1]
ld d, a
2015-11-12 21:49:27 -08:00
call UpdateBGMapRow
ld a, $1
ld [hBGMapUpdate], a
ret
; 2748
2015-11-12 21:49:27 -08:00
ScrollMapUp:: ; 2748
hlcoord 0, SCREEN_HEIGHT - 2
2018-01-23 14:39:09 -08:00
ld de, wBGMapBuffer
2015-11-12 21:49:27 -08:00
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
2017-12-28 04:32:33 -08:00
; cap d at HIGH(vBGMap0)
ld a, h
2015-11-12 21:49:27 -08:00
and %00000011
2017-12-28 04:32:33 -08:00
or HIGH(vBGMap0)
ld e, l
ld d, a
2015-11-12 21:49:27 -08:00
call UpdateBGMapRow
ld a, $1
ld [hBGMapUpdate], a
ret
; 2771
2015-12-13 17:33:56 -08:00
ScrollMapRight:: ; 2771
hlcoord 0, 0
2018-01-23 14:39:09 -08:00
ld de, wBGMapBuffer
2015-11-12 21:49:27 -08:00
call BackupBGMapColumn
ld c, 2 * SCREEN_HEIGHT
call FarCallScrollBGMapPalettes
ld a, [wBGMapAnchor]
ld e, a
ld a, [wBGMapAnchor + 1]
ld d, a
2015-11-12 21:49:27 -08:00
call UpdateBGMapColumn
ld a, $1
ld [hBGMapUpdate], a
ret
; 278f
2015-12-13 17:33:56 -08:00
ScrollMapLeft:: ; 278f
2015-11-12 21:49:27 -08:00
hlcoord SCREEN_WIDTH - 2, 0
2018-01-23 14:39:09 -08:00
ld de, wBGMapBuffer
2015-11-12 21:49:27 -08:00
call BackupBGMapColumn
ld c, 2 * SCREEN_HEIGHT
call FarCallScrollBGMapPalettes
ld a, [wBGMapAnchor]
ld e, a
2015-11-12 21:49:27 -08:00
and %11100000
ld b, a
ld a, e
2015-11-12 21:49:27 -08:00
add SCREEN_HEIGHT
and %00011111
or b
ld e, a
ld a, [wBGMapAnchor + 1]
ld d, a
2015-11-12 21:49:27 -08:00
call UpdateBGMapColumn
ld a, $1
ld [hBGMapUpdate], a
ret
; 27b7
2015-11-12 21:49:27 -08:00
BackupBGMapRow:: ; 27b7
ld c, 2 * SCREEN_WIDTH
.loop
ld a, [hli]
ld [de], a
inc de
dec c
2015-11-12 21:49:27 -08:00
jr nz, .loop
ret
; 27c0
2015-11-12 21:49:27 -08:00
BackupBGMapColumn:: ; 27c0
ld c, SCREEN_HEIGHT
.loop
ld a, [hli]
ld [de], a
inc de
ld a, [hl]
ld [de], a
inc de
2015-11-12 21:49:27 -08:00
ld a, SCREEN_WIDTH - 1
add l
ld l, a
2015-11-12 21:49:27 -08:00
jr nc, .skip
inc h
2015-11-12 21:49:27 -08:00
.skip
dec c
2015-11-12 21:49:27 -08:00
jr nz, .loop
ret
; 27d3
2015-11-12 21:49:27 -08:00
UpdateBGMapRow:: ; 27d3
2018-01-23 14:39:09 -08:00
ld hl, wBGMapBufferPtrs
push de
2015-11-12 21:49:27 -08:00
call .iteration
pop de
ld a, $20
add e
ld e, a
2015-11-12 21:49:27 -08:00
.iteration
ld c, 10
.loop
ld a, e
ld [hli], a
ld a, d
ld [hli], a
ld a, e
inc a
2016-01-06 04:44:50 -08:00
inc a
and $1f
ld b, a
ld a, e
and $e0
or b
ld e, a
dec c
2015-11-12 21:49:27 -08:00
jr nz, .loop
ld a, SCREEN_WIDTH
ld [hBGMapTileCount], a
ret
; 27f8
2015-11-12 21:49:27 -08:00
UpdateBGMapColumn:: ; 27f8
2018-01-23 14:39:09 -08:00
ld hl, wBGMapBufferPtrs
2015-11-12 21:49:27 -08:00
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
2015-11-12 21:49:27 -08:00
jr nc, .skip
inc d
2017-12-28 04:32:33 -08:00
; cap d at HIGH(vBGMap0)
ld a, d
2018-01-11 09:00:01 -08:00
and %11
2017-12-28 04:32:33 -08:00
or HIGH(vBGMap0)
ld d, a
2015-11-12 21:49:27 -08:00
.skip
dec c
2015-11-12 21:49:27 -08:00
jr nz, .loop
ld a, SCREEN_HEIGHT
ld [hBGMapTileCount], a
ret
; 2816
2018-01-02 07:04:21 -08:00
Unreferenced_Function2816::
2018-01-23 14:39:09 -08:00
ld hl, wBGMapBuffer
ld bc, wBGMapBufferEnd - wBGMapBuffer
xor a
call ByteFill
ret
; 2821
LoadTilesetGFX:: ; 2821
2018-01-23 14:39:09 -08:00
ld hl, wTilesetAddress
ld a, [hli]
ld h, [hl]
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wTilesetBank]
ld e, a
2015-11-12 21:49:27 -08:00
ld a, [rSVBK]
push af
ld a, BANK(wDecompressScratch)
ld [rSVBK], a
2015-11-12 21:49:27 -08:00
ld a, e
ld de, wDecompressScratch
call FarDecompress
2015-11-12 21:49:27 -08:00
ld hl, wDecompressScratch
2017-12-28 04:32:33 -08:00
ld de, vTiles2
2015-11-05 16:13:09 -08:00
ld bc, $60 tiles
call CopyBytes
2015-11-12 21:49:27 -08:00
ld a, [rVBK]
push af
ld a, $1
ld [rVBK], a
2015-11-12 21:49:27 -08:00
2017-12-09 11:22:58 -08:00
ld hl, wDecompressScratch + $60 tiles
2017-12-28 04:32:33 -08:00
ld de, vTiles2
2015-11-05 16:13:09 -08:00
ld bc, $60 tiles
call CopyBytes
2015-11-12 21:49:27 -08:00
pop af
ld [rVBK], a
2015-11-12 21:49:27 -08:00
pop af
ld [rSVBK], a
; These tilesets support dynamic per-mapgroup roof tiles.
2018-01-23 14:39:09 -08:00
ld a, [wMapTileset]
2018-01-17 11:50:34 -08:00
cp TILESET_JOHTO
2015-11-12 21:49:27 -08:00
jr z, .load_roof
2018-01-17 11:50:34 -08:00
cp TILESET_JOHTO_MODERN
2015-11-12 21:49:27 -08:00
jr z, .load_roof
cp TILESET_BATTLE_TOWER_OUTSIDE
jr z, .load_roof
jr .skip_roof
.load_roof
2017-12-24 09:47:30 -08:00
farcall LoadMapGroupRoof
2015-11-12 21:49:27 -08:00
.skip_roof
xor a
ld [hTileAnimFrame], a
ret
; 2879
BufferScreen:: ; 2879
2015-12-13 17:33:56 -08:00
ld hl, wOverworldMapAnchor
ld a, [hli]
ld h, [hl]
ld l, a
2015-12-14 08:12:18 -08:00
ld de, wScreenSave
ld c, $5
ld b, $6
2016-01-12 09:46:18 -08:00
.row
push bc
push hl
2016-01-12 09:46:18 -08:00
.col
ld a, [hli]
ld [de], a
inc de
dec b
2016-01-12 09:46:18 -08:00
jr nz, .col
pop hl
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
add $6
ld c, a
ld b, $0
add hl, bc
pop bc
dec c
2016-01-12 09:46:18 -08:00
jr nz, .row
ret
; 289d
SaveScreen:: ; 289d
2015-12-13 17:33:56 -08:00
ld hl, wOverworldMapAnchor
ld a, [hli]
ld h, [hl]
ld l, a
2015-12-14 08:12:18 -08:00
ld de, wScreenSave
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
2015-12-14 08:12:18 -08:00
add 6
2015-11-02 08:15:32 -08:00
ld [hMapObjectIndexBuffer], a
ld a, [wPlayerStepDirection]
and a
2015-11-12 21:49:27 -08:00
jr z, .down
cp UP
jr z, .up
cp LEFT
jr z, .left
cp RIGHT
jr z, .right
ret
2015-11-12 21:49:27 -08:00
.up
2015-12-14 08:12:18 -08:00
ld de, wScreenSave + 6
2015-11-02 08:15:32 -08:00
ld a, [hMapObjectIndexBuffer]
ld c, a
ld b, $0
add hl, bc
2015-11-12 21:49:27 -08:00
jr .vertical
2015-11-12 21:49:27 -08:00
.down
2015-12-14 08:12:18 -08:00
ld de, wScreenSave
2015-11-12 21:49:27 -08:00
.vertical
2015-12-14 08:12:18 -08:00
ld b, 6
ld c, 4
jr SaveScreen_LoadNeighbor
2015-11-12 21:49:27 -08:00
.left
2015-12-14 08:12:18 -08:00
ld de, wScreenSave + 1
inc hl
2015-11-12 21:49:27 -08:00
jr .horizontal
2015-11-12 21:49:27 -08:00
.right
2015-12-14 08:12:18 -08:00
ld de, wScreenSave
2015-11-12 21:49:27 -08:00
.horizontal
2015-12-14 08:12:18 -08:00
ld b, 5
ld c, 5
jr SaveScreen_LoadNeighbor
2014-01-26 19:07:19 -08:00
LoadNeighboringBlockData:: ; 28e3
2015-12-13 17:33:56 -08:00
ld hl, wOverworldMapAnchor
ld a, [hli]
ld h, [hl]
ld l, a
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
2015-12-14 08:12:18 -08:00
add 6
2015-11-12 21:49:27 -08:00
ld [hConnectionStripLength], a
2015-12-14 08:12:18 -08:00
ld de, wScreenSave
ld b, 6
ld c, 5
2015-12-14 08:12:18 -08:00
SaveScreen_LoadNeighbor:: ; 28f7
.row
push bc
push hl
push de
2015-12-14 08:12:18 -08:00
.col
ld a, [de]
inc de
ld [hli], a
dec b
2015-12-14 08:12:18 -08:00
jr nz, .col
pop de
ld a, e
2015-12-14 08:12:18 -08:00
add 6
ld e, a
2015-11-12 21:49:27 -08:00
jr nc, .okay
inc d
2015-11-12 21:49:27 -08:00
.okay
pop hl
2015-11-12 21:49:27 -08:00
ld a, [hConnectionStripLength]
ld c, a
2015-12-14 08:12:18 -08:00
ld b, 0
add hl, bc
pop bc
dec c
2015-12-14 08:12:18 -08:00
jr nz, .row
ret
; 2914
2015-11-19 15:07:20 -08:00
GetMovementPermissions:: ; 2914
xor a
2018-01-23 14:39:09 -08:00
ld [wTilePermissions], a
2016-01-06 04:44:50 -08:00
call .LeftRight
call .UpDown
2015-11-12 21:49:27 -08:00
; get coords of current tile
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapX]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapY]
ld e, a
2015-11-12 21:49:27 -08:00
call GetCoordTile
2018-01-23 14:39:09 -08:00
ld [wPlayerStandingTile], a
2016-01-06 04:44:50 -08:00
call .CheckHiNybble
ret nz
2015-11-12 21:49:27 -08:00
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingTile]
and 7
2016-01-06 04:44:50 -08:00
ld hl, .MovementPermissionsData
add l
ld l, a
ld a, 0
adc h
ld h, a
ld a, [hl]
2018-01-23 14:39:09 -08:00
ld hl, wTilePermissions
or [hl]
ld [hl], a
ret
; 2945
.MovementPermissionsData: ; 2945
db DOWN_MASK
db UP_MASK
db LEFT_MASK
db RIGHT_MASK
db DOWN_MASK | RIGHT_MASK
db UP_MASK | RIGHT_MASK
db DOWN_MASK | LEFT_MASK
db UP_MASK | LEFT_MASK
; 294d
.UpDown:
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapX]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapY]
ld e, a
2015-11-12 21:49:27 -08:00
push de
inc e
2015-11-12 21:49:27 -08:00
call GetCoordTile
2018-01-23 14:39:09 -08:00
ld [wTileDown], a
2016-01-06 04:44:50 -08:00
call .Down
2015-11-12 21:49:27 -08:00
pop de
dec e
2015-11-12 21:49:27 -08:00
call GetCoordTile
2018-01-23 14:39:09 -08:00
ld [wTileUp], a
2016-01-06 04:44:50 -08:00
call .Up
ret
; 296c
.LeftRight:
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapX]
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapY]
ld e, a
2015-11-12 21:49:27 -08:00
push de
dec d
2015-11-12 21:49:27 -08:00
call GetCoordTile
2018-01-23 14:39:09 -08:00
ld [wTileLeft], a
2016-01-06 04:44:50 -08:00
call .Left
2015-11-12 21:49:27 -08:00
pop de
inc d
2015-11-12 21:49:27 -08:00
call GetCoordTile
2018-01-23 14:39:09 -08:00
ld [wTileRight], a
2016-01-06 04:44:50 -08:00
call .Right
ret
; 298b
.Down:
2016-01-06 04:44:50 -08:00
call .CheckHiNybble
ret nz
2018-01-23 14:39:09 -08:00
ld a, [wTileDown]
2015-11-12 21:49:27 -08:00
and 7
cp $2
2016-01-06 04:44:50 -08:00
jr z, .ok_down
cp $6
2016-01-06 04:44:50 -08:00
jr z, .ok_down
cp $7
ret nz
2016-01-06 04:44:50 -08:00
.ok_down
2018-01-23 14:39:09 -08:00
ld a, [wTilePermissions]
2015-11-12 21:49:27 -08:00
or FACE_DOWN
2018-01-23 14:39:09 -08:00
ld [wTilePermissions], a
ret
; 29a8
.Up:
2016-01-06 04:44:50 -08:00
call .CheckHiNybble
ret nz
2018-01-23 14:39:09 -08:00
ld a, [wTileUp]
2015-11-12 21:49:27 -08:00
and 7
cp $3
2016-01-06 04:44:50 -08:00
jr z, .ok_up
cp $4
2016-01-06 04:44:50 -08:00
jr z, .ok_up
cp $5
ret nz
2016-01-06 04:44:50 -08:00
.ok_up
2018-01-23 14:39:09 -08:00
ld a, [wTilePermissions]
2015-11-12 21:49:27 -08:00
or FACE_UP
2018-01-23 14:39:09 -08:00
ld [wTilePermissions], a
ret
; 29c5
.Right:
2016-01-06 04:44:50 -08:00
call .CheckHiNybble
ret nz
2018-01-23 14:39:09 -08:00
ld a, [wTileRight]
2015-11-12 21:49:27 -08:00
and 7
cp $1
2016-01-06 04:44:50 -08:00
jr z, .ok_right
cp $5
2016-01-06 04:44:50 -08:00
jr z, .ok_right
cp $7
ret nz
2016-01-06 04:44:50 -08:00
.ok_right
2018-01-23 14:39:09 -08:00
ld a, [wTilePermissions]
2015-11-12 21:49:27 -08:00
or FACE_RIGHT
2018-01-23 14:39:09 -08:00
ld [wTilePermissions], a
ret
; 29e2
.Left:
2016-01-06 04:44:50 -08:00
call .CheckHiNybble
ret nz
2018-01-23 14:39:09 -08:00
ld a, [wTileLeft]
2015-11-12 21:49:27 -08:00
and 7
cp $0
2016-01-06 04:44:50 -08:00
jr z, .ok_left
cp $4
2016-01-06 04:44:50 -08:00
jr z, .ok_left
cp $6
ret nz
2016-01-06 04:44:50 -08:00
.ok_left
2018-01-23 14:39:09 -08:00
ld a, [wTilePermissions]
2015-11-12 21:49:27 -08:00
or FACE_LEFT
2018-01-23 14:39:09 -08:00
ld [wTilePermissions], 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.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerDirection]
and %1100
srl a
srl a
ld l, a
ld h, 0
2016-01-06 04:44:50 -08:00
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
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapX]
add d
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapY]
add e
ld e, a
ld a, [hl]
ret
.Directions:
; x, y
db 0, 1
2018-01-23 14:39:09 -08:00
dw wTileDown
db 0, -1
2018-01-23 14:39:09 -08:00
dw wTileUp
db -1, 0
2018-01-23 14:39:09 -08:00
dw wTileLeft
db 1, 0
2018-01-23 14:39:09 -08:00
dw wTileRight
; 2a3c
2015-11-12 21:49:27 -08:00
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
2016-01-06 04:44:50 -08:00
add hl, hl
add hl, hl
2018-01-23 14:39:09 -08:00
ld a, [wTilesetCollisionAddress]
ld c, a
2018-01-23 14:39:09 -08:00
ld a, [wTilesetCollisionAddress + 1]
ld b, a
add hl, bc
rr d
jr nc, .nocarry
inc hl
.nocarry
rr e
jr nc, .nocarry2
inc hl
2016-01-06 04:44:50 -08:00
inc hl
.nocarry2
2018-01-23 14:39:09 -08:00
ld a, [wTilesetCollisionBank]
call GetFarByte
ret
.nope
ld a, -1
ret
; 2a66
GetBlockLocation:: ; 2a66
2018-01-23 14:39:09 -08:00
ld a, [wMapWidth]
add 6
ld c, a
ld b, 0
2018-01-23 14:39:09 -08:00
ld hl, wOverworldMap + 1
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
CheckFacingBGEvent:: ; 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 BG events, we don't need to be here.
ld a, [wCurrMapBGEventCount]
and a
ret z
2015-11-12 08:10:19 -08:00
ld c, a
ld a, [hROMBank]
push af
call SwitchToMapScriptsBank
call CheckIfFacingTileCoordIsBGEvent
pop hl
ld a, h
rst Bankswitch
ret
; 2aaa
CheckIfFacingTileCoordIsBGEvent:: ; 2aaa
2018-01-23 14:39:09 -08:00
; Checks to see if you are facing a BG event. If so, copies it into wEngineBuffer1 and sets carry.
ld hl, wCurrMapBGEventsPointer
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 ; BG event 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, wCurBGEventYCoord
ld bc, 5 ; BG event event length
call CopyBytes
scf
ret
; 2ad4
CheckCurrentMapCoordEvents:: ; 2ad4
; If there are no coord events, we don't need to be here.
ld a, [wCurrMapCoordEventCount]
and a
ret z
; Copy the coord event count into c.
ld c, a
ld a, [hROMBank]
push af
call SwitchToMapScriptsBank
call .CoordEventCheck
pop hl
ld a, h
rst Bankswitch
ret
.CoordEventCheck:
2018-01-23 14:39:09 -08:00
; Checks to see if you are standing on a coord event. If yes, copies the event to wEngineBuffer1 and sets carry.
ld hl, wCurrMapCoordEventsPointer
ld a, [hli]
ld h, [hl]
ld l, a
; Load the active scene ID into b
call CheckScenes
ld b, a
; Load your current coordinates into de. This will be used to check if your position is in the coord event table for the current map.
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapX]
sub 4
ld d, a
2018-01-23 14:39:09 -08:00
ld a, [wPlayerStandingMapY]
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 .copy_coord_event
.next
pop hl
ld a, $8 ; coord event size
add l
ld l, a
jr nc, .nocarry
inc h
.nocarry
dec c
jr nz, .loop
xor a
ret
.copy_coord_event
pop hl
ld de, wCurCoordEventSceneID
ld bc, 8 ; coord event size
call CopyBytes
scf
ret
; 2b29
FadeToMenu:: ; 2b29
xor a
ld [hBGMapMode], a
2015-11-11 13:11:08 -08:00
call LoadStandardMenuDataHeader
2018-01-02 08:13:57 -08:00
farcall Special_FadeOutPalettes
call ClearSprites
2015-10-24 07:34:19 -07:00
call DisableSpriteUpdates
ret
; 2b3c
CloseSubmenu:: ; 2b3c
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
2015-12-18 17:07:09 -08:00
call ReloadTilesetAndPalettes
call UpdateSprites
2015-09-09 16:27:07 -07:00
call Call_ExitMenu
2015-12-09 08:38:40 -08:00
call ret_d90
2016-01-06 04:44:50 -08:00
jr FinishExitMenu
; 2b4d
2015-11-17 14:56:49 -08:00
ExitAllMenus:: ; 2b4d
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
2015-09-09 16:27:07 -07:00
call Call_ExitMenu
2015-12-18 17:07:09 -08:00
call ReloadTilesetAndPalettes
call UpdateSprites
2015-12-09 08:38:40 -08:00
call ret_d90
2016-01-06 04:44:50 -08:00
FinishExitMenu:: ; 2b5c
ld b, SCGB_MAPPALS
call GetSGBLayout
2017-12-24 09:47:30 -08:00
farcall LoadOW_BGPal7
2015-12-11 13:59:40 -08:00
call WaitBGMap2
2018-01-02 08:13:57 -08:00
farcall Special_FadeInPalettes
2015-10-24 07:34:19 -07:00
call EnableSpriteUpdates
ret
; 2b74
2015-12-18 17:07:09 -08:00
ReturnToMapWithSpeechTextbox:: ; 0x2b74
push af
ld a, $1
2015-11-25 07:16:29 -08:00
ld [wSpriteUpdatesEnabled], a
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
call ClearSprites
2015-12-18 17:07:09 -08:00
call ReloadTilesetAndPalettes
hlcoord 0, 12
2015-11-05 11:06:03 -08:00
lb bc, 4, 18
call TextBox
2018-01-23 14:39:09 -08:00
ld hl, wVramState
set 0, [hl]
call UpdateSprites
2015-12-11 13:59:40 -08:00
call WaitBGMap2
ld b, SCGB_MAPPALS
call GetSGBLayout
2017-12-24 09:47:30 -08:00
farcall LoadOW_BGPal7
call UpdateTimePals
call DelayFrame
ld a, $1
2015-11-05 11:06:03 -08:00
ld [hMapAnims], a
pop af
ret
; 0x2bae
2015-12-18 17:07:09 -08:00
ReloadTilesetAndPalettes:: ; 2bae
call DisableLCD
call ClearSprites
farcall Special_RefreshSprites
2015-11-04 13:14:27 -08:00
call LoadStandardFont
call LoadFontsExtra
ld a, [hROMBank]
push af
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
ld c, a
call SwitchToAnyMapDataBank
2017-12-24 09:47:30 -08:00
farcall UpdateTimeOfDayPal
2015-11-11 11:12:46 -08:00
call OverworldTextModeSwitch
call LoadTilesetGFX
2014-05-21 13:21:46 -07:00
ld a, 9
call SkipMusic
pop af
rst Bankswitch
call EnableLCD
ret
; 2be5
GetMapDefPointer:: ; 2be5
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
ld c, a
GetAnyMapDefPointer:: ; 0x2bed
; Prior to calling this function, you must have switched banks so that
; MapGroupPointers is visible.
; inputs:
; b = map group, c = map number
; outputs:
; hl points to the map_def
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
2016-01-06 04:44:50 -08:00
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
pop bc ; restore map number
; find the cth map_def
dec c
ld b, 0
ld a, 9
call AddNTimes
ret
; 0x2c04
GetMapDefField:: ; 0x2c04
; Extract data from the current map's map_def.
; inputs:
; de = offset of desired data within the map_def (a MAPDEF_* constant)
; outputs:
; bc = data from the current map's map_def
; (e.g., de = MAPDEF_TILESET would return a pointer to the tileset id)
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
ld c, a
GetAnyMapDefField:: ; 0x2c0c
; bankswitch
ld a, [hROMBank]
push af
ld a, BANK(MapGroupPointers)
rst Bankswitch
call GetAnyMapDefPointer
add hl, de
ld c, [hl]
inc hl
ld b, [hl]
; bankswitch back
pop af
rst Bankswitch
ret
; 0x2c1c
SwitchToMapDataBank:: ; 2c1c
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
ld c, a
SwitchToAnyMapDataBank:: ; 2c24
call GetAnyMapDataBank
rst Bankswitch
ret
; 2c29
GetMapDataBank:: ; 2c29
2018-01-23 14:39:09 -08:00
ld a, [wMapGroup]
ld b, a
2018-01-23 14:39:09 -08:00
ld a, [wMapNumber]
ld c, a
GetAnyMapDataBank:: ; 2c31
push hl
push de
ld de, MAPDEF_MAPDATA_BANK
call GetAnyMapDefField
ld a, c
pop de
pop hl
ret
; 2c3d
PartialCopyMapDef:: ; 2c3d
; Copy map data bank, tileset, environment, and map data address
; from the current map's map_def.
ld a, [hROMBank]
push af
2014-12-26 15:31:48 -08:00
ld a, BANK(MapGroupPointers)
rst Bankswitch
2015-11-12 08:10:19 -08:00
call GetMapDefPointer
ld de, wPartialMapDef
ld bc, wPartialMapDefEnd - wPartialMapDef
call CopyBytes
2015-11-12 08:10:19 -08:00
pop af
rst Bankswitch
ret
; 2c52
SwitchToMapScriptsBank:: ; 2c52
2018-01-23 14:39:09 -08:00
ld a, [wMapScriptsBank]
rst Bankswitch
ret
; 2c57
GetMapScriptsBank:: ; 2c57
2018-01-23 14:39:09 -08:00
ld a, [wMapScriptsBank]
ret
; 2c5b
GetAnyMapBlocksBank:: ; 2c5b
; Return the blockdata bank for group b map c.
push hl
push de
push bc
push bc
ld de, MAPDEF_MAPDATA
call GetAnyMapDefField
ld l, c
ld h, b
pop bc
push hl
ld de, MAPDEF_MAPDATA_BANK
call GetAnyMapDefField
pop hl
ld de, MAPDEF_MAPDATA ; blockdata bank
add hl, de
ld a, c
call GetFarByte
rst Bankswitch
pop bc
pop de
pop hl
ret
; 2c7d
GetMapDataPointer:: ; 0x2c7d
; returns the current map's data pointer in hl.
push bc
push de
ld de, MAPDEF_MAPDATA
call GetMapDefField
ld l, c
ld h, b
pop de
pop bc
ret
; 2c8a
GetMapEnvironment:: ; 2c8a
push hl
push de
push bc
ld de, MAPDEF_ENVIRONMENT
call GetMapDefField
ld a, c
pop bc
pop de
pop hl
ret
; 2c98
ret ; unused
; 2c99
GetAnyMapEnvironment:: ; 2c99
push hl
push de
push bc
ld de, MAPDEF_ENVIRONMENT
call GetAnyMapDefField
ld a, c
pop bc
pop de
pop hl
ret
; 2ca7
GetAnyMapTileset:: ; 2ca7
ld de, MAPDEF_TILESET
call GetAnyMapDefField
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
2015-11-12 08:10:19 -08:00
ld de, MAPDEF_LOCATION
call GetAnyMapDefField
ld a, c
2015-11-12 08:10:19 -08:00
pop bc
pop de
pop hl
ret
; 0x2cbd
GetMapMusic:: ; 2cbd
push hl
push bc
ld de, MAPDEF_MUSIC
call GetMapDefField
ld a, c
2014-05-21 13:21:46 -07:00
cp MUSIC_MAHOGANY_MART
jr z, .mahoganymart
2017-12-10 17:50:08 -08:00
bit RADIO_TOWER_MUSIC_F, c
2014-05-21 13:21:46 -07:00
jr nz, .radiotower
2017-12-24 09:47:30 -08:00
farcall Function8b342
ld e, c
2014-05-21 13:21:46 -07:00
ld d, 0
.done
pop bc
pop hl
ret
2014-05-21 13:21:46 -07:00
.radiotower
ld a, [wStatusFlags2]
bit 0, a
2014-05-21 13:21:46 -07:00
jr z, .clearedradiotower
ld de, MUSIC_ROCKET_OVERTURE
jr .done
2014-05-21 13:21:46 -07:00
.clearedradiotower
; the rest of the byte
ld a, c
2017-12-10 17:50:08 -08:00
and RADIO_TOWER_MUSIC - 1
ld e, a
2014-05-21 13:21:46 -07:00
ld d, 0
jr .done
2014-05-21 13:21:46 -07:00
.mahoganymart
ld a, [wStatusFlags2]
bit 7, a
2014-05-21 13:21:46 -07:00
jr z, .clearedmahogany
ld de, MUSIC_ROCKET_HIDEOUT
jr .done
2014-05-21 13:21:46 -07:00
.clearedmahogany
ld de, MUSIC_CHERRYGROVE_CITY
jr .done
; 2cff
GetMapTimeOfDay:: ; 2cff
call GetPhoneServiceTimeOfDayByte
and $f
ret
; 2d05
GetMapPhoneService:: ; 2d05
call GetPhoneServiceTimeOfDayByte
and $f0
swap a
ret
; 2d0d
GetPhoneServiceTimeOfDayByte:: ; 2d0d
push hl
push bc
2015-11-12 08:10:19 -08:00
ld de, MAPDEF_PALETTE
call GetMapDefField
ld a, c
2015-11-12 08:10:19 -08:00
pop bc
pop hl
ret
; 2d19
2015-11-12 08:10:19 -08:00
GetFishingGroup:: ; 2d19
push de
push hl
push bc
2015-11-12 08:10:19 -08:00
ld de, MAPDEF_FISHGROUP
call GetMapDefField
ld a, c
2015-11-12 08:10:19 -08:00
pop bc
pop hl
pop de
ret
; 2d27
LoadTileset:: ; 2d27
push hl
push bc
2013-12-11 14:23:33 -08:00
ld hl, Tilesets
2018-01-23 14:39:09 -08:00
ld bc, wTilesetEnd - wTileset
ld a, [wMapTileset]
call AddNTimes
2013-12-11 14:23:33 -08:00
2018-01-23 14:39:09 -08:00
ld de, wTilesetBank
ld bc, wTilesetEnd - wTileset
2013-12-11 14:23:33 -08:00
ld a, BANK(Tilesets)
call FarCopyBytes
2013-12-11 14:23:33 -08:00
pop bc
pop hl
ret
; 2d43