pokecrystal-board/engine/overworld/events.asm

1722 lines
28 KiB
NASM
Raw Normal View History

SECTION "Events", ROMX
2018-06-24 07:09:41 -07:00
OverworldLoop::
2019-01-24 18:41:14 -08:00
xor a ; MAPSTATUS_START
2018-01-23 14:39:09 -08:00
ld [wMapStatus], a
2013-12-27 02:56:23 -08:00
.loop
2018-01-23 14:39:09 -08:00
ld a, [wMapStatus]
2021-03-17 08:38:01 -07:00
ld hl, .Jumptable
rst JumpTable
2018-01-23 14:39:09 -08:00
ld a, [wMapStatus]
2019-01-24 18:41:14 -08:00
cp MAPSTATUS_DONE
2013-12-27 02:56:23 -08:00
jr nz, .loop
.done
call DisableOverworldHUD
ld hl, wGameTimer
res GAME_TIMER_COUNTING_F, [hl] ; stop game timer counter
ld a, FALSE
ld [wText2bpp], a
ret
2021-03-17 08:38:01 -07:00
.Jumptable:
2019-01-24 18:41:14 -08:00
; entries correspond to MAPSTATUS_* constants
2013-12-27 02:56:23 -08:00
dw StartMap
dw EnterMap
dw HandleMap
dw .done
2018-06-24 07:09:41 -07:00
DisableEvents:
xor a
2024-02-10 15:16:00 -08:00
ld [wEnabledPlayerEvents], a
ret
2018-06-24 07:09:41 -07:00
EnableEvents::
ld a, $ff
2024-02-10 15:16:00 -08:00
ld [wEnabledPlayerEvents], a
ret
DisableTileEvents:
2024-02-10 15:16:00 -08:00
; DisableWarpsConnections + DisableCoordEvents + DisableStepCount + DisableWildEncounters
push af
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
ld a, [hl]
and ~((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3))
ld [hl], a
pop af
ret
2024-02-10 15:16:00 -08:00
DisableWarpsConnections: ; unreferenced
ld hl, wEnabledPlayerEvents
res 2, [hl]
ret
DisableCoordEvents: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
res 1, [hl]
ret
DisableStepCount: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
res 0, [hl]
ret
DisableWildEncounters: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
res 3, [hl]
ret
DisableSpaceEffects:
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
res 4, [hl]
ret
DisableTrainerAndTalkerEvents: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
res 5, [hl]
ret
2024-02-10 15:16:00 -08:00
EnableWarpsConnections: ; unreferenced
ld hl, wEnabledPlayerEvents
set 2, [hl]
ret
EnableCoordEvents: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
set 1, [hl]
ret
EnableStepCount: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
set 0, [hl]
ret
2018-06-24 07:09:41 -07:00
EnableWildEncounters:
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
set 3, [hl]
ret
EnableSpaceEffects: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
set 4, [hl]
ret
EnableTrainerAndTalkerEvents: ; unreferenced
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
set 5, [hl]
ret
2024-02-10 15:16:00 -08:00
CheckWarpConnectionsEnabled:
ld hl, wEnabledPlayerEvents
bit 2, [hl]
ret
2024-02-10 15:16:00 -08:00
CheckCoordEventsEnabled:
ld hl, wEnabledPlayerEvents
bit 1, [hl]
ret
2024-02-10 15:16:00 -08:00
CheckStepCountEnabled:
ld hl, wEnabledPlayerEvents
bit 0, [hl]
ret
2024-02-10 15:16:00 -08:00
CheckWildEncountersEnabled:
ld hl, wEnabledPlayerEvents
bit 3, [hl]
ret
CheckSpaceEffectsScriptFlag:
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
bit 4, [hl]
ret
CheckTrainerAndTalkerEvents:
2024-02-10 15:16:00 -08:00
ld hl, wEnabledPlayerEvents
bit 5, [hl]
ret
; on enter overworld loop (MAPSETUP_ENTERLEVEL or MAPSETUP_CONTINUE)
2018-06-24 07:09:41 -07:00
StartMap:
xor a
2023-09-30 10:12:57 -07:00
ldh [hScriptVar], a
xor a
2018-01-23 14:39:09 -08:00
ld [wScriptRunning], a
ld hl, wMapStatus
ld bc, wMapStatusEnd - wMapStatus
call ByteFill
2017-12-24 09:47:30 -08:00
farcall InitCallReceiveDelay
call ClearJoypad
ld a, [hMapEntryMethod]
cp MAPSETUP_ENTERLEVEL
jr nz, .not_starting_level
; initialize board state
xor a
ld hl, wCurTurn
ld [hli], a ; wCurTurn
ld [hli], a ;
ld [hli], a ; wCurSpace
ld [hli], a ; wCurLevelCoins
ld [hli], a ;
ld [hli], a ;
ld [hli], a ; wCurLevelExp
ld [hli], a ;
ld [hl], a ;
; initialize overworld state
ld hl, wNextWarp
xor a
ld [hli], a ; wNextWarp
ld [hli], a ; wNextMapGroup
ld [hli], a ; wNextMapNumber
ld [hli], a ; wPrevWarp
ld [hli], a ; wPrevMapGroup
ld [hl], a ; wPrevMapNumber
ld [wPlayerState], a ; PLAYER_NORMAL
ld [wCurOverworldMiscPal], a ; OW_MISC_BOARD_MENU_ITEMS | BOARDMENUITEM_DIE
ld a, BANK(wDisabledSpacesBackups)
ld [rSVBK], a
ld hl, wDisabledSpacesBackups
ld bc, wDisabledSpacesBackupsEnd - wDisabledSpacesBackups
xor a
call ByteFill
ld e, NUM_DISABLED_SPACES_BACKUPS
ld hl, wDisabledSpacesBackups
ld bc, wMap2DisabledSpacesBackup - wMap1DisabledSpacesBackup
.loop1
ld a, GROUP_N_A
ld [hl], a
add hl, bc
dec e
jr nz, .loop1
ld [hl], $00 ; list terminator
ld a, BANK(wMapObjectsBackups)
ld [rSVBK], a
ld e, NUM_MAP_OBJECTS_BACKUPS
ld hl, wMapObjectsBackups
ld bc, wMap2ObjectsBackup - wMap1ObjectsBackup
.loop2
ld a, GROUP_N_A
ld [hl], a
add hl, bc
dec e
jr nz, .loop2
ld [hl], $00 ; list terminator
ld a, 1
ld [rSVBK], a
.not_starting_level
ld a, BOARDEVENT_DISPLAY_MENU
ldh [hCurBoardEvent], a
; fallthrough
; on map reload (e.g. after battle), warps and connections
2018-06-24 07:09:41 -07:00
EnterMap:
xor a
2016-01-12 09:46:18 -08:00
ld [wXYComparePointer], a
ld [wXYComparePointer + 1], a
call SetUpFiveStepWildEncounterCooldown
2017-12-24 09:47:30 -08:00
farcall RunMapSetupScript
call DisableEvents
2013-12-27 02:56:23 -08:00
ldh a, [hMapEntryMethod]
2015-11-11 20:38:57 -08:00
cp MAPSETUP_CONNECTION
jr nz, .dont_enable
call EnableEvents
.dont_enable
2013-12-27 02:56:23 -08:00
ldh a, [hMapEntryMethod]
2015-10-24 16:49:19 -07:00
cp MAPSETUP_RELOADMAP
jr nz, .dontresetpoison
xor a
2018-01-23 14:39:09 -08:00
ld [wPoisonStepCount], a
.dontresetpoison
2013-12-27 02:56:23 -08:00
2015-10-24 16:49:19 -07:00
xor a ; end map entry
ldh [hMapEntryMethod], a
2019-01-24 18:41:14 -08:00
ld a, MAPSTATUS_HANDLE
2018-01-23 14:39:09 -08:00
ld [wMapStatus], a
ret
2018-06-24 07:09:41 -07:00
HandleMap:
call ResetOverworldDelay
2015-12-17 12:14:51 -08:00
call HandleMapTimeAndJoypad
2023-09-15 11:04:16 -07:00
call HandleCmdQueue
2013-12-27 02:56:23 -08:00
call MapEvents
; Not immediately entering a connected map will cause problems.
2018-01-23 14:39:09 -08:00
ld a, [wMapStatus]
2019-01-24 18:41:14 -08:00
cp MAPSTATUS_HANDLE
ret nz
2013-12-27 02:56:23 -08:00
call HandleMapObjects
call NextOverworldFrame
call HandleMapBackground
call CheckPlayerState
ret
2018-06-24 07:09:41 -07:00
MapEvents:
2018-01-23 14:39:09 -08:00
ld a, [wMapEventStatus]
2021-03-17 08:38:01 -07:00
ld hl, .Jumptable
rst JumpTable
ret
2021-03-17 08:38:01 -07:00
.Jumptable:
2019-01-24 18:41:14 -08:00
; entries correspond to MAPEVENTS_* constants
2013-12-27 02:56:23 -08:00
dw .events
dw .no_events
2021-03-17 08:38:01 -07:00
.events:
call PlayerEvents
2017-12-24 09:47:30 -08:00
farcall ScriptEvents
ret
2021-03-17 08:38:01 -07:00
.no_events:
ret
DEF MAX_OVERWORLD_DELAY EQU 2
DEF VIEW_MAP_OVERWORLD_DELAY EQU 1
2018-06-24 07:09:41 -07:00
ResetOverworldDelay:
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ld a, MAX_OVERWORLD_DELAY
jr nz, .set_delay
ld a, VIEW_MAP_OVERWORLD_DELAY
.set_delay
2023-09-30 10:12:57 -07:00
ldh [hOverworldDelay], a
ret
2018-06-24 07:09:41 -07:00
NextOverworldFrame:
2023-09-30 10:12:57 -07:00
ldh a, [hOverworldDelay]
and a
ret z
ld c, a
call DelayFrames
ret
2018-06-24 07:09:41 -07:00
HandleMapTimeAndJoypad:
2018-01-23 14:39:09 -08:00
ld a, [wMapEventStatus]
2019-01-24 18:41:14 -08:00
cp MAPEVENTS_OFF
ret z
2013-12-27 02:56:23 -08:00
call GetJoypad
call TimeOfDayPals
ret
2018-06-24 07:09:41 -07:00
HandleMapObjects:
2020-11-17 08:12:21 -08:00
farcall HandleNPCStep
2017-12-24 09:47:30 -08:00
farcall _HandlePlayerStep
call _CheckObjectEnteringVisibleRange
ret
2018-06-24 07:09:41 -07:00
HandleMapBackground:
call UpdateActiveSprites
2017-12-24 09:47:30 -08:00
farcall ScrollScreen
ret
2018-06-24 07:09:41 -07:00
CheckPlayerState:
ld a, [wPlayerStepFlags]
2019-01-24 18:41:14 -08:00
bit PLAYERSTEP_CONTINUE_F, a
2023-10-18 11:04:11 -07:00
jr z, .events ; PLAYERSTEP_CONTINUE_F not set
2019-01-24 18:41:14 -08:00
bit PLAYERSTEP_STOP_F, a
2023-10-18 11:04:11 -07:00
jr z, .noevents ; PLAYERSTEP_CONTINUE_F set and PLAYERSTEP_STOP_F not set
2019-01-24 18:41:14 -08:00
bit PLAYERSTEP_MIDAIR_F, a
2023-10-18 11:04:11 -07:00
jr nz, .noevents ; PLAYERSTEP_CONTINUE_F, PLAYERSTEP_STOP_F, and PLAYERSTEP_MIDAIR_F all set
call EnableEvents
.events
2019-01-24 18:41:14 -08:00
ld a, MAPEVENTS_ON
2018-01-23 14:39:09 -08:00
ld [wMapEventStatus], a
ret
.noevents
2019-01-24 18:41:14 -08:00
ld a, MAPEVENTS_OFF
2018-01-23 14:39:09 -08:00
ld [wMapEventStatus], a
ret
2018-06-24 07:09:41 -07:00
_CheckObjectEnteringVisibleRange:
ld hl, wPlayerStepFlags
2019-01-24 18:41:14 -08:00
bit PLAYERSTEP_STOP_F, [hl]
ret z
2017-12-24 09:47:30 -08:00
farcall CheckObjectEnteringVisibleRange
ret
2018-06-24 07:09:41 -07:00
PlayerEvents:
xor a
2015-10-24 07:34:19 -07:00
; If there's already a player event, don't interrupt it.
2018-01-23 14:39:09 -08:00
ld a, [wScriptRunning]
and a
ret nz
call CheckBoardEvent
call DisableSpaceEffects ; doesn't alter f
jr c, .ok
call CheckTrainerOrTalkerEvent
jr c, .ok
call CheckTileEvent
call DisableTileEvents ; preserves f
jr c, .ok
2023-12-28 10:53:34 -08:00
call CheckFacingTileEvent
jr c, .ok
2015-10-24 07:34:19 -07:00
call RunMemScript
jr c, .ok
call RunSceneScript
jr c, .ok
2015-10-24 07:34:19 -07:00
call CheckTimeEvents
jr c, .ok
; BOARDEVENT_END_TURN is used as turn cleanup after BOARDEVENT_HANDLE_BOARD.
; when we make it here, it means there's finally nothing else to do (e.g. a trainer),
; so return with BOARDEVENT_DISPLAY_MENU for the next MapEvents iteration.
ldh a, [hCurBoardEvent]
cp BOARDEVENT_END_TURN
jr nz, .continue
ld a, BOARDEVENT_DISPLAY_MENU
ldh [hCurBoardEvent], a
xor a
ret
.continue
call OWPlayerInput
jr c, .ok
xor a
ret
.ok
push af
2017-12-24 09:47:30 -08:00
farcall EnableScriptMode
pop af
2018-01-23 14:39:09 -08:00
ld [wScriptRunning], a
2015-10-24 16:49:19 -07:00
call DoPlayerEvent
scf
ret
CheckBoardEvent:
jumptable .Jumptable, hCurBoardEvent
.Jumptable:
table_width 2, .Jumptable
dw .none
dw .menu ; BOARDEVENT_DISPLAY_MENU
dw .board ; BOARDEVENT_HANDLE_BOARD
dw .none ; BOARDEVENT_END_TURN
dw .viewmap ; BOARDEVENT_VIEW_MAP_MODE
dw .menu ; BOARDEVENT_REDISPLAY_MENU
dw .branch ; BOARDEVENT_RESUME_BRANCH
assert_table_length NUM_BOARD_EVENTS + 1
.none
xor a
ret
.menu
ld a, BANK(BoardMenuScript)
ld hl, BoardMenuScript
call CallScript
scf
ret
.board
call CheckSpaceEffectsScriptFlag
jr z, .no_space_effect
; anchor point handler
2023-11-17 05:22:28 -08:00
; if wCurSpaceNextSpace is not an anchor point, override any anchor point we pass through
ld a, [wCurSpaceNextSpace]
cp NEXT_SPACE_IS_ANCHOR_POINT
jr c, .next
ld a, [wCurMapAnchorEventCount]
and a
jr z, .next
; if we have arrived to an anchor point, load its associated next space to wCurSpaceNextSpace right now.
; don't queue a script so that it happens transparently from the point of view of the player's movement.
; note that the next space of an anchor point could be another anchor point.
ld c, a
ld hl, wCurMapAnchorEventsPointer
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wXCoord]
ld d, a
ld a, [wYCoord]
ld e, a
call CheckAndApplyAnchorPoint
ret nc ; if we applied an anchor point, we're done here (we're not in a space)
.next
; space handler
ld a, [wPlayerTileCollision]
and $f0
cp HI_NYBBLE_SPACES
jr nz, .no_space_effect
ld a, [wPlayerTileCollision]
and $0f
ld e, a
ld d, 0
ld hl, .SpaceScripts
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ld a, BANK(BoardSpaceScripts)
call CallScript
scf
ret
.viewmap
; 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(.ExitViewMapModeScript)
ld hl, .ExitViewMapModeScript
call CallScript
scf
ret
.ExitViewMapModeScript:
reloadmapafterviewmapmode
end
.branch
; special handler to resume branch space after returning from View Map mode.
; skip scall to .ArriveToBranchSpaceScript not to recompute branch struct.
ld a, BOARDEVENT_HANDLE_BOARD
ldh [hCurBoardEvent], a
ld a, BANK(BranchSpaceScript)
ld hl, BranchSpaceScript_PromptPlayer
call CallScript
scf
ret
.no_space_effect
; continue moving in board
xor a
ret
.SpaceScripts:
table_width 2, .SpaceScripts
dw BlueSpaceScript ; COLL_BLUE_SPACE
dw RedSpaceScript ; COLL_RED_SPACE
dw GreenSpaceScript ; COLL_GREEN_SPACE
dw ItemSpaceScript ; COLL_ITEM_SPACE
dw PokemonSpaceScript ; COLL_POKEMON_SPACE
dw MinigameSpaceScript ; COLL_MINIGAME_SPACE
dw EndSpaceScript ; COLL_END_SPACE
dw GreySpaceScript ; COLL_GREY_SPACE
dw BranchSpaceScript ; COLL_BRANCH_SPACE
dw UnionSpaceScript ; COLL_UNION_SPACE
assert_table_length NUM_COLL_SPACES
CheckTrainerOrTalkerEvent:
call CheckTrainerAndTalkerEvents
jr z, .nope
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z ; nc
call CheckTrainerBattleOrTalkerPrompt
jr nc, .nope
2013-12-27 02:56:23 -08:00
ld a, [wSeenTrainerOrTalkerIsTalker]
and a ; cp FALSE
2015-11-12 08:10:19 -08:00
ld a, PLAYEREVENT_SEENBYTRAINER
jr z, .done
ld a, PLAYEREVENT_SEENBYTALKER
.done
scf
ret
.nope
xor a
ret
2018-06-24 07:09:41 -07:00
CheckTileEvent:
; Check for warps, coord events, or wild battles.
2024-02-10 15:16:00 -08:00
call CheckWarpConnectionsEnabled
jr z, .connections_disabled
2017-12-24 09:47:30 -08:00
farcall CheckMovingOffEdgeOfMap
2015-11-12 08:10:19 -08:00
jr c, .map_connection
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z ; nc
2015-10-24 16:49:19 -07:00
call CheckWarpTile
2015-11-12 08:10:19 -08:00
jr c, .warp_tile
.connections_disabled
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z ; nc
2024-02-10 15:16:00 -08:00
call CheckCoordEventsEnabled
jr z, .coord_events_disabled
call CheckCurrentMapCoordEvents
jr c, .coord_event
.coord_events_disabled
2024-02-10 15:16:00 -08:00
call CheckStepCountEnabled
jr z, .step_count_disabled
call CountStep
ret c
.step_count_disabled
2024-02-10 15:16:00 -08:00
call CheckWildEncountersEnabled
jr z, .ok
call RandomEncounter
ret c
.ok
xor a
ret
2015-11-12 08:10:19 -08:00
.map_connection
ld a, PLAYEREVENT_CONNECTION
scf
ret
2015-11-12 08:10:19 -08:00
.warp_tile
ld a, [wPlayerTileCollision]
call CheckPitTile
2015-11-12 08:10:19 -08:00
jr nz, .not_pit
ld a, PLAYEREVENT_FALL
scf
ret
2015-11-12 08:10:19 -08:00
.not_pit
ld a, PLAYEREVENT_WARP
scf
ret
.coord_event
2016-01-06 04:44:50 -08:00
ld hl, wCurCoordEventScriptAddr
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptsBank
call CallScript
ret
2018-06-24 07:09:41 -07:00
CheckWildEncounterCooldown::
ld hl, wWildEncounterCooldown
ld a, [hl]
and a
ret z
dec [hl]
ret z
scf
ret
2018-06-24 07:09:41 -07:00
SetUpFiveStepWildEncounterCooldown:
ld a, 5
ld [wWildEncounterCooldown], a
ret
2023-09-15 11:04:16 -07:00
SetMinTwoStepWildEncounterCooldown: ; unreferenced
ld a, [wWildEncounterCooldown]
cp 2
ret nc
ld a, 2
ld [wWildEncounterCooldown], a
ret
2023-12-28 10:53:34 -08:00
CheckFacingTileEvent:
; no tile events if not in BOARDEVENT_HANDLE_BOARD (e.g. after player lands in space)
2023-12-28 10:53:34 -08:00
ldh a, [hCurBoardEvent]
cp BOARDEVENT_HANDLE_BOARD
jr nz, .NoAction
; no facing-tile events until player has turned to the walking direction.
; if the player has to perform a STEP_TURN first, the facing tile is not the right one.
ld a, [wWalkingDirection]
cp STANDING
2023-12-28 10:53:34 -08:00
jr z, .NoAction
ld e, a
ld a, [wPlayerDirection]
rrca
rrca
maskbits NUM_DIRECTIONS
cp e
jr nz, .NoAction
2023-12-28 10:53:34 -08:00
call .TryObjectEvent
jr c, .Action
call .TryTileCollisionEvent
jr c, .Action
2023-12-28 10:53:34 -08:00
; fallthrough
.NoAction:
xor a
ret
.Action:
push af
farcall StopPlayerForEvent
pop af
scf
ret
.TryObjectEvent:
farcall CheckFacingObject
jr c, .IsObject
xor a
ret
.IsObject:
ldh a, [hObjectStructIndex]
call GetObjectStruct
ld hl, OBJECT_MAP_OBJECT_INDEX
add hl, bc
ld a, [hl]
ldh [hLastTalked], a
ldh a, [hLastTalked]
call GetMapObject
ld hl, MAPOBJECT_TYPE
add hl, bc
ld a, [hl]
and MAPOBJECT_TYPE_MASK
push bc
ld de, 3
ld hl, .ObjectEventTypeArray
call IsInArray
pop bc
jr nc, .nope
inc hl
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
.nope
xor a
ret
.ObjectEventTypeArray:
table_width 3, .ObjectEventTypeArray
dbw OBJECTTYPE_SCRIPT, .none
dbw OBJECTTYPE_ITEMBALL, .none
dbw OBJECTTYPE_TRAINER, .none
dbw OBJECTTYPE_TALKER, .none
dbw OBJECTTYPE_ROCK, .rock
dbw OBJECTTYPE_TREE, .tree
2023-12-28 10:53:34 -08:00
dbw OBJECTTYPE_6, .none
assert_table_length NUM_OBJECT_TYPES
db -1 ; end
.none
xor a
ret ; nc
.rock
2023-12-28 10:53:34 -08:00
ld a, BANK(RockSmashAutoScript)
ld hl, RockSmashAutoScript
call CallScript
ret ; c
.tree
ld a, BANK(Script_CutAuto)
ld hl, Script_CutAuto
call CallScript
ret ; c
.TryTileCollisionEvent:
call GetFacingTileCoord
ld [wFacingTileID], a
;; Surf
; Don't surf if already surfing.
ld a, [wPlayerState]
cp PLAYER_SURF_PIKA
jr z, .next_event_1
cp PLAYER_SURF
jr z, .next_event_1
; Must be facing water.
ld a, [wFacingTileID]
call GetTilePermission
cp WATER_TILE
jr nz, .next_event_1
ld a, PLAYER_SURF
ld [wSurfingPlayerState], a
ld a, BANK(SurfAutoScript)
ld hl, SurfAutoScript
call CallScript
ret ; c
.next_event_1
2023-12-31 04:39:00 -08:00
;; Waterfall
ld a, [wFacingTileID]
call CheckWaterfallTile
jr nz, .next_event_2
; Must be facing up and facing a waterfall tile to trigger the waterfall up sequence.
; Otherwise HI_NYBBLE_CURRENT collision (forced walking in walking direction) applies.
farcall CheckMapCanWaterfall
jr c, .next_event_2
ld a, BANK(Script_WaterfallAuto)
ld hl, Script_WaterfallAuto
call CallScript
ret ; c
.next_event_2
.no_event
xor a
ret ; nc
2018-06-24 07:09:41 -07:00
RunSceneScript:
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z ; nc
2018-09-09 12:09:51 -07:00
ld a, [wCurMapSceneScriptCount]
and a
jr z, .nope
ld c, a
call CheckScenes
cp c
jr nc, .nope
ld e, a
ld d, 0
2018-09-09 12:09:51 -07:00
ld hl, wCurMapSceneScriptsPointer
ld a, [hli]
ld h, [hl]
ld l, a
2019-03-03 11:19:16 -08:00
rept SCENE_SCRIPT_SIZE
2016-01-10 14:44:09 -08:00
add hl, de
endr
call GetMapScriptsBank
call GetFarWord
call GetMapScriptsBank
call CallScript
2018-01-23 14:39:09 -08:00
ld hl, wScriptFlags
res 3, [hl]
2017-12-24 09:47:30 -08:00
farcall EnableScriptMode
farcall ScriptEvents
2018-01-23 14:39:09 -08:00
ld hl, wScriptFlags
bit 3, [hl]
jr z, .nope
2021-06-08 17:35:04 -07:00
ld hl, wDeferredScriptAddr
ld a, [hli]
ld h, [hl]
ld l, a
2021-06-08 17:35:04 -07:00
ld a, [wDeferredScriptBank]
call CallScript
scf
ret
.nope
xor a
ret
2018-06-24 07:09:41 -07:00
CheckTimeEvents:
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z ; nc
ld a, [wLinkMode]
and a
2014-07-24 20:19:56 -07:00
jr nz, .nothing
ld hl, wStatusFlags2
2018-01-22 12:40:43 -08:00
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
2015-10-24 07:34:19 -07:00
jr z, .do_daily
2014-07-24 20:19:56 -07:00
2017-12-24 09:47:30 -08:00
farcall CheckBugContestTimer
2015-10-24 07:34:19 -07:00
jr c, .end_bug_contest
xor a
ret
2015-10-24 07:34:19 -07:00
.do_daily
2017-12-24 09:47:30 -08:00
farcall CheckDailyResetTimer
farcall CheckPokerusTick
farcall CheckPhoneCall
ret c
2014-07-24 20:19:56 -07:00
.nothing
xor a
ret
2015-10-24 07:34:19 -07:00
.end_bug_contest
ld a, BANK(BugCatchingContestOverScript)
ld hl, BugCatchingContestOverScript
call CallScript
scf
ret
2018-06-24 07:09:41 -07:00
OWPlayerInput:
call PlayerMovement
ret c
and a
jr nz, .NoAction
; Can't perform button actions while in BOARDEVENT_HANDLE_BOARD or BOARDEVENT_VIEW_MAP_MODE
ldh 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.
2017-12-24 09:47:30 -08:00
farcall CheckStandingOnIce
jr c, .NoAction
call CheckAPressOW
jr c, .Action
call CheckMenuOW
jr c, .Action
.NoAction:
xor a
ret
.Action:
push af
2017-12-24 09:47:30 -08:00
farcall StopPlayerForEvent
pop af
scf
ret
2018-06-24 07:09:41 -07:00
CheckAPressOW:
ldh a, [hJoyPressed]
and A_BUTTON
ret z
call TryObjectEvent
ret c
call TryBGEvent
ret c
call TryTileCollisionEvent
ret c
xor a
ret
2018-06-24 07:09:41 -07:00
PlayTalkObject:
push de
ld de, SFX_READ_TEXT_2
call PlaySFX
pop de
ret
2018-06-24 07:09:41 -07:00
TryObjectEvent:
2017-12-24 09:47:30 -08:00
farcall CheckFacingObject
jr c, .IsObject
xor a
ret
.IsObject:
call PlayTalkObject
ldh a, [hObjectStructIndex]
call GetObjectStruct
ld hl, OBJECT_MAP_OBJECT_INDEX
add hl, bc
ld a, [hl]
ldh [hLastTalked], a
ldh a, [hLastTalked]
call GetMapObject
ld hl, MAPOBJECT_TYPE
add hl, bc
ld a, [hl]
and MAPOBJECT_TYPE_MASK
push bc
ld de, 3
2021-03-17 08:38:01 -07:00
ld hl, ObjectEventTypeArray
call IsInArray
pop bc
jr nc, .nope
inc hl
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
2019-04-23 16:07:41 -07:00
.nope
xor a
ret
2021-03-17 08:38:01 -07:00
ObjectEventTypeArray:
table_width 3, ObjectEventTypeArray
dbw OBJECTTYPE_SCRIPT, .script
dbw OBJECTTYPE_ITEMBALL, .itemball
dbw OBJECTTYPE_TRAINER, .trainer
; the remaining four are dummy events
dbw OBJECTTYPE_TALKER, .three
2023-12-28 10:53:34 -08:00
dbw OBJECTTYPE_ROCK, .four
dbw OBJECTTYPE_TREE, .five
dbw OBJECTTYPE_6, .six
2021-03-17 08:38:01 -07:00
assert_table_length NUM_OBJECT_TYPES
db -1 ; end
2018-06-24 07:09:41 -07:00
.script
ld hl, MAPOBJECT_SCRIPT_POINTER
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptsBank
call CallScript
ret
2018-06-24 07:09:41 -07:00
.itemball
ld hl, MAPOBJECT_SCRIPT_POINTER
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptsBank
ld de, wItemBallData
ld bc, wItemBallDataEnd - wItemBallData
call FarCopyBytes
ld a, PLAYEREVENT_ITEMBALL
scf
ret
2018-06-24 07:09:41 -07:00
.trainer
call TalkToTrainer
ld a, PLAYEREVENT_TALKTOTRAINER
scf
ret
2018-06-24 07:09:41 -07:00
.three
xor a
ret
2018-06-24 07:09:41 -07:00
.four
xor a
ret
2018-06-24 07:09:41 -07:00
.five
xor a
ret
2018-06-24 07:09:41 -07:00
.six
xor a
ret
2018-06-24 07:09:41 -07:00
TryBGEvent:
call CheckFacingBGEvent
jr c, .is_bg_event
xor a
ret
.is_bg_event:
ld a, [wCurBGEventType]
2021-03-17 08:38:01 -07:00
ld hl, BGEventJumptable
rst JumpTable
ret
2021-03-17 08:38:01 -07:00
BGEventJumptable:
table_width 2, BGEventJumptable
dw .read
dw .up
dw .down
dw .right
dw .left
dw .ifset
dw .ifnotset
dw .itemifset
dw .copy
2021-03-17 08:38:01 -07:00
assert_table_length NUM_BGEVENTS
2021-03-17 08:38:01 -07:00
.up:
ld b, OW_UP
jr .checkdir
2021-03-17 08:38:01 -07:00
.down:
ld b, OW_DOWN
jr .checkdir
2021-03-17 08:38:01 -07:00
.right:
ld b, OW_RIGHT
jr .checkdir
2021-03-17 08:38:01 -07:00
.left:
ld b, OW_LEFT
jr .checkdir
2021-03-17 08:38:01 -07:00
.checkdir:
2018-01-23 14:39:09 -08:00
ld a, [wPlayerDirection]
and %1100
cp b
jp nz, .dontread
2021-03-17 08:38:01 -07:00
.read:
call PlayTalkObject
ld hl, wCurBGEventScriptAddr
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptsBank
call CallScript
scf
ret
2021-03-17 08:38:01 -07:00
.itemifset:
call CheckBGEventFlag
jp nz, .dontread
call PlayTalkObject
call GetMapScriptsBank
ld de, wHiddenItemData
ld bc, wHiddenItemDataEnd - wHiddenItemData
call FarCopyBytes
ld a, BANK(HiddenItemScript)
ld hl, HiddenItemScript
call CallScript
scf
ret
2021-03-17 08:38:01 -07:00
.copy:
call CheckBGEventFlag
jr nz, .dontread
call GetMapScriptsBank
ld de, wHiddenItemData
ld bc, wHiddenItemDataEnd - wHiddenItemData
call FarCopyBytes
jr .dontread
2021-03-17 08:38:01 -07:00
.ifset:
call CheckBGEventFlag
jr z, .dontread
jr .thenread
2021-03-17 08:38:01 -07:00
.ifnotset:
call CheckBGEventFlag
jr nz, .dontread
2021-03-17 08:38:01 -07:00
.thenread:
push hl
call PlayTalkObject
pop hl
inc hl
2015-12-26 18:59:03 -08:00
inc hl
call GetMapScriptsBank
call GetFarWord
call GetMapScriptsBank
call CallScript
scf
ret
2021-03-17 08:38:01 -07:00
.dontread:
xor a
ret
2018-06-24 07:09:41 -07:00
CheckBGEventFlag:
ld hl, wCurBGEventScriptAddr
ld a, [hli]
ld h, [hl]
ld l, a
push hl
call GetMapScriptsBank
call GetFarWord
ld e, l
ld d, h
2015-11-12 08:10:19 -08:00
ld b, CHECK_FLAG
call EventFlagAction
ld a, c
and a
pop hl
ret
2018-06-24 07:09:41 -07:00
PlayerMovement:
2017-12-24 09:47:30 -08:00
farcall DoPlayerMovement
ld a, c
2021-03-17 08:38:01 -07:00
ld hl, PlayerMovementPointers
rst JumpTable
ld a, c
ret
2021-03-17 08:38:01 -07:00
PlayerMovementPointers:
2019-11-03 11:30:33 -08:00
; entries correspond to PLAYERMOVEMENT_* constants
2021-03-17 08:38:01 -07:00
table_width 2, PlayerMovementPointers
2019-11-03 11:30:33 -08:00
dw .normal
dw .warp
dw .turn
dw .force_turn
dw .finish
dw .continue
dw .exit_water
dw .jump
2021-03-17 08:38:01 -07:00
assert_table_length NUM_PLAYER_MOVEMENTS
2019-11-03 11:30:33 -08:00
.normal:
.finish:
xor a
ld c, a
ret
2019-11-03 11:30:33 -08:00
.jump:
xor a
ld c, a
ret
2019-11-03 11:30:33 -08:00
.warp:
ld a, PLAYEREVENT_WARP
ld c, a
scf
ret
2019-11-03 11:30:33 -08:00
.turn:
ld a, PLAYEREVENT_JOYCHANGEFACING
ld c, a
scf
ret
2019-11-03 11:30:33 -08:00
.force_turn:
; force the player to move in some direction
ld a, BANK(Script_ForcedMovement)
ld hl, Script_ForcedMovement
call CallScript
ld c, a
scf
ret
2019-11-03 11:30:33 -08:00
.continue:
.exit_water:
ld a, -1
ld c, a
and a
ret
2018-06-24 07:09:41 -07:00
CheckMenuOW:
xor a
2023-09-30 10:12:57 -07:00
ld [wMenuReturn], a
ldh a, [hJoyPressed]
2017-12-30 09:35:50 -08:00
bit SELECT_F, a
jr nz, .Select
2017-12-30 09:35:50 -08:00
bit START_F, a
jr z, .NoMenu
ld a, BANK(StartMenuScript)
ld hl, StartMenuScript
call CallScript
scf
ret
.NoMenu:
xor a
ret
.Select:
call PlayTalkObject
ld a, BANK(SelectMenuScript)
ld hl, SelectMenuScript
call CallScript
scf
ret
2018-06-24 07:09:41 -07:00
StartMenuScript:
2015-01-20 00:01:23 -08:00
callasm StartMenu
sjump StartMenuCallback
2018-06-24 07:09:41 -07:00
SelectMenuScript:
2015-01-20 00:01:23 -08:00
callasm SelectMenu
sjump SelectMenuCallback
StartMenuCallback:
2018-06-24 07:09:41 -07:00
SelectMenuCallback:
2023-09-30 10:12:57 -07:00
readmem wMenuReturn
ifequal MENURETURN_SCRIPT, .Script
ifequal MENURETURN_ASM, .Asm
end
2018-06-24 07:09:41 -07:00
.Script:
memjump wQueuedScriptBank
2018-06-24 07:09:41 -07:00
.Asm:
memcallasm wQueuedScriptBank
end
2018-06-24 07:09:41 -07:00
CountStep:
2015-10-24 07:34:19 -07:00
; Don't count steps in link communication rooms.
ld a, [wLinkMode]
and a
jr nz, .done
2015-10-24 07:34:19 -07:00
; If there is a special phone call, don't count the step.
2017-12-24 09:47:30 -08:00
farcall CheckSpecialPhoneCall
2015-10-24 07:34:19 -07:00
jr c, .doscript
2015-10-24 07:34:19 -07:00
; If Repel wore off, don't count the step.
call DoRepelStep
jr c, .doscript
2015-10-24 07:34:19 -07:00
; Count the step for poison and total steps
2018-01-23 14:39:09 -08:00
ld hl, wPoisonStepCount
inc [hl]
2018-01-23 14:39:09 -08:00
ld hl, wStepCount
inc [hl]
2015-10-24 07:34:19 -07:00
; Every 256 steps, increase the happiness of all your Pokemon.
jr nz, .skip_happiness
2017-12-24 09:47:30 -08:00
farcall StepHappiness
2015-10-24 07:34:19 -07:00
.skip_happiness
; Every 256 steps, offset from the happiness incrementor by 128 steps,
; decrease the hatch counter of all your eggs until you reach the first
; one that is ready to hatch.
2018-01-23 14:39:09 -08:00
ld a, [wStepCount]
cp $80
2015-10-24 07:34:19 -07:00
jr nz, .skip_egg
2017-12-24 09:47:30 -08:00
farcall DoEggStep
2015-10-24 07:34:19 -07:00
jr nz, .hatch
2015-10-24 07:34:19 -07:00
.skip_egg
; Increase the EXP of (both) DayCare Pokemon by 1.
2017-12-24 09:47:30 -08:00
farcall DayCareStep
2020-11-17 08:09:02 -08:00
; Every 4 steps, deal damage to all poisoned Pokemon.
2018-01-23 14:39:09 -08:00
ld hl, wPoisonStepCount
ld a, [hl]
cp 4
2015-10-24 07:34:19 -07:00
jr c, .skip_poison
ld [hl], 0
2017-12-24 09:47:30 -08:00
farcall DoPoisonStep
2015-10-24 07:34:19 -07:00
jr c, .doscript
2015-10-24 07:34:19 -07:00
.skip_poison
2017-12-24 09:47:30 -08:00
farcall DoBikeStep
.done
xor a
ret
2015-10-24 07:34:19 -07:00
.doscript
ld a, -1
scf
ret
2015-10-24 07:34:19 -07:00
.hatch
2019-11-03 11:30:33 -08:00
ld a, PLAYEREVENT_HATCH
scf
ret
.whiteout ; unreferenced
2019-11-03 11:30:33 -08:00
ld a, PLAYEREVENT_WHITEOUT
scf
ret
2018-06-24 07:09:41 -07:00
DoRepelStep:
2015-10-24 07:34:19 -07:00
ld a, [wRepelEffect]
and a
ret z
2015-09-09 16:27:07 -07:00
dec a
2015-10-24 07:34:19 -07:00
ld [wRepelEffect], a
ret nz
2015-09-09 16:27:07 -07:00
ld a, BANK(RepelWoreOffScript)
ld hl, RepelWoreOffScript
call CallScript
scf
ret
2018-06-24 07:09:41 -07:00
DoPlayerEvent:
2018-01-23 14:39:09 -08:00
ld a, [wScriptRunning]
and a
ret z
2015-11-11 20:38:57 -08:00
2015-11-05 12:08:00 -08:00
cp PLAYEREVENT_MAPSCRIPT ; run script
ret z
2015-11-11 20:38:57 -08:00
2015-11-05 12:08:00 -08:00
cp NUM_PLAYER_EVENTS
ret nc
ld c, a
ld b, 0
2015-11-05 12:08:00 -08:00
ld hl, PlayerEventScriptPointers
2016-01-10 14:44:09 -08:00
add hl, bc
add hl, bc
add hl, bc
ld a, [hli]
2018-01-23 14:39:09 -08:00
ld [wScriptBank], a
ld a, [hli]
2018-01-23 14:39:09 -08:00
ld [wScriptPos], a
ld a, [hl]
2018-01-23 14:39:09 -08:00
ld [wScriptPos + 1], a
ret
2018-06-24 07:09:41 -07:00
PlayerEventScriptPointers:
; entries correspond to PLAYEREVENT_* constants
2021-03-17 08:38:01 -07:00
table_width 3, PlayerEventScriptPointers
2020-10-04 16:43:28 -07:00
dba InvalidEventScript ; PLAYEREVENT_NONE
dba SeenByTrainerScript ; PLAYEREVENT_SEENBYTRAINER
dba TalkToTrainerScript ; PLAYEREVENT_TALKTOTRAINER
dba FindItemInBallScript ; PLAYEREVENT_ITEMBALL
dba EdgeWarpScript ; PLAYEREVENT_CONNECTION
dba WarpToNewMapScript ; PLAYEREVENT_WARP
dba FallIntoMapScript ; PLAYEREVENT_FALL
dba OverworldWhiteoutScript ; PLAYEREVENT_WHITEOUT
dba HatchEggScript ; PLAYEREVENT_HATCH
dba ChangeDirectionScript ; PLAYEREVENT_JOYCHANGEFACING
dba SeenByTalkerScript ; PLAYEREVENT_SEENBYTALKER
2020-10-04 16:43:28 -07:00
dba InvalidEventScript ; (NUM_PLAYER_EVENTS)
2021-03-17 08:38:01 -07:00
assert_table_length NUM_PLAYER_EVENTS + 1
2020-10-04 16:43:28 -07:00
InvalidEventScript:
end
2018-06-24 07:09:41 -07:00
HatchEggScript:
callasm OverworldHatchEgg
end
2018-06-24 07:09:41 -07:00
WarpToNewMapScript:
warpsound
2015-11-11 20:38:57 -08:00
newloadmap MAPSETUP_DOOR
end
2018-06-24 07:09:41 -07:00
FallIntoMapScript:
2015-11-11 20:38:57 -08:00
newloadmap MAPSETUP_FALL
playsound SFX_KINESIS
2020-10-04 16:43:28 -07:00
applymovement PLAYER, .SkyfallMovement
playsound SFX_STRENGTH
2015-10-24 16:49:19 -07:00
scall LandAfterPitfallScript
end
2020-10-04 16:43:28 -07:00
.SkyfallMovement:
skyfall
step_end
2018-06-24 07:09:41 -07:00
LandAfterPitfallScript:
earthquake 16
end
2020-10-04 16:43:28 -07:00
EdgeWarpScript:
reloadend MAPSETUP_CONNECTION
2020-10-04 16:43:28 -07:00
ChangeDirectionScript:
deactivatefacing 3
callasm EnableWildEncounters
end
INCLUDE "engine/overworld/scripting.asm"
2018-01-11 20:50:44 -08:00
WarpToSpawnPoint::
ld hl, wStatusFlags2
res STATUSFLAGS2_SAFARI_GAME_F, [hl]
res STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
ret
RunMemScript::
ldh a, [hCurBoardEvent]
cp BOARDEVENT_VIEW_MAP_MODE
ret z ; nc
; If there is no script here, we don't need to be here.
ld a, [wMapReentryScriptQueueFlag]
and a
ret z ; nc
; Execute the script at (wMapReentryScriptBank):(wMapReentryScriptAddress).
ld hl, wMapReentryScriptAddress
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [wMapReentryScriptBank]
call CallScript
scf
; Clear the buffer for the next script.
push af
xor a
ld hl, wMapReentryScriptQueueFlag
ld bc, 8
call ByteFill
pop af
ret
2023-09-15 11:04:16 -07:00
LoadMemScript::
; If there's already a script here, don't overwrite.
ld hl, wMapReentryScriptQueueFlag
ld a, [hl]
and a
ret nz
; Set the flag
ld [hl], 1
inc hl
; Load the script pointer b:de into (wMapReentryScriptBank):(wMapReentryScriptAddress)
ld [hl], b
inc hl
ld [hl], e
inc hl
ld [hl], d
scf
ret
TryTileCollisionEvent::
call GetFacingTileCoord
ld [wFacingTileID], a
ld c, a
; CheckFacingTileForStdScript preserves c, and
; farcall copies c back into a.
farcall CheckFacingTileForStdScript
jr c, .done
; CheckCutTreeTile expects a == [wFacingTileID], which
; it still is after the previous farcall.
call CheckCutTreeTile
jr nz, .whirlpool
farcall TryCutOW
jr .done
.whirlpool
ld a, [wFacingTileID]
call CheckWhirlpoolTile
jr nz, .waterfall
farcall TryWhirlpoolOW
jr .done
.waterfall
ld a, [wFacingTileID]
call CheckWaterfallTile
jr nz, .headbutt
farcall TryWaterfallOW
jr .done
.headbutt
ld a, [wFacingTileID]
call CheckHeadbuttTreeTile
jr nz, .surf
farcall TryHeadbuttOW
jr c, .done
jr .noevent
.surf
farcall TrySurfOW
jr nc, .noevent
jr .done
.noevent
xor a
ret
.done
call PlayClickSFX
ld a, PLAYEREVENT_MAPSCRIPT
scf
ret
RandomEncounter::
; Random encounter
call CheckWildEncounterCooldown
jr c, .nope
2024-02-10 15:16:00 -08:00
call CanEncounterWildMon
jr nc, .nope
ld hl, wStatusFlags2
bit STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl]
jr nz, .bug_contest
farcall TryWildEncounter
jr nz, .nope
jr .ok
.bug_contest
call _TryWildEncounter_BugContest
jr nc, .nope
jr .ok_bug_contest
.nope
ld a, 1
and a
ret
.ok
ld a, BANK(WildBattleScript)
ld hl, WildBattleScript
jr .done
.ok_bug_contest
ld a, BANK(BugCatchingContestBattleScript)
ld hl, BugCatchingContestBattleScript
jr .done
.done
call CallScript
scf
ret
WildBattleScript:
randomwildmon
startbattle
reloadmapafterbattle
end
2024-02-10 15:16:00 -08:00
CanEncounterWildMon::
ld hl, wStatusFlags
bit STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl]
jr nz, .no
ld a, [wEnvironment]
cp INDOOR_ENVIRONMENT
jr nc, .ice_check
farcall CheckGrassCollision
jr nc, .no
.ice_check
ld a, [wPlayerTileCollision]
call CheckIceTile
jr z, .no
scf
ret
.no
and a
ret
_TryWildEncounter_BugContest:
call TryWildEncounter_BugContest
ret nc
call ChooseWildEncounter_BugContest
farcall CheckRepelEffect
ret
ChooseWildEncounter_BugContest::
; Pick a random mon out of ContestMons.
.loop
call Random
cp 100 << 1
jr nc, .loop
srl a
ld hl, ContestMons
ld de, 4
.CheckMon:
sub [hl]
jr c, .GotMon
add hl, de
jr .CheckMon
.GotMon:
inc hl
; Species
ld a, [hli]
ld [wTempWildMonSpecies], a
; Min level
ld a, [hli]
ld d, a
; Max level
ld a, [hl]
sub d
jr nz, .RandomLevel
; If min and max are the same.
ld a, d
jr .GotLevel
.RandomLevel:
; Get a random level between the min and max.
ld c, a
inc c
call Random
ldh a, [hRandomAdd]
call SimpleDivide
add d
.GotLevel:
ld [wCurPartyLevel], a
xor a
ret
TryWildEncounter_BugContest:
ld a, [wPlayerTileCollision]
call CheckSuperTallGrassTile
ld b, 40 percent
jr z, .ok
ld b, 20 percent
.ok
farcall ApplyMusicEffectOnEncounterRate
farcall ApplyCleanseTagEffectOnEncounterRate
call Random
ldh a, [hRandomAdd]
cp b
ret c
ld a, 1
and a
ret
INCLUDE "data/wild/bug_contest_mons.asm"
DoBikeStep::
; If the bike shop owner doesn't have our number, or
; if we've already gotten the call, we don't have to
; be here.
ld hl, wStatusFlags2
bit STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl]
jr z, .dont_increment
; If we're not on the bike, we don't have to be here.
ld a, [wPlayerState]
cp PLAYER_BIKE
jr nz, .dont_increment
; If we're not in an area of phone service, we don't
; have to be here.
call GetMapPhoneService
and a
jr nz, .dont_increment
; Check the bike step count and check whether we've
; taken 65536 of them yet.
ld hl, wBikeStep
ld a, [hli]
ld d, a
ld e, [hl]
cp 255
jr nz, .increment
ld a, e
cp 255
jr z, .dont_increment
.increment
inc de
ld [hl], e
dec hl
ld [hl], d
.dont_increment
xor a
ret
INCLUDE "engine/overworld/cmd_queue.asm"