pokecrystal-board/engine/events.asm

1135 lines
14 KiB
NASM
Raw Normal View History

INCLUDE "includes.asm"
SECTION "Events", ROMX, BANK[EVENTS]
OverworldLoop:: ; 966b0
xor a
2013-12-27 02:56:23 -08:00
ld [MapStatus], a
.loop
ld a, [MapStatus]
ld hl, .jumps
rst JumpTable
2013-12-27 02:56:23 -08:00
ld a, [MapStatus]
cp 3 ; done
2013-12-27 02:56:23 -08:00
jr nz, .loop
.done
ret
2013-12-27 02:56:23 -08:00
.jumps
dw StartMap
dw EnterMap
dw HandleMap
dw .done
; 966cb
ClearAllScriptFlags3: ; 966cb
xor a
ld [ScriptFlags3], a
ret
; 966d0
SetAll_ScriptFlags3:: ; 966d0
ld a, $ff
ld [ScriptFlags3], a
ret
; 966d6
CheckBit5_ScriptFlags3: ; 966d6
ld hl, ScriptFlags3
bit 5, [hl]
ret
; 966dc
ResetBit2_ScriptFlags3: ; 966dc
ld hl, ScriptFlags3
res 2, [hl]
ret
; 966e2
ResetBit1_ScriptFlags3: ; 966e2
ld hl, ScriptFlags3
res 1, [hl]
ret
; 966e8
ResetBit0_ScriptFlags3: ; 966e8
ld hl, ScriptFlags3
res 0, [hl]
ret
; 966ee
ResetBit4_ScriptFlags3: ; 966ee
ld hl, ScriptFlags3
res 4, [hl]
ret
; 966f4
SetBit2_ScriptFlags3: ; 966f4
ld hl, ScriptFlags3
set 2, [hl]
ret
; 966fa
SetBit1_ScriptFlags3: ; 966fa
ld hl, ScriptFlags3
set 1, [hl]
ret
; 96700
SetBit0_ScriptFlags3: ; 96700
ld hl, ScriptFlags3
set 0, [hl]
ret
; 96706
SetBit4_ScriptFlags3: ; 96706
ld hl, ScriptFlags3
set 4, [hl]
ret
; 9670c
CheckBit2_ScriptFlags3: ; 9670c
ld hl, ScriptFlags3
bit 2, [hl]
ret
; 96712
CheckBit1_ScriptFlags3: ; 96712
ld hl, ScriptFlags3
bit 1, [hl]
ret
; 96718
CheckBit0_ScriptFlags3: ; 96718
ld hl, ScriptFlags3
bit 0, [hl]
ret
; 9671e
CheckBit4_ScriptFlags3: ; 9671e
ld hl, ScriptFlags3
bit 4, [hl]
ret
; 96724
2013-12-27 02:56:23 -08:00
StartMap: ; 96724
xor a
ld [ScriptVar], a
xor a
ld [ScriptRunning], a
2013-12-27 02:56:23 -08:00
ld hl, MapStatus
ld bc, $3e ; 62
call ByteFill
2015-10-24 07:34:19 -07:00
callba InitCallReceiveDelay
call ClearJoypad
; fallthrough
; 9673e
2013-12-27 02:56:23 -08:00
EnterMap: ; 9673e
xor a
ld [wd453], a
ld [wd454], a
call SetUpFiveStepWildEncounterCooldown
2014-01-26 19:07:19 -08:00
callba RunMapSetupScript
call ClearAllScriptFlags3
2013-12-27 02:56:23 -08:00
ld a, [hMapEntryMethod]
2015-10-24 16:49:19 -07:00
cp MAPSETUP_07
jr nz, .dontset
call SetAll_ScriptFlags3
.dontset
2013-12-27 02:56:23 -08:00
ld a, [hMapEntryMethod]
2015-10-24 16:49:19 -07:00
cp MAPSETUP_RELOADMAP
jr nz, .dontresetpoison
xor a
ld [PoisonStepCount], a
.dontresetpoison
2013-12-27 02:56:23 -08:00
2015-10-24 16:49:19 -07:00
xor a ; end map entry
ld [hMapEntryMethod], a
2013-12-27 02:56:23 -08:00
ld a, 2 ; HandleMap
ld [MapStatus], a
ret
; 9676d
Function9676d: ; 9676d
ld c, 30
call DelayFrames
ret
; 96773
2013-12-27 02:56:23 -08:00
HandleMap: ; 96773
call ResetOverworldDelay
call Function967c1
callba Function97e08
2013-12-27 02:56:23 -08:00
call MapEvents
; Not immediately entering a connected map will cause problems.
ld a, [MapStatus]
cp 2 ; HandleMap
ret nz
2013-12-27 02:56:23 -08:00
call Function967d1
call NextOverworldFrame
call Function967e1
call Function967f4
ret
; 96795
2013-12-27 02:56:23 -08:00
MapEvents: ; 96795
ld a, [MapEventStatus]
ld hl, .jumps
rst JumpTable
ret
2013-12-27 02:56:23 -08:00
.jumps
dw .events
dw .no_events
; 967a1
2013-12-27 02:56:23 -08:00
.events ; 967a1
call PlayerEvents
call ClearAllScriptFlags3
callba ScriptEvents
ret
; 967ae
2013-12-27 02:56:23 -08:00
.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
Function967c1: ; 967c1
2013-12-27 02:56:23 -08:00
ld a, [MapEventStatus]
cp 1 ; no events
ret z
2013-12-27 02:56:23 -08:00
call UpdateTime
call GetJoypad
call TimeOfDayPals
ret
; 967d1
Function967d1: ; 967d1
callba Function576a
callba Functiond497
call Function96812
ret
; 967e1
Function967e1: ; 967e1
callba RefreshMapAppearDisappear
callba Functiond4d2
callba Functionb8098
ret
; 967f4
Function967f4: ; 967f4
ld a, [wd150]
bit 5, a
jr z, .events
bit 6, a
jr z, .noevents
bit 4, a
jr nz, .noevents
call SetAll_ScriptFlags3
.events
2013-12-27 02:56:23 -08:00
ld a, 0 ; events
ld [MapEventStatus], a
ret
.noevents
2013-12-27 02:56:23 -08:00
ld a, 1 ; no events
ld [MapEventStatus], a
ret
; 96812
Function96812: ; 96812
ld hl, wd150
bit 6, [hl]
ret z
2013-12-27 02:56:23 -08:00
callba Function81ca
ret
; 9681f
PlayerEvents: ; 9681f
xor a
2015-10-24 07:34:19 -07:00
; If there's already a player event, don't interrupt it.
ld a, [ScriptRunning]
and a
ret nz
2015-10-24 07:34:19 -07:00
call Dummy_CheckScriptFlags3Bit5 ; This is a waste of time
call CheckTrainerBattle3
jr c, .ok
call CheckTileEvent
jr c, .ok
2015-10-24 07:34:19 -07:00
call RunMemScript
jr c, .ok
2015-10-24 07:34:19 -07:00
call DoMapTrigger
jr c, .ok
2015-10-24 07:34:19 -07:00
call CheckTimeEvents
jr c, .ok
call OWPlayerInput
jr c, .ok
xor a
ret
.ok
push af
callba EnableScriptMode
pop af
ld [ScriptRunning], a
2015-10-24 16:49:19 -07:00
call DoPlayerEvent
ld a, [ScriptRunning]
cp 4
jr z, .ok2
cp 9
jr z, .ok2
xor a
ld [wc2da], a
.ok2
scf
ret
; 96867
CheckTrainerBattle3: ; 96867
nop
nop
call CheckTrainerBattle2
jr nc, .nope
2013-12-27 02:56:23 -08:00
ld a, 1
scf
ret
.nope
xor a
ret
; 96874
CheckTileEvent: ; 96874
; Check for warps, tile triggers or wild battles.
call CheckBit2_ScriptFlags3
jr z, .bit2
callba CheckMovingOffEdgeOfMap
jr c, .return4
2015-10-24 16:49:19 -07:00
call CheckWarpTile
jr c, .return6
.bit2
call CheckBit1_ScriptFlags3
jr z, .bit1
call CheckCurrentMapXYTriggers
jr c, .movement
.bit1
call CheckBit0_ScriptFlags3
jr z, .bit0
call CountStep
ret c
.bit0
call CheckBit4_ScriptFlags3
jr z, .ok
call RandomEncounter
ret c
jr .ok ; pointless
.ok
xor a
ret
.return4
ld a, 4
scf
ret
.return6
ld a, [StandingTile]
call CheckPitTile
jr nz, .pittile
ld a, 6
scf
ret
.pittile
ld a, 5
scf
ret
.movement
ld hl, MovementAnimation
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptHeaderBank
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
2015-10-24 16:49:19 -07:00
ret_968d7: ; 968d7
ret
;968d8
SetMinTwoStepWildEncounterCooldown: ; 968d8
ld a, [wWildEncounterCooldown]
cp 2
ret nc
ld a, 2
ld [wWildEncounterCooldown], a
ret
; 968e4
2015-10-24 07:34:19 -07:00
Dummy_CheckScriptFlags3Bit5: ; 968e4
call CheckBit5_ScriptFlags3
ret z
2015-10-24 07:34:19 -07:00
call ret_2f3e
ret
; 968ec
2015-10-24 07:34:19 -07:00
DoMapTrigger: ; 968ec
2015-10-24 16:49:19 -07:00
ld a, [wCurrMapTriggerCount]
and a
jr z, .nope
ld c, a
call CheckTriggers
cp c
jr nc, .nope
ld e, a
ld d, 0
2015-10-24 16:49:19 -07:00
ld hl, wCurrMapTriggerHeaderPointer
ld a, [hli]
ld h, [hl]
ld l, a
rept 4
add hl,de
endr
call GetMapScriptHeaderBank
call GetFarHalfword
call GetMapScriptHeaderBank
call CallScript
ld hl, ScriptFlags
res 3, [hl]
callba EnableScriptMode
callba ScriptEvents
ld hl, ScriptFlags
bit 3, [hl]
jr z, .nope
ld hl, ScriptDelay + 2
ld a, [hli]
ld h, [hl]
ld l, a
ld a, [ScriptDelay + 1]
call CallScript
scf
ret
.nope
xor a
ret
; 9693a
2015-10-24 07:34:19 -07:00
CheckTimeEvents: ; 9693a
ld a, [wLinkMode]
and a
2014-07-24 20:19:56 -07:00
jr nz, .nothing
ld hl, StatusFlags2
bit 2, [hl]
2015-10-24 07:34:19 -07:00
jr z, .do_daily
2014-07-24 20:19:56 -07:00
2015-10-24 07:34:19 -07:00
callba CheckBugContestTimer
jr c, .end_bug_contest
xor a
ret
2015-10-24 07:34:19 -07:00
.do_daily
callba CheckDailyResetTimer
callba CheckPokerusTrick
2014-07-24 20:19:56 -07:00
callba 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
; 96970
2015-10-24 07:34:19 -07:00
.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.
callba Function80404
jr c, .NoAction
call CheckAPressOW
jr c, .Action
call CheckMenuOW
jr c, .Action
.NoAction
xor a
ret
.Action
push af
callba Function80422
pop af
scf
ret
; 96999
CheckAPressOW: ; 96999
ld a, [hJoyPressed]
and A_BUTTON
ret z
call TryObjectEvent
ret c
call TryReadSign
ret c
2015-10-01 13:55:24 -07:00
call CheckFacingTileEvent
ret c
xor a
ret
; 969ac
PlayTalkObject: ; 969ac
push de
ld de, SFX_READ_TEXT_2
call PlaySFX
pop de
ret
; 969b5
TryObjectEvent: ; 969b5
callba CheckFacingObject
jr c, .IsObject
xor a
ret
.IsObject
call PlayTalkObject
ld a, [hMapObjectIndexBuffer2]
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
xor a
ret
.pointers
dbw 0, .zero
dbw 1, .one
dbw 2, .two
dbw 3, .three
dbw 4, .four
dbw 5, .five
dbw 6, .six
db -1
; 96a04
.zero ; 96a04
ld hl, MAPOBJECT_SCRIPT_POINTER
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptHeaderBank
call CallScript
; ld a, -1
ret
; 96a12
.one ; 96a12
ld hl, MAPOBJECT_SCRIPT_POINTER
add hl, bc
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptHeaderBank
ld de, EngineBuffer1
ld bc, 2
call FarCopyBytes
ld a, 3
scf
ret
; 96a29
.two ; 96a29
call Function3674
ld a, 2
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
TryReadSign: ; 96a38
call CheckFacingSign
jr c, .IsSign
xor a
ret
.IsSign
ld a, [wd040]
ld hl, .signs
rst JumpTable
ret
.signs
dw .read
dw .up
dw .down
dw .right
dw .left
dw .ifset
dw .ifnotset
dw .itemifset
dw .copy
; 96a59
.up
ld b, UP << 2
jr .checkdir
.down
ld b, DOWN << 2
jr .checkdir
.right
ld b, RIGHT << 2
jr .checkdir
.left
ld b, LEFT << 2
jr .checkdir
.checkdir
ld a, [PlayerDirection]
and %1100
cp b
jp nz, .dontread
.read
call PlayTalkObject
ld hl, wd041
ld a, [hli]
ld h, [hl]
ld l, a
call GetMapScriptHeaderBank
call CallScript
scf
ret
.itemifset
call CheckSignFlag
jp nz, .dontread
call PlayTalkObject
call GetMapScriptHeaderBank
ld de, EngineBuffer1
ld bc, 3
call FarCopyBytes
ld a, BANK(SignpostItemScript)
ld hl, SignpostItemScript
call CallScript
scf
ret
.copy
call CheckSignFlag
jr nz, .dontread
call GetMapScriptHeaderBank
ld de, EngineBuffer1
ld bc, 3
call FarCopyBytes
jr .dontread
.ifset
call CheckSignFlag
jr z, .dontread
jr .thenread
.ifnotset
call CheckSignFlag
jr nz, .dontread
.thenread
push hl
call PlayTalkObject
pop hl
2015-07-20 19:18:18 -07:00
rept 2
inc hl
2015-07-20 19:18:18 -07:00
endr
call GetMapScriptHeaderBank
call GetFarHalfword
call GetMapScriptHeaderBank
call CallScript
scf
ret
.dontread
xor a
ret
; 96ad8
CheckSignFlag: ; 96ad8
ld hl, wd041
ld a, [hli]
ld h, [hl]
ld l, a
push hl
call GetMapScriptHeaderBank
call GetFarHalfword
ld e, l
ld d, h
ld b, $2 ; check
call EventFlagAction
ld a, c
and a
pop hl
ret
; 96af0
PlayerMovement: ; 96af0
callba 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
2015-10-24 16:49:19 -07:00
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
2015-10-24 07:34:19 -07:00
ld [hMenuReturn], a
ld [$ffa1], a
ld a, [hJoyPressed]
bit 2, a ; SELECT
jr nz, .Select
bit 3, a ; START
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
2015-01-20 00:01:23 -08:00
callasm StartMenu
jump StartMenuCallback
; 96b5f
SelectMenuScript: ; 96b5f
2015-01-20 00:01:23 -08:00
callasm SelectMenu
jump SelectMenuCallback
; 96b66
StartMenuCallback:
SelectMenuCallback: ; 96b66
2015-10-24 07:34:19 -07:00
copybytetovar hMenuReturn
if_equal HMENURETURN_SCRIPT, .Script
if_equal HMENURETURN_ASM, .Asm
end
; 96b72
.Script ; 96b72
ptjump wd0e8
; 96b75
.Asm ; 96b75
ptcallasm wd0e8
end
; 96b79
CountStep: ; 96b79
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.
callba CheckSpecialPhoneCall
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
ld hl, PoisonStepCount
inc [hl]
ld hl, StepCount
inc [hl]
2015-10-24 07:34:19 -07:00
; Every 256 steps, increase the happiness of all your Pokemon.
jr nz, .skip_happiness
callba 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.
ld a, [StepCount]
cp $80
2015-10-24 07:34:19 -07:00
jr nz, .skip_egg
2015-10-24 07:34:19 -07:00
callba DoEggStep
jr nz, .hatch
2015-10-24 07:34:19 -07:00
.skip_egg
; Increase the EXP of (both) DayCare Pokemon by 1.
callba DaycareStep
2015-10-24 07:34:19 -07:00
; Every four steps, deal damage to all Poisoned Pokemon
ld hl, PoisonStepCount
ld a, [hl]
cp 4
2015-10-24 07:34:19 -07:00
jr c, .skip_poison
ld [hl], 0
2015-10-24 07:34:19 -07:00
callba DoPoisonStep
jr c, .doscript
2015-10-24 07:34:19 -07:00
.skip_poison
callba 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
ld a, 8
scf
ret
; 96bd3
2015-10-24 07:34:19 -07:00
.unreferenced: ; 96bd3
ld a, 7
scf
ret
; 96bd7
2015-10-24 07:34:19 -07:00
DoRepelStep: ; 96bd7
ld a, [wRepelEffect]
and a
ret z
dec a
2015-10-24 07:34:19 -07:00
ld [wRepelEffect], a
ret nz
ld a, BANK(RepelWoreOffScript)
ld hl, RepelWoreOffScript
call CallScript
scf
ret
; 96beb
2015-10-24 16:49:19 -07:00
DoPlayerEvent: ; 96beb
ld a, [ScriptRunning]
and a
ret z
2015-10-24 07:34:19 -07:00
cp -1 ; run script
ret z
cp 10
ret nc
ld c, a
ld b, 0
ld hl, ScriptPointers96c0c
rept 3
add hl,bc
endr
ld a, [hli]
ld [ScriptBank], a
ld a, [hli]
ld [ScriptPos], a
ld a, [hl]
ld [ScriptPos + 1], a
ret
; 96c0c
ScriptPointers96c0c: ; 96c0c
2015-10-24 07:34:19 -07:00
dba Invalid_0x96c2d
dba SeenByTrainerScript
dba TalkToTrainerScript
dba FindItemInBallScript
dba UnknownScript_0x96c4d
dba WarpToNewMapScript
dba FallIntoMapScript
dba UnknownScript_0x124c8
dba HatchEggScript
dba UnknownScript_0x96c4f
dba Invalid_0x96c2d
; 96c2d
Invalid_0x96c2d: ; 96c2d
end
; 96c2e
UnknownScript_0x96c2e: ; 96c2e
end
; 96c2f
HatchEggScript: ; 96c2f
callasm OverworldHatchEgg
end
; 96c34
WarpToNewMapScript: ; 96c34
warpsound
2015-10-24 16:49:19 -07:00
newloadmap MAPSETUP_05
end
; 96c38
FallIntoMapScript: ; 96c38
2015-10-24 16:49:19 -07:00
newloadmap MAPSETUP_06
playsound SFX_KINESIS
applymovement PLAYER, MovementData_0x96c48
playsound SFX_STRENGTH
2015-10-24 16:49:19 -07:00
scall LandAfterPitfallScript
end
; 96c48
MovementData_0x96c48: ; 96c48
skyfall
step_end
; 96c4a
2015-10-24 16:49:19 -07:00
LandAfterPitfallScript: ; 96c4a
earthquake 16
end
; 96c4d
UnknownScript_0x96c4d: ; 96c4d
reloadandreturn $f7
; 96c4f
UnknownScript_0x96c4f: ; 96c4f
deactivatefacing $3
callasm SetBit4_ScriptFlags3
end
; 96c56
INCLUDE "engine/scripting.asm"
INCLUDE "engine/events_2.asm"