Implement View Map mode [commit 1] (#29)

This commit is contained in:
xCrystal
2023-10-31 20:25:56 +01:00
parent 85f9c258b5
commit 147c9f2add
12 changed files with 207 additions and 22 deletions

View File

@@ -8,10 +8,15 @@ BoardMenuScript::
ifequal BOARDMENUITEM_PACK, .Pack
ifequal BOARDMENUITEM_POKEGEAR, .Pokegear
ifequal BOARDMENUITEM_EXIT, .Exit
ifequal BOARDMENUITEM_VIEWMAP, .ViewMap
closetext
end
.Upkeep:
; skip upkeep if we are re-entering after returning from View Map mode
ld a, [hCurBoardEvent]
cp BOARDEVENT_REDISPLAY_MENU
ret z
; save after opentext to reanchor map first
; save before processing variables like wCurTurn due to BoardMenuScript reentry after game reset
farcall AutoSaveGameInOverworld
@@ -68,6 +73,34 @@ BoardMenuScript::
text ""
done
.ViewMap:
callasm .EnterViewMapMode
closetext
end
.EnterViewMapMode:
ld hl, wVramState
res 2, [hl]
ld a, BOARDEVENT_VIEW_MAP_MODE
ldh [hCurBoardEvent], a
ld a, TRUE
ld [wViewMapModeRange], a
ld a, [wMapGroup]
ld [wBeforeViewMapMapGroup], a
ld a, [wMapNumber]
ld [wBeforeViewMapMapNumber], a
ld a, [wXCoord]
ld [wBeforeViewMapXCoord], a
ld a, [wYCoord]
ld [wBeforeViewMapYCoord], a
xor a
ld [wViewMapModeDisplacementY], a
ld [wViewMapModeDisplacementX], a
call DisableOverworldHUD
ld hl, wPlayerFlags
set INVISIBLE_F, [hl]
ret
.SubmenuCallback:
; if submenu has requested a callback through wMenuReturn,
; it has also taken care of queuing it into wQueuedScriptBank/wQueuedScriptAddr.
@@ -163,6 +196,8 @@ GetBoardMenuSelection:
call GetMenuJoypad
bit A_BUTTON_F, a
jr nz, .a_button
bit SELECT_F, a
jr nz, .select_button
bit D_RIGHT_F, a
jr nz, .d_right
bit D_LEFT_F, a
@@ -176,6 +211,14 @@ GetBoardMenuSelection:
scf
ret
.select_button
ld a, BOARDMENUITEM_VIEWMAP
ld [wBoardMenuCursorPosition], a
call PlayClickSFX
call WaitSFX
scf
ret
.d_right
call PlayClickSFX
ld a, [wBoardMenuCursorPosition]

View File

@@ -331,9 +331,11 @@ CheckBoardEvent:
.Jumptable:
table_width 2, .Jumptable
dw .none
dw .menu ; BOARDEVENT_DISPLAY_MENU
dw .board ; BOARDEVENT_HANDLE_BOARD
dw .none ; BOARDEVENT_END_TURN
dw .menu ; BOARDEVENT_DISPLAY_MENU
dw .board ; BOARDEVENT_HANDLE_BOARD
dw .none ; BOARDEVENT_END_TURN
dw .mapview ; BOARDEVENT_VIEW_MAP_MODE
dw .menu ; BOARDEVENT_REDISPLAY_MENU
assert_table_length NUM_BOARD_EVENTS + 1
.none
@@ -369,6 +371,25 @@ CheckBoardEvent:
scf
ret
.mapview
; check if player pressed B and if so queue the script to exit View Map mode
ldh a, [hJoyDown]
and D_PAD
ret nz ; nc
ldh a, [hJoyPressed]
bit B_BUTTON_F, a
ret z ; nc
; B was pressed
ld a, BANK(.ExitMapViewModeScript)
ld hl, .ExitMapViewModeScript
call CallScript
scf
ret
.ExitMapViewModeScript:
reloadmapafterviewmapmode
end
.no_space_effect
; continue moving in board
xor a
@@ -389,6 +410,10 @@ CheckBoardEvent:
assert_table_length NUM_COLL_SPACES
CheckTrainerEvent:
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z
call CheckTrainerBattle
jr nc, .nope
@@ -409,10 +434,18 @@ CheckTileEvent:
farcall CheckMovingOffEdgeOfMap
jr c, .map_connection
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z
call CheckWarpTile
jr c, .warp_tile
.connections_disabled
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z
call CheckCoordEventScriptFlag
jr z, .coord_events_disabled
@@ -488,6 +521,10 @@ SetMinTwoStepWildEncounterCooldown: ; unreferenced
ret
RunSceneScript:
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z
ld a, [wCurMapSceneScriptCount]
and a
jr z, .nope
@@ -536,6 +573,10 @@ endr
ret
CheckTimeEvents:
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z
ld a, [wLinkMode]
and a
jr nz, .nothing
@@ -572,10 +613,12 @@ OWPlayerInput:
and a
jr nz, .NoAction
; Can't perform button actions while in BOARDEVENT_HANDLE_BOARD
; Can't perform button actions while in BOARDEVENT_HANDLE_BOARD or BOARDEVENT_VIEW_MAP_MODE
ld a, [hCurBoardEvent]
cp BOARDEVENT_HANDLE_BOARD
jr z, .NoAction
cp BOARDEVENT_VIEW_MAP_MODE
jr z, .NoAction
; Can't perform button actions while sliding on ice.
farcall CheckStandingOnIce
@@ -1121,6 +1164,9 @@ WarpToSpawnPoint::
ret
RunMemScript::
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z
; If there is no script here, we don't need to be here.
ld a, [wMapReentryScriptQueueFlag]
and a

View File

@@ -87,6 +87,11 @@ UpdatePlayerCoords:
jr nz, .check_step_down
ld hl, wYCoord
inc [hl]
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementY
inc [hl]
ret
.check_step_down
@@ -94,6 +99,11 @@ UpdatePlayerCoords:
jr nz, .check_step_left
ld hl, wYCoord
dec [hl]
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementY
dec [hl]
ret
.check_step_left
@@ -101,6 +111,11 @@ UpdatePlayerCoords:
jr nz, .check_step_right
ld hl, wXCoord
dec [hl]
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementX
dec [hl]
ret
.check_step_right
@@ -108,6 +123,11 @@ UpdatePlayerCoords:
ret nz
ld hl, wXCoord
inc [hl]
ld a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret nz
ld hl, wViewMapModeDisplacementX
inc [hl]
ret
UpdateOverworldMap:

View File

@@ -235,6 +235,7 @@ ScriptCommandTable:
dw Script_wait ; a8
dw Script_checksave ; a9
dw Script_exitoverworld ; aa
dw Script_reloadmapafterviewmapmode ; db
assert_table_length NUM_EVENT_COMMANDS
StartScript:
@@ -1203,6 +1204,22 @@ Script_reloadmapafterbattle:
.done
jp Script_reloadmap
Script_reloadmapafterviewmapmode:
xor a
ld [wBattleScriptFlags], a
ld a, MAPSETUP_EXITVIEWMAP
ldh [hMapEntryMethod], a
ld a, SPAWN_FROM_RAM
ld [wDefaultSpawnpoint], a
ld a, BOARDEVENT_REDISPLAY_MENU
ldh [hCurBoardEvent], a
ld a, MAPSTATUS_ENTER
call LoadMapStatus
ld hl, wPlayerFlags
res INVISIBLE_F, [hl]
call StopScript
ret
Script_reloadmap:
xor a
ld [wBattleScriptFlags], a

View File

@@ -7,6 +7,8 @@ EnterMapSpawnPoint:
ld a, [wDefaultSpawnpoint]
cp SPAWN_N_A
jr z, .spawn_n_a
cp SPAWN_FROM_RAM
jr z, .spawn_from_ram
ld l, a
ld h, 0
add hl, hl
@@ -21,6 +23,20 @@ EnterMapSpawnPoint:
ld [wXCoord], a
ld a, [hli]
ld [wYCoord], a
pop de
pop hl
ret
.spawn_from_ram
; exiting from View Map mode
ld a, [wBeforeViewMapMapGroup]
ld [wMapGroup], a
ld a, [wBeforeViewMapMapNumber]
ld [wMapNumber], a
ld a, [wBeforeViewMapXCoord]
ld [wXCoord], a
ld a, [wBeforeViewMapYCoord]
ld [wYCoord], a
.spawn_n_a
pop de
pop hl