diff options
author | libjet <libj3t@gmail.com> | 2020-05-31 03:31:15 +0100 |
---|---|---|
committer | libjet <libj3t@gmail.com> | 2020-05-31 03:31:15 +0100 |
commit | 8ed6e954221473960c336d2d96171212525e68c6 (patch) | |
tree | 0e23a3852e7764c71619b3e54f1191477f363992 | |
parent | 8a892f8240d1ed4fc69a00b4740dafa438d2efca (diff) |
Add engine/events/magnet_train.asm
-rw-r--r-- | constants/sprite_anim_constants.asm | 1 | ||||
-rwxr-xr-x | engine/events/magnet_train.asm | 387 | ||||
-rwxr-xr-x | gfx/overworld/magnet_train_bg.tilemap | 1 | ||||
-rwxr-xr-x | gfx/overworld/magnet_train_fg.tilemap | bin | 0 -> 80 bytes | |||
-rw-r--r-- | main.asm | 4 | ||||
-rw-r--r-- | wram.asm | 15 |
6 files changed, 405 insertions, 3 deletions
diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index 4ad57dbb..0265bb1c 100644 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -38,6 +38,7 @@ SPRITE_ANIM_INDEX_TRADE_TUBE_BULGE EQU $22 SPRITE_ANIM_INDEX_TRADEMON_ICON EQU $23 SPRITE_ANIM_INDEX_TRADEMON_BUBBLE EQU $24 SPRITE_ANIM_INDEX_RADIO_TUNING_KNOB EQU $26 +SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED EQU $27 SPRITE_ANIM_INDEX_LEAF EQU $28 SPRITE_ANIM_INDEX_CUT_TREE EQU $29 SPRITE_ANIM_INDEX_FLY_LEAF EQU $2a diff --git a/engine/events/magnet_train.asm b/engine/events/magnet_train.asm new file mode 100755 index 00000000..715c801c --- /dev/null +++ b/engine/events/magnet_train.asm @@ -0,0 +1,387 @@ +MagnetTrain: + ld a, [wScriptVar] + and a + jr nz, .ToGoldenrod + ld a, 1 ; forwards + lb bc, 8 * TILE_WIDTH, 12 * TILE_WIDTH + lb de, (11 * TILE_WIDTH) - (11 * TILE_WIDTH + 4), -12 * TILE_WIDTH + jr .continue + +.ToGoldenrod: + ld a, -1 ; backwards + lb bc, -8 * TILE_WIDTH, -12 * TILE_WIDTH + lb de, (11 * TILE_WIDTH) + (11 * TILE_WIDTH + 4), 12 * TILE_WIDTH + +.continue + ld [wMagnetTrainDirection], a + ld a, c + ld [wMagnetTrainInitPosition], a + ld a, b + ld [wMagnetTrainHoldPosition], a + ld a, e + ld [wMagnetTrainFinalPosition], a + ld a, d + ld [wMagnetTrainPlayerSpriteInitX], a + + ldh a, [hSCX] + push af + ldh a, [hSCY] + push af + call MagnetTrain_LoadGFX_PlayMusic + ld hl, hVBlank + ld a, [hl] + push af + ld [hl], 1 +.loop + ld a, [wJumptableIndex] + bit 7, a + jr nz, .done + callfar PlaySpriteAnimations + call MagnetTrain_Jumptable + call MagnetTrain_UpdateLYOverrides + call PushLYOverrides + call DelayFrame + jr .loop + +.done + pop af + ldh [hVBlank], a + call ClearBGPalettes + xor a + ldh [hLCDCPointer], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a + ldh [hSCX], a + ld [wRequested2bppSource], a + ld [wRequested2bppSource + 1], a + ld [wRequested2bppDest], a + ld [wRequested2bppDest + 1], a + ld [wRequested2bpp], a + call ClearTilemap + + pop af + ldh [hSCY], a + pop af + ldh [hSCX], a + xor a + ldh [hBGMapMode], a + ret + +MagnetTrain_UpdateLYOverrides: + ld hl, wLYOverridesBackup + ld c, 6 * TILE_WIDTH - 1 + ld a, [wMagnetTrainOffset] + add a + ldh [hSCX], a + call .loadloop + ld c, 6 * TILE_WIDTH + ld a, [wMagnetTrainPosition] + call .loadloop + ld c, 6 * TILE_WIDTH + 1 + ld a, [wMagnetTrainOffset] + add a + call .loadloop + + ld a, [wMagnetTrainDirection] + ld d, a + ld hl, wMagnetTrainOffset + ld a, [hl] + add d + add d + ld [hl], a + ret + +.loadloop + ld [hli], a + dec c + jr nz, .loadloop + ret + +MagnetTrain_LoadGFX_PlayMusic: + call ClearBGPalettes + call ClearSprites + call DisableLCD + callfar ClearSpriteAnims + call SetMagnetTrainPals + call DrawMagnetTrain + ld a, SCREEN_HEIGHT_PX + ldh [hWY], a + call EnableLCD + xor a + ldh [hBGMapMode], a + ldh [hSCX], a + ldh [hSCY], a + + ld de, ChrisSpriteGFX + ld hl, vTiles0 + lb bc, BANK(ChrisSpriteGFX), 4 + call Request2bpp + + ld de, ChrisSpriteGFX + 12 tiles + ld hl, vTiles0 tile $04 + lb bc, BANK(ChrisSpriteGFX), 4 + call Request2bpp + + call MagnetTrain_InitLYOverrides + + ld a, [wTimeOfDayPal] + push af + ld a, [wEnvironment] + push af + + ld a, [wTimeOfDay] + maskbits NUM_DAYTIMES + ld [wTimeOfDayPal], a + ld a, TOWN + ld [wEnvironment], a + ld b, SCGB_MAPPALS + call GetSGBLayout + call UpdateTimePals + + ldh a, [rBGP] + ld [wBGP], a + ldh a, [rOBP0] + ld [wOBP0], a + ldh a, [rOBP1] + ld [wOBP1], a + + pop af + ld [wEnvironment], a + pop af + ld [wTimeOfDayPal], a + + ld hl, wJumptableIndex + xor a + ld [hli], a ; wJumptableIndex + ld a, [wMagnetTrainInitPosition] + ld [hli], a ; wMagnetTrainOffset + ld [hli], a ; wMagnetTrainPosition + ld [hli], a ; wMagnetTrainWaitCounter + + ld de, MUSIC_MAGNET_TRAIN + call PlayMusic2 + ret + +DrawMagnetTrain: + hlbgcoord 0, 0 + xor a +.loop + call GetMagnetTrainBGTiles + ld b, BG_MAP_WIDTH / 2 + call .FillAlt + inc a + cp SCREEN_HEIGHT + jr c, .loop + + hlbgcoord 0, 6 + ld de, MagnetTrainTilemap + ld c, SCREEN_WIDTH + call .FillLine + hlbgcoord 0, 7 + ld de, MagnetTrainTilemap + SCREEN_WIDTH + ld c, SCREEN_WIDTH + call .FillLine + hlbgcoord 0, 8 + ld de, MagnetTrainTilemap + (SCREEN_WIDTH * 2) + ld c, SCREEN_WIDTH + call .FillLine + hlbgcoord 0, 9 + ld de, MagnetTrainTilemap + (SCREEN_WIDTH * 3) + ld c, SCREEN_WIDTH + call .FillLine + ret + +.FillLine: + ld a, [de] + inc de + ld [hli], a + dec c + jr nz, .FillLine + ret + +.FillAlt: + ld [hl], e + inc hl + ld [hl], d + inc hl + dec b + jr nz, .FillAlt + ret + +GetMagnetTrainBGTiles: + push hl + ld e, a + ld d, 0 + ld hl, MagnetTrainBGTiles + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + pop hl + ret + +MagnetTrainBGTiles: +; 2x18 tilemap, repeated in vertical strips for the background. +INCBIN "gfx/overworld/magnet_train_bg.tilemap" + +MagnetTrain_InitLYOverrides: + ld hl, wLYOverrides + ld bc, wLYOverridesEnd - wLYOverrides + ld a, [wMagnetTrainInitPosition] + call ByteFill + ld hl, wLYOverridesBackup + ld bc, wLYOverridesBackupEnd - wLYOverridesBackup + ld a, [wMagnetTrainInitPosition] + call ByteFill + ld a, LOW(rSCX) + ldh [hLCDCPointer], a + ret + +SetMagnetTrainPals: + ld a, 1 + ldh [rVBK], a + + ; bushes + hlbgcoord 0, 0 + ld bc, 4 * BG_MAP_WIDTH + ld a, PAL_BG_GREEN + call ByteFill + + ; train + hlbgcoord 0, 4 + ld bc, 10 * BG_MAP_WIDTH + xor a ; PAL_BG_GRAY + call ByteFill + + ; more bushes + hlbgcoord 0, 14 + ld bc, 4 * BG_MAP_WIDTH + ld a, PAL_BG_GREEN + call ByteFill + + ; train window + hlbgcoord 7, 8 + ld bc, 6 + ld a, PAL_BG_YELLOW + call ByteFill + + ld a, 0 + ldh [rVBK], a + ret + +MagnetTrain_Jumptable: + ld a, [wJumptableIndex] + ld e, a + ld d, 0 + ld hl, .Jumptable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Jumptable: + dw .InitPlayerSpriteAnim + dw .WaitScene + dw .MoveTrain1 + dw .WaitScene + dw .MoveTrain2 + dw .WaitScene + dw .TrainArrived + +.Next: + ld hl, wJumptableIndex + inc [hl] + ret + +.InitPlayerSpriteAnim: + ld d, (8 + 2) * TILE_WIDTH + 5 + ld a, [wMagnetTrainPlayerSpriteInitX] + ld e, a + ld a, SPRITE_ANIM_INDEX_MAGNET_TRAIN_RED + call InitSpriteAnimStruct + ld hl, SPRITEANIMSTRUCT_TILE_ID + add hl, bc + ld [hl], 0 + call .Next + ld a, 128 + ld [wMagnetTrainWaitCounter], a + ret + +.MoveTrain1: + ld hl, wMagnetTrainHoldPosition + ld a, [wMagnetTrainPosition] + cp [hl] + jr z, .PrepareToHoldTrain + ld e, a + ld a, [wMagnetTrainDirection] + xor $ff + inc a + add e + ld [wMagnetTrainPosition], a + ld hl, wGlobalAnimXOffset + ld a, [wMagnetTrainDirection] + add [hl] + ld [hl], a + ret + +.PrepareToHoldTrain: + call .Next + ld a, 128 + ld [wMagnetTrainWaitCounter], a + ret + +.WaitScene: + ld hl, wMagnetTrainWaitCounter + ld a, [hl] + and a + jr z, .DoneWaiting + dec [hl] + ret + +.DoneWaiting: + call .Next + ret + +.MoveTrain2: + ld hl, wMagnetTrainFinalPosition + ld a, [wMagnetTrainPosition] + cp [hl] + jr z, .PrepareToFinishAnim + ld e, a + ld a, [wMagnetTrainDirection] + xor $ff + inc a + ld d, a + ld a, e + add d + add d + ld [wMagnetTrainPosition], a + ld hl, wGlobalAnimXOffset + ld a, [wMagnetTrainDirection] + ld d, a + ld a, [hl] + add d + add d + ld [hl], a + ret + + ret + +.PrepareToFinishAnim: + call .Next + ret + +.TrainArrived: + ld a, $80 + ld [wJumptableIndex], a + ld de, SFX_TRAIN_ARRIVED + call PlaySFX + ret + + +MagnetTrainTilemap: +; 20x4 tilemap +INCBIN "gfx/overworld/magnet_train_fg.tilemap" diff --git a/gfx/overworld/magnet_train_bg.tilemap b/gfx/overworld/magnet_train_bg.tilemap new file mode 100755 index 00000000..3a70aecc --- /dev/null +++ b/gfx/overworld/magnet_train_bg.tilemap @@ -0,0 +1 @@ +LM\]LM\]11
11LM\]LM\]
\ No newline at end of file diff --git a/gfx/overworld/magnet_train_fg.tilemap b/gfx/overworld/magnet_train_fg.tilemap Binary files differnew file mode 100755 index 00000000..2f542683 --- /dev/null +++ b/gfx/overworld/magnet_train_fg.tilemap @@ -236,9 +236,7 @@ INCLUDE "engine/menus/delete_save.asm" INCLUDE "engine/tilesets/timeofday_pals.asm" INCLUDE "engine/battle/battle_transition.asm" INCLUDE "engine/events/field_moves.asm" - -MagnetTrain:: - dr $8ce7c, $8d174 +INCLUDE "engine/events/magnet_train.asm" ClearSpriteAnims:: dr $8d174, $8d183 @@ -1054,6 +1054,12 @@ wTrainerCardBadgeTileID:: db wTrainerCardBadgeAttributes:: db NEXTU ; ce64 +; magnet train +wMagnetTrainOffset:: db +wMagnetTrainPosition:: db +wMagnetTrainWaitCounter:: db + +NEXTU ; ce64 ; miscellaneous wFrameCounter:: wMomBankDigitCursorPosition:: @@ -1230,6 +1236,15 @@ UNION ; ceed wTempMail:: mailmsg wTempMail NEXTU ; ceed +; magnet train +wMagnetTrain:: ; used only for BANK(wMagnetTrain) +wMagnetTrainDirection:: db +wMagnetTrainInitPosition:: db +wMagnetTrainHoldPosition:: db +wMagnetTrainFinalPosition:: db +wMagnetTrainPlayerSpriteInitX:: db + +NEXTU ; ceed ; credits wCreditsPos:: dw wCreditsTimer:: db |