VermilionDock_Script: call EnableAutoTextBoxDrawing ;ld hl, VermilionDockTrainerHeaders ld de, VermilionDock_ScriptPointers call ExecuteCurMapScriptInTable ;call TruckCheck CheckEventHL EVENT_STARTED_WALKING_OUT_OF_DOCK jr nz, .asm_1db8d CheckEventReuseHL EVENT_GOT_HM01 ret z ld a, [wDestinationWarpID] cp $1 ret nz CheckEventReuseHL EVENT_SS_ANNE_LEFT jp z, VermilionDock_1db9b 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 .asm_1db8d 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 VermilionDock_ScriptPointers: dw CheckFightingMapTrainers dw DisplayEnemyTrainerTextAndStartBattle dw EndTrainerBattle VermilionDock_1db9b: ld a, [wObtainedBadges] bit 4, a ; after obtaining 4 badges the ship returns ret nz 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 .asm_1dbfa 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 .asm_1dc11 call VermilionDock_AnimSmokePuffDriftRight ld c, $8 .asm_1dc16 call VermilionDock_1dc7c dec c jr nz, .asm_1dc16 inc d dec b jr nz, .asm_1dc11 pop bc dec e jr nz, .asm_1dbfa 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 .loop inc [hl] inc [hl] add hl, de dec c jr nz, .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_1dc7c: ld h, d ld l, $50 call .asm_1dc86 ld h, $0 ld l, $80 .asm_1dc86 ldh a, [rLY] cp l jr nz, .asm_1dc86 ld a, h ldh [rSCX], a .asm_1dc8e ldh a, [rLY] cp h jr z, .asm_1dc8e 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: dw VermilionDockText1 dw PickUpItemText ;dw VermilionDockText2 VermilionDockText1: text_far _VermilionDockText1 text_end ; this massive new set of scripts allows the truck to be pushed with Strength. Credit to Vortyne's pureRGB hack for figuring this out! ;VermilionDockTrainerHeaders: ; def_trainers ;MewTrainerHeader: ; trainer EVENT_ENCOUNTERED_MEW, 0, MewBattleText, MewBattleText, MewBattleText ; db -1 ; end ;VermilionDockText2: ; text_asm ; ld hl, MewTrainerHeader ; call TalkToTrainer ; jp TextScriptEnd ;MewBattleText: ; text_far _MewtwoBattleText ; Mew! ; text_asm ; ld a, MEW ; call PlayCry ; call WaitForSoundToFinish ; jp TextScriptEnd ;TruckOAMTable: ; db $50, $28, $C0, $10 ; db $50, $30, $C1, $10 ; db $50, $38, $C2, $10 ; db $50, $40, $C3, $10 ; db $58, $28, $C4, $10 ; db $58, $30, $C5, $10 ; db $58, $38, $C6, $10 ; db $58, $40, $C7, $10 ;RedLeftOAMTable: ; db $8,$0,$9,$0 ; db $a,$2,$b,$3 ;TruckSpriteGFX: INCBIN "gfx/sprites/truck_sprite.2bpp" ;TruckCheck: ; CheckEventHL EVENT_FOUND_MEW ; jp nz, ChangeTruckTile ; ld c, HS_MEW ; ld b, $2 ; ld hl, wMissableObjectFlags ; predef FlagActionPredef ; ld a, c ; and a ; jr nz, .skiphidingmew ; ld a, HS_MEW ; ld [wMissableObjectIndex], a ; predef HideObject ;.skiphidingmew ; ld a, [wd728] ; bit 0, a ; using Strength? ; ret z ; ; the position for moving truck is $00, $15 ; ld hl, wYCoord ; ld a, [hli] ; and a ; ret nz ; ld a, [hl] ; cp $16 ; ret nz ; ; if the player is trying to walk left ; ld a, [wPlayerDirection] ; cp 2 ; ret nz ; xor a ; ld [$ff8c], a ; ld a, $8 ; ld [$ff8d], a ; call SetSpriteFacingDirection ; ld a, $ff ; ld [wJoyIgnore], a ; ld [wUpdateSpritesEnabled], a ; xor a ; ld bc, $4c48 ; ld de, RedLeftOAMTable ; call WriteOAMBlock ; ld bc, (Bank(TruckSpriteGFX) << 8) | 8 ; ld hl, vChars1 + $400 ; ld de, TruckSpriteGFX ; call CopyVideoData ; ld hl, TruckOAMTable ; ld bc, $20 ; ld de, wShadowOAM + $20 ; call CopyData ; ld a, $c ; ld [wNewTileBlockID], a ; used to be wd09f ; ld bc, $a ; predef ReplaceTileBlock ; ; moving the truck ; ld a, SFX_PUSH_BOULDER ; call PlaySound ; ld b, 32 ; ld de, 4 ;.movingtruck ; ld hl, wShadowOAM + $21 ; ld a, 8 ;.movingtruck2 ; dec [hl] ; add hl, de ; dec a ; jr nz, .movingtruck2 ; ld c, 2 ; call DelayFrames ; dec b ; jr nz, .movingtruck ; ld a, $3 ; ld [wNewTileBlockID], a ; used to be wd09f ; ld bc, $9 ; predef ReplaceTileBlock ; call ShowMew ; jp FinishShowMew ; ; show mew and print its dialogue ;ShowMew: ; ld a, 1 ; ld [wUpdateSpritesEnabled], a ; ld a, HS_MEW ; ld [wMissableObjectIndex], a ; predef ShowObject ; ret ;FinishShowMew: ; ld c, 60 ; call DelayFrames ; xor a ; ld [wJoyIgnore], a ; SetEvent EVENT_FOUND_MEW ; ret ;ChangeTruckTile: ; ld bc, $9 ; call GetOWCoord ; ld a, [hl] ; cp $3 ; ret z ; ld a, $3 ; ld [hli], a ; ld a, $c ; ld [hl], a ; CheckEvent EVENT_ENCOUNTERED_MEW ; call z, ShowMew ; jpfar RedrawMapView ; ;GetOWCoord: ; ld hl, wOverworldMap + 2 ; ld a, [wCurMapWidth] ; add $6 ; ld e, a ; ld d, $0 ; add hl, de ; add hl, de ; inc b ; inc c ;.bloop ; add hl, de ; dec b ; jr nz, .bloop ;.cloop ; inc hl ; dec c ; jr nz, .cloop ; ret