INCLUDE "constants.asm" SECTION "Events", ROMX OverworldLoop:: ; 966b0 xor a ld [MapStatus], a .loop ld a, [MapStatus] ld hl, .jumps rst JumpTable ld a, [MapStatus] cp 3 ; done jr nz, .loop .done ret .jumps dw StartMap dw EnterMap dw HandleMap dw .done ; 966cb DisableEvents: ; 966cb xor a ld [ScriptFlags3], a ret ; 966d0 EnableEvents:: ; 966d0 ld a, $ff ld [ScriptFlags3], a ret ; 966d6 CheckBit5_ScriptFlags3: ; 966d6 ld hl, ScriptFlags3 bit 5, [hl] ret ; 966dc DisableWarpsConnxns: ; 966dc ld hl, ScriptFlags3 res 2, [hl] ret ; 966e2 DisableCoordEvents: ; 966e2 ld hl, ScriptFlags3 res 1, [hl] ret ; 966e8 DisableStepCount: ; 966e8 ld hl, ScriptFlags3 res 0, [hl] ret ; 966ee DisableWildEncounters: ; 966ee ld hl, ScriptFlags3 res 4, [hl] ret ; 966f4 EnableWarpsConnxns: ; 966f4 ld hl, ScriptFlags3 set 2, [hl] ret ; 966fa EnableCoordEvents: ; 966fa ld hl, ScriptFlags3 set 1, [hl] ret ; 96700 EnableStepCount: ; 96700 ld hl, ScriptFlags3 set 0, [hl] ret ; 96706 EnableWildEncounters: ; 96706 ld hl, ScriptFlags3 set 4, [hl] ret ; 9670c CheckWarpConnxnScriptFlag: ; 9670c ld hl, ScriptFlags3 bit 2, [hl] ret ; 96712 CheckCoordEventScriptFlag: ; 96712 ld hl, ScriptFlags3 bit 1, [hl] ret ; 96718 CheckStepCountScriptFlag: ; 96718 ld hl, ScriptFlags3 bit 0, [hl] ret ; 9671e CheckWildEncountersScriptFlag: ; 9671e ld hl, ScriptFlags3 bit 4, [hl] ret ; 96724 StartMap: ; 96724 xor a ld [ScriptVar], a xor a ld [ScriptRunning], a ld hl, MapStatus ld bc, wMapStatusEnd - MapStatus call ByteFill farcall InitCallReceiveDelay call ClearJoypad EnterMap: ; 9673e xor a ld [wXYComparePointer], a ld [wXYComparePointer + 1], a call SetUpFiveStepWildEncounterCooldown farcall RunMapSetupScript call DisableEvents ld a, [hMapEntryMethod] cp MAPSETUP_CONNECTION jr nz, .dont_enable call EnableEvents .dont_enable ld a, [hMapEntryMethod] cp MAPSETUP_RELOADMAP jr nz, .dontresetpoison xor a ld [PoisonStepCount], a .dontresetpoison xor a ; end map entry ld [hMapEntryMethod], a ld a, 2 ; HandleMap ld [MapStatus], a ret ; 9676d UnusedWait30Frames: ; 9676d ld c, 30 call DelayFrames ret ; 96773 HandleMap: ; 96773 call ResetOverworldDelay call HandleMapTimeAndJoypad farcall HandleCmdQueue ; no need to farcall call MapEvents ; Not immediately entering a connected map will cause problems. ld a, [MapStatus] cp 2 ; HandleMap ret nz call HandleMapObjects call NextOverworldFrame call HandleMapBackground call CheckPlayerState ret ; 96795 MapEvents: ; 96795 ld a, [MapEventStatus] ld hl, .jumps rst JumpTable ret .jumps dw .events dw .no_events ; 967a1 .events ; 967a1 call PlayerEvents call DisableEvents farcall ScriptEvents ret ; 967ae .no_events ; 967ae ret ; 967af MaxOverworldDelay: ; 967af db 2 ; 967b0 ResetOverworldDelay: ; 967b0 ld a, [MaxOverworldDelay] ld [OverworldDelay], a ret ; 967b7 NextOverworldFrame: ; 967b7 ld a, [OverworldDelay] and a ret z ld c, a call DelayFrames ret ; 967c1 HandleMapTimeAndJoypad: ; 967c1 ld a, [MapEventStatus] cp 1 ; no events ret z call UpdateTime call GetJoypad call TimeOfDayPals ret ; 967d1 HandleMapObjects: ; 967d1 farcall HandleNPCStep ; engine/map_objects.asm farcall _HandlePlayerStep call _CheckObjectEnteringVisibleRange ret ; 967e1 HandleMapBackground: ; 967e1 farcall _UpdateSprites farcall ScrollScreen farcall PlaceMapNameSign ret ; 967f4 CheckPlayerState: ; 967f4 ld a, [wPlayerStepFlags] bit 5, a ; in the middle of step jr z, .events bit 6, a ; stopping step jr z, .noevents bit 4, a ; in midair jr nz, .noevents call EnableEvents .events ld a, 0 ; events ld [MapEventStatus], a ret .noevents ld a, 1 ; no events ld [MapEventStatus], a ret ; 96812 _CheckObjectEnteringVisibleRange: ; 96812 ld hl, wPlayerStepFlags bit 6, [hl] ret z farcall CheckObjectEnteringVisibleRange ret ; 9681f PlayerEvents: ; 9681f xor a ; If there's already a player event, don't interrupt it. ld a, [ScriptRunning] and a ret nz call Dummy_CheckScriptFlags3Bit5 ; This is a waste of time call CheckTrainerBattle3 jr c, .ok call CheckTileEvent jr c, .ok call RunMemScript jr c, .ok call RunSceneScript jr c, .ok call CheckTimeEvents jr c, .ok call OWPlayerInput jr c, .ok xor a ret .ok push af farcall EnableScriptMode pop af ld [ScriptRunning], a call DoPlayerEvent ld a, [ScriptRunning] cp PLAYEREVENT_CONNECTION jr z, .ok2 cp PLAYEREVENT_JOYCHANGEFACING jr z, .ok2 xor a ld [wLandmarkSignTimer], a .ok2 scf ret ; 96867 CheckTrainerBattle3: ; 96867 nop nop call CheckTrainerBattle2 jr nc, .nope ld a, PLAYEREVENT_SEENBYTRAINER scf ret .nope xor a ret ; 96874 CheckTileEvent: ; 96874 ; Check for warps, coord events, or wild battles. call CheckWarpConnxnScriptFlag jr z, .connections_disabled farcall CheckMovingOffEdgeOfMap jr c, .map_connection call CheckWarpTile jr c, .warp_tile .connections_disabled call CheckCoordEventScriptFlag jr z, .coord_events_disabled call CheckCurrentMapCoordEvents jr c, .coord_event .coord_events_disabled call CheckStepCountScriptFlag jr z, .step_count_disabled call CountStep ret c .step_count_disabled call CheckWildEncountersScriptFlag jr z, .ok call RandomEncounter ret c jr .ok ; pointless .ok xor a ret .map_connection ld a, PLAYEREVENT_CONNECTION scf ret .warp_tile ld a, [PlayerStandingTile] call CheckPitTile jr nz, .not_pit ld a, PLAYEREVENT_FALL scf ret .not_pit ld a, PLAYEREVENT_WARP scf ret .coord_event ld hl, wCurCoordEventScriptAddr ld a, [hli] ld h, [hl] ld l, a call GetMapScriptsBank call CallScript ret ; 968c7 CheckWildEncounterCooldown:: ; 968c7 ld hl, wWildEncounterCooldown ld a, [hl] and a ret z dec [hl] ret z scf ret ; 968d1 SetUpFiveStepWildEncounterCooldown: ; 968d1 ld a, 5 ld [wWildEncounterCooldown], a ret ; 968d7 ret_968d7: ; 968d7 ret ;968d8 SetMinTwoStepWildEncounterCooldown: ; 968d8 ld a, [wWildEncounterCooldown] cp 2 ret nc ld a, 2 ld [wWildEncounterCooldown], a ret ; 968e4 Dummy_CheckScriptFlags3Bit5: ; 968e4 call CheckBit5_ScriptFlags3 ret z call ret_2f3e ret ; 968ec RunSceneScript: ; 968ec ld a, [wCurrMapSceneScriptCount] and a jr z, .nope ld c, a call CheckScenes cp c jr nc, .nope ld e, a ld d, 0 ld hl, wCurrMapSceneScriptsPointer ld a, [hli] ld h, [hl] ld l, a rept 4 add hl, de endr call GetMapScriptsBank call GetFarHalfword call GetMapScriptsBank call CallScript ld hl, ScriptFlags res 3, [hl] farcall EnableScriptMode farcall ScriptEvents ld hl, ScriptFlags bit 3, [hl] jr z, .nope ld hl, wPriorityScriptAddr ld a, [hli] ld h, [hl] ld l, a ld a, [wPriorityScriptBank] call CallScript scf ret .nope xor a ret ; 9693a CheckTimeEvents: ; 9693a ld a, [wLinkMode] and a jr nz, .nothing ld hl, wStatusFlags2 bit 2, [hl] ; bug contest jr z, .do_daily farcall CheckBugContestTimer jr c, .end_bug_contest xor a ret .do_daily farcall CheckDailyResetTimer farcall CheckPokerusTick farcall CheckPhoneCall ret c .nothing xor a ret .end_bug_contest ld a, BANK(BugCatchingContestOverScript) ld hl, BugCatchingContestOverScript call CallScript scf ret ; 96970 .unused ; 96970 ld a, 8 scf ret ; 96974 OWPlayerInput: ; 96974 call PlayerMovement ret c and a jr nz, .NoAction ; Can't perform button actions while sliding on ice. farcall CheckStandingOnIce jr c, .NoAction call CheckAPressOW jr c, .Action call CheckMenuOW jr c, .Action .NoAction: xor a ret .Action: push af farcall StopPlayerForEvent pop af scf ret ; 96999 CheckAPressOW: ; 96999 ld a, [hJoyPressed] and A_BUTTON ret z call TryObjectEvent ret c call TryBGEvent ret c call TryTileCollisionEvent ret c xor a ret ; 969ac PlayTalkObject: ; 969ac push de ld de, SFX_READ_TEXT_2 call PlaySFX pop de ret ; 969b5 TryObjectEvent: ; 969b5 farcall CheckFacingObject jr c, .IsObject xor a ret .IsObject: call PlayTalkObject ld a, [hObjectStructIndexBuffer] call GetObjectStruct ld hl, OBJECT_MAP_OBJECT_INDEX add hl, bc ld a, [hl] ld [hLastTalked], a ld a, [hLastTalked] call GetMapObject ld hl, MAPOBJECT_COLOR add hl, bc ld a, [hl] and %00001111 ; Bug: If IsInArray returns nc, data at bc will be executed as code. push bc ld de, 3 ld hl, .pointers call IsInArray jr nc, .nope_bugged pop bc inc hl ld a, [hli] ld h, [hl] ld l, a jp hl .nope_bugged ; pop bc xor a ret .pointers dbw OBJECTTYPE_SCRIPT, .script dbw OBJECTTYPE_ITEMBALL, .itemball dbw OBJECTTYPE_TRAINER, .trainer ; the remaining four are dummy events dbw OBJECTTYPE_3, .three dbw OBJECTTYPE_4, .four dbw OBJECTTYPE_5, .five dbw OBJECTTYPE_6, .six db -1 ; 96a04 .script ; 96a04 ld hl, MAPOBJECT_SCRIPT_POINTER add hl, bc ld a, [hli] ld h, [hl] ld l, a call GetMapScriptsBank call CallScript ret ; 96a12 .itemball ; 96a12 ld hl, MAPOBJECT_SCRIPT_POINTER add hl, bc ld a, [hli] ld h, [hl] ld l, a call GetMapScriptsBank ld de, EngineBuffer1 ld bc, 2 call FarCopyBytes ld a, PLAYEREVENT_ITEMBALL scf ret ; 96a29 .trainer ; 96a29 call TalkToTrainer ld a, PLAYEREVENT_TALKTOTRAINER scf ret ; 96a30 .three ; 96a30 xor a ret ; 96a32 .four ; 96a32 xor a ret ; 96a34 .five ; 96a34 xor a ret ; 96a36 .six ; 96a36 xor a ret ; 96a38 TryBGEvent: ; 96a38 call CheckFacingBGEvent jr c, .is_bg_event xor a ret .is_bg_event: ld a, [EngineBuffer3] ld hl, .bg_events rst JumpTable ret .bg_events dw .read dw .up dw .down dw .right dw .left dw .ifset dw .ifnotset dw .itemifset dw .copy ; 96a59 .up ld b, OW_UP jr .checkdir .down ld b, OW_DOWN jr .checkdir .right ld b, OW_RIGHT jr .checkdir .left ld b, OW_LEFT jr .checkdir .checkdir ld a, [PlayerDirection] and %1100 cp b jp nz, .dontread .read call PlayTalkObject ld hl, EngineBuffer4 ld a, [hli] ld h, [hl] ld l, a call GetMapScriptsBank call CallScript scf ret .itemifset call CheckBGEventFlag jp nz, .dontread call PlayTalkObject call GetMapScriptsBank ld de, EngineBuffer1 ld bc, 3 call FarCopyBytes ld a, BANK(HiddenItemScript) ld hl, HiddenItemScript call CallScript scf ret .copy call CheckBGEventFlag jr nz, .dontread call GetMapScriptsBank ld de, EngineBuffer1 ld bc, 3 call FarCopyBytes jr .dontread .ifset call CheckBGEventFlag jr z, .dontread jr .thenread .ifnotset call CheckBGEventFlag jr nz, .dontread .thenread push hl call PlayTalkObject pop hl inc hl inc hl call GetMapScriptsBank call GetFarHalfword call GetMapScriptsBank call CallScript scf ret .dontread xor a ret ; 96ad8 CheckBGEventFlag: ; 96ad8 ld hl, EngineBuffer4 ld a, [hli] ld h, [hl] ld l, a push hl call GetMapScriptsBank call GetFarHalfword ld e, l ld d, h ld b, CHECK_FLAG call EventFlagAction ld a, c and a pop hl ret ; 96af0 PlayerMovement: ; 96af0 farcall DoPlayerMovement ld a, c ld hl, .pointers rst JumpTable ld a, c ret ; 96afd .pointers dw .zero dw .one dw .two dw .three dw .four dw .five dw .six dw .seven .zero .four ; 96b0d xor a ld c, a ret ; 96b10 .seven ; 96b10 call ret_968d7 ; mobile xor a ld c, a ret ; 96b16 .one ; 96b16 ld a, 5 ld c, a scf ret ; 96b1b .two ; 96b1b ld a, 9 ld c, a scf ret ; 96b20 .three ; 96b20 ; force the player to move in some direction ld a, BANK(Script_ForcedMovement) ld hl, Script_ForcedMovement call CallScript ; ld a, -1 ld c, a scf ret ; 96b2b .five .six ; 96b2b ld a, -1 ld c, a and a ret ; 96b30 CheckMenuOW: ; 96b30 xor a ld [hMenuReturn], a ld [hMenuReturn + 1], a ld a, [hJoyPressed] bit SELECT_F, a jr nz, .Select 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 ; 96b58 StartMenuScript: ; 96b58 callasm StartMenu jump StartMenuCallback ; 96b5f SelectMenuScript: ; 96b5f callasm SelectMenu jump SelectMenuCallback ; 96b66 StartMenuCallback: SelectMenuCallback: ; 96b66 copybytetovar hMenuReturn if_equal HMENURETURN_SCRIPT, .Script if_equal HMENURETURN_ASM, .Asm end ; 96b72 .Script: ; 96b72 ptjump wQueuedScriptBank ; 96b75 .Asm: ; 96b75 ptcallasm wQueuedScriptBank end ; 96b79 CountStep: ; 96b79 ; Don't count steps in link communication rooms. ld a, [wLinkMode] and a jr nz, .done ; If there is a special phone call, don't count the step. farcall CheckSpecialPhoneCall jr c, .doscript ; If Repel wore off, don't count the step. call DoRepelStep jr c, .doscript ; Count the step for poison and total steps ld hl, PoisonStepCount inc [hl] ld hl, StepCount inc [hl] ; Every 256 steps, increase the happiness of all your Pokemon. jr nz, .skip_happiness farcall StepHappiness .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. ld a, [StepCount] cp $80 jr nz, .skip_egg farcall DoEggStep jr nz, .hatch .skip_egg ; Increase the EXP of (both) DayCare Pokemon by 1. farcall DayCareStep ; Every four steps, deal damage to all Poisoned Pokemon ld hl, PoisonStepCount ld a, [hl] cp 4 jr c, .skip_poison ld [hl], 0 farcall DoPoisonStep jr c, .doscript .skip_poison farcall DoBikeStep .done xor a ret .doscript ld a, -1 scf ret .hatch ld a, 8 scf ret ; 96bd3 ; unused .unreferenced ; 96bd3 ld a, 7 scf ret ; 96bd7 DoRepelStep: ; 96bd7 ld a, [wRepelEffect] and a ret z dec a ld [wRepelEffect], a ret nz ld a, BANK(RepelWoreOffScript) ld hl, RepelWoreOffScript call CallScript scf ret ; 96beb DoPlayerEvent: ; 96beb ld a, [ScriptRunning] and a ret z cp PLAYEREVENT_MAPSCRIPT ; run script ret z cp NUM_PLAYER_EVENTS ret nc ld c, a ld b, 0 ld hl, PlayerEventScriptPointers add hl, bc add hl, bc add hl, bc ld a, [hli] ld [ScriptBank], a ld a, [hli] ld [ScriptPos], a ld a, [hl] ld [ScriptPos + 1], a ret ; 96c0c PlayerEventScriptPointers: ; 96c0c dba Invalid_0x96c2d ; 0 dba SeenByTrainerScript ; 1 dba TalkToTrainerScript ; 2 dba FindItemInBallScript ; 3 dba EdgeWarpScript ; 4 dba WarpToNewMapScript ; 5 dba FallIntoMapScript ; 6 dba Script_OverworldWhiteout ; 7 dba HatchEggScript ; 8 dba ChangeDirectionScript ; 9 dba Invalid_0x96c2d ; 10 ; 96c2d Invalid_0x96c2d: ; 96c2d end ; 96c2e ; unused end ; 96c2f HatchEggScript: ; 96c2f callasm OverworldHatchEgg end ; 96c34 WarpToNewMapScript: ; 96c34 warpsound newloadmap MAPSETUP_DOOR end ; 96c38 FallIntoMapScript: ; 96c38 newloadmap MAPSETUP_FALL playsound SFX_KINESIS applymovement PLAYER, MovementData_0x96c48 playsound SFX_STRENGTH scall LandAfterPitfallScript end ; 96c48 MovementData_0x96c48: ; 96c48 skyfall step_end ; 96c4a LandAfterPitfallScript: ; 96c4a earthquake 16 end ; 96c4d EdgeWarpScript: ; 4 reloadandreturn MAPSETUP_CONNECTION ; 96c4f ChangeDirectionScript: ; 9 deactivatefacing 3 callasm EnableWildEncounters end ; 96c56 INCLUDE "engine/scripting.asm" INCLUDE "engine/events_2.asm"