diff options
Diffstat (limited to 'src/engine/sequences/intro_sequence_commands.asm')
-rw-r--r-- | src/engine/sequences/intro_sequence_commands.asm | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/src/engine/sequences/intro_sequence_commands.asm b/src/engine/sequences/intro_sequence_commands.asm new file mode 100644 index 0000000..028027b --- /dev/null +++ b/src/engine/sequences/intro_sequence_commands.asm @@ -0,0 +1,392 @@ +ExecuteIntroSequenceCmd: ; 1d408 (7:5408) + ld a, [wSequenceDelay] + or a + jr z, .call_function + cp $ff + ret z ; sequence ended + + dec a ; still waiting + ld [wSequenceDelay], a + ret + +.call_function + ld a, [wSequenceCmdPtr + 0] + ld l, a + ld a, [wSequenceCmdPtr + 1] + ld h, a + ld a, [hli] + ld e, a + ld a, [hli] + ld d, a + ld a, [hli] + ld c, a + ld a, [hli] + ld b, a + ld l, e + ld h, d + call CallHL2 + jr c, ExecuteIntroSequenceCmd + ret + +AdvanceIntroSequenceCmdPtrBy2: ; 1d42e (7:542e) + ld a, 2 + jr AdvanceIntroSequenceCmdPtr + +AdvanceIntroSequenceCmdPtrBy3: ; 1d432 (7:5432) + ld a, 3 + jr AdvanceIntroSequenceCmdPtr + +AdvanceIntroSequenceCmdPtrBy4: ; 1d436 (7:5436) + ld a, 4 +; fallthrough + +AdvanceIntroSequenceCmdPtr: ; 1d438 (7:5438) + push hl + ld hl, wSequenceCmdPtr + add [hl] + ld [hli], a + ld a, [hl] + adc 0 + ld [hl], a + pop hl + ret + +IntroSequenceCmd_WaitOrbsAnimation: ; 1d444 (7:5444) + ld c, $7 + ld de, wTitleScreenSprites +.loop + ld a, [de] + ld [wWhichSprite], a + farcall GetSpriteAnimCounter + cp $ff + jr nz, .no_carry + inc de + dec c + jr nz, .loop + call AdvanceIntroSequenceCmdPtrBy2 + scf + ret + +.no_carry + or a + ret + +IntroSequenceCmd_Wait: ; 1d460 (7:5460) + ld a, c + ld [wSequenceDelay], a + call AdvanceIntroSequenceCmdPtrBy3 + scf + ret + +IntroSequenceCmd_SetOrbsAnimations: ; 1d469 (7:5469) + ld l, c + ld h, b + + ld c, $7 + ld de, wTitleScreenSprites +.loop + push bc + push de + ld a, [de] + ld [wWhichSprite], a + ld a, [hli] + farcall StartSpriteAnimation + pop de + pop bc + inc de + dec c + jr nz, .loop + + call AdvanceIntroSequenceCmdPtrBy4 + scf + ret + +IntroSequenceCmd_SetOrbsCoordinates: ; 1d486 (7:5486) + ld l, c + ld h, b + + ld c, $7 + ld de, wTitleScreenSprites +.loop + push bc + push de + ld a, [de] + ld [wWhichSprite], a + push hl + ld c, SPRITE_ANIM_COORD_X + call GetSpriteAnimBufferProperty + ld e, l + ld d, h + pop hl + ld a, [hli] + add 8 + ld [de], a ; x + inc de + ld a, [hli] + add 16 + ld [de], a ; y + pop de + pop bc + inc de + dec c + jr nz, .loop + + call AdvanceIntroSequenceCmdPtrBy4 + scf + ret + +IntroOrbAnimations_CharizardScene: ; 1d4b0 (7:54b0) + db SPRITE_ANIM_192 ; GRASS + db SPRITE_ANIM_193 ; FIRE + db SPRITE_ANIM_193 ; WATER + db SPRITE_ANIM_192 ; COLORLESS + db SPRITE_ANIM_193 ; LIGHTNING + db SPRITE_ANIM_192 ; PSYCHIC + db SPRITE_ANIM_193 ; FIGHTING + +IntroOrbCoordinates_CharizardScene: ; 1d4b7 (7:54b7) + ; x coord, y coord + db 240, 28 ; GRASS + db 160, 120 ; FIRE + db 160, 8 ; WATER + db 240, 64 ; COLORLESS + db 160, 84 ; LIGHTNING + db 240, 100 ; PSYCHIC + db 160, 44 ; FIGHTING + +IntroOrbAnimations_ScytherScene: ; 1d4c5 (7:54c5) + db SPRITE_ANIM_193 ; GRASS + db SPRITE_ANIM_192 ; FIRE + db SPRITE_ANIM_192 ; WATER + db SPRITE_ANIM_193 ; COLORLESS + db SPRITE_ANIM_192 ; LIGHTNING + db SPRITE_ANIM_193 ; PSYCHIC + db SPRITE_ANIM_192 ; FIGHTING + +IntroOrbCoordinates_ScytherScene: ; 1d4cc (7:54cc) + ; x coord, y coord + db 160, 28 ; GRASS + db 240, 120 ; FIRE + db 240, 8 ; WATER + db 160, 64 ; COLORLESS + db 240, 84 ; LIGHTNING + db 160, 100 ; PSYCHIC + db 240, 44 ; FIGHTING + +IntroOrbAnimations_AerodactylScene: ; 1d4da (7:54da) + db SPRITE_ANIM_194 ; GRASS + db SPRITE_ANIM_197 ; FIRE + db SPRITE_ANIM_200 ; WATER + db SPRITE_ANIM_203 ; COLORLESS + db SPRITE_ANIM_206 ; LIGHTNING + db SPRITE_ANIM_209 ; PSYCHIC + db SPRITE_ANIM_212 ; FIGHTING + +IntroOrbCoordinates_AerodactylScene: ; 1d4e1 (7:54e1) + ; x coord, y coord + db 240, 32 ; GRASS + db 160, 112 ; FIRE + db 160, 16 ; WATER + db 240, 64 ; COLORLESS + db 160, 80 ; LIGHTNING + db 240, 96 ; PSYCHIC + db 160, 48 ; FIGHTING + +IntroOrbAnimations_InitialTitleScreen: ; 1d4ef (7:54ef) + db SPRITE_ANIM_195 ; GRASS + db SPRITE_ANIM_198 ; FIRE + db SPRITE_ANIM_201 ; WATER + db SPRITE_ANIM_204 ; COLORLESS + db SPRITE_ANIM_207 ; LIGHTNING + db SPRITE_ANIM_210 ; PSYCHIC + db SPRITE_ANIM_213 ; FIGHTING + +IntroOrbCoordinates_InitialTitleScreen: ; 1d4f6 (7:54f6) + ; x coord, y coord + db 112, 144 ; GRASS + db 12, 144 ; FIRE + db 32, 144 ; WATER + db 92, 144 ; COLORLESS + db 52, 144 ; LIGHTNING + db 132, 144 ; PSYCHIC + db 72, 144 ; FIGHTING + +IntroOrbAnimations_InTitleScreen: ; 1d504 (7:5504) + db SPRITE_ANIM_196 ; GRASS + db SPRITE_ANIM_199 ; FIRE + db SPRITE_ANIM_202 ; WATER + db SPRITE_ANIM_205 ; COLORLESS + db SPRITE_ANIM_208 ; LIGHTNING + db SPRITE_ANIM_211 ; PSYCHIC + db SPRITE_ANIM_214 ; FIGHTING + +IntroOrbCoordinates_InTitleScreen: ; 1d50b (7:550b) + ; x coord, y coord + db 112, 76 ; GRASS + db 0, 28 ; FIRE + db 32, 76 ; WATER + db 92, 252 ; COLORLESS + db 52, 252 ; LIGHTNING + db 144, 28 ; PSYCHIC + db 72, 76 ; FIGHTING + +IntroSequenceCmd_PlayTitleScreenMusic: ; 1d519 (7:5519) + ld a, MUSIC_TITLESCREEN + call PlaySong + call AdvanceIntroSequenceCmdPtrBy2 + scf + ret + +IntroSequenceCmd_WaitSFX: ; 1d523 (7:5523) + call AssertSFXFinished + or a + jr nz, .no_carry + call AdvanceIntroSequenceCmdPtrBy2 + scf + ret + +.no_carry + or a + ret + +IntroSequenceCmd_PlaySFX: ; 1d530 (7:5530) + ld a, c + call PlaySFX + call AdvanceIntroSequenceCmdPtrBy3 + scf + ret + +IntroSequenceCmd_FadeIn: ; 1d539 (7:5539) + ld a, TRUE + ld [wIntroSequencePalsNeedUpdate], a + call AdvanceIntroSequenceCmdPtrBy2 + scf + ret + +IntroSequenceCmd_FadeOut: ; 1d543 (7:5543) + farcall Func_10d50 + ld a, TRUE + ld [wIntroSequencePalsNeedUpdate], a + call AdvanceIntroSequenceCmdPtrBy2 + scf + ret + +IntroSequenceCmd_LoadCharizardScene: ; 1d551 (7:5551) + lb bc, 6, 3 + ld a, SCENE_CHARIZARD_INTRO + jr LoadOpeningSceneAndUpdateSGBBorder + +IntroSequenceCmd_LoadScytherScene: ; 1d558 (7:5558) + lb bc, 6, 3 + ld a, SCENE_SCYTHER_INTRO + jr LoadOpeningSceneAndUpdateSGBBorder + +IntroSequenceCmd_LoadAerodactylScene: ; 1d55f (7:555f) + lb bc, 6, 3 + ld a, SCENE_AERODACTYL_INTRO +; fallthrough + +LoadOpeningSceneAndUpdateSGBBorder: ; 1d564 (7:5564) + call LoadOpeningScene + ld l, %001010 + lb bc, 0, 0 + lb de, 20, 18 + farcall Func_70498 + scf + ret + +IntroSequenceCmd_LoadTitleScreenScene: ; 1d575 (7:5575) + lb bc, 0, 0 + ld a, SCENE_TITLE_SCREEN + call LoadOpeningScene + call IntroSequenceEmptyFunc + scf + ret + +; a = scene ID +; bc = coordinates for scene +LoadOpeningScene: ; 1d582 (7:5582) + push af + push bc + call DisableLCD + pop bc + pop af + + farcall _LoadScene ; TODO change func name? + farcall Func_10d17 + + xor a + ld [wIntroSequencePalsNeedUpdate], a + call AdvanceIntroSequenceCmdPtrBy2 + call EnableLCD + ret + +IntroSequenceEmptyFunc: ; 1d59c (7:559c) + ret + +INCLUDE "data/sequences/intro.asm" + +; once every 63 frames randomly choose an orb sprite +; to animate, i.e. circle around the screen +AnimateRandomTitleScreenOrb: + ld a, [wConsole] + cp CONSOLE_CGB + call z, .UpdateSpriteAttributes + ld a, [wd635] + and 63 + ret nz ; don't pick an orb now + +.pick_orb + ld a, $7 + call Random + ld c, a + ld b, $00 + ld hl, wTitleScreenSprites + add hl, bc + ld a, [hl] + ld [wWhichSprite], a + farcall GetSpriteAnimCounter + cp $ff + jr nz, .pick_orb + + ld c, SPRITE_ANIM_ATTRIBUTES + call GetSpriteAnimBufferProperty + ld a, [wConsole] + cp CONSOLE_CGB + jr nz, .set_coords + set SPRITE_ANIM_FLAG_UNSKIPPABLE, [hl] + +.set_coords + inc hl + ld a, 248 + ld [hli], a ; SPRITE_ANIM_COORD_X + ld a, 14 + ld [hl], a ; SPRITE_ANIM_COORD_Y + ld a, [wConsole] + cp CONSOLE_CGB + ld a, SPRITE_ANIM_215 + jr nz, .start_anim + ld a, SPRITE_ANIM_216 +.start_anim + farcall StartSpriteAnimation + ret + +.UpdateSpriteAttributes + ld c, $7 + ld de, wTitleScreenSprites +.loop_orbs + push bc + ld a, [de] + ld [wWhichSprite], a + ld c, SPRITE_ANIM_COORD_X + call GetSpriteAnimBufferProperty + ld a, [hld] + cp 152 + jr nz, .skip + res SPRITE_ANIM_FLAG_UNSKIPPABLE, [hl] +.skip + pop bc + inc de + dec c + jr nz, .loop_orbs + ret |