ref: 1d9a68dbdd0132035f1fc7b7ea8f7fdc24741507
dir: /engine/overworld/events_2.asm/
; More overworld event handling. WarpToSpawnPoint:: ld hl, wStatusFlags2 res STATUSFLAGS2_SAFARI_GAME_F, [hl] res STATUSFLAGS2_BUG_CONTEST_TIMER_F, [hl] ret RunMemScript:: ; If there is no script here, we don't need to be here. ld a, [wMapReentryScriptQueueFlag] and a ret z ; 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 LoadScriptBDE:: ; 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 [wEngineBuffer1], a ld c, a farcall CheckFacingTileForStdScript jr c, .done call CheckCutTreeTile jr nz, .whirlpool farcall TryCutOW jr .done .whirlpool ld a, [wEngineBuffer1] call CheckWhirlpoolTile jr nz, .waterfall farcall TryWhirlpoolOW jr .done .waterfall ld a, [wEngineBuffer1] call CheckWaterfallTile jr nz, .headbutt farcall TryWaterfallOW jr .done .headbutt ld a, [wEngineBuffer1] 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, $ff scf ret RandomEncounter:: ; Random encounter call CheckWildEncounterCooldown jr c, .nope call CanUseSweetScent 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 CanUseSweetScent:: ld hl, wStatusFlags bit STATUSFLAGS_NO_WILD_ENCOUNTERS_F, [hl] jr nz, .no ld a, [wEnvironment] cp CAVE jr z, .ice_check cp DUNGEON jr z, .ice_check farcall CheckGrassCollision jr nc, .no .ice_check ld a, [wPlayerStandingTile] 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 ld a, [hRandomAdd] call SimpleDivide add d .GotLevel: ld [wCurPartyLevel], a xor a ret TryWildEncounter_BugContest: ld a, [wPlayerStandingTile] call CheckSuperTallGrassTile ld b, 40 percent jr z, .ok ld b, 20 percent .ok farcall ApplyMusicEffectOnEncounterRate farcall ApplyCleanseTagEffectOnEncounterRate call Random ld a, [hRandomAdd] cp b ret c ld a, 1 and a ret INCLUDE "data/wild/bug_contest_mons.asm" DoBikeStep:: nop nop ; 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, .NoCall ; If we're not on the bike, we don't have to be here. ld a, [wPlayerState] cp PLAYER_BIKE jr nz, .NoCall ; If we're not in an area of phone service, we don't ; have to be here. call GetMapPhoneService and a jr nz, .NoCall ; 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 ; If we've taken at least 1024 steps, have the bike ; shop owner try to call us. ld a, d cp HIGH(1024) jr c, .NoCall ; If a call has already been queued, don't overwrite ; that call. ld a, [wSpecialPhoneCallID] and a jr nz, .NoCall ; Queue the call. ld a, SPECIALCALL_BIKESHOP ld [wSpecialPhoneCallID], a xor a ld [wSpecialPhoneCallID + 1], a ld hl, wStatusFlags2 res STATUSFLAGS2_BIKE_SHOP_CALL_F, [hl] scf ret .NoCall: xor a ret ClearCmdQueue:: ld hl, wCmdQueue ld de, 6 ld c, 4 xor a .loop ld [hl], a add hl, de dec c jr nz, .loop ret HandleCmdQueue:: ld hl, wCmdQueue xor a .loop ld [hMapObjectIndexBuffer], a ld a, [hl] and a jr z, .skip push hl ld b, h ld c, l call HandleQueuedCommand pop hl .skip ld de, CMDQUEUE_ENTRY_SIZE add hl, de ld a, [hMapObjectIndexBuffer] inc a cp CMDQUEUE_CAPACITY jr nz, .loop ret Unreferenced_GetNthCmdQueueEntry: ld hl, wCmdQueue ld bc, CMDQUEUE_ENTRY_SIZE call AddNTimes ld b, h ld c, l ret WriteCmdQueue:: push bc push de call .GetNextEmptyEntry ld d, h ld e, l pop hl pop bc ret c ld a, b ld bc, CMDQUEUE_ENTRY_SIZE - 1 call FarCopyBytes xor a ld [hl], a ret .GetNextEmptyEntry: ld hl, wCmdQueue ld de, CMDQUEUE_ENTRY_SIZE ld c, CMDQUEUE_CAPACITY .loop ld a, [hl] and a jr z, .done add hl, de dec c jr nz, .loop scf ret .done ld a, CMDQUEUE_CAPACITY sub c and a ret DelCmdQueue:: ld hl, wCmdQueue ld de, CMDQUEUE_ENTRY_SIZE ld c, CMDQUEUE_CAPACITY .loop ld a, [hl] cp b jr z, .done add hl, de dec c jr nz, .loop and a ret .done xor a ld [hl], a scf ret _DelCmdQueue: ld hl, CMDQUEUE_TYPE add hl, bc ld [hl], 0 ret HandleQueuedCommand: ld hl, CMDQUEUE_TYPE add hl, bc ld a, [hl] cp 5 jr c, .okay xor a .okay ld e, a ld d, 0 ld hl, .Jumptable add hl, de add hl, de add hl, de ld a, [hli] push af ld a, [hli] ld h, [hl] ld l, a pop af rst FarCall ret .Jumptable: dba CmdQueue_Null dba CmdQueue_Null2 dba CmdQueue_StoneTable dba CmdQueue_Type3 dba CmdQueue_Type4 CmdQueueAnonymousJumptable: ld hl, CMDQUEUE_05 add hl, bc ld a, [hl] pop hl rst JumpTable ret CmdQueueAnonJT_Increment: ld hl, CMDQUEUE_05 add hl, bc inc [hl] ret CmdQueueAnonJT_Decrement: ld hl, CMDQUEUE_05 add hl, bc dec [hl] ret CmdQueue_Null: ret CmdQueue_Null2: call ret_2f3e ret CmdQueue_Type4: call CmdQueueAnonymousJumptable ; anonymous dw dw .zero dw .one .zero ld a, [hSCY] ld hl, 4 add hl, bc ld [hl], a call CmdQueueAnonJT_Increment .one ld hl, 1 add hl, bc ld a, [hl] dec a ld [hl], a jr z, .finish and $1 jr z, .add ld hl, 2 add hl, bc ld a, [hSCY] sub [hl] ld [hSCY], a ret .add ld hl, 2 add hl, bc ld a, [hSCY] add [hl] ld [hSCY], a ret .finish ld hl, 4 add hl, bc ld a, [hl] ld [hSCY], a call _DelCmdQueue ret CmdQueue_Type3: call CmdQueueAnonymousJumptable ; anonymous dw dw .zero dw .one dw .two .zero call .IsPlayerFacingDown jr z, .PlayerNotFacingDown call CmdQueueAnonJT_Increment .one call .IsPlayerFacingDown jr z, .PlayerNotFacingDown call CmdQueueAnonJT_Increment ld hl, 2 add hl, bc ld a, [hl] ld [wd173], a ret .two call .IsPlayerFacingDown jr z, .PlayerNotFacingDown call CmdQueueAnonJT_Decrement ld hl, 3 add hl, bc ld a, [hl] ld [wd173], a ret .PlayerNotFacingDown: ld a, $7f ld [wd173], a ld hl, 5 add hl, bc ld [hl], 0 ret .IsPlayerFacingDown: push bc ld bc, wPlayerStruct call GetSpriteDirection and a pop bc ret CmdQueue_StoneTable: ld de, wPlayerStruct ld a, NUM_OBJECT_STRUCTS .loop push af ld hl, OBJECT_SPRITE add hl, de ld a, [hl] and a jr z, .next ld hl, OBJECT_MOVEMENTTYPE add hl, de ld a, [hl] cp SPRITEMOVEDATA_STRENGTH_BOULDER jr nz, .next ld hl, OBJECT_NEXT_TILE add hl, de ld a, [hl] call CheckPitTile jr nz, .next ld hl, OBJECT_DIRECTION_WALKING add hl, de ld a, [hl] cp STANDING jr nz, .next call HandleStoneQueue jr c, .fall_down_hole .next ld hl, OBJECT_STRUCT_LENGTH add hl, de ld d, h ld e, l pop af dec a jr nz, .loop ret .fall_down_hole pop af ret