mirror of
https://gitlab.com/xCrystal/pokecrystal-board.git
synced 2024-11-16 11:27:33 -08:00
6.9 KiB
Executable File
6.9 KiB
Executable File
Overworld workflow
OverworldLoop
is called fromGameMenu_World
with eitherhMapEntryMethod
=MAPSETUP_ENTERLEVEL
orhMapEntryMethod
=MAPSETUP_CONTINUE
.StartMap
resetswCurTurn
andwCurSpace
ifMAPSETUP_ENTERLEVEL
.StartMap
setshCurBoardEvent
toBOARDEVENT_DISPLAY_MENU
.wEnabledPlayerEvents
is cleared.wMapStatus
is set toMAPSTATUS_HANDLE
causingHandleMap
to be called.MapEvents
(fromHandleMap
) callsPlayerEvents
.CheckBoardEvent
queuesBoardMenuScript
which is executed byScriptEvents
.BoardMenuScript.Upkeep
saves the game, clearswTurnData[]
, increaseswCurTurn
, and loads current space towCurSpaceStruct[]
.- If player exits, the
exitoverworld
script setswMapStatus
toMAPSTATUS_DONE
. This causesOverworldLoop
to return back to the game menu. Exit this workflow.
- If player exits, the
- Player rolls die and the animation plays. After the animation,
wDisplaySecondarySprites.SECONDARYSPRITES_SPACES_LEFT_F
is set andhCurBoardEvent
is set toBOARDEVENT_HANDLE_BOARD
. At the end of thisHandleMap
iteration,CheckPlayerState
setswMapEventStatus
toMAPEVENTS_ON
(wEnabledPlayerEvents
is not touched so it remains cleared). - In the next
HandleMap
iteration,CheckBoardEvent
fromPlayerEvents
jumps to.board
and then to.no_space_effect
due towEnabledPlayerEvents[4]
not being set. - Execution continues in
PlayerEvents
;OWPlayerInput
is eventually called, and thusDoPlayerMovement
. Here,StepTowardsNextSpace
computes based onwCurSpaceNextSpace
what direction key to write towCurInput
, causing the player to begin a movement in that direction. - The player may need to turn to a different direction through the
ChangeDirectionScript
(whenDoPlayerMovement
returns withPLAYERMOVEMENT_TURN
). Otherwise or after that,CheckPlayerState
setswMapEventStatus
toMAPEVENTS_OFF
, - When the step finishes (i.e.
PLAYERSTEP_STOP_F
becomes set) in someHandleMap
iteration,CheckPlayerState
setswEnabledPlayerEvents
to $ff andwMapEventStatus
toMAPEVENTS_ON
. - In the next
HandleMap
iteration,CheckBoardEvent.board
is called withwEnabledPlayerEvents[4]
set.- If
wCurSpaceNextSpace
matchesNEXT_SPACE_IS_ANCHOR_POINT
: If player is at a tile with an anchor event,wCurSpaceNextSpace
is updated with the next space byte of salid anchor event.wEnabledPlayerEvents[4]
is reset. Go back to 7. - If player is not above a tile (
wPlayerTileCollision
) with a space collision:wEnabledPlayerEvents[4]
is reset. Go back to 7. - If player is above a tile, the corresponding space script is queued to be executed by
ScriptEvents
in the currentHandleMap
iteration.wEnabledPlayerEvents[4]
is reset. Continue to 11.
- If
- The space script loads the value of
wCurSpaceNextSpace
intowCurSpace
, and loads the new space data towCurSpaceStruct[]
. Unless the space is a Branch Space or a Union Space,wSpacesLeft
is decreased.- If the space is a Branch Space, the branch data is loaded to
wTempSpaceBranchStruct
. Then the player is prompted to choose a valid direction.wCurSpaceNextSpace
is populated with the next space that corresponds to the chosen direction. Go back to 6. - If the space is an End Space, a fading out animation plays and then the
exitoverworld
script setswMapStatus
toMAPSTATUS_DONE
. This causesOverworldLoop
to return back to the game menu. Exit this workflow.
- If the space is a Branch Space, the branch data is loaded to
- If
wSpacesLeft
is non-0, go back to 6. - The script code specific to the space type of the landed-on space is executed.
- If player whites out in battle,
Script_BattleWhiteout
executesexitoverworld
. Exit this workflow.
- If player whites out in battle,
- The landed-on space is disabled by executing a block change that converts it into a Grey Space.
hCurBoardEvent
is set toBOARDEVENT_END_TURN
.CheckBoardEvent
does nothing in this state. In the first subsequentHandleMap
iteration where no other kind of event triggers causingPlayerEvents
to return early,hCurBoardEvent
is set toBOARDEVENT_DISPLAY_MENU
. - Go back to 3
View Map mode workflow
- Pressing SELECT in the board menu triggers View Map mode.
hCurBoardEvent
is set toBOARDEVENT_VIEW_MAP_MODE
, player state (coordinates as well as current map in order to support connected maps) is backed up,wPlayerFlags[INVISIBLE_F]
is set, and a static mockup of the player object is loaded to the lastwMapObject
and, in the background, to the firstwObjectStruct
is available. - The board event handler in
CheckBoardEvent
listens for the B button being pressed (except when a DPAD key is simultaneously held). When B is pressed, a script (a singlereloadmapafterviewmapmode
) to exit from View Map mode is queued to be executed byScriptEvents
. Otherwise,DoPlayerMovement.ViewMapMode
handles movement input in this mode. - When requested exit of View Map mode via B button,
reloadmapafterviewmapmode
setshMapEntryMethod
toMAPSETUP_EXITVIEWMAP
,hMapEntryMethod
toSPAWN_FROM_RAM
(required by the map setup commandEnterMapSpawnPoint
to restore the backed up player state), loadsMAPSTATUS_ENTER
tpwMapStatus
, and resetswPlayerFlags[INVISIBLE_F]
(the mocked player object naturally disappears when the map reloads). - Then:
a) If View Map mode was entered from the board menu,
BOARDEVENT_REDISPLAY_MENU
is loaded. It is the same asBOARDEVENT_DISPLAY_MENU
but skipsBoardMenuScript.Upkeep
. b) If View Map mode was entered from the branch menu, insteadBOARDEVENT_RESUME_BRANCH
is loaded, usingwPlayerSpriteSetupFlags[PLAYERSPRITESETUP_CUSTOM_FACING_F]
to maintain the facing direction according to the direction (SPRITEMOVEDATA_*
) of the mocked player object.BOARDEVENT_RESUME_BRANCH
makes sure to shortcut the branch space script by callingBranchSpaceScript_PromptPlayer
directly and avoiding the recomputation of the branch struct that would cause corruption.BOARDEVENT_HANDLE_BOARD
is loaded immediately byBOARDEVENT_RESUME_BRANCH
.
- In View Map mode, regular collisions except for
COLL_OUT_OF_BOUNDS
are ignored whereas going off-limits (i.e. outside of the map limits in a direction where there is no connected map) or off-range is accounted for. - Events other than warpless connections are ignored in View Map mode (as well as button actions, like while in
BOARDEVENT_HANDLE_BOARD
). wTileDown
,wTileUp
, etc., otherwise unused, are borrowed by in order to signal valid directions toInitSecondarySprites
(e.g.wTileDown=COLL_OUT_OF_BOUNDS
means that DOWN direction is not valid).- In View Map mode, the overworld delay is 1 rather than 2.
UpdatePlayerCoords
tracks the displacement during View Map mode in the X and Y axes in order to monitor the allowed range.