pokered/scripts/VermilionDock.asm
vulcandth d001ced41b
Add macros, constants, and labels for map scripts and text (#367)
This introduces `def_script_pointers`, `def_text_pointers`, and `object_const_def` macros, and applies them to all maps. Most other map labels have also been identified.
2023-07-13 21:27:56 -04:00

217 lines
4.3 KiB
NASM

VermilionDock_Script:
call EnableAutoTextBoxDrawing
CheckEventHL EVENT_STARTED_WALKING_OUT_OF_DOCK
jr nz, .walking_out_of_dock
CheckEventReuseHL EVENT_GOT_HM01
ret z
ld a, [wDestinationWarpID]
cp $1
ret nz
CheckEventReuseHL EVENT_SS_ANNE_LEFT
jp z, VermilionDockSSAnneLeavesScript
SetEventReuseHL EVENT_STARTED_WALKING_OUT_OF_DOCK
call Delay3
ld hl, wd730
set 7, [hl]
ld hl, wSimulatedJoypadStatesEnd
ld a, D_UP
ld [hli], a
ld [hli], a
ld [hl], a
ld a, $3
ld [wSimulatedJoypadStatesIndex], a
xor a
ld [wSpritePlayerStateData2MovementByte1], a
ld [wOverrideSimulatedJoypadStatesMask], a
dec a
ld [wJoyIgnore], a
ret
.walking_out_of_dock
CheckEventAfterBranchReuseHL EVENT_WALKED_OUT_OF_DOCK, EVENT_STARTED_WALKING_OUT_OF_DOCK
ret nz
ld a, [wSimulatedJoypadStatesIndex]
and a
ret nz
ld [wJoyIgnore], a
SetEventReuseHL EVENT_WALKED_OUT_OF_DOCK
ret
VermilionDockSSAnneLeavesScript:
SetEventForceReuseHL EVENT_SS_ANNE_LEFT
ld a, SFX_STOP_ALL_MUSIC
ld [wJoyIgnore], a
ld [wNewSoundID], a
call PlaySound
ld c, BANK(Music_Surfing)
ld a, MUSIC_SURFING
call PlayMusic
farcall LoadSmokeTileFourTimes
xor a
ld [wSpritePlayerStateData1ImageIndex], a
ld c, 120
call DelayFrames
ld b, $9c
call CopyScreenTileBufferToVRAM
hlcoord 0, 10
ld bc, SCREEN_WIDTH * 6
ld a, $14 ; water tile
call FillMemory
ld a, 1
ldh [hAutoBGTransferEnabled], a
call Delay3
xor a
ldh [hAutoBGTransferEnabled], a
ld [wSSAnneSmokeDriftAmount], a
ldh [rOBP1], a
ld a, 88
ld [wSSAnneSmokeX], a
ld hl, wMapViewVRAMPointer
ld c, [hl]
inc hl
ld b, [hl]
push bc
push hl
ld a, SFX_SS_ANNE_HORN
call PlaySoundWaitForCurrent
ld a, $ff
ld [wUpdateSpritesEnabled], a
ld d, $0
ld e, $8
.shift_columns_up
ld hl, $2
add hl, bc
ld a, l
ld [wMapViewVRAMPointer], a
ld a, h
ld [wMapViewVRAMPointer + 1], a
push hl
push de
call ScheduleEastColumnRedraw
call VermilionDock_EmitSmokePuff
pop de
ld b, $10
.smoke_puff_drift_loop
call VermilionDock_AnimSmokePuffDriftRight
ld c, $8
.delay_between_drifts
call VermilionDock_SyncScrollWithLY
dec c
jr nz, .delay_between_drifts
inc d
dec b
jr nz, .smoke_puff_drift_loop
pop bc
dec e
jr nz, .shift_columns_up
xor a
ldh [rWY], a
ldh [hWY], a
call VermilionDock_EraseSSAnne
ld a, $90
ldh [hWY], a
ld a, $1
ld [wUpdateSpritesEnabled], a
pop hl
pop bc
ld [hl], b
dec hl
ld [hl], c
call LoadPlayerSpriteGraphics
ld hl, wNumberOfWarps
dec [hl]
ret
VermilionDock_AnimSmokePuffDriftRight:
push bc
push de
ld hl, wShadowOAMSprite04XCoord
ld a, [wSSAnneSmokeDriftAmount]
swap a
ld c, a
ld de, 4
.drift_loop
inc [hl]
inc [hl]
add hl, de
dec c
jr nz, .drift_loop
pop de
pop bc
ret
VermilionDock_EmitSmokePuff:
; new smoke puff above the S.S. Anne's front smokestack
ld a, [wSSAnneSmokeX]
sub 16
ld [wSSAnneSmokeX], a
ld c, a
ld b, 100 ; Y
ld a, [wSSAnneSmokeDriftAmount]
inc a
ld [wSSAnneSmokeDriftAmount], a
ld a, $1
ld de, VermilionDockOAMBlock
call WriteOAMBlock
ret
VermilionDockOAMBlock:
; tile id, attribute
db $fc, $10
db $fd, $10
db $fe, $10
db $ff, $10
VermilionDock_SyncScrollWithLY:
ld h, d
ld l, $50
call .sync_scroll_ly
ld h, $0
ld l, $80
.sync_scroll_ly
ldh a, [rLY]
cp l
jr nz, .sync_scroll_ly
ld a, h
ldh [rSCX], a
.wait_for_ly_match
ldh a, [rLY]
cp h
jr z, .wait_for_ly_match
ret
VermilionDock_EraseSSAnne:
; Fill the area the S.S. Anne occupies in BG map 0 with water tiles.
ld hl, wVermilionDockTileMapBuffer
ld bc, wVermilionDockTileMapBufferEnd - wVermilionDockTileMapBuffer
ld a, $14 ; water tile
call FillMemory
hlbgcoord 0, 10
ld de, wVermilionDockTileMapBuffer
lb bc, BANK(wVermilionDockTileMapBuffer), 12
call CopyVideoData
; Replace the blocks of the lower half of the ship with water blocks. This
; leaves the upper half alone, but that doesn't matter because replacing any of
; the blocks is unnecessary because the blocks the ship occupies are south of
; the player and won't be redrawn when the player automatically walks north and
; exits the map. This code could be removed without affecting anything.
hlowcoord 5, 2, VERMILION_DOCK_WIDTH
ld a, $d ; water block
ld [hli], a
ld [hli], a
ld [hli], a
ld [hl], a
ld a, SFX_SS_ANNE_HORN
call PlaySound
ld c, 120
call DelayFrames
ret
VermilionDock_TextPointers:
def_text_pointers
dw_const VermilionDockUnusedText, TEXT_VERMILIONDOCK_UNUSED
VermilionDockUnusedText:
text_far _VermilionDockUnusedText
text_end