pokegold-spaceworld/home/overworld.asm
2025-12-12 20:22:47 -06:00

187 lines
3.7 KiB
NASM

INCLUDE "constants.asm"
SECTION "home/overworld.asm@Startmenu and Select Button Check", ROM0
OverworldStartButtonCheck::
ldh a, [hJoyState]
bit START_F, a
ret z
and (START | B_BUTTON)
cp (START | B_BUTTON)
jr nz, .regularMenu
ld a, [wDebugFlags]
bit DEBUG_FIELD_F, a
ret z ; debug disabled
farcall FieldDebugMenu
jr CheckStartmenuSelectHook
.regularMenu
farcall DisplayStartMenu
jr CheckStartmenuSelectHook
SelectButtonFunction::
callfar CheckRegisteredItem
CheckStartmenuSelectHook:
ldh a, [hStartmenuCloseAndSelectHookEnable]
and a
ret z ; hook is disabled
ld hl, wQueuedScriptAddr
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wQueuedScriptBank]
call FarCall_hl
ld hl, hStartmenuCloseAndSelectHookEnable
xor a
ld [hli], a ; clear hook enable and ???
ld [hl], a
dec a
ret
; Runs the code for all map objects that move, and stays in a loop as long as the player is moving.
HandleMapObjects::
.loop
call .HandleMapObjects
and a
ld a, [wPlayerStepFlags]
bit PLAYERSTEP_CONTINUE_F, a
ret z
bit PLAYERSTEP_STOP_F, a
jr z, .loop
scf
ret
.HandleMapObjects:
ldh a, [hROMBank]
push af
ld a, BANK(HandleNPCStep)
call Bankswitch
call HandleNPCStep
call LoadMinorObjectGFX
ld a, BANK(_HandlePlayerStep)
call Bankswitch
call _HandlePlayerStep
ld a, BANK(InitSprites)
call Bankswitch
call InitSprites
call DelayFrame
call UpdateToolgear
ld hl, wToolgearFlags
set 2, [hl]
call DelayFrame
pop af
call Bankswitch
ret
UpdateAndTransferToolgear:
call DelayFrame
call UpdateToolgear
ld hl, wToolgearFlags
set 2, [hl] ; transfer toolgear to window
call DelayFrame
ret
ScheduleNorthRowRedraw:
coord hl, 0, 0
call CopyToRedrawRowOrColumnSrcTiles
ld a, [wBGMapAnchor]
ldh [hRedrawRowOrColumnDest], a
ld a, [wBGMapAnchor + 1]
ldh [hRedrawRowOrColumnDest + 1], a
ld a, REDRAW_ROW
ldh [hRedrawRowOrColumnMode], a
ret
ScheduleSouthRowRedraw:
coord hl, 0, SCREEN_HEIGHT - 2
call CopyToRedrawRowOrColumnSrcTiles
ld a, [wBGMapAnchor]
ld l, a
ld a, [wBGMapAnchor + 1]
ld h, a
ld bc, BG_MAP_WIDTH * (SCREEN_HEIGHT - 2)
add hl, bc
; the following 4 lines wrap us from bottom to top if necessary
ld a, h
and HIGH(vBGMap1 - vBGMap0 - $01)
or HIGH(vBGMap0)
ldh [hRedrawRowOrColumnDest + 1], a
ld a, l
ldh [hRedrawRowOrColumnDest], a
ld a, REDRAW_ROW
ldh [hRedrawRowOrColumnMode], a
ret
ScheduleEastColumnRedraw:
coord hl, SCREEN_WIDTH - 2, 0
call ScheduleColumnRedrawHelper
ld a, [wBGMapAnchor]
ld c, a
and ($FF ^ (BG_MAP_WIDTH - 1)) ; mask upper address bits
ld b, a
ld a, c
add SCREEN_WIDTH - 2
and BG_MAP_WIDTH - 1 ; mask lower address bits
or b
ldh [hRedrawRowOrColumnDest], a
ld a, [wBGMapAnchor + 1]
ldh [hRedrawRowOrColumnDest + 1], a
ld a, REDRAW_COL
ldh [hRedrawRowOrColumnMode], a
ret
ScheduleWestColumnRedraw:
coord hl, 0, 0
call ScheduleColumnRedrawHelper
ld a, [wBGMapAnchor]
ldh [hRedrawRowOrColumnDest], a
ld a, [wBGMapAnchor + 1]
ldh [hRedrawRowOrColumnDest + 1], a
ld a, REDRAW_COL
ldh [hRedrawRowOrColumnMode], a
ret
CopyToRedrawRowOrColumnSrcTiles:
ld de, wRedrawRowOrColumnSrcTiles
ld c, 2 * SCREEN_WIDTH
.loop
ld a, [hli]
ld [de], a
inc de
dec c
jr nz, .loop
ret
ScheduleColumnRedrawHelper:
ld de, wRedrawRowOrColumnSrcTiles
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, .noCarry
inc h
.noCarry
dec c
jr nz, .loop
ret
SECTION "home/overworld.asm@QueueScript", ROM0
QueueScript::
; Install a function that is called as soon as
; the start menu is closed or directly after
; the select button function ran
ld [wQueuedScriptBank], a
ld a, l
ld [wQueuedScriptAddr], a
ld a, h
ld [wQueuedScriptAddr + 1], a
ret