From 4092ef120744a3eecb30f5b3ad3a5630d558db40 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 13:43:06 +0700 Subject: Disassemble G/S intro --- engine/opening_cutscene.asm | 1228 +++++++++++++++++++++++++++++++++++++++++++ layout.link | 2 + ram/hram.asm | 1 + ram/wram.asm | 27 +- shim.sym | 1 - 5 files changed, 1257 insertions(+), 2 deletions(-) create mode 100644 engine/opening_cutscene.asm diff --git a/engine/opening_cutscene.asm b/engine/opening_cutscene.asm new file mode 100644 index 0000000..d049661 --- /dev/null +++ b/engine/opening_cutscene.asm @@ -0,0 +1,1228 @@ +INCLUDE "constants.asm" + +SECTION "engine/opening_cutscene.asm", ROMX + +OpeningCutscene:: + call .Init +.loop + call .PlayFrame + jr nc, .loop + ret + +.Init: + callba InitEffectObject + xor a + ld [wIntroJumptableIndex], a + ldh [hBGMapMode], a + ret + +.PlayFrame: + ld hl, hJoypadDown + ld a, [hl] + and %00001111 + jr nz, .Finish + +; check done flag + ld a, [wIntroJumptableIndex] + bit 7, a + jr nz, .Finish + + callba EffectObjectJumpNoDelay + call IntroSceneJumper + call DelayFrame + and a + ret + +.Finish: + callab InitEffectObject + call ClearSprites + call DelayFrame + xor a + ldh [hSCX], a + ldh [hSCY], a + ldh [hLCDCPointer], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a + ld a, %11100100 + ldh [rBGP], a + ldh [rOBP0], a + scf + ret + +IntroSceneJumper: + jumptable .scenes, wIntroJumptableIndex +.scenes + dw IntroScene1 + dw IntroScene2 + dw IntroScene3 + dw IntroScene4 + dw IntroScene5 + dw IntroScene6 + dw IntroScene7 + dw IntroScene8 + dw IntroScene9 + dw IntroScene10 + dw IntroScene11 + dw IntroScene12 + dw IntroScene13 + dw IntroScene14 + dw IntroScene15 + dw IntroScene16 + dw IntroScene17 + +IntroScene1: ; 43b8 +; Set up water cutscene + ld hl, wIntroJumptableIndex + inc [hl] + call DisableLCD + + ld b, SGB_GS_INTRO + ld c, 0 + call GetSGBLayout + + callab InitEffectObject + + call Intro_ResetLYOverrides + + ld hl, vChars2 + ld de, IntroUnderwaterGFX + call Intro_Copy128Tiles + +; Load water metatiles + ld a, $df + ld [wIntroTilesPointer + 0], a + ld a, $54 + ld [wIntroTilesPointer + 1], a + +; Set destination BG map pointer + ld hl, vBGMap0 + ld a, l + ld [wIntroBGMapPointer + 0], a + ld a, h + ld [wIntroBGMapPointer + 1], a + +; Set destination tilemap pointer + ld de, $53cf + ld a, e + ld [wIntroTilemapPointer + 0], a + ld a, d + ld [wIntroTilemapPointer + 1], a + call Intro_DrawBackground + +; draw GFX + ld hl, IntroWaterPokemonGFX + ld de, vChars0 + ld bc, $0800 +.draw_gfx + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .draw_gfx + + ld hl, wSpriteAnimDict + ld a, $21 + ld [hli], a + ld a, $00 + ld [hli], a + + xor a + ldh [hSCY], a + ld [wGlobalAnimYOffset], a + ld [wGlobalAnimXOffset], a + + ld a, $58 + ldh [hSCX], a + +; setup counter for the first scene + xor a + ld [wIntroFrameCounter2], a + ld a, $80 + ld [wIntroFrameCounter1], a + + ld a, $42 + ldh [hLCDCPointer], a + call Intro_InitSineLYOverrides + + xor a ; FALSE + ld [wIntroSpriteStateFlag], a + + call EnableLCD + call DelayFrame + + ld a, %11100100 + ldh [rBGP], a + ld a, %11100000 + ldh [rOBP0], a + call Intro_InitOmanyte + ret + +IntroScene2: ; 444a + call Intro_UpdateLYOverrides + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .skip_intro + dec [hl] + call Intro_InitBubble + ret + +.skip_intro + ld [hl], $10 + ld hl, wIntroJumptableIndex + inc [hl] + +IntroScene3: +; rise towards the surface + call IntroScene3_Jumper + call IntroScene3_ScrollToSurface + ret nc +; next scene if carry flag is set + call Intro_ResetLYOverrides + ld hl, hSCY + inc [hl] + ld hl, wIntroJumptableIndex + inc [hl] + +IntroScene4: +; at surface; Lapras surfs to left of screen + ld a, [wIntroSpriteStateFlag] + and a + jr nz, .next + ld hl, wIntroFrameCounter2 + inc [hl] + ld a, [hl] + and $07 + jr nz, .skip_move_left + ld hl, hSCX + dec [hl] + +.skip_move_left + call Intro_AnimateOceanWaves + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + xor a + ld [wIntroFrameCounter1], a + +IntroScene5: +; fade out + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + swap a + and $f + ld e, a + ld d, 0 + ld hl, .palettes + add hl, de + ld a, [hl] + cp -1 + jr z, .next + ldh [rBGP], a + call Intro_AnimateOceanWaves + ld hl, hSCX + dec [hl] + dec [hl] + ret +.next + ld hl, wIntroJumptableIndex + inc [hl] + ret + +.palettes: + db %11100100 + db %11100100 + db %10010000 + db %01000000 + db %00000000 + db -1 + +IntroScene17: +; delay a bit before leading into the title screen + ld c, 64 +.loop + call DelayFrame + dec c + jr nz, .loop +; set done flag + ld hl, wIntroJumptableIndex + set 7, [hl] + ret + +IntroScene3_ScrollToSurface: + ld hl, wIntroFrameCounter2 + inc [hl] + ld a, [hl] + and %00000011 + jr nz, .skip_move_left + ld hl, hSCX + dec [hl] + +.skip_move_left + and 1 + jr nz, .no_carry + ld hl, wGlobalAnimYOffset + inc [hl] + ld hl, hSCY + ld a, [hl] + dec [hl] + and $f + call z, Intro_UpdateTilemapAndBGMap + ld a, [wIntroFrameCounter1] + and a + jr z, .carry + +.no_carry + and a + ret + +.carry + scf + ret + +IntroScene3_Jumper: + jumptable .subroutines, wIntroFrameCounter1 +.subroutines + dw .scene3_2 + dw .scene3_2 + dw .scene3_2 + dw .scene3_1 + dw .scene3_2 + dw .scene3_2 + dw .scene3_3 + dw .scene3_3 + dw .scene3_3 + dw .scene3_4 + dw .scene3_5 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + +.scene3_1: + call Intro_InitLapras + ld a, %11100100 + ldh [rOBP0], a + +.scene3_2: ; fallthrough + call Intro_AnimateOceanWaves + ret + +.scene3_3: + call Intro_InitMagikarps + call Intro_AnimateOceanWaves + ret + +.scene3_4: + ld hl, wIntroFrameCounter2 + ld a, [hl] + and %00011111 + jr z, .load_palettes + call Intro_InitMagikarps + ret +.load_palettes + callab Function962d ; load magikarp palettes + ret + +.scene3_5: + xor a + ldh [hLCDCPointer], a + ret + +.scene3_6: + call Intro_UpdateLYOverrides + ret + +Intro_InitBubble: + ld hl, wIntroFrameCounter1 + ld a, [hl] + and $0f + ret nz + + ld a, [hl] + and $70 + swap a + ld e, a + ld d, $00 + ld hl, .pixel_table + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, $21 ; SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE + call InitSpriteAnimStruct + ret + +.pixel_table + db $30, $74 + db $70, $94 + db $50, $84 + db $60, $78 + db $20, $68 + db $40, $88 + +Intro_InitMagikarps: + ld de, $403f + ld a, [wSGB] + and a + jr z, .ok + + ld de, $201f + +.ok + ld hl, wIntroFrameCounter2 + ld a, [hl] + and e + ret nz + ld a, [hl] + and d + jr nz, .alternate_frame + ld de, $e8e0 + call .PlaceMagikarp + ld de, wObject8SpriteXOffset + call .PlaceMagikarp + ld de, $00c0 + call .PlaceMagikarp + ret + +.alternate_frame + ld de, $e0f0 + call .PlaceMagikarp + ld de, $f8c0 + call .PlaceMagikarp + ld de, $10e0 + call .PlaceMagikarp + ret + +.PlaceMagikarp: + ld a, $23 ; SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP + call InitSpriteAnimStruct + ret + +Intro_InitOmanyte: + ld de, $9038 + call .PlaceOmanyte + ld de, $7050 + call .PlaceOmanyte + ld de, $8078 + +.PlaceOmanyte: + ld a, $22 ; SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER + call InitSpriteAnimStruct + ret + +Intro_InitLapras: + ld a, [wIntroFrameCounter2] + and %00011111 + ret nz + ld de, $80c0 + ld a, $25 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS + call InitSpriteAnimStruct + ret + +Intro_UnusedInitAerodactyl: ; unreferenced + ld de, $1000 + ld a, $24 ; SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL + call InitSpriteAnimStruct + ret + +Intro_UpdateTilemapAndBGMap: +; add new tiles to top as water scene scrolls up to surface + push hl + push de + + ld a, [wIntroTilemapPointer + 0] + ld e, a + ld a, [wIntroTilemapPointer + 1] + ld d, a + ld hl, -$10 + add hl, de + ld a, l + ld e, l + ld [wIntroTilemapPointer + 0], a + ld a, h + ld d, h + ld [wIntroTilemapPointer + 1], a + + hlcoord 0, 0 + ld c, BG_MAP_WIDTH / 2 +.loop + call Intro_Draw2x2Tiles + dec c + jr nz, .loop + + ld a, [wIntroBGMapPointer + 0] + ld e, a + ld a, [wIntroBGMapPointer + 1] + ld d, a + ld hl, hCurSpriteYCoord + add hl, de + ld a, l + ld [wIntroBGMapPointer + 0], a + ld [wVBCopyDst], a + ld a, h + and %11111011 + or %00001000 + ld [wIntroBGMapPointer + 1], a + ld [wVBCopyDst + 1], a + ld a, LOW(wTileMap) + ld [wVBCopySrc], a + ld a, HIGH(wTileMap) + ld [wVBCopySrc + 1], a + ld a, 4 + ld [wVBCopySize], a + ld hl, wIntroFrameCounter1 + dec [hl] + pop de + pop hl + ret + + +Intro_AnimateOceanWaves: +; uses a 2bpp request to copy tile IDs to the BG map + ld hl, wIntroFrameCounter2 + ld a, [hl] + and 3 + cp 3 + ret z + + ld a, [hl] + and $30 + swap a + ld l, a + ld h, 0 +rept 5 + add hl, hl +endr + ld de, .wave_tiles + add hl, de + ld a, l + ld [wVBCopySrc], a + ld a, h + ld [wVBCopySrc + 1], a + ld a, $e0 + ld [wVBCopyDst], a + ld a, $99 + ld [wVBCopyDst + 1], a + ld a, 2 + ld [wVBCopySize], a + ret +.wave_tiles: +rept 8 + db $70, $71, $72, $73 +endr +rept 8 + db $74, $75, $76, $77 +endr +rept 8 + db $78, $79, $7a, $7b +endr +rept 8 + db $7c, $7d, $7e, $7f +endr + +Intro_InitSineLYOverrides: + ld bc, wLYOverrides2 + ld a, SCREEN_HEIGHT_PX + ld de, BG_MAP_WIDTH * BG_MAP_HEIGHT +.loop + push af + push de + callba BattleAnim_Sine_e + ld a, e + ld [bc], a + inc bc + pop de + inc e + pop af + dec a + jr nz, .loop + ret + +Intro_UpdateLYOverrides: + ld bc, wLYOverrides + ld e, $10 + +.loop1 + ldh a, [hSCY] + ld [bc], a + inc bc + dec e + jr nz, .loop1 + + ld hl, wLYOverrides2 + ld de, wLYOverrides2 + 1 + ld a, [hl] + push af + ld a, $80 + +.loop2 + push af + ld a, [de] + inc de + ld [hli], a + push hl + ld hl, hSCY + add [hl] + ld [bc], a + inc bc + pop hl + pop af + dec a + jr nz, .loop2 + + pop af + ld [hl], a + ret + +IntroScene6: +; Set up grass cutscene (Pikachu/Jigglypuff) + ld hl, wIntroJumptableIndex + inc [hl] + call DisableLCD + ld b, SGB_GS_INTRO + ld c, 1 + call GetSGBLayout + callab InitEffectObject + call Intro_ResetLYOverrides + ld hl, vChars2 + ld de, IntroForestGFX + call Intro_Copy128Tiles + ld a, $0f + ld [wIntroTilesPointer + 0], a + ld a, $62 + ld [wIntroTilesPointer + 1], a + ld hl, vBGMap0 + ld a, l + ld [wIntroBGMapPointer + 0], a + ld a, h + ld [wIntroBGMapPointer + 1], a + ld de, $610f + ld a, e + ld [wIntroTilemapPointer + 0], a + ld a, d + ld [wIntroTilemapPointer + 1], a + call Intro_DrawBackground + ld hl, IntroJigglypuffPikachuGFX + ld de, vChars0 + ld bc, $0a00 + +.load + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .load + + ld hl, wSpriteAnimDict + ld a, $22 + ld [hli], a + ld a, $00 + ld [hli], a + xor a + ldh [hSCY], a + ld [wGlobalAnimYOffset], a + ld a, $60 + ldh [hSCX], a + ld a, $a0 + ld [wGlobalAnimXOffset], a + xor a + ld [wIntroFrameCounter2], a + call EnableLCD + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + call Intro_InitJigglypuff + xor a + ld [wIntroSpriteStateFlag], a + ret + +IntroScene7: + call Intro_InitNote + ld hl, wIntroFrameCounter2 + ld a, [hl] + inc [hl] + and $03 + ret z + + ld hl, hSCX + ld a, [hl] + and a + jr z, .next + + dec [hl] + ld hl, wGlobalAnimXOffset + inc [hl] + ret + +.next + ld a, $ff + ld [wIntroFrameCounter1], a + call Intro_InitPikachu + ld hl, wIntroJumptableIndex + inc [hl] + ret + +IntroScene8: + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + dec [hl] + call Intro_InitNote + ld hl, wIntroFrameCounter2 + inc [hl] + ret + +.next + xor a + ld [wIntroFrameCounter1], a + ld hl, wIntroJumptableIndex + inc [hl] + callab Function9633 + ret + +IntroScene9: + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + swap a + and $0f + ld e, a + ld d, $00 + ld hl, .palettes + add hl, de + ld a, [hl] + and a + jr z, .next + + ldh [rBGP], a + ld hl, hSCY + inc [hl] + ld hl, wGlobalAnimYOffset + dec [hl] + ret + +.next: + ld hl, wIntroJumptableIndex + inc [hl] + ret + +.palettes: +; fade out to black + db %11100100 + db %11100100 + db %11100100 + db %11100100 + db %11100100 + db %11111001 + db %11111110 + db %11111111 + db 0 + +Intro_DummyFunction: + ret + + +Intro_InitNote: + ld a, [wIntroSpriteStateFlag] + and a + ret nz + + ld hl, wIntroFrameCounter2 + ld a, [hl] + and $3f + ret nz + + ld a, [hl] + and $7f + jr z, .SmallerNote + + ld de, $5c30 + ld a, $26 ; SPRITE_ANIM_INDEX_GS_INTRO_NOTE + call InitSpriteAnimStruct + ret + +.SmallerNote: + ld de, $5430 + ld a, $27 ; SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE + call InitSpriteAnimStruct + ret + + +Intro_InitJigglypuff: + ld de, $7030 + ld a, $28 ; SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF + call InitSpriteAnimStruct + ret + + +Intro_InitPikachu: + ld de, $70c0 + ld a, $29 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU + call InitSpriteAnimStruct + ld de, $70c0 + ld a, $2a ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL + call InitSpriteAnimStruct + ret + +IntroScene10: +; Set up fireball cutscene (evolved Kanto starters) + ld hl, wIntroJumptableIndex + inc [hl] + ld b, SGB_GS_INTRO + ld c, 2 + call GetSGBLayout + callab InitEffectObject + call Intro_ResetLYOverrides + call Intro_BlankTilemapAndBGMap + + ld hl, vChars2 + ld de, IntroCharizard1GFX + ld bc, $3980 + call Request2bpp + + ld hl, vFont + ld de, $735f + ld bc, $3980 + call Request2bpp + + ld hl, vChars0 + ld de, IntroCharizardFlamesGFX + ld bc, $3980 + call Request2bpp + + ld hl, wSpriteAnimDict + ld a, $22 ; SPRITE_ANIM_DICT_GS_INTRO + ld [hli], a + ld a, $00 + ld [hli], a + + ld a, 0 + call DrawIntroCharizardGraphic + + ld a, $80 + ldh [hSCY], a + + xor a + ldh [hSCX], a + ld [wGlobalAnimYOffset], a + ld [wGlobalAnimXOffset], a + + xor a + ld [wIntroFrameCounter2], a + ld a, %00111111 + ldh [rBGP], a + ld a, %11111111 + ldh [rOBP0], a + ret + +IntroScene11: +; scroll up to Charizard silhoutte, flash Blastoise and Venusaur + ld hl, wIntroFrameCounter2 + ld a, [hl] + inc [hl] + and 1 + ret z + call Intro_CheckSCYEvent + ld hl, hSCY + ld a, [hl] + and a + jr z, .next + inc [hl] + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + xor a + ld [wIntroFrameCounter1], a + +IntroScene12: +; load Charizard palettes + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + srl a + srl a + and 3 + ld e, a + ld d, 0 + ld hl, .palettes + add hl, de + ld a, [hl] + and a + jr z, .next + ldh [rBGP], a + ldh [rOBP0], a + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + ld a, $80 + ld [wIntroFrameCounter1], a + ret + +.palettes: + db %01101010 + db %10100101 + db %11100100 + db %00000000 + +IntroScene13: +; Charizard mouth open + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + + dec [hl] + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + ld a, 1 + call DrawIntroCharizardGraphic + ld a, 4 + ld [wIntroFrameCounter1], a + ret + +IntroScene14: +; Charizard breathing fire + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + dec [hl] + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + ld a, 2 + call DrawIntroCharizardGraphic + ld a, 64 + ld [wIntroFrameCounter1], a + xor a + ld [wIntroFrameCounter2], a +; fallthrough + +IntroScene15: +; Charizard mouth wide open / fireball starts + call Intro_AnimateFireball + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + dec [hl] + ret +.next + ld hl, wIntroJumptableIndex + inc [hl] + xor a + ld [wIntroFrameCounter1], a + ret + +IntroScene16: +; continue fireball / fade out palettes + call Intro_AnimateFireball + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + swap a + and $07 + ld e, a + ld d, $00 + ld hl, .palettes + add hl, de + ld a, [hl] + cp $ff + jr z, .next + ldh [rBGP], a + ldh [rOBP0], a + ret +.next + ld hl, wIntroJumptableIndex + inc [hl] + ret +.palettes: + db %11100100 + db %10010000 + db %01000000 + db %00000000 + db -1 + +Intro_BlankTilemapAndBGMap: + ld hl, $c2a0 + ld bc, $0168 +.blank_tilemap + ld [hl], 0 + inc hl + dec bc + ld a, b + or c + jr nz, .blank_tilemap + + ld hl, $c600 + ld bc, $0400 +.blank_bgmap + ld [hl], 0 + inc hl + dec bc + ld a, b + or c + jr nz, .blank_bgmap + + ld hl, vBGMap0 + ld de, $c600 + ld bc, $3940 + call Request2bpp + ret + + +Intro_CheckSCYEvent: + ldh a, [hSCY] + ld c, a + ld hl, .Cuelist + +.loop + ld a, [hli] + cp -1 + ret z + cp c + jr z, .value_found + inc hl + inc hl + jr .loop + +.value_found + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Cuelist: + dbw $87, Intro_BlastoiseAppears + dbw $88, Intro_FlashMonPalette + dbw $98, Intro_FlashSilhouette + dbw $99, Intro_LoadVenusaurPalette + dbw $bf, Intro_VenusaurAppears + dbw $c0, Intro_FlashMonPalette + dbw $d0, Intro_FlashSilhouette + dbw $d1, Intro_LoadCharizardPalette + db -1 + +Intro_BlastoiseAppears: + call Intro_LoadBlastoiseObject + ret + +Intro_VenusaurAppears: + call Intro_LoadVenusaurObject + ret + +Intro_FlashMonPalette: + ld a, %11100100 + ldh [rOBP0], a + xor a + ldh [rBGP], a + ret + +Intro_FlashSilhouette: + ld a, %11111111 + ldh [rOBP0], a + ld a, %00111111 + ldh [rBGP], a + ret + +Intro_LoadVenusaurPalette: + callab Function9639 + ret + +Intro_LoadCharizardPalette: + callab Function963f + ret + + +DrawIntroCharizardGraphic: + push af + hlcoord 0, 6 + ld c, SCREEN_WIDTH * 8 + xor a +.loop1 + ld [hli], a + dec c + jr nz, .loop1 + + pop af + ld e, a + ld d, $00 + ld hl, .charizard_data +rept 5 + add hl, de +endr + ld e, [hl] + inc hl + ld c, [hl] + inc hl + ld b, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ld a, e + +.loop2_outer + push bc + push hl +.loop2_inner + ld [hli], a + inc a + dec c + jr nz, .loop2_inner + + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .loop2_outer + + ld a, 1 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hBGMapMode], a + ret + +.charizard_data + db $00, $08, $08, $22, $c3 + db $40, $09, $08, $21, $c3 + db $88, $09, $08, $20, $c3 + +Intro_AnimateFireball: + ld hl, wIntroFrameCounter2 + ld a, [hl] + inc [hl] + and 3 + ret nz + ld de, $6454 + ld a, $2b ; SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL + call InitSpriteAnimStruct + ld hl, hSCX + dec [hl] + ld hl, wGlobalAnimXOffset + inc [hl] + ret + +Intro_LoadBlastoiseObject: + ld de, $b008 + ld a, $2c ; SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE + call InitSpriteAnimStruct + ret + +Intro_LoadVenusaurObject: + ld de, $b0a0 + ld a, $2d ; SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR + call InitSpriteAnimStruct + ret + +Intro_Copy128Tiles: + ld bc, 128 tiles +.loop + ld a, [de] + inc de + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + ret + + +Intro_DrawBackground: + ld b, BG_MAP_WIDTH / 2 +.outer_loop + push hl + ld c, BG_MAP_HEIGHT / 2 +.inner_loop + call Intro_Draw2x2Tiles + dec c + jr nz, .inner_loop + pop hl + push bc + ld bc, 2 * BG_MAP_WIDTH + add hl, bc + pop bc + dec b + jr nz, .outer_loop + ret + + +Intro_Draw2x2Tiles: + push bc + push de + push hl + push hl + push hl + ld a, [de] + ld l, a + ld h, 0 + ld a, [wIntroTilesPointer + 0] + ld e, a + ld a, [wIntroTilesPointer + 1] + ld d, a + add hl, hl + add hl, hl + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop hl + ld bc, BG_MAP_WIDTH + add hl, bc + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop hl + inc hl + inc hl + pop de + inc de + pop bc + ret + + +Intro_ResetLYOverrides: + ld hl, wLYOverrides + xor a + ld c, wLYOverrides2 - wLYOverrides +.loop + ld [hli], a + dec c + jr nz, .loop + ret + +;;;;;; GFX goes here ;;;;;;;;;;;;;;;;;; diff --git a/layout.link b/layout.link index e03d166..b33af85 100644 --- a/layout.link +++ b/layout.link @@ -897,6 +897,8 @@ ROMX $39 org $4000 org $41ff "gfx.asm@Gamefreak Logo GFX" + org $432F + "engine/opening_cutscene.asm" org $4adf "gfx.asm@Intro Underwater GFX" org $55ef diff --git a/ram/hram.asm b/ram/hram.asm index 4acfbfa..8f86a2a 100644 --- a/ram/hram.asm +++ b/ram/hram.asm @@ -124,6 +124,7 @@ ENDU ds 3 ; TODO +hCurSpriteYCoord:: hFFC0:: ds 1 ds 6 diff --git a/ram/wram.asm b/ram/wram.asm index da6d364..f579aa6 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -89,6 +89,10 @@ UNION wTileMapBackup:: ds SCREEN_HEIGHT * SCREEN_WIDTH +NEXTU + +wSpriteAnimDict:: ds 10 * 2 ; NUM_SPRITEANIMDICT_ENTRIES * 2 + NEXTU ds 1 @@ -115,7 +119,10 @@ wSpriteAnimIDBuffer:: db ds 6 +wGlobalAnimYOffset:: wc4c7:: db + +wGlobalAnimXOffset:: wc4c8:: db ds 7 @@ -229,13 +236,31 @@ wca0a:: ds 1 ds 5 ; TODO +wIntroJumptableIndex:: wca10:: ds 1 + +UNION +wIntroBGMapPointer:: ds 2 ; ca11 +NEXTU wca11:: ds 1 wca12:: ds 1 +ENDU + +UNION +wIntroTilemapPointer:: ds 2 ; ca13 +NEXTU wca13:: ds 1 wca14:: ds 1 +ENDU + +wIntroTilesPointer:: ds 2 ; ca15 + +wIntroFrameCounter1:: ds 1 ; ca17 +wIntroFrameCounter2:: ds 1 ; ca18 + +wIntroSpriteStateFlag:: ds 1 ; ca19 - ds $22 ; TODO + ds $1d ; TODO wca37:: ds 1 wca38:: ds 1 diff --git a/shim.sym b/shim.sym index a34e54f..2f3baaa 100755 --- a/shim.sym +++ b/shim.sym @@ -153,7 +153,6 @@ 38:4000 PikachuMiniGame 39:4000 GameFreakIntro -39:432F OpeningCutscene 3A:441D Functione841d 3A:45D8 Functione85d8 3A:47F9 Functione87f9 -- cgit v1.2.3 From 25a4edfe6f71abcbda22fac47f7399bfda4e276b Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 14:23:48 +0700 Subject: Dump intro tilemaps --- engine/opening_cutscene.asm | 16 +++++++--------- gfx/gfx.asm | 12 ++++++++++-- gfx/gfx.mk | 3 +++ gfx/intro/forest.bin | Bin 0 -> 96 bytes gfx/intro/forest_tilemap.bin | Bin 0 -> 288 bytes gfx/intro/water.bin | Bin 0 -> 272 bytes gfx/intro/water_tilemap.bin | 2 ++ layout.link | 5 +---- 8 files changed, 23 insertions(+), 15 deletions(-) create mode 100644 gfx/intro/forest.bin create mode 100644 gfx/intro/forest_tilemap.bin create mode 100644 gfx/intro/water.bin create mode 100644 gfx/intro/water_tilemap.bin diff --git a/engine/opening_cutscene.asm b/engine/opening_cutscene.asm index d049661..d97f3ea 100644 --- a/engine/opening_cutscene.asm +++ b/engine/opening_cutscene.asm @@ -89,9 +89,9 @@ IntroScene1: ; 43b8 call Intro_Copy128Tiles ; Load water metatiles - ld a, $df + ld a, LOW(Intro_WaterMeta) ld [wIntroTilesPointer + 0], a - ld a, $54 + ld a, HIGH(Intro_WaterMeta) ld [wIntroTilesPointer + 1], a ; Set destination BG map pointer @@ -101,8 +101,8 @@ IntroScene1: ; 43b8 ld a, h ld [wIntroBGMapPointer + 1], a -; Set destination tilemap pointer - ld de, $53cf +; Load water tilemap + ld de, Intro_WaterTilemap + 15 tiles ld a, e ld [wIntroTilemapPointer + 0], a ld a, d @@ -596,16 +596,16 @@ IntroScene6: ld hl, vChars2 ld de, IntroForestGFX call Intro_Copy128Tiles - ld a, $0f + ld a, LOW(Intro_GrassMeta) ld [wIntroTilesPointer + 0], a - ld a, $62 + ld a, HIGH(Intro_GrassMeta) ld [wIntroTilesPointer + 1], a ld hl, vBGMap0 ld a, l ld [wIntroBGMapPointer + 0], a ld a, h ld [wIntroBGMapPointer + 1], a - ld de, $610f + ld de, Intro_GrassTilemap + 2 tiles ld a, e ld [wIntroTilemapPointer + 0], a ld a, d @@ -1224,5 +1224,3 @@ Intro_ResetLYOverrides: dec c jr nz, .loop ret - -;;;;;; GFX goes here ;;;;;;;;;;;;;;;;;; diff --git a/gfx/gfx.asm b/gfx/gfx.asm index 44e1c07..9613e8a 100644 --- a/gfx/gfx.asm +++ b/gfx/gfx.asm @@ -546,12 +546,20 @@ INCBIN "gfx/splash/game_freak_logo_oam.2bpp" SECTION "gfx.asm@Intro Underwater GFX", ROMX IntroUnderwaterGFX:: INCBIN "gfx/intro/underwater.2bpp" - -SECTION "gfx.asm@Intro Water Mon and Forest GFX", ROMX +Intro_WaterTilemap:: +INCBIN "gfx/intro/water_tilemap.bin" +Intro_WaterMeta:: +INCBIN "gfx/intro/water.bin" IntroWaterPokemonGFX:: INCBIN "gfx/intro/water_pokemon.2bpp" + +SECTION "gfx.asm@Intro Forest GFX", ROMX IntroForestGFX:: INCBIN "gfx/intro/forest.2bpp" +Intro_GrassTilemap:: +INCBIN "gfx/intro/forest_tilemap.bin" +Intro_GrassMeta:: +INCBIN "gfx/intro/forest.bin" SECTION "gfx.asm@Intro Mon", ROMX IntroJigglypuffPikachuGFX:: diff --git a/gfx/gfx.mk b/gfx/gfx.mk index fe01521..ac19398 100644 --- a/gfx/gfx.mk +++ b/gfx/gfx.mk @@ -17,5 +17,8 @@ $(BUILD)/gfx/minigames/poker.2bpp: tools/gfx += --trim-whitespace $(BUILD)/gfx/intro/jigglypuff_pikachu.2bpp: tools/gfx += --trim-whitespace +$(BUILD)/gfx/intro/%.bin: gfx/intro/%.bin + cp $< $@ + $(BUILD)/gfx/battle_anims/attack_animations_1.2bpp: tools/gfx += --trim-whitespace $(BUILD)/gfx/battle_anims/attack_animations_2.2bpp: tools/gfx += --trim-whitespace diff --git a/gfx/intro/forest.bin b/gfx/intro/forest.bin new file mode 100644 index 0000000..cf13546 Binary files /dev/null and b/gfx/intro/forest.bin differ diff --git a/gfx/intro/forest_tilemap.bin b/gfx/intro/forest_tilemap.bin new file mode 100644 index 0000000..fb1179d Binary files /dev/null and b/gfx/intro/forest_tilemap.bin differ diff --git a/gfx/intro/water.bin b/gfx/intro/water.bin new file mode 100644 index 0000000..7f8675f Binary files /dev/null and b/gfx/intro/water.bin differ diff --git a/gfx/intro/water_tilemap.bin b/gfx/intro/water_tilemap.bin new file mode 100644 index 0000000..b91bfd7 --- /dev/null +++ b/gfx/intro/water_tilemap.bin @@ -0,0 +1,2 @@ + !"#0123 !"#0123()*+89:;()*+89:;''$%&ABC''$%&ABC'',-.''''',-.'''''''''''''''''''''''''''''''''''  +  ////// \ No newline at end of file diff --git a/layout.link b/layout.link index b33af85..cce2beb 100644 --- a/layout.link +++ b/layout.link @@ -899,11 +899,8 @@ ROMX $39 "gfx.asm@Gamefreak Logo GFX" org $432F "engine/opening_cutscene.asm" - org $4adf "gfx.asm@Intro Underwater GFX" - org $55ef - "gfx.asm@Intro Water Mon and Forest GFX" - org $626f + "gfx.asm@Intro Forest GFX" "gfx.asm@Intro Mon" ROMX $3a -- cgit v1.2.3 From 9d8ae4c2563eddfd6939aaf1559a8da56f319cc3 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 14:25:52 +0700 Subject: Intro: contextualize rLCDC pointer --- engine/opening_cutscene.asm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/engine/opening_cutscene.asm b/engine/opening_cutscene.asm index d97f3ea..11ba902 100644 --- a/engine/opening_cutscene.asm +++ b/engine/opening_cutscene.asm @@ -142,7 +142,7 @@ IntroScene1: ; 43b8 ld a, $80 ld [wIntroFrameCounter1], a - ld a, $42 + ld a, LOW(rSCY) ldh [hLCDCPointer], a call Intro_InitSineLYOverrides -- cgit v1.2.3 From f79810c82ce57d913638427ea425cb693cd5b8af Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 15:26:37 +0700 Subject: Disassemble Game Freak logo animation --- engine/game_freak_intro.asm | 341 ++++++++++++++++++++++++++++++++++++++++++++ layout.link | 3 +- ram/wram.asm | 2 + shim.sym | 2 +- 4 files changed, 345 insertions(+), 3 deletions(-) create mode 100644 engine/game_freak_intro.asm diff --git a/engine/game_freak_intro.asm b/engine/game_freak_intro.asm new file mode 100644 index 0000000..c92baa2 --- /dev/null +++ b/engine/game_freak_intro.asm @@ -0,0 +1,341 @@ +INCLUDE "constants.asm" + +SECTION "engine/game_freak_intro.asm", ROMX + +GameFreakIntro:: +; Copyright screen and Game Freak logo + + call DisableLCD + call ClearVRAM + + ld a, HIGH(vBGMap0) + ldh [hBGMapAddress + 1], a + xor a + ldh [hBGMapAddress], a + ldh [hJoyState], a + ldh [hSCX], a + ldh [hSCY], a + + ld a, $90 + ldh [hWY], a + + call EnableLCD + + ld c, 10 + call DelayFrames + ld b, SGB_GS_TITLE_SCREEN + call GetSGBLayout + + callab IntroCopyRightInfo + + ld a, 1 + ldh [hBGMapMode], a + call WaitBGMap + call SetPalettes + + ld c, 3 * 60 ; 3 seconds + call DelayFrames + + xor a + ldh [hWY], a + call ClearTileMap + + call .Init +.loop + call .Frame + jr nc, .loop + +; this was set if user skipped the GF logo by pressing A + ld a, [wJumptableIndex] + bit 6, a + jr nz, .cancelled + +; clear carry flag from .PlayFrame + and a + ret + +.cancelled + scf + ret + +.Init: + call DisableLCD + + ld hl, vBGMap0 + ld bc, $0240 + xor a + call ByteFill + + ld de, GameFreakLogoGFX + ld hl, vFont + ld bc, $391c + call Get1bpp + + ld hl, GameFreakLogoSparkleGFX + ld de, $89c0 + ld bc, $0050 + ld a, $39 + call FarCopyData + + callba InitEffectObject + + ld hl, wSpriteAnimDict + ld a, $27 ; SPRITE_ANIM_DICT_GS_SPLASH + ld [hli], a + ld a, $8d + ld [hl], a + + xor a + ld [wJumptableIndex], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + ldh [hSCX], a + ldh [hSCY], a + + ld a, 1 + ldh [hBGMapMode], a + + ld a, SCREEN_HEIGHT_PX + ldh [hWY], a + call EnableLCD + + ld a, %11100100 + ld a, %11100100 ; redundant + ldh [rOBP0], a + ld a, %00100100 + ldh [rOBP1], a + ret + + +.Frame: +; Play one frame of GameFreakPresents sequence. +; Return carry when the sequence completes or is canceled. + ld hl, hJoypadDown + ld a, [hl] + and %00001111 + jr nz, .pressed + + ld a, [wJumptableIndex] + bit 7, a + jr nz, .Finished + + callba EffectObjectJumpNoDelay + + call GameFreakPresentsScene + call DelayFrame + and a + ret + +.pressed + ld hl, wJumptableIndex + set 6, [hl] + +.Finished: + callab InitEffectObject + call ClearTileMap + call ClearSprites + + ld c, 16 + call DelayFrames + + scf + ret + + +GameFreakPresentsScene: + jumptable .scenes, wJumptableIndex + +.scenes + dw GameFreakPresents_Wait64Frames + dw GameFreakPresents_Star + dw GameFreakPresents_PlaceLogo + dw GameFreakPresents_LogoSparkles + dw GameFreakPresents_PlacePresents + dw GameFreakPresents_WaitForTimer + dw GameFreakPresents_SetDoneFlag + +GameFreakPresents_NextScene: + ld hl, wJumptableIndex + inc [hl] + ret + +GameFreakPresents_Wait64Frames: + ld c, $40 + call DelayFrames + call GameFreakPresents_NextScene + ret + +GameFreakPresents_Star: + xor a + ld [wIntroSceneFrameCounter], a + ld de, $5458 + ld a, $3b ; SPRITE_ANIM_INDEX_GS_INTRO_STAR + call InitSpriteAnimStruct + + ld hl, $000c ; SPRITEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $a0 ; star path radius + + ld de, $0031 ; SFX_GAME_FREAK_LOGO (metronome?) + call PlaySFX + call GameFreakPresents_NextScene + ret + +GameFreakPresents_PlaceLogo: + ld a, [wIntroSceneFrameCounter] + and a + ret z + + ld de, $5458 + ld a, $3a ; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO + call InitSpriteAnimStruct + call GameFreakPresents_NextScene + +; set timer for the next scene + ld a, 128 + ld [wIntroSceneTimer], a + ret + +GameFreakPresents_LogoSparkles: + ld hl, wIntroSceneTimer + ld a, [hl] + and a + jr z, .done + dec [hl] + +; add first text when timer passes half + cp 63 + call z, GameFreakPresents_PlaceGameFreak + +; add sparkles continuously + call GameFreakPresents_Sparkle + ret + +.done +; set timer for the next scene and go there + ld [hl], 128 + call GameFreakPresents_NextScene + ret + + +GameFreakPresents_PlaceGameFreak: + hlcoord 5, 12 + ld de, .game_freak + call PlaceString + ret + +.game_freak +; G A M E F R E A K + db $80, $81, $82, $83, $8d, $84, $85, $83, $81, $86 + db "@" + +GameFreakPresents_PlacePresents: + hlcoord 7, 13 + ld de, .presents + call PlaceString + call GameFreakPresents_NextScene + ld a, $80 + ld [wIntroSceneTimer], a + ret + +.presents +; P R E S E N T S + db $87, $88, $89, $8a, $8b, $8c + db "@" + +GameFreakPresents_SetDoneFlag: + ld hl, wJumptableIndex + set 7, [hl] + ret + +GameFreakPresents_WaitForTimer: + ld hl, wIntroSceneTimer + ld a, [hl] + and a + jr z, .done + dec [hl] + ret +.done + call GameFreakPresents_NextScene + ret + +GameFreakPresents_UpdateLogoPal: +; called from sprite animation routine + +; once we reached the final state, leave it alone + ldh a, [rOBP1] + cp %10010000 + ret z + +; wait 16 frames before next change + ld a, [wIntroSceneTimer] + and $0f + ret nz + +; rotate OBP1 by one color slot (2 bits) + ld hl, rOBP1 + rrc [hl] + rrc [hl] + ret + + +GameFreakPresents_Sparkle: +; Initialize and configure a sparkle sprite. + +; run only every second frame + ld d, a + and 1 + ret nz + +; shift over so our index is still changing by 1 each time + ld a, d + srl a +; set up a new sparkle sprite + push af + ld de, $5858 + ld a, $3c + call InitSpriteAnimStruct + pop af + +; take the bottom 4 bits of a as an index into +; sparkle_vectors (16 entries) + and %00001111 + ld e, a + ld d, 0 + ld hl, .vectors + add hl, de + add hl, de + +; set the angle and distance for this sprite + ld e, l + ld d, h + ld hl, $b ; SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [de] + ld [hl], a ; angle + inc de + ld hl, $c ; SPRITEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], 0 + inc hl ; SPRITEANIMSTRUCT_VAR2 + ld a, [de] + ld [hl], a ; distance + ret + +.vectors + db $00, $03 + db $08, $04 + db $04, $03 + db $0c, $02 + db $10, $02 + db $18, $03 + db $14, $04 + db $1c, $03 + db $20, $02 + db $28, $02 + db $24, $03 + db $2c, $04 + db $30, $04 + db $38, $03 + db $34, $02 + db $3c, $04 diff --git a/layout.link b/layout.link index cce2beb..c29878b 100644 --- a/layout.link +++ b/layout.link @@ -895,9 +895,8 @@ ROMX $38 ROMX $39 org $4000 - org $41ff + "engine/game_freak_intro.asm" "gfx.asm@Gamefreak Logo GFX" - org $432F "engine/opening_cutscene.asm" "gfx.asm@Intro Underwater GFX" "gfx.asm@Intro Forest GFX" diff --git a/ram/wram.asm b/ram/wram.asm index f579aa6..2ca1311 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -356,10 +356,12 @@ SECTION "CB5E", WRAM0[$CB5E] wJumptableIndex:: db wFlyDestination:: +wIntroSceneFrameCounter:: wBattleTransitionCounter:: db wBattleTransitionSineWaveOffset:: wBattleTransitionSpinQuadrant:: +wIntroSceneTimer:: wcb60:: ds 1 wcb61:: ds 1 diff --git a/shim.sym b/shim.sym index 2f3baaa..237f5e3 100755 --- a/shim.sym +++ b/shim.sym @@ -152,7 +152,7 @@ 33:6263 BattleAnim_Cosine_e 38:4000 PikachuMiniGame -39:4000 GameFreakIntro + 3A:441D Functione841d 3A:45D8 Functione85d8 3A:47F9 Functione87f9 -- cgit v1.2.3 From 9769bcc09977e9bc71644821a359abf3764fdd33 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 15:53:42 +0700 Subject: Intro and GF asm adjustments --- engine/game_freak_intro.asm | 12 ++++++------ engine/opening_cutscene.asm | 38 +++++++++++++++++++++----------------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/engine/game_freak_intro.asm b/engine/game_freak_intro.asm index c92baa2..c9e6c07 100644 --- a/engine/game_freak_intro.asm +++ b/engine/game_freak_intro.asm @@ -62,19 +62,19 @@ GameFreakIntro:: call DisableLCD ld hl, vBGMap0 - ld bc, $0240 + ld bc, BG_MAP_WIDTH * SCREEN_HEIGHT xor a call ByteFill ld de, GameFreakLogoGFX - ld hl, vFont - ld bc, $391c + ld hl, vChars1 + lb bc, BANK(GameFreakLogoGFX), 28 call Get1bpp ld hl, GameFreakLogoSparkleGFX - ld de, $89c0 - ld bc, $0050 - ld a, $39 + ld de, vChars1 tile $1C + ld bc, 5 tiles + ld a, BANK(GameFreakLogoSparkleGFX) call FarCopyData callba InitEffectObject diff --git a/engine/opening_cutscene.asm b/engine/opening_cutscene.asm index 11ba902..832d254 100644 --- a/engine/opening_cutscene.asm +++ b/engine/opening_cutscene.asm @@ -112,7 +112,7 @@ IntroScene1: ; 43b8 ; draw GFX ld hl, IntroWaterPokemonGFX ld de, vChars0 - ld bc, $0800 + ld bc, $80 tiles .draw_gfx ld a, [hli] ld [de], a @@ -508,25 +508,29 @@ endr ld [wVBCopySrc], a ld a, h ld [wVBCopySrc + 1], a - ld a, $e0 + ld a, LOW(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 ld [wVBCopyDst], a - ld a, $99 + ld a, HIGH(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 ld [wVBCopyDst + 1], a ld a, 2 ld [wVBCopySize], a ret .wave_tiles: +; Fill an entire bg map row with each frame rept 8 - db $70, $71, $72, $73 + db $70, $71, $72, $73 ; frame 1 endr + rept 8 - db $74, $75, $76, $77 + db $74, $75, $76, $77 ; frame 2 endr + rept 8 - db $78, $79, $7a, $7b + db $78, $79, $7a, $7b ; frame 3 endr + rept 8 - db $7c, $7d, $7e, $7f + db $7c, $7d, $7e, $7f ; frame 4 endr Intro_InitSineLYOverrides: @@ -789,17 +793,17 @@ IntroScene10: ld hl, vChars2 ld de, IntroCharizard1GFX - ld bc, $3980 + lb bc, BANK(IntroCharizard1GFX), 8 tiles call Request2bpp ld hl, vFont - ld de, $735f - ld bc, $3980 + ld de, IntroCharizard2GFX tile $40 + lb bc, BANK(IntroCharizard2GFX), 8 tiles call Request2bpp ld hl, vChars0 ld de, IntroCharizardFlamesGFX - ld bc, $3980 + lb bc, BANK(IntroCharizardFlamesGFX), 8 tiles call Request2bpp ld hl, wSpriteAnimDict @@ -965,8 +969,8 @@ IntroScene16: db -1 Intro_BlankTilemapAndBGMap: - ld hl, $c2a0 - ld bc, $0168 + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT .blank_tilemap ld [hl], 0 inc hl @@ -975,8 +979,8 @@ Intro_BlankTilemapAndBGMap: or c jr nz, .blank_tilemap - ld hl, $c600 - ld bc, $0400 + ld hl, wOverworldMapBlocks ; $c600, buffer + ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT .blank_bgmap ld [hl], 0 inc hl @@ -986,8 +990,8 @@ Intro_BlankTilemapAndBGMap: jr nz, .blank_bgmap ld hl, vBGMap0 - ld de, $c600 - ld bc, $3940 + ld de, wOverworldMapBlocks ; $c600, buffer + lb bc, BANK(@), $40 call Request2bpp ret -- cgit v1.2.3 From 6f0797676bd572ff85a8d4a37a3eafc95077d048 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 16:01:31 +0700 Subject: Move cutscene code to "movie" folder --- engine/game_freak_intro.asm | 341 ---------- engine/intro.asm | 798 ------------------------ engine/movie/game_freak_intro.asm | 341 ++++++++++ engine/movie/oak_speech.asm | 798 ++++++++++++++++++++++++ engine/movie/opening_cutscene.asm | 1230 +++++++++++++++++++++++++++++++++++++ engine/movie/title.asm | 636 +++++++++++++++++++ engine/opening_cutscene.asm | 1230 ------------------------------------- engine/title.asm | 636 ------------------- layout.link | 10 +- 9 files changed, 3010 insertions(+), 3010 deletions(-) delete mode 100644 engine/game_freak_intro.asm delete mode 100644 engine/intro.asm create mode 100644 engine/movie/game_freak_intro.asm create mode 100644 engine/movie/oak_speech.asm create mode 100644 engine/movie/opening_cutscene.asm create mode 100644 engine/movie/title.asm delete mode 100644 engine/opening_cutscene.asm delete mode 100644 engine/title.asm diff --git a/engine/game_freak_intro.asm b/engine/game_freak_intro.asm deleted file mode 100644 index c9e6c07..0000000 --- a/engine/game_freak_intro.asm +++ /dev/null @@ -1,341 +0,0 @@ -INCLUDE "constants.asm" - -SECTION "engine/game_freak_intro.asm", ROMX - -GameFreakIntro:: -; Copyright screen and Game Freak logo - - call DisableLCD - call ClearVRAM - - ld a, HIGH(vBGMap0) - ldh [hBGMapAddress + 1], a - xor a - ldh [hBGMapAddress], a - ldh [hJoyState], a - ldh [hSCX], a - ldh [hSCY], a - - ld a, $90 - ldh [hWY], a - - call EnableLCD - - ld c, 10 - call DelayFrames - ld b, SGB_GS_TITLE_SCREEN - call GetSGBLayout - - callab IntroCopyRightInfo - - ld a, 1 - ldh [hBGMapMode], a - call WaitBGMap - call SetPalettes - - ld c, 3 * 60 ; 3 seconds - call DelayFrames - - xor a - ldh [hWY], a - call ClearTileMap - - call .Init -.loop - call .Frame - jr nc, .loop - -; this was set if user skipped the GF logo by pressing A - ld a, [wJumptableIndex] - bit 6, a - jr nz, .cancelled - -; clear carry flag from .PlayFrame - and a - ret - -.cancelled - scf - ret - -.Init: - call DisableLCD - - ld hl, vBGMap0 - ld bc, BG_MAP_WIDTH * SCREEN_HEIGHT - xor a - call ByteFill - - ld de, GameFreakLogoGFX - ld hl, vChars1 - lb bc, BANK(GameFreakLogoGFX), 28 - call Get1bpp - - ld hl, GameFreakLogoSparkleGFX - ld de, vChars1 tile $1C - ld bc, 5 tiles - ld a, BANK(GameFreakLogoSparkleGFX) - call FarCopyData - - callba InitEffectObject - - ld hl, wSpriteAnimDict - ld a, $27 ; SPRITE_ANIM_DICT_GS_SPLASH - ld [hli], a - ld a, $8d - ld [hl], a - - xor a - ld [wJumptableIndex], a - ld [wIntroSceneFrameCounter], a - ld [wIntroSceneTimer], a - ldh [hSCX], a - ldh [hSCY], a - - ld a, 1 - ldh [hBGMapMode], a - - ld a, SCREEN_HEIGHT_PX - ldh [hWY], a - call EnableLCD - - ld a, %11100100 - ld a, %11100100 ; redundant - ldh [rOBP0], a - ld a, %00100100 - ldh [rOBP1], a - ret - - -.Frame: -; Play one frame of GameFreakPresents sequence. -; Return carry when the sequence completes or is canceled. - ld hl, hJoypadDown - ld a, [hl] - and %00001111 - jr nz, .pressed - - ld a, [wJumptableIndex] - bit 7, a - jr nz, .Finished - - callba EffectObjectJumpNoDelay - - call GameFreakPresentsScene - call DelayFrame - and a - ret - -.pressed - ld hl, wJumptableIndex - set 6, [hl] - -.Finished: - callab InitEffectObject - call ClearTileMap - call ClearSprites - - ld c, 16 - call DelayFrames - - scf - ret - - -GameFreakPresentsScene: - jumptable .scenes, wJumptableIndex - -.scenes - dw GameFreakPresents_Wait64Frames - dw GameFreakPresents_Star - dw GameFreakPresents_PlaceLogo - dw GameFreakPresents_LogoSparkles - dw GameFreakPresents_PlacePresents - dw GameFreakPresents_WaitForTimer - dw GameFreakPresents_SetDoneFlag - -GameFreakPresents_NextScene: - ld hl, wJumptableIndex - inc [hl] - ret - -GameFreakPresents_Wait64Frames: - ld c, $40 - call DelayFrames - call GameFreakPresents_NextScene - ret - -GameFreakPresents_Star: - xor a - ld [wIntroSceneFrameCounter], a - ld de, $5458 - ld a, $3b ; SPRITE_ANIM_INDEX_GS_INTRO_STAR - call InitSpriteAnimStruct - - ld hl, $000c ; SPRITEANIMSTRUCT_VAR1 - add hl, bc - ld [hl], $a0 ; star path radius - - ld de, $0031 ; SFX_GAME_FREAK_LOGO (metronome?) - call PlaySFX - call GameFreakPresents_NextScene - ret - -GameFreakPresents_PlaceLogo: - ld a, [wIntroSceneFrameCounter] - and a - ret z - - ld de, $5458 - ld a, $3a ; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO - call InitSpriteAnimStruct - call GameFreakPresents_NextScene - -; set timer for the next scene - ld a, 128 - ld [wIntroSceneTimer], a - ret - -GameFreakPresents_LogoSparkles: - ld hl, wIntroSceneTimer - ld a, [hl] - and a - jr z, .done - dec [hl] - -; add first text when timer passes half - cp 63 - call z, GameFreakPresents_PlaceGameFreak - -; add sparkles continuously - call GameFreakPresents_Sparkle - ret - -.done -; set timer for the next scene and go there - ld [hl], 128 - call GameFreakPresents_NextScene - ret - - -GameFreakPresents_PlaceGameFreak: - hlcoord 5, 12 - ld de, .game_freak - call PlaceString - ret - -.game_freak -; G A M E F R E A K - db $80, $81, $82, $83, $8d, $84, $85, $83, $81, $86 - db "@" - -GameFreakPresents_PlacePresents: - hlcoord 7, 13 - ld de, .presents - call PlaceString - call GameFreakPresents_NextScene - ld a, $80 - ld [wIntroSceneTimer], a - ret - -.presents -; P R E S E N T S - db $87, $88, $89, $8a, $8b, $8c - db "@" - -GameFreakPresents_SetDoneFlag: - ld hl, wJumptableIndex - set 7, [hl] - ret - -GameFreakPresents_WaitForTimer: - ld hl, wIntroSceneTimer - ld a, [hl] - and a - jr z, .done - dec [hl] - ret -.done - call GameFreakPresents_NextScene - ret - -GameFreakPresents_UpdateLogoPal: -; called from sprite animation routine - -; once we reached the final state, leave it alone - ldh a, [rOBP1] - cp %10010000 - ret z - -; wait 16 frames before next change - ld a, [wIntroSceneTimer] - and $0f - ret nz - -; rotate OBP1 by one color slot (2 bits) - ld hl, rOBP1 - rrc [hl] - rrc [hl] - ret - - -GameFreakPresents_Sparkle: -; Initialize and configure a sparkle sprite. - -; run only every second frame - ld d, a - and 1 - ret nz - -; shift over so our index is still changing by 1 each time - ld a, d - srl a -; set up a new sparkle sprite - push af - ld de, $5858 - ld a, $3c - call InitSpriteAnimStruct - pop af - -; take the bottom 4 bits of a as an index into -; sparkle_vectors (16 entries) - and %00001111 - ld e, a - ld d, 0 - ld hl, .vectors - add hl, de - add hl, de - -; set the angle and distance for this sprite - ld e, l - ld d, h - ld hl, $b ; SPRITEANIMSTRUCT_JUMPTABLE_INDEX - add hl, bc - ld a, [de] - ld [hl], a ; angle - inc de - ld hl, $c ; SPRITEANIMSTRUCT_VAR1 - add hl, bc - ld [hl], 0 - inc hl ; SPRITEANIMSTRUCT_VAR2 - ld a, [de] - ld [hl], a ; distance - ret - -.vectors - db $00, $03 - db $08, $04 - db $04, $03 - db $0c, $02 - db $10, $02 - db $18, $03 - db $14, $04 - db $1c, $03 - db $20, $02 - db $28, $02 - db $24, $03 - db $2c, $04 - db $30, $04 - db $38, $03 - db $34, $02 - db $3c, $04 diff --git a/engine/intro.asm b/engine/intro.asm deleted file mode 100644 index 070862d..0000000 --- a/engine/intro.asm +++ /dev/null @@ -1,798 +0,0 @@ -INCLUDE "constants.asm" - -SECTION "engine/intro.asm", ROMX - -DemoStart:: - ld de, OakPic - lb bc, BANK(OakPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call FadeInIntroPic - ld hl, OakSpeechDemo - call PrintText - call GBFadeOutToWhite - call ClearTileMap - ld de, ProtagonistPic - lb bc, BANK(ProtagonistPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call MovePicLeft - ld a, %11010000 - ldh [rOBP0], a - call DemoSetUpPlayer - jp IntroCleanup - -GameStart:: - ld de, OakPic - lb bc, BANK(OakPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call FadeInIntroPic - ld hl, OakSpeech1 - call PrintText - call GBFadeOutToWhite - call ClearTileMap - ld a, DEX_YADOKING - ld [wCurSpecies], a - ld [wMonDexIndex], a - call GetMonHeader - hlcoord 6, 4 - hlcoord 6, 4 - call PrepMonFrontpic - call MovePicLeft - ld hl, OakSpeech2 - call PrintText - ld a, DEX_YADOKING - call PlayCry - ld hl, OakSpeech3 - call PrintText - call GBFadeOutToWhite - call ClearTileMap - ld de, ProtagonistPic - lb bc, BANK(ProtagonistPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call MovePicLeft - ld hl, OakSpeech4 - call PrintText - call ChoosePlayerName - call GBFadeOutToWhite - call ClearTileMap - ld de, RivalPic - lb bc, BANK(RivalPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call FadeInIntroPic - ld hl, OakSpeech5 - call PrintText - call ChooseRivalName - call GBFadeOutToWhite - call ClearTileMap - ld de, OakPic - lb bc, BANK(OakPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call FadeInIntroPic - ld hl, OakSpeech6 - call PrintText - callba SetClockDialog - call Function04ac - call GBFadeOutToWhite - call ClearTileMap - ld de, ProtagonistPic - lb bc, BANK(ProtagonistPic), $00 - call IntroDisplayPicCenteredOrUpperRight - call GBFadeInFromWhite - ld hl, OakSpeech7 - call PrintText - ldh a, [hROMBank] - push af - ld a, $20 - ld [wMusicFade], a - ld de, MUSIC_NONE - ld a, e - ld [wMusicFadeIDLow], a - ld a, d - ld [wMusicFadeIDHigh], a - ld de, $000B ; should be a constant - shrink noise? - call PlaySFX - pop af - call Bankswitch - ld c, $04 - call DelayFrames - -IntroCleanup:: - ld de, ShrinkPic1 - lb bc, BANK(ShrinkPic1), $00 - call IntroDisplayPicCenteredOrUpperRight - ld c, $04 - call DelayFrames - ld de, ShrinkPic2 - lb bc, BANK(ShrinkPic2), $00 - call IntroDisplayPicCenteredOrUpperRight - ld c, $14 - call DelayFrames - hlcoord 6, 5 - ld b, $07 - ld c, $07 - call ClearBox - ld c, $14 - call DelayFrames - call LoadStartingSprites - call LoadFontExtra - ld c, $32 - call DelayFrames - call GBFadeOutToWhite - call ClearTileMap - call Function0502 - ld a, $00 - ld [wd638], a - ld [wd637], a - -OverworldStart:: - call SetUpGameEntry - ld hl, wDebugFlags - bit CONTINUED_F, [hl] - call z, Function15b5 - ld hl, wd4a9 - set 0, [hl] - jp Function2a85 - -SetUpGameEntry:: - ld a, $04 - ld [wd65e], a - ld a, $F2 - ldh [hMapEntryMethod], a - ld hl, wDebugFlags - bit CONTINUED_F, [hl] ; if we loaded a game - ret nz - ld a, $F1 - ldh [hMapEntryMethod], a - ld a, $00 - ld [wDefaultSpawnPoint], a - ld hl, GameStartPlacement - ld de, wMapGroup - ld bc, wd65e - wMapGroup - call CopyBytes - ret - -GameStartPlacement:: - db $01 ; map group - db MAP_PLAYER_HOUSE_2F ; map - dwcoord 15, 45 ; screen anchor - db $04 ; metatile x - db $04 ; metatile y - db $00 ; in-metatile x - db $01 ; in-metatile y - -DebugSetUpPlayer:: - call SetPlayerNamesDebug - ld a, $0F - ld [wd15d], a - ld a, $42 - ld [wd15e], a - ld a, $3F - ld [wd15f], a - ld a, $FF - ld [wd163], a - ld [wd164], a - call GiveRandomJohto - ld a, $03 - call AddRandomPokemonToBox - call FillTMs - ld de, DebugBagItems - call FillBagWithList - ld hl, wPokedexOwned - call DebugFillPokedex - ld hl, wPokedexSeen - call DebugFillPokedex - ld hl, wAnnonDex - ld [hl], $01 - call Function40fd - ret - -DebugFillPokedex:: - ld b, $1F - ld a, $FF -.loop - ld [hl+], a - dec b - jr nz, .loop - ld [hl], $07 - ret - -FillBagWithList:: - ld hl, wNumBagItems -.loop - ld a, [de] - cp $FF - jr z, .yump - ld [wCurItem], a - inc de - ld a, [de] - inc de - ld [wItemQuantity], a - call ReceiveItem - jr .loop -.yump - ret - -DebugBagItems:: - db ITEM_IMPORTANT_BAG, $01 - db ITEM_BAG, $01 - db ITEM_TM_HOLDER, $01 - db ITEM_BALL_HOLDER, $01 - db ITEM_BICYCLE, $01 - db ITEM_MAIL, $06 - db ITEM_ULTRA_BALL, $1E - db ITEM_POKE_BALL, $63 - db ITEM_POTION, $1E - db ITEM_RARE_CANDY, $14 - db ITEM_MOON_STONE, $63 - db ITEM_FULL_HEAL, $63 - db ITEM_PROTEIN, $63 - db ITEM_QUICK_NEEDLE, $63 - db ITEM_SNAKESKIN, $63 - db ITEM_KINGS_ROCK, $63 - db ITEM_FLEE_FEATHER, $63 - db ITEM_FOCUS_ORB, $63 - db ITEM_SHARP_SCYTHE, $63 - db ITEM_DETECT_ORB, $63 - db $FF - -GiveRandomPokemon:: - and a - ret z -.loop - push af - call RandomUnder246 - ld b, $0A - call GivePokemon - pop af - dec a - jr nz, .loop - ret - -GiveRandomJohto:: -.loop - call Random - and $03 - jr z, .loop - dec a - ld b, a - add a, a - add a, b - add a, $98 ; maybe should be a constant - 152, aka the number of kanto pokes - ld b, $08 - call GivePokemon - ld a, $8D - ld [wPartyMon1 + 1], a - ret - -GiveKantoStarters:: - ld a, $03 - ld b, $20 - call GivePokemon - ld a, $06 - ld b, $24 - call GivePokemon - ld a, $09 - ld b, $24 - call GivePokemon - ret - -GivePokemon:: - ld [wMonDexIndex], a - ld a, b - ld [wCurPartyLevel], a - ld a, $10 - call Predef - ret - -AddRandomPokemonToBox: - and a - ret z -.loop - push af - xor a - ld [wca44], a - call RandomUnder246 - ld [wcdd7], a - ld a, $05 - ld [wCurPartyLevel], a - callab AddPokemonToBox - ld a, [wcdd7] - ld [wMonDexIndex], a - callab Functiondd5c - pop af - dec a - jr nz, .loop - ret - -RandomUnder246:: -.loop - call Random - and a - jr z, .loop - cp $F6 - jr nc, .loop - ret - -FillTMs:: - ld b, $39 - ld a, $01 - ld hl, wTMsHMs -.loop - ld [hl+], a - dec b - jr nz, .loop - ret - -DebugGiveKeyItems:: - ld hl, DebugKeyItemsList - ld de, wKeyItems - ld c, $FF -.loop - inc c - ld a, [hl+] - ld [de], a - inc de - cp $FF - jr nz, .loop - ld a, c - ld [wNumKeyItems], a - ret - -DebugKeyItemsList:: - db ITEM_TM_HOLDER - db ITEM_BALL_HOLDER - db ITEM_BAG - db ITEM_BICYCLE - db $FF - -DemoSetUpPlayer:: - ld hl, wPlayerName - ld de, DemoPlayerName - call CopyString - ld hl, wRivalName - ld de, DemoRivalName - call CopyString - call Function40fd - ld de, DemoItemList - call FillBagWithList - call GiveRandomJohto - ret - -DemoItemList:: - db ITEM_POKE_BALL, $05 - db ITEM_POTION, $0A - db ITEM_FULL_HEAL, $0A - db ITEM_STIMULUS_ORB, $01 - db ITEM_FOCUS_ORB, $01 - db $FF - -DemoPlayerName:: - db "サトシ@" - -DemoRivalName:: - db "シゲル@" - -OakSpeechDemo:: - text "ようこそ" - line "ポケット モンスターの せかいへ!" - cont "ごぞんじ わしが オーキドじゃ!" - - para "きょう きみに きてもらったのは" - line "ほかでもない" - cont "あたらしい ずかんづくりを" - cont "てつだって ほしいのじゃ!" - - para "もちろん" - line "きみの パートナーとなる ポケモンと" - cont "りュックは ようい しておる" - - para "りュックの なかには" - line "キズぐすりと" - cont "モンスターボールが" - cont "はいっておるから あんしんじゃ!" - - para "すでに きみの ライバルは" - line "しゅっぱつ しとる" - - para "まけないよう がんばって くれい!" - prompt - -OakSpeech1:: - text "いやあ またせた!" - - para "ポケット モンスターの せかいへ" - line "ようこそ!" - - para "わたしの なまえは オーキド" - - para "みんなからは # はかせと" - line "したわれて おるよ" - prompt - -OakSpeech2:: - text "きみも もちろん" - line "しっているとは おもうが" - - para "この せかいには" - line "ポケット モンスターと よばれる" - cont "いきもの たちが" - cont "いたるところに すんでいる!" - prompt - -OakSpeech3:: - text "その # という いきものを" - line "ひとは ぺットに したり" - cont "しょうぶに つかったり" - cont "そして・・・" - - para "わたしは この #の" - line "けんきゅうを してる というわけだ" - prompt - -OakSpeech4:: - text "では はじめに きみの なまえを" - line "おしえて もらおう!" - prompt - -OakSpeech5:: - text "そして この しょうねんは" - line "きみの おさななじみであり" - cont"ライバルである" - - para "・・・えーと?" - line "なまえは なんて いったかな?" - prompt - -OakSpeech6:: - text "さて きみの きねんすべき" - line "たびだちのひを" - cont "きろくしておこう!" - - para "じかんも なるべく せいかくにな!" - prompt - -OakSpeech7:: - text "!" - - para "いよいよ これから" - line "きみの ものがたりの はじまりだ!" - - para "ゆめと ぼうけんと!" - line "ポケット モンスターの せかいへ!" - - para "レッツ ゴー!" - done - -SetPlayerNamesDebug:: - ld hl, DebugPlayerName - ld de, wPlayerName - call CopyNameDebug - ld hl, DebugRivalName - ld de, wRivalName - -CopyNameDebug: - ld bc, PLAYER_NAME_LENGTH - call CopyBytes - ret - -DebugPlayerName: - db "コージ@" - -DebugRivalName: - db "レッド@" - -ChoosePlayerName:: - call PanPortraitRight - ld hl, PlayerNameMenuHeader - call NamingWindow - ld a, [wMenuCursorY] - dec a - jr z, .loop - ld de, wPlayerName - call SaveCustomName - jr .farjump - -.loop - ld b, $01 - ld de, wPlayerName - callba NamingScreen - ld a, [wPlayerName] - cp "@" - jr z, .loop - - call GBFadeOutToWhite - call ClearTileMap - call LoadFontExtra - call WaitBGMap - ld de, $4D10 - ld bc, $1200 - call IntroDisplayPicCenteredOrUpperRight - call GBFadeInFromWhite -.farjump - ld hl, ChoosePlayerNameEndText - call PrintText - ret - -ChoosePlayerNameEndText: - text "ふむ・・・" - line " と いうんだな!" - prompt - -PlayerNameMenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 00, 00, 10, 11 - dw PlayerNameMenuData - db 01 ; initial selection - -PlayerNameMenuData: - db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B - db 04 ; items - db "じぶんできめる@" - db "ゴールド@" - db "サトシ@" - db "ジャック@" - db 3 ; x offset for the title string - db "なまえこうほ@" - -ChooseRivalName:: - call PanPortraitRight - ld hl, RivalNameMenuHeader - call NamingWindow - ld a, [wMenuCursorY] - dec a - jr z, .loop - ld de, wRivalName - call SaveCustomName - jr .farjump - -.loop - ld b, $02 - ld de, wRivalName - callba NamingScreen - ld a, [wRivalName] - cp "@" - jr z, .loop - - call GBFadeOutToWhite - call ClearTileMap - call LoadFontExtra - call WaitBGMap - ld de, $4BD4 - ld bc, $1200 - call IntroDisplayPicCenteredOrUpperRight - call GBFadeInFromWhite -.farjump - ld hl, ChooseRivalNameEndText - call PrintText - ret - -ChooseRivalNameEndText: - text "そうか そうだったな" - line " という なまえだ" - prompt - -RivalNameMenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 00, 00, 10, 11 - dw RivalNameMenuData - db 01 ; initial selection - -RivalNameMenuData: - db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B - db 04 ; items - db "じぶんできめる@" - db "シルバー@" - db "シゲル@" - db "ジョン@" - db 3 - db "なまえこうほ@" - -MomNamePrompt:: - ld hl, MomNameMenuHeader - call NamingWindow - ld a, [wMenuCursorY] - dec a - jr z, .loop - ld de, wMomsName - call SaveCustomName - jr .escape - -.loop - ld b, $03 - ld de, wMomsName - callba NamingScreen - ld a, [wMomsName] - cp "@" - jr z, .loop - - call ClearPalettes - call ClearTileMap - callab Function140d9 - call LoadFontExtra - call GetMemSGBLayout - call WaitBGMap -.escape - ret - -MomNameMenuHeader: - db MENU_BACKUP_TILES ; flags - menu_coords 00, 00, 10, 11 - dw .MomNameMenuData - db 01 ; initial selection - -.MomNameMenuData: - db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B - db 04 ; items - db "じぶんで きめる@" - db "おかあさん@" - db "ママ@" - db "かあちゃん@" - db 3 - db "なまえこうほ@" - -NamingWindow:: - ; loads the menu header put into hl - call LoadMenuHeader - call VerticalMenu - ld a, [wMenuCursorY] - dec a - call CopyNameFromMenu - call CloseWindow - ret - -SaveCustomName:: - ld hl, wStringBuffer2 - ld bc, PLAYER_NAME_LENGTH - call CopyBytes - ret - -PanPortraitRight:: - hlcoord 5, 4 - ld d, $06 - ld e, $7E - ld b, d - ld c, e - ld d, $00 - add hl, de -.loop - xor a - ldh [hBGMapMode], a - push hl - push bc -.innerLoop - ;pans all the tiles onscreen to the right one - ld a, [hl+] - ld [hl-], a - dec hl - dec c - jr nz, .innerLoop - - call WaitBGMap - pop bc - pop hl - inc hl - dec b ; passed c - how many tiles right to pan? - jr nz, .loop - ret - -PanPortraitLeft:: - hlcoord 12, 4 - ld b, $06 - ld c, $7E -.loop - xor a - ldh [hBGMapMode], a - push hl - push bc -.innerloop - ld a, [hl-] - ld [hl+], a - inc hl - dec c - jr nz, .innerloop - - call WaitBGMap - pop bc - pop hl - inc hl - dec b - jr nz, .loop - ret - -MenuCallSettings:: - call SettingsScreen - ret - -FadeInIntroPic: - ld hl, IntroFadePalettes - ld b, 6 -.next - ld a, [hl+] - ldh [rBGP], a - ld c, 10 - call DelayFrames - dec b - jr nz, .next - ret - -IntroFadePalettes: - db %01010100 - db %10101000 - db %11111100 - db %11111000 - db %11110100 - db %11100100 - -MovePicLeft: - ld a, 119 - ldh [hWX], a - call DelayFrame - - ld a, %11100100 - ldh [rBGP], a -.next - call DelayFrame - ldh a, [hWX] - sub 8 - cp $FF - ret z - ldh [hWX], a - jr .next - -IntroDisplayPicCenteredOrUpperRight:: -; b = bank -; de = address of compressed pic -; c: 0 = centred, non-zero = upper-right - ld a, c - and a - hlcoord 13, 4 - jr nz, .skip - hlcoord 6, 4 -.skip - push hl - ld a, b - call UncompressSpriteFromDE - ld a, $00 - call OpenSRAM - ld hl, sSpriteBuffer1 - ld de, sSpriteBuffer0 - ld bc, DOUBLESPRITEBUFFERSIZE - call CopyBytes - call CloseSRAM - ld de, VRAM_Begin + $1000 - call InterlaceMergeSpriteBuffers - pop hl - xor a - ldh [hGraphicStartTile], a - ld bc, $0707 - predef PlaceGraphic - ret - -LoadStartingSprites: - ld de, GoldSpriteGFX - lb bc, BANK(GoldSpriteGFX), $0C - ld hl, VRAM_Begin - call Request2bpp - ld hl, wVirtualOAM - ld de, GameStartSprites - ld c, $04 -.loop - ld a, [de] - inc de - ld [hl+], a - ld a, [de] - inc de - ld [hl+], a - ld a, [de] - inc de - ld [hl+], a - xor a - ld [hl+], a - dec c - jr nz, .loop - ret - -GameStartSprites: - db $50, $48, $00 - db $50, $50, $01 - db $58, $48, $02 - db $58, $50, $03 diff --git a/engine/movie/game_freak_intro.asm b/engine/movie/game_freak_intro.asm new file mode 100644 index 0000000..e8a7a00 --- /dev/null +++ b/engine/movie/game_freak_intro.asm @@ -0,0 +1,341 @@ +INCLUDE "constants.asm" + +SECTION "engine/movie/game_freak_intro.asm", ROMX + +GameFreakIntro:: +; Copyright screen and Game Freak logo + + call DisableLCD + call ClearVRAM + + ld a, HIGH(vBGMap0) + ldh [hBGMapAddress + 1], a + xor a + ldh [hBGMapAddress], a + ldh [hJoyState], a + ldh [hSCX], a + ldh [hSCY], a + + ld a, $90 + ldh [hWY], a + + call EnableLCD + + ld c, 10 + call DelayFrames + ld b, SGB_GS_TITLE_SCREEN + call GetSGBLayout + + callab IntroCopyRightInfo + + ld a, 1 + ldh [hBGMapMode], a + call WaitBGMap + call SetPalettes + + ld c, 3 * 60 ; 3 seconds + call DelayFrames + + xor a + ldh [hWY], a + call ClearTileMap + + call .Init +.loop + call .Frame + jr nc, .loop + +; this was set if user skipped the GF logo by pressing A + ld a, [wJumptableIndex] + bit 6, a + jr nz, .cancelled + +; clear carry flag from .PlayFrame + and a + ret + +.cancelled + scf + ret + +.Init: + call DisableLCD + + ld hl, vBGMap0 + ld bc, BG_MAP_WIDTH * SCREEN_HEIGHT + xor a + call ByteFill + + ld de, GameFreakLogoGFX + ld hl, vChars1 + lb bc, BANK(GameFreakLogoGFX), 28 + call Get1bpp + + ld hl, GameFreakLogoSparkleGFX + ld de, vChars1 tile $1C + ld bc, 5 tiles + ld a, BANK(GameFreakLogoSparkleGFX) + call FarCopyData + + callba InitEffectObject + + ld hl, wSpriteAnimDict + ld a, $27 ; SPRITE_ANIM_DICT_GS_SPLASH + ld [hli], a + ld a, $8d + ld [hl], a + + xor a + ld [wJumptableIndex], a + ld [wIntroSceneFrameCounter], a + ld [wIntroSceneTimer], a + ldh [hSCX], a + ldh [hSCY], a + + ld a, 1 + ldh [hBGMapMode], a + + ld a, SCREEN_HEIGHT_PX + ldh [hWY], a + call EnableLCD + + ld a, %11100100 + ld a, %11100100 ; redundant + ldh [rOBP0], a + ld a, %00100100 + ldh [rOBP1], a + ret + + +.Frame: +; Play one frame of GameFreakPresents sequence. +; Return carry when the sequence completes or is canceled. + ld hl, hJoypadDown + ld a, [hl] + and %00001111 + jr nz, .pressed + + ld a, [wJumptableIndex] + bit 7, a + jr nz, .Finished + + callba EffectObjectJumpNoDelay + + call GameFreakPresentsScene + call DelayFrame + and a + ret + +.pressed + ld hl, wJumptableIndex + set 6, [hl] + +.Finished: + callab InitEffectObject + call ClearTileMap + call ClearSprites + + ld c, 16 + call DelayFrames + + scf + ret + + +GameFreakPresentsScene: + jumptable .scenes, wJumptableIndex + +.scenes + dw GameFreakPresents_Wait64Frames + dw GameFreakPresents_Star + dw GameFreakPresents_PlaceLogo + dw GameFreakPresents_LogoSparkles + dw GameFreakPresents_PlacePresents + dw GameFreakPresents_WaitForTimer + dw GameFreakPresents_SetDoneFlag + +GameFreakPresents_NextScene: + ld hl, wJumptableIndex + inc [hl] + ret + +GameFreakPresents_Wait64Frames: + ld c, $40 + call DelayFrames + call GameFreakPresents_NextScene + ret + +GameFreakPresents_Star: + xor a + ld [wIntroSceneFrameCounter], a + ld de, $5458 + ld a, $3b ; SPRITE_ANIM_INDEX_GS_INTRO_STAR + call InitSpriteAnimStruct + + ld hl, $000c ; SPRITEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], $a0 ; star path radius + + ld de, $0031 ; SFX_GAME_FREAK_LOGO (metronome?) + call PlaySFX + call GameFreakPresents_NextScene + ret + +GameFreakPresents_PlaceLogo: + ld a, [wIntroSceneFrameCounter] + and a + ret z + + ld de, $5458 + ld a, $3a ; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO + call InitSpriteAnimStruct + call GameFreakPresents_NextScene + +; set timer for the next scene + ld a, 128 + ld [wIntroSceneTimer], a + ret + +GameFreakPresents_LogoSparkles: + ld hl, wIntroSceneTimer + ld a, [hl] + and a + jr z, .done + dec [hl] + +; add first text when timer passes half + cp 63 + call z, GameFreakPresents_PlaceGameFreak + +; add sparkles continuously + call GameFreakPresents_Sparkle + ret + +.done +; set timer for the next scene and go there + ld [hl], 128 + call GameFreakPresents_NextScene + ret + + +GameFreakPresents_PlaceGameFreak: + hlcoord 5, 12 + ld de, .game_freak + call PlaceString + ret + +.game_freak +; G A M E F R E A K + db $80, $81, $82, $83, $8d, $84, $85, $83, $81, $86 + db "@" + +GameFreakPresents_PlacePresents: + hlcoord 7, 13 + ld de, .presents + call PlaceString + call GameFreakPresents_NextScene + ld a, $80 + ld [wIntroSceneTimer], a + ret + +.presents +; P R E S E N T S + db $87, $88, $89, $8a, $8b, $8c + db "@" + +GameFreakPresents_SetDoneFlag: + ld hl, wJumptableIndex + set 7, [hl] + ret + +GameFreakPresents_WaitForTimer: + ld hl, wIntroSceneTimer + ld a, [hl] + and a + jr z, .done + dec [hl] + ret +.done + call GameFreakPresents_NextScene + ret + +GameFreakPresents_UpdateLogoPal: +; called from sprite animation routine + +; once we reached the final state, leave it alone + ldh a, [rOBP1] + cp %10010000 + ret z + +; wait 16 frames before next change + ld a, [wIntroSceneTimer] + and $0f + ret nz + +; rotate OBP1 by one color slot (2 bits) + ld hl, rOBP1 + rrc [hl] + rrc [hl] + ret + + +GameFreakPresents_Sparkle: +; Initialize and configure a sparkle sprite. + +; run only every second frame + ld d, a + and 1 + ret nz + +; shift over so our index is still changing by 1 each time + ld a, d + srl a +; set up a new sparkle sprite + push af + ld de, $5858 + ld a, $3c + call InitSpriteAnimStruct + pop af + +; take the bottom 4 bits of a as an index into +; sparkle_vectors (16 entries) + and %00001111 + ld e, a + ld d, 0 + ld hl, .vectors + add hl, de + add hl, de + +; set the angle and distance for this sprite + ld e, l + ld d, h + ld hl, $b ; SPRITEANIMSTRUCT_JUMPTABLE_INDEX + add hl, bc + ld a, [de] + ld [hl], a ; angle + inc de + ld hl, $c ; SPRITEANIMSTRUCT_VAR1 + add hl, bc + ld [hl], 0 + inc hl ; SPRITEANIMSTRUCT_VAR2 + ld a, [de] + ld [hl], a ; distance + ret + +.vectors + db $00, $03 + db $08, $04 + db $04, $03 + db $0c, $02 + db $10, $02 + db $18, $03 + db $14, $04 + db $1c, $03 + db $20, $02 + db $28, $02 + db $24, $03 + db $2c, $04 + db $30, $04 + db $38, $03 + db $34, $02 + db $3c, $04 diff --git a/engine/movie/oak_speech.asm b/engine/movie/oak_speech.asm new file mode 100644 index 0000000..5941f65 --- /dev/null +++ b/engine/movie/oak_speech.asm @@ -0,0 +1,798 @@ +INCLUDE "constants.asm" + +SECTION "engine/movie/oak_speech.asm", ROMX + +DemoStart:: + ld de, OakPic + lb bc, BANK(OakPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call FadeInIntroPic + ld hl, OakSpeechDemo + call PrintText + call GBFadeOutToWhite + call ClearTileMap + ld de, ProtagonistPic + lb bc, BANK(ProtagonistPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call MovePicLeft + ld a, %11010000 + ldh [rOBP0], a + call DemoSetUpPlayer + jp IntroCleanup + +GameStart:: + ld de, OakPic + lb bc, BANK(OakPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call FadeInIntroPic + ld hl, OakSpeech1 + call PrintText + call GBFadeOutToWhite + call ClearTileMap + ld a, DEX_YADOKING + ld [wCurSpecies], a + ld [wMonDexIndex], a + call GetMonHeader + hlcoord 6, 4 + hlcoord 6, 4 + call PrepMonFrontpic + call MovePicLeft + ld hl, OakSpeech2 + call PrintText + ld a, DEX_YADOKING + call PlayCry + ld hl, OakSpeech3 + call PrintText + call GBFadeOutToWhite + call ClearTileMap + ld de, ProtagonistPic + lb bc, BANK(ProtagonistPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call MovePicLeft + ld hl, OakSpeech4 + call PrintText + call ChoosePlayerName + call GBFadeOutToWhite + call ClearTileMap + ld de, RivalPic + lb bc, BANK(RivalPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call FadeInIntroPic + ld hl, OakSpeech5 + call PrintText + call ChooseRivalName + call GBFadeOutToWhite + call ClearTileMap + ld de, OakPic + lb bc, BANK(OakPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call FadeInIntroPic + ld hl, OakSpeech6 + call PrintText + callba SetClockDialog + call Function04ac + call GBFadeOutToWhite + call ClearTileMap + ld de, ProtagonistPic + lb bc, BANK(ProtagonistPic), $00 + call IntroDisplayPicCenteredOrUpperRight + call GBFadeInFromWhite + ld hl, OakSpeech7 + call PrintText + ldh a, [hROMBank] + push af + ld a, $20 + ld [wMusicFade], a + ld de, MUSIC_NONE + ld a, e + ld [wMusicFadeIDLow], a + ld a, d + ld [wMusicFadeIDHigh], a + ld de, $000B ; should be a constant - shrink noise? + call PlaySFX + pop af + call Bankswitch + ld c, $04 + call DelayFrames + +IntroCleanup:: + ld de, ShrinkPic1 + lb bc, BANK(ShrinkPic1), $00 + call IntroDisplayPicCenteredOrUpperRight + ld c, $04 + call DelayFrames + ld de, ShrinkPic2 + lb bc, BANK(ShrinkPic2), $00 + call IntroDisplayPicCenteredOrUpperRight + ld c, $14 + call DelayFrames + hlcoord 6, 5 + ld b, $07 + ld c, $07 + call ClearBox + ld c, $14 + call DelayFrames + call LoadStartingSprites + call LoadFontExtra + ld c, $32 + call DelayFrames + call GBFadeOutToWhite + call ClearTileMap + call Function0502 + ld a, $00 + ld [wd638], a + ld [wd637], a + +OverworldStart:: + call SetUpGameEntry + ld hl, wDebugFlags + bit CONTINUED_F, [hl] + call z, Function15b5 + ld hl, wd4a9 + set 0, [hl] + jp Function2a85 + +SetUpGameEntry:: + ld a, $04 + ld [wd65e], a + ld a, $F2 + ldh [hMapEntryMethod], a + ld hl, wDebugFlags + bit CONTINUED_F, [hl] ; if we loaded a game + ret nz + ld a, $F1 + ldh [hMapEntryMethod], a + ld a, $00 + ld [wDefaultSpawnPoint], a + ld hl, GameStartPlacement + ld de, wMapGroup + ld bc, wd65e - wMapGroup + call CopyBytes + ret + +GameStartPlacement:: + db $01 ; map group + db MAP_PLAYER_HOUSE_2F ; map + dwcoord 15, 45 ; screen anchor + db $04 ; metatile x + db $04 ; metatile y + db $00 ; in-metatile x + db $01 ; in-metatile y + +DebugSetUpPlayer:: + call SetPlayerNamesDebug + ld a, $0F + ld [wd15d], a + ld a, $42 + ld [wd15e], a + ld a, $3F + ld [wd15f], a + ld a, $FF + ld [wd163], a + ld [wd164], a + call GiveRandomJohto + ld a, $03 + call AddRandomPokemonToBox + call FillTMs + ld de, DebugBagItems + call FillBagWithList + ld hl, wPokedexOwned + call DebugFillPokedex + ld hl, wPokedexSeen + call DebugFillPokedex + ld hl, wAnnonDex + ld [hl], $01 + call Function40fd + ret + +DebugFillPokedex:: + ld b, $1F + ld a, $FF +.loop + ld [hl+], a + dec b + jr nz, .loop + ld [hl], $07 + ret + +FillBagWithList:: + ld hl, wNumBagItems +.loop + ld a, [de] + cp $FF + jr z, .yump + ld [wCurItem], a + inc de + ld a, [de] + inc de + ld [wItemQuantity], a + call ReceiveItem + jr .loop +.yump + ret + +DebugBagItems:: + db ITEM_IMPORTANT_BAG, $01 + db ITEM_BAG, $01 + db ITEM_TM_HOLDER, $01 + db ITEM_BALL_HOLDER, $01 + db ITEM_BICYCLE, $01 + db ITEM_MAIL, $06 + db ITEM_ULTRA_BALL, $1E + db ITEM_POKE_BALL, $63 + db ITEM_POTION, $1E + db ITEM_RARE_CANDY, $14 + db ITEM_MOON_STONE, $63 + db ITEM_FULL_HEAL, $63 + db ITEM_PROTEIN, $63 + db ITEM_QUICK_NEEDLE, $63 + db ITEM_SNAKESKIN, $63 + db ITEM_KINGS_ROCK, $63 + db ITEM_FLEE_FEATHER, $63 + db ITEM_FOCUS_ORB, $63 + db ITEM_SHARP_SCYTHE, $63 + db ITEM_DETECT_ORB, $63 + db $FF + +GiveRandomPokemon:: + and a + ret z +.loop + push af + call RandomUnder246 + ld b, $0A + call GivePokemon + pop af + dec a + jr nz, .loop + ret + +GiveRandomJohto:: +.loop + call Random + and $03 + jr z, .loop + dec a + ld b, a + add a, a + add a, b + add a, $98 ; maybe should be a constant - 152, aka the number of kanto pokes + ld b, $08 + call GivePokemon + ld a, $8D + ld [wPartyMon1 + 1], a + ret + +GiveKantoStarters:: + ld a, $03 + ld b, $20 + call GivePokemon + ld a, $06 + ld b, $24 + call GivePokemon + ld a, $09 + ld b, $24 + call GivePokemon + ret + +GivePokemon:: + ld [wMonDexIndex], a + ld a, b + ld [wCurPartyLevel], a + ld a, $10 + call Predef + ret + +AddRandomPokemonToBox: + and a + ret z +.loop + push af + xor a + ld [wca44], a + call RandomUnder246 + ld [wcdd7], a + ld a, $05 + ld [wCurPartyLevel], a + callab AddPokemonToBox + ld a, [wcdd7] + ld [wMonDexIndex], a + callab Functiondd5c + pop af + dec a + jr nz, .loop + ret + +RandomUnder246:: +.loop + call Random + and a + jr z, .loop + cp $F6 + jr nc, .loop + ret + +FillTMs:: + ld b, $39 + ld a, $01 + ld hl, wTMsHMs +.loop + ld [hl+], a + dec b + jr nz, .loop + ret + +DebugGiveKeyItems:: + ld hl, DebugKeyItemsList + ld de, wKeyItems + ld c, $FF +.loop + inc c + ld a, [hl+] + ld [de], a + inc de + cp $FF + jr nz, .loop + ld a, c + ld [wNumKeyItems], a + ret + +DebugKeyItemsList:: + db ITEM_TM_HOLDER + db ITEM_BALL_HOLDER + db ITEM_BAG + db ITEM_BICYCLE + db $FF + +DemoSetUpPlayer:: + ld hl, wPlayerName + ld de, DemoPlayerName + call CopyString + ld hl, wRivalName + ld de, DemoRivalName + call CopyString + call Function40fd + ld de, DemoItemList + call FillBagWithList + call GiveRandomJohto + ret + +DemoItemList:: + db ITEM_POKE_BALL, $05 + db ITEM_POTION, $0A + db ITEM_FULL_HEAL, $0A + db ITEM_STIMULUS_ORB, $01 + db ITEM_FOCUS_ORB, $01 + db $FF + +DemoPlayerName:: + db "サトシ@" + +DemoRivalName:: + db "シゲル@" + +OakSpeechDemo:: + text "ようこそ" + line "ポケット モンスターの せかいへ!" + cont "ごぞんじ わしが オーキドじゃ!" + + para "きょう きみに きてもらったのは" + line "ほかでもない" + cont "あたらしい ずかんづくりを" + cont "てつだって ほしいのじゃ!" + + para "もちろん" + line "きみの パートナーとなる ポケモンと" + cont "りュックは ようい しておる" + + para "りュックの なかには" + line "キズぐすりと" + cont "モンスターボールが" + cont "はいっておるから あんしんじゃ!" + + para "すでに きみの ライバルは" + line "しゅっぱつ しとる" + + para "まけないよう がんばって くれい!" + prompt + +OakSpeech1:: + text "いやあ またせた!" + + para "ポケット モンスターの せかいへ" + line "ようこそ!" + + para "わたしの なまえは オーキド" + + para "みんなからは # はかせと" + line "したわれて おるよ" + prompt + +OakSpeech2:: + text "きみも もちろん" + line "しっているとは おもうが" + + para "この せかいには" + line "ポケット モンスターと よばれる" + cont "いきもの たちが" + cont "いたるところに すんでいる!" + prompt + +OakSpeech3:: + text "その # という いきものを" + line "ひとは ぺットに したり" + cont "しょうぶに つかったり" + cont "そして・・・" + + para "わたしは この #の" + line "けんきゅうを してる というわけだ" + prompt + +OakSpeech4:: + text "では はじめに きみの なまえを" + line "おしえて もらおう!" + prompt + +OakSpeech5:: + text "そして この しょうねんは" + line "きみの おさななじみであり" + cont"ライバルである" + + para "・・・えーと?" + line "なまえは なんて いったかな?" + prompt + +OakSpeech6:: + text "さて きみの きねんすべき" + line "たびだちのひを" + cont "きろくしておこう!" + + para "じかんも なるべく せいかくにな!" + prompt + +OakSpeech7:: + text "!" + + para "いよいよ これから" + line "きみの ものがたりの はじまりだ!" + + para "ゆめと ぼうけんと!" + line "ポケット モンスターの せかいへ!" + + para "レッツ ゴー!" + done + +SetPlayerNamesDebug:: + ld hl, DebugPlayerName + ld de, wPlayerName + call CopyNameDebug + ld hl, DebugRivalName + ld de, wRivalName + +CopyNameDebug: + ld bc, PLAYER_NAME_LENGTH + call CopyBytes + ret + +DebugPlayerName: + db "コージ@" + +DebugRivalName: + db "レッド@" + +ChoosePlayerName:: + call PanPortraitRight + ld hl, PlayerNameMenuHeader + call NamingWindow + ld a, [wMenuCursorY] + dec a + jr z, .loop + ld de, wPlayerName + call SaveCustomName + jr .farjump + +.loop + ld b, $01 + ld de, wPlayerName + callba NamingScreen + ld a, [wPlayerName] + cp "@" + jr z, .loop + + call GBFadeOutToWhite + call ClearTileMap + call LoadFontExtra + call WaitBGMap + ld de, $4D10 + ld bc, $1200 + call IntroDisplayPicCenteredOrUpperRight + call GBFadeInFromWhite +.farjump + ld hl, ChoosePlayerNameEndText + call PrintText + ret + +ChoosePlayerNameEndText: + text "ふむ・・・" + line " と いうんだな!" + prompt + +PlayerNameMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 00, 00, 10, 11 + dw PlayerNameMenuData + db 01 ; initial selection + +PlayerNameMenuData: + db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B + db 04 ; items + db "じぶんできめる@" + db "ゴールド@" + db "サトシ@" + db "ジャック@" + db 3 ; x offset for the title string + db "なまえこうほ@" + +ChooseRivalName:: + call PanPortraitRight + ld hl, RivalNameMenuHeader + call NamingWindow + ld a, [wMenuCursorY] + dec a + jr z, .loop + ld de, wRivalName + call SaveCustomName + jr .farjump + +.loop + ld b, $02 + ld de, wRivalName + callba NamingScreen + ld a, [wRivalName] + cp "@" + jr z, .loop + + call GBFadeOutToWhite + call ClearTileMap + call LoadFontExtra + call WaitBGMap + ld de, $4BD4 + ld bc, $1200 + call IntroDisplayPicCenteredOrUpperRight + call GBFadeInFromWhite +.farjump + ld hl, ChooseRivalNameEndText + call PrintText + ret + +ChooseRivalNameEndText: + text "そうか そうだったな" + line " という なまえだ" + prompt + +RivalNameMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 00, 00, 10, 11 + dw RivalNameMenuData + db 01 ; initial selection + +RivalNameMenuData: + db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B + db 04 ; items + db "じぶんできめる@" + db "シルバー@" + db "シゲル@" + db "ジョン@" + db 3 + db "なまえこうほ@" + +MomNamePrompt:: + ld hl, MomNameMenuHeader + call NamingWindow + ld a, [wMenuCursorY] + dec a + jr z, .loop + ld de, wMomsName + call SaveCustomName + jr .escape + +.loop + ld b, $03 + ld de, wMomsName + callba NamingScreen + ld a, [wMomsName] + cp "@" + jr z, .loop + + call ClearPalettes + call ClearTileMap + callab Function140d9 + call LoadFontExtra + call GetMemSGBLayout + call WaitBGMap +.escape + ret + +MomNameMenuHeader: + db MENU_BACKUP_TILES ; flags + menu_coords 00, 00, 10, 11 + dw .MomNameMenuData + db 01 ; initial selection + +.MomNameMenuData: + db STATICMENU_CURSOR | STATICMENU_PLACE_TITLE | STATICMENU_DISABLE_B + db 04 ; items + db "じぶんで きめる@" + db "おかあさん@" + db "ママ@" + db "かあちゃん@" + db 3 + db "なまえこうほ@" + +NamingWindow:: + ; loads the menu header put into hl + call LoadMenuHeader + call VerticalMenu + ld a, [wMenuCursorY] + dec a + call CopyNameFromMenu + call CloseWindow + ret + +SaveCustomName:: + ld hl, wStringBuffer2 + ld bc, PLAYER_NAME_LENGTH + call CopyBytes + ret + +PanPortraitRight:: + hlcoord 5, 4 + ld d, $06 + ld e, $7E + ld b, d + ld c, e + ld d, $00 + add hl, de +.loop + xor a + ldh [hBGMapMode], a + push hl + push bc +.innerLoop + ;pans all the tiles onscreen to the right one + ld a, [hl+] + ld [hl-], a + dec hl + dec c + jr nz, .innerLoop + + call WaitBGMap + pop bc + pop hl + inc hl + dec b ; passed c - how many tiles right to pan? + jr nz, .loop + ret + +PanPortraitLeft:: + hlcoord 12, 4 + ld b, $06 + ld c, $7E +.loop + xor a + ldh [hBGMapMode], a + push hl + push bc +.innerloop + ld a, [hl-] + ld [hl+], a + inc hl + dec c + jr nz, .innerloop + + call WaitBGMap + pop bc + pop hl + inc hl + dec b + jr nz, .loop + ret + +MenuCallSettings:: + call SettingsScreen + ret + +FadeInIntroPic: + ld hl, IntroFadePalettes + ld b, 6 +.next + ld a, [hl+] + ldh [rBGP], a + ld c, 10 + call DelayFrames + dec b + jr nz, .next + ret + +IntroFadePalettes: + db %01010100 + db %10101000 + db %11111100 + db %11111000 + db %11110100 + db %11100100 + +MovePicLeft: + ld a, 119 + ldh [hWX], a + call DelayFrame + + ld a, %11100100 + ldh [rBGP], a +.next + call DelayFrame + ldh a, [hWX] + sub 8 + cp $FF + ret z + ldh [hWX], a + jr .next + +IntroDisplayPicCenteredOrUpperRight:: +; b = bank +; de = address of compressed pic +; c: 0 = centred, non-zero = upper-right + ld a, c + and a + hlcoord 13, 4 + jr nz, .skip + hlcoord 6, 4 +.skip + push hl + ld a, b + call UncompressSpriteFromDE + ld a, $00 + call OpenSRAM + ld hl, sSpriteBuffer1 + ld de, sSpriteBuffer0 + ld bc, DOUBLESPRITEBUFFERSIZE + call CopyBytes + call CloseSRAM + ld de, VRAM_Begin + $1000 + call InterlaceMergeSpriteBuffers + pop hl + xor a + ldh [hGraphicStartTile], a + ld bc, $0707 + predef PlaceGraphic + ret + +LoadStartingSprites: + ld de, GoldSpriteGFX + lb bc, BANK(GoldSpriteGFX), $0C + ld hl, VRAM_Begin + call Request2bpp + ld hl, wVirtualOAM + ld de, GameStartSprites + ld c, $04 +.loop + ld a, [de] + inc de + ld [hl+], a + ld a, [de] + inc de + ld [hl+], a + ld a, [de] + inc de + ld [hl+], a + xor a + ld [hl+], a + dec c + jr nz, .loop + ret + +GameStartSprites: + db $50, $48, $00 + db $50, $50, $01 + db $58, $48, $02 + db $58, $50, $03 diff --git a/engine/movie/opening_cutscene.asm b/engine/movie/opening_cutscene.asm new file mode 100644 index 0000000..1eeacb5 --- /dev/null +++ b/engine/movie/opening_cutscene.asm @@ -0,0 +1,1230 @@ +INCLUDE "constants.asm" + +SECTION "engine/movie/opening_cutscene.asm", ROMX + +OpeningCutscene:: + call .Init +.loop + call .PlayFrame + jr nc, .loop + ret + +.Init: + callba InitEffectObject + xor a + ld [wIntroJumptableIndex], a + ldh [hBGMapMode], a + ret + +.PlayFrame: + ld hl, hJoypadDown + ld a, [hl] + and %00001111 + jr nz, .Finish + +; check done flag + ld a, [wIntroJumptableIndex] + bit 7, a + jr nz, .Finish + + callba EffectObjectJumpNoDelay + call IntroSceneJumper + call DelayFrame + and a + ret + +.Finish: + callab InitEffectObject + call ClearSprites + call DelayFrame + xor a + ldh [hSCX], a + ldh [hSCY], a + ldh [hLCDCPointer], a + ldh [hLYOverrideStart], a + ldh [hLYOverrideEnd], a + ld a, %11100100 + ldh [rBGP], a + ldh [rOBP0], a + scf + ret + +IntroSceneJumper: + jumptable .scenes, wIntroJumptableIndex +.scenes + dw IntroScene1 + dw IntroScene2 + dw IntroScene3 + dw IntroScene4 + dw IntroScene5 + dw IntroScene6 + dw IntroScene7 + dw IntroScene8 + dw IntroScene9 + dw IntroScene10 + dw IntroScene11 + dw IntroScene12 + dw IntroScene13 + dw IntroScene14 + dw IntroScene15 + dw IntroScene16 + dw IntroScene17 + +IntroScene1: ; 43b8 +; Set up water cutscene + ld hl, wIntroJumptableIndex + inc [hl] + call DisableLCD + + ld b, SGB_GS_INTRO + ld c, 0 + call GetSGBLayout + + callab InitEffectObject + + call Intro_ResetLYOverrides + + ld hl, vChars2 + ld de, IntroUnderwaterGFX + call Intro_Copy128Tiles + +; Load water metatiles + ld a, LOW(Intro_WaterMeta) + ld [wIntroTilesPointer + 0], a + ld a, HIGH(Intro_WaterMeta) + ld [wIntroTilesPointer + 1], a + +; Set destination BG map pointer + ld hl, vBGMap0 + ld a, l + ld [wIntroBGMapPointer + 0], a + ld a, h + ld [wIntroBGMapPointer + 1], a + +; Load water tilemap + ld de, Intro_WaterTilemap + 15 tiles + ld a, e + ld [wIntroTilemapPointer + 0], a + ld a, d + ld [wIntroTilemapPointer + 1], a + call Intro_DrawBackground + +; draw GFX + ld hl, IntroWaterPokemonGFX + ld de, vChars0 + ld bc, $80 tiles +.draw_gfx + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .draw_gfx + + ld hl, wSpriteAnimDict + ld a, $21 + ld [hli], a + ld a, $00 + ld [hli], a + + xor a + ldh [hSCY], a + ld [wGlobalAnimYOffset], a + ld [wGlobalAnimXOffset], a + + ld a, $58 + ldh [hSCX], a + +; setup counter for the first scene + xor a + ld [wIntroFrameCounter2], a + ld a, $80 + ld [wIntroFrameCounter1], a + + ld a, LOW(rSCY) + ldh [hLCDCPointer], a + call Intro_InitSineLYOverrides + + xor a ; FALSE + ld [wIntroSpriteStateFlag], a + + call EnableLCD + call DelayFrame + + ld a, %11100100 + ldh [rBGP], a + ld a, %11100000 + ldh [rOBP0], a + call Intro_InitOmanyte + ret + +IntroScene2: ; 444a + call Intro_UpdateLYOverrides + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .skip_intro + dec [hl] + call Intro_InitBubble + ret + +.skip_intro + ld [hl], $10 + ld hl, wIntroJumptableIndex + inc [hl] + +IntroScene3: +; rise towards the surface + call IntroScene3_Jumper + call IntroScene3_ScrollToSurface + ret nc +; next scene if carry flag is set + call Intro_ResetLYOverrides + ld hl, hSCY + inc [hl] + ld hl, wIntroJumptableIndex + inc [hl] + +IntroScene4: +; at surface; Lapras surfs to left of screen + ld a, [wIntroSpriteStateFlag] + and a + jr nz, .next + ld hl, wIntroFrameCounter2 + inc [hl] + ld a, [hl] + and $07 + jr nz, .skip_move_left + ld hl, hSCX + dec [hl] + +.skip_move_left + call Intro_AnimateOceanWaves + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + xor a + ld [wIntroFrameCounter1], a + +IntroScene5: +; fade out + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + swap a + and $f + ld e, a + ld d, 0 + ld hl, .palettes + add hl, de + ld a, [hl] + cp -1 + jr z, .next + ldh [rBGP], a + call Intro_AnimateOceanWaves + ld hl, hSCX + dec [hl] + dec [hl] + ret +.next + ld hl, wIntroJumptableIndex + inc [hl] + ret + +.palettes: + db %11100100 + db %11100100 + db %10010000 + db %01000000 + db %00000000 + db -1 + +IntroScene17: +; delay a bit before leading into the title screen + ld c, 64 +.loop + call DelayFrame + dec c + jr nz, .loop +; set done flag + ld hl, wIntroJumptableIndex + set 7, [hl] + ret + +IntroScene3_ScrollToSurface: + ld hl, wIntroFrameCounter2 + inc [hl] + ld a, [hl] + and %00000011 + jr nz, .skip_move_left + ld hl, hSCX + dec [hl] + +.skip_move_left + and 1 + jr nz, .no_carry + ld hl, wGlobalAnimYOffset + inc [hl] + ld hl, hSCY + ld a, [hl] + dec [hl] + and $f + call z, Intro_UpdateTilemapAndBGMap + ld a, [wIntroFrameCounter1] + and a + jr z, .carry + +.no_carry + and a + ret + +.carry + scf + ret + +IntroScene3_Jumper: + jumptable .subroutines, wIntroFrameCounter1 +.subroutines + dw .scene3_2 + dw .scene3_2 + dw .scene3_2 + dw .scene3_1 + dw .scene3_2 + dw .scene3_2 + dw .scene3_3 + dw .scene3_3 + dw .scene3_3 + dw .scene3_4 + dw .scene3_5 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + dw .scene3_6 + +.scene3_1: + call Intro_InitLapras + ld a, %11100100 + ldh [rOBP0], a + +.scene3_2: ; fallthrough + call Intro_AnimateOceanWaves + ret + +.scene3_3: + call Intro_InitMagikarps + call Intro_AnimateOceanWaves + ret + +.scene3_4: + ld hl, wIntroFrameCounter2 + ld a, [hl] + and %00011111 + jr z, .load_palettes + call Intro_InitMagikarps + ret +.load_palettes + callab Function962d ; load magikarp palettes + ret + +.scene3_5: + xor a + ldh [hLCDCPointer], a + ret + +.scene3_6: + call Intro_UpdateLYOverrides + ret + +Intro_InitBubble: + ld hl, wIntroFrameCounter1 + ld a, [hl] + and $0f + ret nz + + ld a, [hl] + and $70 + swap a + ld e, a + ld d, $00 + ld hl, .pixel_table + add hl, de + add hl, de + ld e, [hl] + inc hl + ld d, [hl] + ld a, $21 ; SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE + call InitSpriteAnimStruct + ret + +.pixel_table + db $30, $74 + db $70, $94 + db $50, $84 + db $60, $78 + db $20, $68 + db $40, $88 + +Intro_InitMagikarps: + ld de, $403f + ld a, [wSGB] + and a + jr z, .ok + + ld de, $201f + +.ok + ld hl, wIntroFrameCounter2 + ld a, [hl] + and e + ret nz + ld a, [hl] + and d + jr nz, .alternate_frame + ld de, $e8e0 + call .PlaceMagikarp + ld de, wObject8SpriteXOffset + call .PlaceMagikarp + ld de, $00c0 + call .PlaceMagikarp + ret + +.alternate_frame + ld de, $e0f0 + call .PlaceMagikarp + ld de, $f8c0 + call .PlaceMagikarp + ld de, $10e0 + call .PlaceMagikarp + ret + +.PlaceMagikarp: + ld a, $23 ; SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP + call InitSpriteAnimStruct + ret + +Intro_InitOmanyte: + ld de, $9038 + call .PlaceOmanyte + ld de, $7050 + call .PlaceOmanyte + ld de, $8078 + +.PlaceOmanyte: + ld a, $22 ; SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER + call InitSpriteAnimStruct + ret + +Intro_InitLapras: + ld a, [wIntroFrameCounter2] + and %00011111 + ret nz + ld de, $80c0 + ld a, $25 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS + call InitSpriteAnimStruct + ret + +Intro_UnusedInitAerodactyl: ; unreferenced + ld de, $1000 + ld a, $24 ; SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL + call InitSpriteAnimStruct + ret + +Intro_UpdateTilemapAndBGMap: +; add new tiles to top as water scene scrolls up to surface + push hl + push de + + ld a, [wIntroTilemapPointer + 0] + ld e, a + ld a, [wIntroTilemapPointer + 1] + ld d, a + ld hl, -$10 + add hl, de + ld a, l + ld e, l + ld [wIntroTilemapPointer + 0], a + ld a, h + ld d, h + ld [wIntroTilemapPointer + 1], a + + hlcoord 0, 0 + ld c, BG_MAP_WIDTH / 2 +.loop + call Intro_Draw2x2Tiles + dec c + jr nz, .loop + + ld a, [wIntroBGMapPointer + 0] + ld e, a + ld a, [wIntroBGMapPointer + 1] + ld d, a + ld hl, hCurSpriteYCoord + add hl, de + ld a, l + ld [wIntroBGMapPointer + 0], a + ld [wVBCopyDst], a + ld a, h + and %11111011 + or %00001000 + ld [wIntroBGMapPointer + 1], a + ld [wVBCopyDst + 1], a + ld a, LOW(wTileMap) + ld [wVBCopySrc], a + ld a, HIGH(wTileMap) + ld [wVBCopySrc + 1], a + ld a, 4 + ld [wVBCopySize], a + ld hl, wIntroFrameCounter1 + dec [hl] + pop de + pop hl + ret + + +Intro_AnimateOceanWaves: +; uses a 2bpp request to copy tile IDs to the BG map + ld hl, wIntroFrameCounter2 + ld a, [hl] + and 3 + cp 3 + ret z + + ld a, [hl] + and $30 + swap a + ld l, a + ld h, 0 +rept 5 + add hl, hl +endr + ld de, .wave_tiles + add hl, de + ld a, l + ld [wVBCopySrc], a + ld a, h + ld [wVBCopySrc + 1], a + ld a, LOW(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 + ld [wVBCopyDst], a + ld a, HIGH(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 + ld [wVBCopyDst + 1], a + ld a, 2 + ld [wVBCopySize], a + ret +.wave_tiles: +; Fill an entire bg map row with each frame +rept 8 + db $70, $71, $72, $73 ; frame 1 +endr + +rept 8 + db $74, $75, $76, $77 ; frame 2 +endr + +rept 8 + db $78, $79, $7a, $7b ; frame 3 +endr + +rept 8 + db $7c, $7d, $7e, $7f ; frame 4 +endr + +Intro_InitSineLYOverrides: + ld bc, wLYOverrides2 + ld a, SCREEN_HEIGHT_PX + ld de, BG_MAP_WIDTH * BG_MAP_HEIGHT +.loop + push af + push de + callba BattleAnim_Sine_e + ld a, e + ld [bc], a + inc bc + pop de + inc e + pop af + dec a + jr nz, .loop + ret + +Intro_UpdateLYOverrides: + ld bc, wLYOverrides + ld e, $10 + +.loop1 + ldh a, [hSCY] + ld [bc], a + inc bc + dec e + jr nz, .loop1 + + ld hl, wLYOverrides2 + ld de, wLYOverrides2 + 1 + ld a, [hl] + push af + ld a, $80 + +.loop2 + push af + ld a, [de] + inc de + ld [hli], a + push hl + ld hl, hSCY + add [hl] + ld [bc], a + inc bc + pop hl + pop af + dec a + jr nz, .loop2 + + pop af + ld [hl], a + ret + +IntroScene6: +; Set up grass cutscene (Pikachu/Jigglypuff) + ld hl, wIntroJumptableIndex + inc [hl] + call DisableLCD + ld b, SGB_GS_INTRO + ld c, 1 + call GetSGBLayout + callab InitEffectObject + call Intro_ResetLYOverrides + ld hl, vChars2 + ld de, IntroForestGFX + call Intro_Copy128Tiles + ld a, LOW(Intro_GrassMeta) + ld [wIntroTilesPointer + 0], a + ld a, HIGH(Intro_GrassMeta) + ld [wIntroTilesPointer + 1], a + ld hl, vBGMap0 + ld a, l + ld [wIntroBGMapPointer + 0], a + ld a, h + ld [wIntroBGMapPointer + 1], a + ld de, Intro_GrassTilemap + 2 tiles + ld a, e + ld [wIntroTilemapPointer + 0], a + ld a, d + ld [wIntroTilemapPointer + 1], a + call Intro_DrawBackground + ld hl, IntroJigglypuffPikachuGFX + ld de, vChars0 + ld bc, $0a00 + +.load + ld a, [hli] + ld [de], a + inc de + dec bc + ld a, b + or c + jr nz, .load + + ld hl, wSpriteAnimDict + ld a, $22 + ld [hli], a + ld a, $00 + ld [hli], a + xor a + ldh [hSCY], a + ld [wGlobalAnimYOffset], a + ld a, $60 + ldh [hSCX], a + ld a, $a0 + ld [wGlobalAnimXOffset], a + xor a + ld [wIntroFrameCounter2], a + call EnableLCD + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + call Intro_InitJigglypuff + xor a + ld [wIntroSpriteStateFlag], a + ret + +IntroScene7: + call Intro_InitNote + ld hl, wIntroFrameCounter2 + ld a, [hl] + inc [hl] + and $03 + ret z + + ld hl, hSCX + ld a, [hl] + and a + jr z, .next + + dec [hl] + ld hl, wGlobalAnimXOffset + inc [hl] + ret + +.next + ld a, $ff + ld [wIntroFrameCounter1], a + call Intro_InitPikachu + ld hl, wIntroJumptableIndex + inc [hl] + ret + +IntroScene8: + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + dec [hl] + call Intro_InitNote + ld hl, wIntroFrameCounter2 + inc [hl] + ret + +.next + xor a + ld [wIntroFrameCounter1], a + ld hl, wIntroJumptableIndex + inc [hl] + callab Function9633 + ret + +IntroScene9: + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + swap a + and $0f + ld e, a + ld d, $00 + ld hl, .palettes + add hl, de + ld a, [hl] + and a + jr z, .next + + ldh [rBGP], a + ld hl, hSCY + inc [hl] + ld hl, wGlobalAnimYOffset + dec [hl] + ret + +.next: + ld hl, wIntroJumptableIndex + inc [hl] + ret + +.palettes: +; fade out to black + db %11100100 + db %11100100 + db %11100100 + db %11100100 + db %11100100 + db %11111001 + db %11111110 + db %11111111 + db 0 + +Intro_DummyFunction: + ret + + +Intro_InitNote: + ld a, [wIntroSpriteStateFlag] + and a + ret nz + + ld hl, wIntroFrameCounter2 + ld a, [hl] + and $3f + ret nz + + ld a, [hl] + and $7f + jr z, .SmallerNote + + ld de, $5c30 + ld a, $26 ; SPRITE_ANIM_INDEX_GS_INTRO_NOTE + call InitSpriteAnimStruct + ret + +.SmallerNote: + ld de, $5430 + ld a, $27 ; SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE + call InitSpriteAnimStruct + ret + + +Intro_InitJigglypuff: + ld de, $7030 + ld a, $28 ; SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF + call InitSpriteAnimStruct + ret + + +Intro_InitPikachu: + ld de, $70c0 + ld a, $29 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU + call InitSpriteAnimStruct + ld de, $70c0 + ld a, $2a ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL + call InitSpriteAnimStruct + ret + +IntroScene10: +; Set up fireball cutscene (evolved Kanto starters) + ld hl, wIntroJumptableIndex + inc [hl] + ld b, SGB_GS_INTRO + ld c, 2 + call GetSGBLayout + callab InitEffectObject + call Intro_ResetLYOverrides + call Intro_BlankTilemapAndBGMap + + ld hl, vChars2 + ld de, IntroCharizard1GFX + lb bc, BANK(IntroCharizard1GFX), 8 tiles + call Request2bpp + + ld hl, vFont + ld de, IntroCharizard2GFX tile $40 + lb bc, BANK(IntroCharizard2GFX), 8 tiles + call Request2bpp + + ld hl, vChars0 + ld de, IntroCharizardFlamesGFX + lb bc, BANK(IntroCharizardFlamesGFX), 8 tiles + call Request2bpp + + ld hl, wSpriteAnimDict + ld a, $22 ; SPRITE_ANIM_DICT_GS_INTRO + ld [hli], a + ld a, $00 + ld [hli], a + + ld a, 0 + call DrawIntroCharizardGraphic + + ld a, $80 + ldh [hSCY], a + + xor a + ldh [hSCX], a + ld [wGlobalAnimYOffset], a + ld [wGlobalAnimXOffset], a + + xor a + ld [wIntroFrameCounter2], a + ld a, %00111111 + ldh [rBGP], a + ld a, %11111111 + ldh [rOBP0], a + ret + +IntroScene11: +; scroll up to Charizard silhoutte, flash Blastoise and Venusaur + ld hl, wIntroFrameCounter2 + ld a, [hl] + inc [hl] + and 1 + ret z + call Intro_CheckSCYEvent + ld hl, hSCY + ld a, [hl] + and a + jr z, .next + inc [hl] + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + xor a + ld [wIntroFrameCounter1], a + +IntroScene12: +; load Charizard palettes + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + srl a + srl a + and 3 + ld e, a + ld d, 0 + ld hl, .palettes + add hl, de + ld a, [hl] + and a + jr z, .next + ldh [rBGP], a + ldh [rOBP0], a + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + ld a, $80 + ld [wIntroFrameCounter1], a + ret + +.palettes: + db %01101010 + db %10100101 + db %11100100 + db %00000000 + +IntroScene13: +; Charizard mouth open + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + + dec [hl] + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + ld a, 1 + call DrawIntroCharizardGraphic + ld a, 4 + ld [wIntroFrameCounter1], a + ret + +IntroScene14: +; Charizard breathing fire + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + dec [hl] + ret + +.next + ld hl, wIntroJumptableIndex + inc [hl] + ld a, 2 + call DrawIntroCharizardGraphic + ld a, 64 + ld [wIntroFrameCounter1], a + xor a + ld [wIntroFrameCounter2], a +; fallthrough + +IntroScene15: +; Charizard mouth wide open / fireball starts + call Intro_AnimateFireball + ld hl, wIntroFrameCounter1 + ld a, [hl] + and a + jr z, .next + dec [hl] + ret +.next + ld hl, wIntroJumptableIndex + inc [hl] + xor a + ld [wIntroFrameCounter1], a + ret + +IntroScene16: +; continue fireball / fade out palettes + call Intro_AnimateFireball + ld hl, wIntroFrameCounter1 + ld a, [hl] + inc [hl] + swap a + and $07 + ld e, a + ld d, $00 + ld hl, .palettes + add hl, de + ld a, [hl] + cp $ff + jr z, .next + ldh [rBGP], a + ldh [rOBP0], a + ret +.next + ld hl, wIntroJumptableIndex + inc [hl] + ret +.palettes: + db %11100100 + db %10010000 + db %01000000 + db %00000000 + db -1 + +Intro_BlankTilemapAndBGMap: + hlcoord 0, 0 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT +.blank_tilemap + ld [hl], 0 + inc hl + dec bc + ld a, b + or c + jr nz, .blank_tilemap + + ld hl, wOverworldMapBlocks ; $c600, buffer + ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT +.blank_bgmap + ld [hl], 0 + inc hl + dec bc + ld a, b + or c + jr nz, .blank_bgmap + + ld hl, vBGMap0 + ld de, wOverworldMapBlocks ; $c600, buffer + lb bc, BANK(@), $40 + call Request2bpp + ret + + +Intro_CheckSCYEvent: + ldh a, [hSCY] + ld c, a + ld hl, .Cuelist + +.loop + ld a, [hli] + cp -1 + ret z + cp c + jr z, .value_found + inc hl + inc hl + jr .loop + +.value_found + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +.Cuelist: + dbw $87, Intro_BlastoiseAppears + dbw $88, Intro_FlashMonPalette + dbw $98, Intro_FlashSilhouette + dbw $99, Intro_LoadVenusaurPalette + dbw $bf, Intro_VenusaurAppears + dbw $c0, Intro_FlashMonPalette + dbw $d0, Intro_FlashSilhouette + dbw $d1, Intro_LoadCharizardPalette + db -1 + +Intro_BlastoiseAppears: + call Intro_LoadBlastoiseObject + ret + +Intro_VenusaurAppears: + call Intro_LoadVenusaurObject + ret + +Intro_FlashMonPalette: + ld a, %11100100 + ldh [rOBP0], a + xor a + ldh [rBGP], a + ret + +Intro_FlashSilhouette: + ld a, %11111111 + ldh [rOBP0], a + ld a, %00111111 + ldh [rBGP], a + ret + +Intro_LoadVenusaurPalette: + callab Function9639 + ret + +Intro_LoadCharizardPalette: + callab Function963f + ret + + +DrawIntroCharizardGraphic: + push af + hlcoord 0, 6 + ld c, SCREEN_WIDTH * 8 + xor a +.loop1 + ld [hli], a + dec c + jr nz, .loop1 + + pop af + ld e, a + ld d, $00 + ld hl, .charizard_data +rept 5 + add hl, de +endr + ld e, [hl] + inc hl + ld c, [hl] + inc hl + ld b, [hl] + inc hl + ld a, [hli] + ld h, [hl] + ld l, a + ld a, e + +.loop2_outer + push bc + push hl +.loop2_inner + ld [hli], a + inc a + dec c + jr nz, .loop2_inner + + pop hl + ld bc, SCREEN_WIDTH + add hl, bc + pop bc + dec b + jr nz, .loop2_outer + + ld a, 1 + ldh [hBGMapMode], a + call DelayFrame + call DelayFrame + call DelayFrame + xor a + ldh [hBGMapMode], a + ret + +.charizard_data + db $00, $08, $08, $22, $c3 + db $40, $09, $08, $21, $c3 + db $88, $09, $08, $20, $c3 + +Intro_AnimateFireball: + ld hl, wIntroFrameCounter2 + ld a, [hl] + inc [hl] + and 3 + ret nz + ld de, $6454 + ld a, $2b ; SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL + call InitSpriteAnimStruct + ld hl, hSCX + dec [hl] + ld hl, wGlobalAnimXOffset + inc [hl] + ret + +Intro_LoadBlastoiseObject: + ld de, $b008 + ld a, $2c ; SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE + call InitSpriteAnimStruct + ret + +Intro_LoadVenusaurObject: + ld de, $b0a0 + ld a, $2d ; SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR + call InitSpriteAnimStruct + ret + +Intro_Copy128Tiles: + ld bc, 128 tiles +.loop + ld a, [de] + inc de + ld [hli], a + dec bc + ld a, c + or b + jr nz, .loop + ret + + +Intro_DrawBackground: + ld b, BG_MAP_WIDTH / 2 +.outer_loop + push hl + ld c, BG_MAP_HEIGHT / 2 +.inner_loop + call Intro_Draw2x2Tiles + dec c + jr nz, .inner_loop + pop hl + push bc + ld bc, 2 * BG_MAP_WIDTH + add hl, bc + pop bc + dec b + jr nz, .outer_loop + ret + + +Intro_Draw2x2Tiles: + push bc + push de + push hl + push hl + push hl + ld a, [de] + ld l, a + ld h, 0 + ld a, [wIntroTilesPointer + 0] + ld e, a + ld a, [wIntroTilesPointer + 1] + ld d, a + add hl, hl + add hl, hl + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop hl + ld bc, BG_MAP_WIDTH + add hl, bc + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop hl + inc hl + inc hl + pop de + inc de + pop bc + ret + + +Intro_ResetLYOverrides: + ld hl, wLYOverrides + xor a + ld c, wLYOverrides2 - wLYOverrides +.loop + ld [hli], a + dec c + jr nz, .loop + ret diff --git a/engine/movie/title.asm b/engine/movie/title.asm new file mode 100644 index 0000000..26d6f8b --- /dev/null +++ b/engine/movie/title.asm @@ -0,0 +1,636 @@ +INCLUDE "constants.asm" + +SECTION "engine/movie/title.asm@Title screen", ROMX + +IntroSequence:: + callab GameFreakIntro + jr c, TitleSequenceStart + ld a, [wTitleSequenceOpeningType] + and a + jr z, .opening_sequence + +.pikachu_minigame + callab PikachuMiniGame + jr TitleSequenceStart + +.opening_sequence + callab OpeningCutscene + +TitleSequenceStart:: + call TitleSequenceInit + callab SetTitleBGDecorationBorder + +.loop + call TitleScreenMain + jr nc, .loop + + call ClearBGPalettes + call ClearSprites + ld a, $01 + ldh [hBGMapMode], a + call ClearTileMap + call UpdateTimePals + + ld a, [wJumptableIndex + 1] + ld e, a + ld d, 0 + ld hl, TitleScreenJumpTable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + + jp hl + +TitleScreenJumpTable:: + dw MainMenu + dw DebugMenu + dw SRAMClearMenu + dw IntroSequence + +TitleSequenceInit:: + call ClearPalettes + + xor a + ldh [hMapAnims], a + ldh [hSCY], a + ldh [hSCX], a + + ld de, MUSIC_NONE + call PlayMusic + + call ClearTileMap + call DisableLCD + call ClearSprites + + callba InitEffectObject + ld hl, vChars0 + ld bc, vBGMap0 - vChars0 + +.clear_loop + ld [hl], $00 + inc hl + dec bc + ld a, b + or c + jr nz, .clear_loop + + ld hl, TitleScreenGFX + ld de, vChars2 + 65 tiles + ld bc, 13 tiles + ld a, BANK(TitleScreenGFX) + call FarCopyData + + ld hl, TitleScreenVersionGFX + ld de, vChars2 + 96 tiles + ld bc, 24 tiles + ld a, BANK(TitleScreenVersionGFX) + call FarCopyData + + ld hl, TitleScreenHoOhGFX + ld de, vChars2 + ld bc, 49 tiles + ld a, BANK(TitleScreenHoOhGFX) + call FarCopyData + + ld hl, TitleScreenLogoGFX + ld de, vChars1 + ld bc, 58 tiles + ld a, BANK(TitleScreenLogoGFX) + call FarCopyData + + ld hl, TitleScreenGoldLogoGFX + ld de, vChars0 + 186 tiles + ld bc, 20 tiles + ld a, BANK(TitleScreenGoldLogoGFX) + call FarCopyData + + call SetTitleGfx + ld hl, wTileMapBackup + ld a, $24 + ld [hli], a + ld a, $00 + ld [hli], a + + ld hl, vBGMap0 + ld bc, 128 tiles + ld a, " " + call ByteFill + + ld b, $06 + call GetSGBLayout + call EnableLCD + ld a, $01 + ldh [hBGMapMode], a + call WaitBGMap + xor a + ldh [hBGMapMode], a + ld hl, wJumptableIndex + ld [hli], a ; (Possibly wJumptableIndex from Crystal) + ld [hli], a ; (Possibly wIntroSceneFrameCounter from Crystal) + ld [hli], a ; (Possibly wTitleScreenTimer from Crystal) + ld [hl], a ; (Possibly wTitleScreenTimer + 1 from Crystal) + + call .load_position_table + + + ld a, %00011010 + ldh [rBGP], a + ld a, %11100100 + ldh [rOBP0], a + ret + +.load_position_table: + ld hl, FirePositionTable + ld c, 6 ; Load 6 flying objects on the screen. + +.set_fire_note_loop + push bc + ld e, [hl] + inc hl + ld d, [hl] + inc hl + push hl + ld a, $2E ; Title fire/note object effect type? + call InitSpriteAnimStruct + pop hl + pop bc + dec c + jr nz, .set_fire_note_loop + ret + +FirePositionTable:: + dw $4CE0 + dw $58A0 + dw $6490 + dw $70D0 + dw $7CB0 + dw $8800 + +TitleFireGFX:: INCBIN "gfx/title/fire.2bpp" +TitleNotesGFX:: INCBIN "gfx/title/notes.2bpp" + +TitleScreenMain:: + ld a, [wJumptableIndex] + bit 7, a + jr nz, .exit + call TitleScreenSequence + callba EffectObjectJumpNoDelay + call DelayFrame + and a + ret + +.exit + scf + ret + +TitleScreenSequence:: + ld e, a + ld d, 0 + ld hl, TitleScreenSequenceTable + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + +TitleScreenSequenceTable:: + dw TitleSeq_Start + dw TitleSeq_LoadPokemonLogo + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_MoveTitle + dw TitleSeq_MoveTitleEnd + dw TitleSeq_InitFlashTitle + dw TitleSeq_FlashTitle + + dw TitleSeq_PMJapaneseChara + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_WaitForNextSequence + dw TitleSeq_PMSubtitle + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_WaitForNextSequence + dw TitleSeq_Version + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_WaitForNextSequence + dw TitleSeq_CopyRight + + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_WaitForNextSequence + dw TitleSeq_HoOh + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + dw TitleSeq_IncreaseJumpTableIndex + + dw TitleSeq_WaitForNextSequence + dw TitleSeq_PressButtonInit + dw TitleSeq_TitleScreenInputAndTimeout + dw TitleSeq_FadeMusicOut + +TitleSeq_IncreaseJumpTableIndex:: + ld hl, wJumptableIndex + inc [hl] + ret + +TitleSeq_WaitForNextSequence:: + xor a + ldh [hBGMapMode], a + ld hl, wJumptableIndex + 2 + ld a, [hl] + and a + jr z, .next_seq + dec [hl] + ret + +.next_seq + call TitleSeq_IncreaseJumpTableIndex + ret + +TitleSeq_LoadPokemonLogo:: + call PrintPokemonLogo + call TitleSeq_IncreaseJumpTableIndex + ld a, $01 + ldh [hBGMapMode], a + ret + +TitleSeq_Start:: + call TitleSeq_IncreaseJumpTableIndex + push de + ld de, $2D ; "swish" sound + call PlaySFX + pop de + ld a, $80 + ld [wJumptableIndex + 2], a + call SetLYOverrides + ld a, $43 + ldh [hLCDCPointer], a + ret + +TitleSeq_MoveTitle:: + xor a + ldh [hBGMapMode], a + ld hl, wJumptableIndex + 2 + ld a, [hl] + and a + jr z, .nextseq + add $04 + ld [hl], a + ld e, a +.wait + ldh a, [rLY] + cp $40 + jr c, .wait + ld a, e + call SetLYOverrides + ret + +.nextseq + call TitleSeq_IncreaseJumpTableIndex + ret + +TitleSeq_MoveTitleEnd:: + xor a + ldh [hLCDCPointer], a + call TitleSeq_IncreaseJumpTableIndex + ld de, MUSIC_TITLE + call PlayMusic + ret + +TitleSeq_InitFlashTitle:: + call TitleSeq_IncreaseJumpTableIndex + ld a, %00011010 + ld [wJumptableIndex + 2], a + ld a, 6 + ld [wJumptableIndex + 3], a + ret + +TitleSeq_FlashTitle:: + ld hl, wJumptableIndex + 3 + ld a, [hl] + and a + jr z, .exit + dec [hl] + ld a, [wJumptableIndex + 2] + xor %00011010 + ld [wJumptableIndex +2 ], a + ldh [rBGP], a + call DelayFrame + call DelayFrame + ret + +.exit + call TitleSeq_IncreaseJumpTableIndex + ld a, %11100100 + ldh [rBGP], a + ret + +TitleSeq_PMJapaneseChara:: + call PrintPMJapaneseChara + ld a, $10 + ld [wJumptableIndex + 2], a + call TitleSeq_IncreaseJumpTableIndex + ld a, $01 + ldh [hBGMapMode], a + ret + +TitleSeq_PMSubtitle:: + call PrintPMSubtitle + ld a, $10 + ld [wJumptableIndex + 2], a + call TitleSeq_IncreaseJumpTableIndex + ld a, $01 + ldh [hBGMapMode], a + ret + +TitleSeq_Version:: + call PrintVersion + ld a, $10 + ld [wJumptableIndex + 2], a + call TitleSeq_IncreaseJumpTableIndex + ld a, $01 + ldh [hBGMapMode], a + ret + +TitleSeq_CopyRight:: + call PrintCopyRight + ld a, $10 + ld [wJumptableIndex + 2], a + call TitleSeq_IncreaseJumpTableIndex + ld a, $01 + ldh [hBGMapMode], a + ret + +TitleSeq_HoOh:: + call Set_HoOh + ld a, $10 + ld [wJumptableIndex + 2], a + call TitleSeq_IncreaseJumpTableIndex + ld a, $01 + ldh [hBGMapMode], a + ret + +TitleSeq_PressButtonInit:: + ld hl, wJumptableIndex + inc [hl] + ld hl, wJumptableIndex + 2 + ld de, DecodeNybble0Table - 3 + ld [hl], e + inc hl + ld [hl], d + ret + +TitleSeq_TitleScreenInputAndTimeout:: + ld hl, wJumptableIndex + 2 + ld e, [hl] + inc hl + ld d, [hl] + ld a, e + or d + jr z, .psbtn_reset + dec de + ld [hl], d + dec hl + ld [hl], e + call GetJoypad + ld hl, hJoyState +; UP + B + SELECT opens the SRAM clear screen + ld a, [hl] + and D_UP | B_BUTTON | SELECT + cp D_UP | B_BUTTON | SELECT + jr z, .psbtn_sramclear +; SELECT opens the debug menu + ld a, [hl] + and SELECT + jr nz, .psbtn_gotodebug + ld a, [hl] + and $09 + ret z + +.psbtn_play + ld a, $00 ; MainMenu + jr .psbtn_nextseq + +.psbtn_gotodebug + ld a, $01 ; DebugMenu + jr .psbtn_nextseq + +.psbtn_sramclear + ld a, $02 + +.psbtn_nextseq + ld [wJumptableIndex + 1], a + ld hl, wJumptableIndex + set 7, [hl] + ret + +.psbtn_reset + ld hl, wJumptableIndex + inc [hl] + xor a + ld [wMusicFadeID], a + ld [wMusicFadeID + 1], a + ld hl, wMusicFade + ld [hl], 8 + ret + +TitleSeq_FadeMusicOut:: + ld a, [wMusicFade] + and a + ret nz + ld a, 3 + ld [wJumptableIndex + 1], a + ld hl, wJumptableIndex + set 7, [hl] + ret + +SetLYOverrides:: + ld hl, wLYOverrides + ld c, $30 +.setly_loop + ld [hli], a + dec c + jr nz, .setly_loop + ret + +PrintPMSubtitle:: + coord hl, 2, 6 + ld b, 15 + ld a, $69 + jr LoadPrintArea + +PrintVersion:: + coord hl, 4, 1 + ld b, $09 + ld a, $60 + +LoadPrintArea:: + ld [hli], a + inc a + dec b + jr nz, LoadPrintArea + ret + +PrintPMJapaneseChara:: + coord hl, 15, 2 + ld a, "こ" + lb bc, 4, 4 + jr PrintBoxArea + +PrintPokemonLogo:: + coord hl, 15, 3 + ld [hl], $B8 + coord hl, 15, 4 + ld [hl], $B9 + coord hl, 1, 2 + ld a, $80 + ld bc, $0E04 + +PrintBoxArea:: + ld de, SCREEN_WIDTH + push bc + push hl + +.xloop + ld [hli], a + inc a + dec b + jr nz, .xloop + pop hl + add hl, de + pop bc + dec c + jr nz, PrintBoxArea + ret + +PrintCopyRight:: + coord hl, 3, 17 + ld a, $41 + ld b, $0D + +.loop + ld [hli], a + inc a + dec b + jr nz, .loop + ret + +SRAMClearMenu:: + call ClearTileMap + call GetMemSGBLayout + call LoadFont + call LoadFontExtra + ld hl, SRAMClear_Message + call PrintText + ld hl, SRAMClear_WinPOS + call CopyMenuHeader + call VerticalMenu + jp c, Init + ld a, [wMenuCursorY] + cp $01 + jp z, Init + + callab InitAllSRAMBanks + jp Init + +SRAMClear_Message:: + db "すべての セーブデータエりアを" + db "クりア しますか?" + +SRAMClear_WinPOS:: + db 0 + db 7,14,11,19 + dw SRAMClear_TextChoice ; menu data + db 1 ; default option + +SRAMClear_TextChoice:: + db %11000000 + db 2 + db "いいえ@" + db "はい@" + +IntroCopyRightInfo:: + call ClearTileMap + call LoadFontExtra + ld de, TitleScreenGFX + ld hl, $9600 + lb bc, BANK(TitleScreenGFX), $19 + call Request2bpp + + coord hl, 5, 7 + ld de, IntroCopyRightInfo_Text + jp PlaceString + +IntroCopyRightInfo_Text:: + db $60, $61, $62, $63, $6D, $6E, $6F, $70, $71, $72, $4E ; "ⓒ1997 Nintendo\n" + db $60, $61, $62, $63, $73, $74, $75, $76, $77, $78, $6B, $6C, $4E ; "ⓒ1997 Creatures Inc.\n" + db $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $50 ; "ⓒ1997 GAME FREAK Inc.\0" + +Set_HoOh:: + coord hl, 7, 9 + ld de, $000D + ld a, $00 + ld b, $07 +.loop + ld c, $07 +.loop2 + ld [hli], a + inc a + dec c + jr nz, .loop2 + add hl, de + dec b + jr nz, .loop + ret + +; Unused code, looks like it sets the font type for the logo? +SetTitleFont:: + ld de, vChars1 + ld hl, TitleScreenLogoGFX + ld bc, 130 tiles + ld a, $04 + jp FarCopyDataDouble + +; Sets the type of art that will be displayed on the title screen +; depending on wTitleSequenceOpeningType. +SetTitleGfx:: + ld hl, wTitleSequenceOpeningType + ld a, [hl] + xor $01 + ld [hl], a + jr nz, .flame + +.note + ld hl, TitleNotesGFX + jr SetTitleGfxNext + +.flame + ld hl, TitleFireGFX +SetTitleGfxNext:: + ld de, vChars0 + ld c, $80 +.loop + ld a, [hli] + ld [de], a + inc de + dec c + jr nz, .loop + ret + +SECTION "engine/movie/title.asm@Title screen TEMPORARY", ROMX + +GameInit:: + call ClearWindowData + ld a, $23 + ld [wce5f], a + jp IntroSequence diff --git a/engine/opening_cutscene.asm b/engine/opening_cutscene.asm deleted file mode 100644 index 832d254..0000000 --- a/engine/opening_cutscene.asm +++ /dev/null @@ -1,1230 +0,0 @@ -INCLUDE "constants.asm" - -SECTION "engine/opening_cutscene.asm", ROMX - -OpeningCutscene:: - call .Init -.loop - call .PlayFrame - jr nc, .loop - ret - -.Init: - callba InitEffectObject - xor a - ld [wIntroJumptableIndex], a - ldh [hBGMapMode], a - ret - -.PlayFrame: - ld hl, hJoypadDown - ld a, [hl] - and %00001111 - jr nz, .Finish - -; check done flag - ld a, [wIntroJumptableIndex] - bit 7, a - jr nz, .Finish - - callba EffectObjectJumpNoDelay - call IntroSceneJumper - call DelayFrame - and a - ret - -.Finish: - callab InitEffectObject - call ClearSprites - call DelayFrame - xor a - ldh [hSCX], a - ldh [hSCY], a - ldh [hLCDCPointer], a - ldh [hLYOverrideStart], a - ldh [hLYOverrideEnd], a - ld a, %11100100 - ldh [rBGP], a - ldh [rOBP0], a - scf - ret - -IntroSceneJumper: - jumptable .scenes, wIntroJumptableIndex -.scenes - dw IntroScene1 - dw IntroScene2 - dw IntroScene3 - dw IntroScene4 - dw IntroScene5 - dw IntroScene6 - dw IntroScene7 - dw IntroScene8 - dw IntroScene9 - dw IntroScene10 - dw IntroScene11 - dw IntroScene12 - dw IntroScene13 - dw IntroScene14 - dw IntroScene15 - dw IntroScene16 - dw IntroScene17 - -IntroScene1: ; 43b8 -; Set up water cutscene - ld hl, wIntroJumptableIndex - inc [hl] - call DisableLCD - - ld b, SGB_GS_INTRO - ld c, 0 - call GetSGBLayout - - callab InitEffectObject - - call Intro_ResetLYOverrides - - ld hl, vChars2 - ld de, IntroUnderwaterGFX - call Intro_Copy128Tiles - -; Load water metatiles - ld a, LOW(Intro_WaterMeta) - ld [wIntroTilesPointer + 0], a - ld a, HIGH(Intro_WaterMeta) - ld [wIntroTilesPointer + 1], a - -; Set destination BG map pointer - ld hl, vBGMap0 - ld a, l - ld [wIntroBGMapPointer + 0], a - ld a, h - ld [wIntroBGMapPointer + 1], a - -; Load water tilemap - ld de, Intro_WaterTilemap + 15 tiles - ld a, e - ld [wIntroTilemapPointer + 0], a - ld a, d - ld [wIntroTilemapPointer + 1], a - call Intro_DrawBackground - -; draw GFX - ld hl, IntroWaterPokemonGFX - ld de, vChars0 - ld bc, $80 tiles -.draw_gfx - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .draw_gfx - - ld hl, wSpriteAnimDict - ld a, $21 - ld [hli], a - ld a, $00 - ld [hli], a - - xor a - ldh [hSCY], a - ld [wGlobalAnimYOffset], a - ld [wGlobalAnimXOffset], a - - ld a, $58 - ldh [hSCX], a - -; setup counter for the first scene - xor a - ld [wIntroFrameCounter2], a - ld a, $80 - ld [wIntroFrameCounter1], a - - ld a, LOW(rSCY) - ldh [hLCDCPointer], a - call Intro_InitSineLYOverrides - - xor a ; FALSE - ld [wIntroSpriteStateFlag], a - - call EnableLCD - call DelayFrame - - ld a, %11100100 - ldh [rBGP], a - ld a, %11100000 - ldh [rOBP0], a - call Intro_InitOmanyte - ret - -IntroScene2: ; 444a - call Intro_UpdateLYOverrides - ld hl, wIntroFrameCounter1 - ld a, [hl] - and a - jr z, .skip_intro - dec [hl] - call Intro_InitBubble - ret - -.skip_intro - ld [hl], $10 - ld hl, wIntroJumptableIndex - inc [hl] - -IntroScene3: -; rise towards the surface - call IntroScene3_Jumper - call IntroScene3_ScrollToSurface - ret nc -; next scene if carry flag is set - call Intro_ResetLYOverrides - ld hl, hSCY - inc [hl] - ld hl, wIntroJumptableIndex - inc [hl] - -IntroScene4: -; at surface; Lapras surfs to left of screen - ld a, [wIntroSpriteStateFlag] - and a - jr nz, .next - ld hl, wIntroFrameCounter2 - inc [hl] - ld a, [hl] - and $07 - jr nz, .skip_move_left - ld hl, hSCX - dec [hl] - -.skip_move_left - call Intro_AnimateOceanWaves - ret - -.next - ld hl, wIntroJumptableIndex - inc [hl] - xor a - ld [wIntroFrameCounter1], a - -IntroScene5: -; fade out - ld hl, wIntroFrameCounter1 - ld a, [hl] - inc [hl] - swap a - and $f - ld e, a - ld d, 0 - ld hl, .palettes - add hl, de - ld a, [hl] - cp -1 - jr z, .next - ldh [rBGP], a - call Intro_AnimateOceanWaves - ld hl, hSCX - dec [hl] - dec [hl] - ret -.next - ld hl, wIntroJumptableIndex - inc [hl] - ret - -.palettes: - db %11100100 - db %11100100 - db %10010000 - db %01000000 - db %00000000 - db -1 - -IntroScene17: -; delay a bit before leading into the title screen - ld c, 64 -.loop - call DelayFrame - dec c - jr nz, .loop -; set done flag - ld hl, wIntroJumptableIndex - set 7, [hl] - ret - -IntroScene3_ScrollToSurface: - ld hl, wIntroFrameCounter2 - inc [hl] - ld a, [hl] - and %00000011 - jr nz, .skip_move_left - ld hl, hSCX - dec [hl] - -.skip_move_left - and 1 - jr nz, .no_carry - ld hl, wGlobalAnimYOffset - inc [hl] - ld hl, hSCY - ld a, [hl] - dec [hl] - and $f - call z, Intro_UpdateTilemapAndBGMap - ld a, [wIntroFrameCounter1] - and a - jr z, .carry - -.no_carry - and a - ret - -.carry - scf - ret - -IntroScene3_Jumper: - jumptable .subroutines, wIntroFrameCounter1 -.subroutines - dw .scene3_2 - dw .scene3_2 - dw .scene3_2 - dw .scene3_1 - dw .scene3_2 - dw .scene3_2 - dw .scene3_3 - dw .scene3_3 - dw .scene3_3 - dw .scene3_4 - dw .scene3_5 - dw .scene3_6 - dw .scene3_6 - dw .scene3_6 - dw .scene3_6 - dw .scene3_6 - dw .scene3_6 - -.scene3_1: - call Intro_InitLapras - ld a, %11100100 - ldh [rOBP0], a - -.scene3_2: ; fallthrough - call Intro_AnimateOceanWaves - ret - -.scene3_3: - call Intro_InitMagikarps - call Intro_AnimateOceanWaves - ret - -.scene3_4: - ld hl, wIntroFrameCounter2 - ld a, [hl] - and %00011111 - jr z, .load_palettes - call Intro_InitMagikarps - ret -.load_palettes - callab Function962d ; load magikarp palettes - ret - -.scene3_5: - xor a - ldh [hLCDCPointer], a - ret - -.scene3_6: - call Intro_UpdateLYOverrides - ret - -Intro_InitBubble: - ld hl, wIntroFrameCounter1 - ld a, [hl] - and $0f - ret nz - - ld a, [hl] - and $70 - swap a - ld e, a - ld d, $00 - ld hl, .pixel_table - add hl, de - add hl, de - ld e, [hl] - inc hl - ld d, [hl] - ld a, $21 ; SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE - call InitSpriteAnimStruct - ret - -.pixel_table - db $30, $74 - db $70, $94 - db $50, $84 - db $60, $78 - db $20, $68 - db $40, $88 - -Intro_InitMagikarps: - ld de, $403f - ld a, [wSGB] - and a - jr z, .ok - - ld de, $201f - -.ok - ld hl, wIntroFrameCounter2 - ld a, [hl] - and e - ret nz - ld a, [hl] - and d - jr nz, .alternate_frame - ld de, $e8e0 - call .PlaceMagikarp - ld de, wObject8SpriteXOffset - call .PlaceMagikarp - ld de, $00c0 - call .PlaceMagikarp - ret - -.alternate_frame - ld de, $e0f0 - call .PlaceMagikarp - ld de, $f8c0 - call .PlaceMagikarp - ld de, $10e0 - call .PlaceMagikarp - ret - -.PlaceMagikarp: - ld a, $23 ; SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP - call InitSpriteAnimStruct - ret - -Intro_InitOmanyte: - ld de, $9038 - call .PlaceOmanyte - ld de, $7050 - call .PlaceOmanyte - ld de, $8078 - -.PlaceOmanyte: - ld a, $22 ; SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER - call InitSpriteAnimStruct - ret - -Intro_InitLapras: - ld a, [wIntroFrameCounter2] - and %00011111 - ret nz - ld de, $80c0 - ld a, $25 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS - call InitSpriteAnimStruct - ret - -Intro_UnusedInitAerodactyl: ; unreferenced - ld de, $1000 - ld a, $24 ; SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL - call InitSpriteAnimStruct - ret - -Intro_UpdateTilemapAndBGMap: -; add new tiles to top as water scene scrolls up to surface - push hl - push de - - ld a, [wIntroTilemapPointer + 0] - ld e, a - ld a, [wIntroTilemapPointer + 1] - ld d, a - ld hl, -$10 - add hl, de - ld a, l - ld e, l - ld [wIntroTilemapPointer + 0], a - ld a, h - ld d, h - ld [wIntroTilemapPointer + 1], a - - hlcoord 0, 0 - ld c, BG_MAP_WIDTH / 2 -.loop - call Intro_Draw2x2Tiles - dec c - jr nz, .loop - - ld a, [wIntroBGMapPointer + 0] - ld e, a - ld a, [wIntroBGMapPointer + 1] - ld d, a - ld hl, hCurSpriteYCoord - add hl, de - ld a, l - ld [wIntroBGMapPointer + 0], a - ld [wVBCopyDst], a - ld a, h - and %11111011 - or %00001000 - ld [wIntroBGMapPointer + 1], a - ld [wVBCopyDst + 1], a - ld a, LOW(wTileMap) - ld [wVBCopySrc], a - ld a, HIGH(wTileMap) - ld [wVBCopySrc + 1], a - ld a, 4 - ld [wVBCopySize], a - ld hl, wIntroFrameCounter1 - dec [hl] - pop de - pop hl - ret - - -Intro_AnimateOceanWaves: -; uses a 2bpp request to copy tile IDs to the BG map - ld hl, wIntroFrameCounter2 - ld a, [hl] - and 3 - cp 3 - ret z - - ld a, [hl] - and $30 - swap a - ld l, a - ld h, 0 -rept 5 - add hl, hl -endr - ld de, .wave_tiles - add hl, de - ld a, l - ld [wVBCopySrc], a - ld a, h - ld [wVBCopySrc + 1], a - ld a, LOW(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 - ld [wVBCopyDst], a - ld a, HIGH(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 - ld [wVBCopyDst + 1], a - ld a, 2 - ld [wVBCopySize], a - ret -.wave_tiles: -; Fill an entire bg map row with each frame -rept 8 - db $70, $71, $72, $73 ; frame 1 -endr - -rept 8 - db $74, $75, $76, $77 ; frame 2 -endr - -rept 8 - db $78, $79, $7a, $7b ; frame 3 -endr - -rept 8 - db $7c, $7d, $7e, $7f ; frame 4 -endr - -Intro_InitSineLYOverrides: - ld bc, wLYOverrides2 - ld a, SCREEN_HEIGHT_PX - ld de, BG_MAP_WIDTH * BG_MAP_HEIGHT -.loop - push af - push de - callba BattleAnim_Sine_e - ld a, e - ld [bc], a - inc bc - pop de - inc e - pop af - dec a - jr nz, .loop - ret - -Intro_UpdateLYOverrides: - ld bc, wLYOverrides - ld e, $10 - -.loop1 - ldh a, [hSCY] - ld [bc], a - inc bc - dec e - jr nz, .loop1 - - ld hl, wLYOverrides2 - ld de, wLYOverrides2 + 1 - ld a, [hl] - push af - ld a, $80 - -.loop2 - push af - ld a, [de] - inc de - ld [hli], a - push hl - ld hl, hSCY - add [hl] - ld [bc], a - inc bc - pop hl - pop af - dec a - jr nz, .loop2 - - pop af - ld [hl], a - ret - -IntroScene6: -; Set up grass cutscene (Pikachu/Jigglypuff) - ld hl, wIntroJumptableIndex - inc [hl] - call DisableLCD - ld b, SGB_GS_INTRO - ld c, 1 - call GetSGBLayout - callab InitEffectObject - call Intro_ResetLYOverrides - ld hl, vChars2 - ld de, IntroForestGFX - call Intro_Copy128Tiles - ld a, LOW(Intro_GrassMeta) - ld [wIntroTilesPointer + 0], a - ld a, HIGH(Intro_GrassMeta) - ld [wIntroTilesPointer + 1], a - ld hl, vBGMap0 - ld a, l - ld [wIntroBGMapPointer + 0], a - ld a, h - ld [wIntroBGMapPointer + 1], a - ld de, Intro_GrassTilemap + 2 tiles - ld a, e - ld [wIntroTilemapPointer + 0], a - ld a, d - ld [wIntroTilemapPointer + 1], a - call Intro_DrawBackground - ld hl, IntroJigglypuffPikachuGFX - ld de, vChars0 - ld bc, $0a00 - -.load - ld a, [hli] - ld [de], a - inc de - dec bc - ld a, b - or c - jr nz, .load - - ld hl, wSpriteAnimDict - ld a, $22 - ld [hli], a - ld a, $00 - ld [hli], a - xor a - ldh [hSCY], a - ld [wGlobalAnimYOffset], a - ld a, $60 - ldh [hSCX], a - ld a, $a0 - ld [wGlobalAnimXOffset], a - xor a - ld [wIntroFrameCounter2], a - call EnableLCD - ld a, $e4 - ldh [rBGP], a - ldh [rOBP0], a - call Intro_InitJigglypuff - xor a - ld [wIntroSpriteStateFlag], a - ret - -IntroScene7: - call Intro_InitNote - ld hl, wIntroFrameCounter2 - ld a, [hl] - inc [hl] - and $03 - ret z - - ld hl, hSCX - ld a, [hl] - and a - jr z, .next - - dec [hl] - ld hl, wGlobalAnimXOffset - inc [hl] - ret - -.next - ld a, $ff - ld [wIntroFrameCounter1], a - call Intro_InitPikachu - ld hl, wIntroJumptableIndex - inc [hl] - ret - -IntroScene8: - ld hl, wIntroFrameCounter1 - ld a, [hl] - and a - jr z, .next - dec [hl] - call Intro_InitNote - ld hl, wIntroFrameCounter2 - inc [hl] - ret - -.next - xor a - ld [wIntroFrameCounter1], a - ld hl, wIntroJumptableIndex - inc [hl] - callab Function9633 - ret - -IntroScene9: - ld hl, wIntroFrameCounter1 - ld a, [hl] - inc [hl] - swap a - and $0f - ld e, a - ld d, $00 - ld hl, .palettes - add hl, de - ld a, [hl] - and a - jr z, .next - - ldh [rBGP], a - ld hl, hSCY - inc [hl] - ld hl, wGlobalAnimYOffset - dec [hl] - ret - -.next: - ld hl, wIntroJumptableIndex - inc [hl] - ret - -.palettes: -; fade out to black - db %11100100 - db %11100100 - db %11100100 - db %11100100 - db %11100100 - db %11111001 - db %11111110 - db %11111111 - db 0 - -Intro_DummyFunction: - ret - - -Intro_InitNote: - ld a, [wIntroSpriteStateFlag] - and a - ret nz - - ld hl, wIntroFrameCounter2 - ld a, [hl] - and $3f - ret nz - - ld a, [hl] - and $7f - jr z, .SmallerNote - - ld de, $5c30 - ld a, $26 ; SPRITE_ANIM_INDEX_GS_INTRO_NOTE - call InitSpriteAnimStruct - ret - -.SmallerNote: - ld de, $5430 - ld a, $27 ; SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE - call InitSpriteAnimStruct - ret - - -Intro_InitJigglypuff: - ld de, $7030 - ld a, $28 ; SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF - call InitSpriteAnimStruct - ret - - -Intro_InitPikachu: - ld de, $70c0 - ld a, $29 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU - call InitSpriteAnimStruct - ld de, $70c0 - ld a, $2a ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL - call InitSpriteAnimStruct - ret - -IntroScene10: -; Set up fireball cutscene (evolved Kanto starters) - ld hl, wIntroJumptableIndex - inc [hl] - ld b, SGB_GS_INTRO - ld c, 2 - call GetSGBLayout - callab InitEffectObject - call Intro_ResetLYOverrides - call Intro_BlankTilemapAndBGMap - - ld hl, vChars2 - ld de, IntroCharizard1GFX - lb bc, BANK(IntroCharizard1GFX), 8 tiles - call Request2bpp - - ld hl, vFont - ld de, IntroCharizard2GFX tile $40 - lb bc, BANK(IntroCharizard2GFX), 8 tiles - call Request2bpp - - ld hl, vChars0 - ld de, IntroCharizardFlamesGFX - lb bc, BANK(IntroCharizardFlamesGFX), 8 tiles - call Request2bpp - - ld hl, wSpriteAnimDict - ld a, $22 ; SPRITE_ANIM_DICT_GS_INTRO - ld [hli], a - ld a, $00 - ld [hli], a - - ld a, 0 - call DrawIntroCharizardGraphic - - ld a, $80 - ldh [hSCY], a - - xor a - ldh [hSCX], a - ld [wGlobalAnimYOffset], a - ld [wGlobalAnimXOffset], a - - xor a - ld [wIntroFrameCounter2], a - ld a, %00111111 - ldh [rBGP], a - ld a, %11111111 - ldh [rOBP0], a - ret - -IntroScene11: -; scroll up to Charizard silhoutte, flash Blastoise and Venusaur - ld hl, wIntroFrameCounter2 - ld a, [hl] - inc [hl] - and 1 - ret z - call Intro_CheckSCYEvent - ld hl, hSCY - ld a, [hl] - and a - jr z, .next - inc [hl] - ret - -.next - ld hl, wIntroJumptableIndex - inc [hl] - xor a - ld [wIntroFrameCounter1], a - -IntroScene12: -; load Charizard palettes - ld hl, wIntroFrameCounter1 - ld a, [hl] - inc [hl] - srl a - srl a - and 3 - ld e, a - ld d, 0 - ld hl, .palettes - add hl, de - ld a, [hl] - and a - jr z, .next - ldh [rBGP], a - ldh [rOBP0], a - ret - -.next - ld hl, wIntroJumptableIndex - inc [hl] - ld a, $80 - ld [wIntroFrameCounter1], a - ret - -.palettes: - db %01101010 - db %10100101 - db %11100100 - db %00000000 - -IntroScene13: -; Charizard mouth open - ld hl, wIntroFrameCounter1 - ld a, [hl] - and a - jr z, .next - - dec [hl] - ret - -.next - ld hl, wIntroJumptableIndex - inc [hl] - ld a, 1 - call DrawIntroCharizardGraphic - ld a, 4 - ld [wIntroFrameCounter1], a - ret - -IntroScene14: -; Charizard breathing fire - ld hl, wIntroFrameCounter1 - ld a, [hl] - and a - jr z, .next - dec [hl] - ret - -.next - ld hl, wIntroJumptableIndex - inc [hl] - ld a, 2 - call DrawIntroCharizardGraphic - ld a, 64 - ld [wIntroFrameCounter1], a - xor a - ld [wIntroFrameCounter2], a -; fallthrough - -IntroScene15: -; Charizard mouth wide open / fireball starts - call Intro_AnimateFireball - ld hl, wIntroFrameCounter1 - ld a, [hl] - and a - jr z, .next - dec [hl] - ret -.next - ld hl, wIntroJumptableIndex - inc [hl] - xor a - ld [wIntroFrameCounter1], a - ret - -IntroScene16: -; continue fireball / fade out palettes - call Intro_AnimateFireball - ld hl, wIntroFrameCounter1 - ld a, [hl] - inc [hl] - swap a - and $07 - ld e, a - ld d, $00 - ld hl, .palettes - add hl, de - ld a, [hl] - cp $ff - jr z, .next - ldh [rBGP], a - ldh [rOBP0], a - ret -.next - ld hl, wIntroJumptableIndex - inc [hl] - ret -.palettes: - db %11100100 - db %10010000 - db %01000000 - db %00000000 - db -1 - -Intro_BlankTilemapAndBGMap: - hlcoord 0, 0 - ld bc, SCREEN_WIDTH * SCREEN_HEIGHT -.blank_tilemap - ld [hl], 0 - inc hl - dec bc - ld a, b - or c - jr nz, .blank_tilemap - - ld hl, wOverworldMapBlocks ; $c600, buffer - ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT -.blank_bgmap - ld [hl], 0 - inc hl - dec bc - ld a, b - or c - jr nz, .blank_bgmap - - ld hl, vBGMap0 - ld de, wOverworldMapBlocks ; $c600, buffer - lb bc, BANK(@), $40 - call Request2bpp - ret - - -Intro_CheckSCYEvent: - ldh a, [hSCY] - ld c, a - ld hl, .Cuelist - -.loop - ld a, [hli] - cp -1 - ret z - cp c - jr z, .value_found - inc hl - inc hl - jr .loop - -.value_found - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -.Cuelist: - dbw $87, Intro_BlastoiseAppears - dbw $88, Intro_FlashMonPalette - dbw $98, Intro_FlashSilhouette - dbw $99, Intro_LoadVenusaurPalette - dbw $bf, Intro_VenusaurAppears - dbw $c0, Intro_FlashMonPalette - dbw $d0, Intro_FlashSilhouette - dbw $d1, Intro_LoadCharizardPalette - db -1 - -Intro_BlastoiseAppears: - call Intro_LoadBlastoiseObject - ret - -Intro_VenusaurAppears: - call Intro_LoadVenusaurObject - ret - -Intro_FlashMonPalette: - ld a, %11100100 - ldh [rOBP0], a - xor a - ldh [rBGP], a - ret - -Intro_FlashSilhouette: - ld a, %11111111 - ldh [rOBP0], a - ld a, %00111111 - ldh [rBGP], a - ret - -Intro_LoadVenusaurPalette: - callab Function9639 - ret - -Intro_LoadCharizardPalette: - callab Function963f - ret - - -DrawIntroCharizardGraphic: - push af - hlcoord 0, 6 - ld c, SCREEN_WIDTH * 8 - xor a -.loop1 - ld [hli], a - dec c - jr nz, .loop1 - - pop af - ld e, a - ld d, $00 - ld hl, .charizard_data -rept 5 - add hl, de -endr - ld e, [hl] - inc hl - ld c, [hl] - inc hl - ld b, [hl] - inc hl - ld a, [hli] - ld h, [hl] - ld l, a - ld a, e - -.loop2_outer - push bc - push hl -.loop2_inner - ld [hli], a - inc a - dec c - jr nz, .loop2_inner - - pop hl - ld bc, SCREEN_WIDTH - add hl, bc - pop bc - dec b - jr nz, .loop2_outer - - ld a, 1 - ldh [hBGMapMode], a - call DelayFrame - call DelayFrame - call DelayFrame - xor a - ldh [hBGMapMode], a - ret - -.charizard_data - db $00, $08, $08, $22, $c3 - db $40, $09, $08, $21, $c3 - db $88, $09, $08, $20, $c3 - -Intro_AnimateFireball: - ld hl, wIntroFrameCounter2 - ld a, [hl] - inc [hl] - and 3 - ret nz - ld de, $6454 - ld a, $2b ; SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL - call InitSpriteAnimStruct - ld hl, hSCX - dec [hl] - ld hl, wGlobalAnimXOffset - inc [hl] - ret - -Intro_LoadBlastoiseObject: - ld de, $b008 - ld a, $2c ; SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE - call InitSpriteAnimStruct - ret - -Intro_LoadVenusaurObject: - ld de, $b0a0 - ld a, $2d ; SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR - call InitSpriteAnimStruct - ret - -Intro_Copy128Tiles: - ld bc, 128 tiles -.loop - ld a, [de] - inc de - ld [hli], a - dec bc - ld a, c - or b - jr nz, .loop - ret - - -Intro_DrawBackground: - ld b, BG_MAP_WIDTH / 2 -.outer_loop - push hl - ld c, BG_MAP_HEIGHT / 2 -.inner_loop - call Intro_Draw2x2Tiles - dec c - jr nz, .inner_loop - pop hl - push bc - ld bc, 2 * BG_MAP_WIDTH - add hl, bc - pop bc - dec b - jr nz, .outer_loop - ret - - -Intro_Draw2x2Tiles: - push bc - push de - push hl - push hl - push hl - ld a, [de] - ld l, a - ld h, 0 - ld a, [wIntroTilesPointer + 0] - ld e, a - ld a, [wIntroTilesPointer + 1] - ld d, a - add hl, hl - add hl, hl - add hl, de - ld e, l - ld d, h - pop hl - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - pop hl - ld bc, BG_MAP_WIDTH - add hl, bc - ld a, [de] - inc de - ld [hli], a - ld a, [de] - inc de - ld [hli], a - pop hl - inc hl - inc hl - pop de - inc de - pop bc - ret - - -Intro_ResetLYOverrides: - ld hl, wLYOverrides - xor a - ld c, wLYOverrides2 - wLYOverrides -.loop - ld [hli], a - dec c - jr nz, .loop - ret diff --git a/engine/title.asm b/engine/title.asm deleted file mode 100644 index df47646..0000000 --- a/engine/title.asm +++ /dev/null @@ -1,636 +0,0 @@ -INCLUDE "constants.asm" - -SECTION "engine/title.asm@Title screen", ROMX - -IntroSequence:: - callab GameFreakIntro - jr c, TitleSequenceStart - ld a, [wTitleSequenceOpeningType] - and a - jr z, .opening_sequence - -.pikachu_minigame - callab PikachuMiniGame - jr TitleSequenceStart - -.opening_sequence - callab OpeningCutscene - -TitleSequenceStart:: - call TitleSequenceInit - callab SetTitleBGDecorationBorder - -.loop - call TitleScreenMain - jr nc, .loop - - call ClearBGPalettes - call ClearSprites - ld a, $01 - ldh [hBGMapMode], a - call ClearTileMap - call UpdateTimePals - - ld a, [wJumptableIndex + 1] - ld e, a - ld d, 0 - ld hl, TitleScreenJumpTable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - - jp hl - -TitleScreenJumpTable:: - dw MainMenu - dw DebugMenu - dw SRAMClearMenu - dw IntroSequence - -TitleSequenceInit:: - call ClearPalettes - - xor a - ldh [hMapAnims], a - ldh [hSCY], a - ldh [hSCX], a - - ld de, MUSIC_NONE - call PlayMusic - - call ClearTileMap - call DisableLCD - call ClearSprites - - callba InitEffectObject - ld hl, vChars0 - ld bc, vBGMap0 - vChars0 - -.clear_loop - ld [hl], $00 - inc hl - dec bc - ld a, b - or c - jr nz, .clear_loop - - ld hl, TitleScreenGFX - ld de, vChars2 + 65 tiles - ld bc, 13 tiles - ld a, BANK(TitleScreenGFX) - call FarCopyData - - ld hl, TitleScreenVersionGFX - ld de, vChars2 + 96 tiles - ld bc, 24 tiles - ld a, BANK(TitleScreenVersionGFX) - call FarCopyData - - ld hl, TitleScreenHoOhGFX - ld de, vChars2 - ld bc, 49 tiles - ld a, BANK(TitleScreenHoOhGFX) - call FarCopyData - - ld hl, TitleScreenLogoGFX - ld de, vChars1 - ld bc, 58 tiles - ld a, BANK(TitleScreenLogoGFX) - call FarCopyData - - ld hl, TitleScreenGoldLogoGFX - ld de, vChars0 + 186 tiles - ld bc, 20 tiles - ld a, BANK(TitleScreenGoldLogoGFX) - call FarCopyData - - call SetTitleGfx - ld hl, wTileMapBackup - ld a, $24 - ld [hli], a - ld a, $00 - ld [hli], a - - ld hl, vBGMap0 - ld bc, 128 tiles - ld a, " " - call ByteFill - - ld b, $06 - call GetSGBLayout - call EnableLCD - ld a, $01 - ldh [hBGMapMode], a - call WaitBGMap - xor a - ldh [hBGMapMode], a - ld hl, wJumptableIndex - ld [hli], a ; (Possibly wJumptableIndex from Crystal) - ld [hli], a ; (Possibly wIntroSceneFrameCounter from Crystal) - ld [hli], a ; (Possibly wTitleScreenTimer from Crystal) - ld [hl], a ; (Possibly wTitleScreenTimer + 1 from Crystal) - - call .load_position_table - - - ld a, %00011010 - ldh [rBGP], a - ld a, %11100100 - ldh [rOBP0], a - ret - -.load_position_table: - ld hl, FirePositionTable - ld c, 6 ; Load 6 flying objects on the screen. - -.set_fire_note_loop - push bc - ld e, [hl] - inc hl - ld d, [hl] - inc hl - push hl - ld a, $2E ; Title fire/note object effect type? - call InitSpriteAnimStruct - pop hl - pop bc - dec c - jr nz, .set_fire_note_loop - ret - -FirePositionTable:: - dw $4CE0 - dw $58A0 - dw $6490 - dw $70D0 - dw $7CB0 - dw $8800 - -TitleFireGFX:: INCBIN "gfx/title/fire.2bpp" -TitleNotesGFX:: INCBIN "gfx/title/notes.2bpp" - -TitleScreenMain:: - ld a, [wJumptableIndex] - bit 7, a - jr nz, .exit - call TitleScreenSequence - callba EffectObjectJumpNoDelay - call DelayFrame - and a - ret - -.exit - scf - ret - -TitleScreenSequence:: - ld e, a - ld d, 0 - ld hl, TitleScreenSequenceTable - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - -TitleScreenSequenceTable:: - dw TitleSeq_Start - dw TitleSeq_LoadPokemonLogo - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_MoveTitle - dw TitleSeq_MoveTitleEnd - dw TitleSeq_InitFlashTitle - dw TitleSeq_FlashTitle - - dw TitleSeq_PMJapaneseChara - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_WaitForNextSequence - dw TitleSeq_PMSubtitle - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_WaitForNextSequence - dw TitleSeq_Version - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_WaitForNextSequence - dw TitleSeq_CopyRight - - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_WaitForNextSequence - dw TitleSeq_HoOh - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - dw TitleSeq_IncreaseJumpTableIndex - - dw TitleSeq_WaitForNextSequence - dw TitleSeq_PressButtonInit - dw TitleSeq_TitleScreenInputAndTimeout - dw TitleSeq_FadeMusicOut - -TitleSeq_IncreaseJumpTableIndex:: - ld hl, wJumptableIndex - inc [hl] - ret - -TitleSeq_WaitForNextSequence:: - xor a - ldh [hBGMapMode], a - ld hl, wJumptableIndex + 2 - ld a, [hl] - and a - jr z, .next_seq - dec [hl] - ret - -.next_seq - call TitleSeq_IncreaseJumpTableIndex - ret - -TitleSeq_LoadPokemonLogo:: - call PrintPokemonLogo - call TitleSeq_IncreaseJumpTableIndex - ld a, $01 - ldh [hBGMapMode], a - ret - -TitleSeq_Start:: - call TitleSeq_IncreaseJumpTableIndex - push de - ld de, $2D ; "swish" sound - call PlaySFX - pop de - ld a, $80 - ld [wJumptableIndex + 2], a - call SetLYOverrides - ld a, $43 - ldh [hLCDCPointer], a - ret - -TitleSeq_MoveTitle:: - xor a - ldh [hBGMapMode], a - ld hl, wJumptableIndex + 2 - ld a, [hl] - and a - jr z, .nextseq - add $04 - ld [hl], a - ld e, a -.wait - ldh a, [rLY] - cp $40 - jr c, .wait - ld a, e - call SetLYOverrides - ret - -.nextseq - call TitleSeq_IncreaseJumpTableIndex - ret - -TitleSeq_MoveTitleEnd:: - xor a - ldh [hLCDCPointer], a - call TitleSeq_IncreaseJumpTableIndex - ld de, MUSIC_TITLE - call PlayMusic - ret - -TitleSeq_InitFlashTitle:: - call TitleSeq_IncreaseJumpTableIndex - ld a, %00011010 - ld [wJumptableIndex + 2], a - ld a, 6 - ld [wJumptableIndex + 3], a - ret - -TitleSeq_FlashTitle:: - ld hl, wJumptableIndex + 3 - ld a, [hl] - and a - jr z, .exit - dec [hl] - ld a, [wJumptableIndex + 2] - xor %00011010 - ld [wJumptableIndex +2 ], a - ldh [rBGP], a - call DelayFrame - call DelayFrame - ret - -.exit - call TitleSeq_IncreaseJumpTableIndex - ld a, %11100100 - ldh [rBGP], a - ret - -TitleSeq_PMJapaneseChara:: - call PrintPMJapaneseChara - ld a, $10 - ld [wJumptableIndex + 2], a - call TitleSeq_IncreaseJumpTableIndex - ld a, $01 - ldh [hBGMapMode], a - ret - -TitleSeq_PMSubtitle:: - call PrintPMSubtitle - ld a, $10 - ld [wJumptableIndex + 2], a - call TitleSeq_IncreaseJumpTableIndex - ld a, $01 - ldh [hBGMapMode], a - ret - -TitleSeq_Version:: - call PrintVersion - ld a, $10 - ld [wJumptableIndex + 2], a - call TitleSeq_IncreaseJumpTableIndex - ld a, $01 - ldh [hBGMapMode], a - ret - -TitleSeq_CopyRight:: - call PrintCopyRight - ld a, $10 - ld [wJumptableIndex + 2], a - call TitleSeq_IncreaseJumpTableIndex - ld a, $01 - ldh [hBGMapMode], a - ret - -TitleSeq_HoOh:: - call Set_HoOh - ld a, $10 - ld [wJumptableIndex + 2], a - call TitleSeq_IncreaseJumpTableIndex - ld a, $01 - ldh [hBGMapMode], a - ret - -TitleSeq_PressButtonInit:: - ld hl, wJumptableIndex - inc [hl] - ld hl, wJumptableIndex + 2 - ld de, DecodeNybble0Table - 3 - ld [hl], e - inc hl - ld [hl], d - ret - -TitleSeq_TitleScreenInputAndTimeout:: - ld hl, wJumptableIndex + 2 - ld e, [hl] - inc hl - ld d, [hl] - ld a, e - or d - jr z, .psbtn_reset - dec de - ld [hl], d - dec hl - ld [hl], e - call GetJoypad - ld hl, hJoyState -; UP + B + SELECT opens the SRAM clear screen - ld a, [hl] - and D_UP | B_BUTTON | SELECT - cp D_UP | B_BUTTON | SELECT - jr z, .psbtn_sramclear -; SELECT opens the debug menu - ld a, [hl] - and SELECT - jr nz, .psbtn_gotodebug - ld a, [hl] - and $09 - ret z - -.psbtn_play - ld a, $00 ; MainMenu - jr .psbtn_nextseq - -.psbtn_gotodebug - ld a, $01 ; DebugMenu - jr .psbtn_nextseq - -.psbtn_sramclear - ld a, $02 - -.psbtn_nextseq - ld [wJumptableIndex + 1], a - ld hl, wJumptableIndex - set 7, [hl] - ret - -.psbtn_reset - ld hl, wJumptableIndex - inc [hl] - xor a - ld [wMusicFadeID], a - ld [wMusicFadeID + 1], a - ld hl, wMusicFade - ld [hl], 8 - ret - -TitleSeq_FadeMusicOut:: - ld a, [wMusicFade] - and a - ret nz - ld a, 3 - ld [wJumptableIndex + 1], a - ld hl, wJumptableIndex - set 7, [hl] - ret - -SetLYOverrides:: - ld hl, wLYOverrides - ld c, $30 -.setly_loop - ld [hli], a - dec c - jr nz, .setly_loop - ret - -PrintPMSubtitle:: - coord hl, 2, 6 - ld b, 15 - ld a, $69 - jr LoadPrintArea - -PrintVersion:: - coord hl, 4, 1 - ld b, $09 - ld a, $60 - -LoadPrintArea:: - ld [hli], a - inc a - dec b - jr nz, LoadPrintArea - ret - -PrintPMJapaneseChara:: - coord hl, 15, 2 - ld a, "こ" - lb bc, 4, 4 - jr PrintBoxArea - -PrintPokemonLogo:: - coord hl, 15, 3 - ld [hl], $B8 - coord hl, 15, 4 - ld [hl], $B9 - coord hl, 1, 2 - ld a, $80 - ld bc, $0E04 - -PrintBoxArea:: - ld de, SCREEN_WIDTH - push bc - push hl - -.xloop - ld [hli], a - inc a - dec b - jr nz, .xloop - pop hl - add hl, de - pop bc - dec c - jr nz, PrintBoxArea - ret - -PrintCopyRight:: - coord hl, 3, 17 - ld a, $41 - ld b, $0D - -.loop - ld [hli], a - inc a - dec b - jr nz, .loop - ret - -SRAMClearMenu:: - call ClearTileMap - call GetMemSGBLayout - call LoadFont - call LoadFontExtra - ld hl, SRAMClear_Message - call PrintText - ld hl, SRAMClear_WinPOS - call CopyMenuHeader - call VerticalMenu - jp c, Init - ld a, [wMenuCursorY] - cp $01 - jp z, Init - - callab InitAllSRAMBanks - jp Init - -SRAMClear_Message:: - db "すべての セーブデータエりアを" - db "クりア しますか?" - -SRAMClear_WinPOS:: - db 0 - db 7,14,11,19 - dw SRAMClear_TextChoice ; menu data - db 1 ; default option - -SRAMClear_TextChoice:: - db %11000000 - db 2 - db "いいえ@" - db "はい@" - -IntroCopyRightInfo:: - call ClearTileMap - call LoadFontExtra - ld de, TitleScreenGFX - ld hl, $9600 - lb bc, BANK(TitleScreenGFX), $19 - call Request2bpp - - coord hl, 5, 7 - ld de, IntroCopyRightInfo_Text - jp PlaceString - -IntroCopyRightInfo_Text:: - db $60, $61, $62, $63, $6D, $6E, $6F, $70, $71, $72, $4E ; "ⓒ1997 Nintendo\n" - db $60, $61, $62, $63, $73, $74, $75, $76, $77, $78, $6B, $6C, $4E ; "ⓒ1997 Creatures Inc.\n" - db $60, $61, $62, $63, $64, $65, $66, $67, $68, $69, $6A, $6B, $6C, $50 ; "ⓒ1997 GAME FREAK Inc.\0" - -Set_HoOh:: - coord hl, 7, 9 - ld de, $000D - ld a, $00 - ld b, $07 -.loop - ld c, $07 -.loop2 - ld [hli], a - inc a - dec c - jr nz, .loop2 - add hl, de - dec b - jr nz, .loop - ret - -; Unused code, looks like it sets the font type for the logo? -SetTitleFont:: - ld de, vChars1 - ld hl, TitleScreenLogoGFX - ld bc, 130 tiles - ld a, $04 - jp FarCopyDataDouble - -; Sets the type of art that will be displayed on the title screen -; depending on wTitleSequenceOpeningType. -SetTitleGfx:: - ld hl, wTitleSequenceOpeningType - ld a, [hl] - xor $01 - ld [hl], a - jr nz, .flame - -.note - ld hl, TitleNotesGFX - jr SetTitleGfxNext - -.flame - ld hl, TitleFireGFX -SetTitleGfxNext:: - ld de, vChars0 - ld c, $80 -.loop - ld a, [hli] - ld [de], a - inc de - dec c - jr nz, .loop - ret - -SECTION "engine/title.asm@Title screen TEMPORARY", ROMX - -GameInit:: - call ClearWindowData - ld a, $23 - ld [wce5f], a - jp IntroSequence diff --git a/layout.link b/layout.link index c29878b..3615fab 100644 --- a/layout.link +++ b/layout.link @@ -102,9 +102,9 @@ ROMX $01 "engine/menu/main_menu.asm@Initialize new game WRAM" "engine/dumps/bank01.asm@Function5388" "engine/menu/main_menu.asm@MainMenu" - "engine/intro.asm" - "engine/title.asm@Title screen" - "engine/title.asm@Title screen TEMPORARY" + "engine/movie/oak_speech.asm" + "engine/movie/title.asm@Title screen" + "engine/movie/title.asm@Title screen TEMPORARY" "engine/predef.asm" "engine/dumps/bank01.asm@ReanchorBGMap_NoOAMUpdate" "engine/math/math.asm" @@ -895,9 +895,9 @@ ROMX $38 ROMX $39 org $4000 - "engine/game_freak_intro.asm" + "engine/movie/game_freak_intro.asm" "gfx.asm@Gamefreak Logo GFX" - "engine/opening_cutscene.asm" + "engine/movie/opening_cutscene.asm" "gfx.asm@Intro Underwater GFX" "gfx.asm@Intro Forest GFX" "gfx.asm@Intro Mon" -- cgit v1.2.3 From ab8fa72e5a447d5ba057dacb63fd080505f43997 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 16:29:36 +0700 Subject: Cover remaining bytes on bank $39 --- layout.link | 1 + slack/slack.asm | 6 ++++++ slack/unknown_e7e9f.bin | Bin 0 -> 353 bytes 3 files changed, 7 insertions(+) create mode 100644 slack/unknown_e7e9f.bin diff --git a/layout.link b/layout.link index 3615fab..0a298c0 100644 --- a/layout.link +++ b/layout.link @@ -901,6 +901,7 @@ ROMX $39 "gfx.asm@Intro Underwater GFX" "gfx.asm@Intro Forest GFX" "gfx.asm@Intro Mon" + "slack.asm@Unknowne7e9f" ROMX $3a org $4000 diff --git a/slack/slack.asm b/slack/slack.asm index f3e450b..0423771 100755 --- a/slack/slack.asm +++ b/slack/slack.asm @@ -26,3 +26,9 @@ SECTION "slack.asm@Corrupted Sprites", ROMX CorruptedSpriteGFX: INCBIN "slack/sprites_corrupted.2bpp" + +SECTION "slack.asm@Unknowne7e9f", ROMX + +Unknowne7e9f: +INCBIN "slack/unknown_e7e9f.bin" ; Loaded as corrupted graphics + diff --git a/slack/unknown_e7e9f.bin b/slack/unknown_e7e9f.bin new file mode 100644 index 0000000..3080e80 Binary files /dev/null and b/slack/unknown_e7e9f.bin differ -- cgit v1.2.3 From de3c0631f0dca7f911f01e95d3180ad8afdfc9a8 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 21:14:56 +0700 Subject: Remove address comments in wram.asm --- ram/wram.asm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/ram/wram.asm b/ram/wram.asm index 2ca1311..5c07810 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -240,25 +240,25 @@ wIntroJumptableIndex:: wca10:: ds 1 UNION -wIntroBGMapPointer:: ds 2 ; ca11 +wIntroBGMapPointer:: ds 2 NEXTU wca11:: ds 1 wca12:: ds 1 ENDU UNION -wIntroTilemapPointer:: ds 2 ; ca13 +wIntroTilemapPointer:: ds 2 NEXTU wca13:: ds 1 wca14:: ds 1 ENDU -wIntroTilesPointer:: ds 2 ; ca15 +wIntroTilesPointer:: ds 2 -wIntroFrameCounter1:: ds 1 ; ca17 -wIntroFrameCounter2:: ds 1 ; ca18 +wIntroFrameCounter1:: ds 1 +wIntroFrameCounter2:: ds 1 -wIntroSpriteStateFlag:: ds 1 ; ca19 +wIntroSpriteStateFlag:: ds 1 ds $1d ; TODO -- cgit v1.2.3 From 20e4167f6959b86c86643a2e2b98b52bb46ead13 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 22:10:19 +0700 Subject: Make use of depixel / dbpixel --- engine/dumps/bank02.asm | 10 ++++---- engine/menu/text_entry.asm | 14 +++++------ engine/movie/game_freak_intro.asm | 6 ++--- engine/movie/opening_cutscene.asm | 49 +++++++++++++++++++++------------------ engine/movie/title.asm | 12 +++++----- 5 files changed, 48 insertions(+), 43 deletions(-) diff --git a/engine/dumps/bank02.asm b/engine/dumps/bank02.asm index 97590e4..86f11e6 100755 --- a/engine/dumps/bank02.asm +++ b/engine/dumps/bank02.asm @@ -1150,7 +1150,7 @@ Function886a: ld hl, vChars0 + $40 lb bc, BANK(GoldSpriteGFX), $04 call Request2bpp - ld de, $0000 + depixel 0, 0 ld a, $41 call InitSpriteAnimStruct ld hl, $0003 @@ -1188,7 +1188,7 @@ Function88b3: ld hl, vChars0 + $c0 lb bc, BANK(PidgeySpriteGFX), $04 call Request2bpp - ld de, $0000 + depixel 0, 0 ld a, $41 call InitSpriteAnimStruct ld hl, $0003 @@ -1443,7 +1443,7 @@ Function8c21: ld hl, wTileMapBackup ld [hli], a ld [hl], $7c - ld de, $241c + depixel 4, 3, 4, 4 ld a, $44 call InitSpriteAnimStruct call Function8c1c @@ -1568,7 +1568,7 @@ Function8cb7: ld hl, Text91c2 call PrintText call WaitBGMap - ld de, $4c23 + depixel 9, 4, 4, 3 ld a, $44 call InitSpriteAnimStruct ld hl, $0002 @@ -1577,7 +1577,7 @@ Function8cb7: ld hl, $0003 add hl, bc ld [hl], $7c - ld de, $4030 + depixel 8, 6 ld a, $4b call InitSpriteAnimStruct ld hl, $0003 diff --git a/engine/menu/text_entry.asm b/engine/menu/text_entry.asm index 14dbc85..0c9bf75 100644 --- a/engine/menu/text_entry.asm +++ b/engine/menu/text_entry.asm @@ -147,7 +147,7 @@ GetNamingScreenSetup: ld hl, wTileMapBackup ld [hl+], a ld [hl], $00 - ld de, $2420 + depixel 4, 4, 4, 0 ld a, $41 call InitSpriteAnimStruct ld hl, $0001 @@ -180,7 +180,7 @@ GetNamingScreenSetup: ld hl, wTileMapBackup ld [hli], a ld [hl], $00 - ld de, $2420 + depixel 4, 4, 4, 0 ld a, $41 call InitSpriteAnimStruct ret @@ -301,7 +301,7 @@ NamingScreenJoypadLoop: dw .ReadButtons .InitCursor: - ld de, $5818 + depixel 11, 3, 0, 0 ld a, $39 call InitSpriteAnimStruct ld a, c @@ -728,13 +728,13 @@ ComposeMailMessage: ld hl, wTileMapBackup ld [hli], a ld [hl], 0 - ld de, $2420 + depixel 4, 4, 4, 0 ld a, 8 call InitSpriteAnimStruct ld hl, $0002 add hl, bc ld [hl], 0 - ld de, $5818 + depixel 11, 3, 0, 0 ld a, $39 call InitSpriteAnimStruct ld a, c @@ -945,13 +945,13 @@ SetupMail: ld hl, wTileMapBackup ld [hli], a ld [hl], 0 - ld de, $2420 + depixel 4, 4, 4, 0 ld a, 8 call InitSpriteAnimStruct ld hl, $0002 add hl, bc ld [hl], 0 - ld de, $6018 + depixel 12, 3, 0, 0 ld a, $40 call InitSpriteAnimStruct ld a, c diff --git a/engine/movie/game_freak_intro.asm b/engine/movie/game_freak_intro.asm index e8a7a00..f3f888c 100644 --- a/engine/movie/game_freak_intro.asm +++ b/engine/movie/game_freak_intro.asm @@ -168,7 +168,7 @@ GameFreakPresents_Wait64Frames: GameFreakPresents_Star: xor a ld [wIntroSceneFrameCounter], a - ld de, $5458 + depixel 10, 11, 4, 0 ld a, $3b ; SPRITE_ANIM_INDEX_GS_INTRO_STAR call InitSpriteAnimStruct @@ -186,7 +186,7 @@ GameFreakPresents_PlaceLogo: and a ret z - ld de, $5458 + depixel 10, 11, 4, 0 ld a, $3a ; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO call InitSpriteAnimStruct call GameFreakPresents_NextScene @@ -292,7 +292,7 @@ GameFreakPresents_Sparkle: srl a ; set up a new sparkle sprite push af - ld de, $5858 + depixel 11, 11 ld a, $3c call InitSpriteAnimStruct pop af diff --git a/engine/movie/opening_cutscene.asm b/engine/movie/opening_cutscene.asm index 1eeacb5..bd475f8 100644 --- a/engine/movie/opening_cutscene.asm +++ b/engine/movie/opening_cutscene.asm @@ -370,12 +370,11 @@ Intro_InitBubble: db $40, $88 Intro_InitMagikarps: - ld de, $403f + depixel 8, 7, 0, 7 ld a, [wSGB] and a jr z, .ok - - ld de, $201f + depixel 4, 3, 0, 7 .ok ld hl, wIntroFrameCounter2 @@ -385,20 +384,25 @@ Intro_InitMagikarps: ld a, [hl] and d jr nz, .alternate_frame - ld de, $e8e0 + + depixel 29, 28 call .PlaceMagikarp - ld de, wObject8SpriteXOffset + + depixel 26, 0 call .PlaceMagikarp - ld de, $00c0 + + depixel 0, 24 call .PlaceMagikarp ret .alternate_frame - ld de, $e0f0 + depixel 28, 30 call .PlaceMagikarp - ld de, $f8c0 + + depixel 31, 24 call .PlaceMagikarp - ld de, $10e0 + + depixel 2, 28 call .PlaceMagikarp ret @@ -408,11 +412,12 @@ Intro_InitMagikarps: ret Intro_InitOmanyte: - ld de, $9038 + depixel 18, 7 call .PlaceOmanyte - ld de, $7050 + depixel 14, 10 call .PlaceOmanyte - ld de, $8078 + depixel 16, 15 +; fallback .PlaceOmanyte: ld a, $22 ; SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER @@ -423,13 +428,13 @@ Intro_InitLapras: ld a, [wIntroFrameCounter2] and %00011111 ret nz - ld de, $80c0 + depixel 16, 24 ld a, $25 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS call InitSpriteAnimStruct ret Intro_UnusedInitAerodactyl: ; unreferenced - ld de, $1000 + depixel 2, 0 ld a, $24 ; SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL call InitSpriteAnimStruct ret @@ -752,30 +757,30 @@ Intro_InitNote: and $7f jr z, .SmallerNote - ld de, $5c30 + depixel 11, 6, 4, 0 ld a, $26 ; SPRITE_ANIM_INDEX_GS_INTRO_NOTE call InitSpriteAnimStruct ret .SmallerNote: - ld de, $5430 + depixel 10, 6, 4, 0 ld a, $27 ; SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE call InitSpriteAnimStruct ret Intro_InitJigglypuff: - ld de, $7030 + depixel 14, 6 ld a, $28 ; SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF call InitSpriteAnimStruct ret Intro_InitPikachu: - ld de, $70c0 + depixel 14, 24 ld a, $29 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU call InitSpriteAnimStruct - ld de, $70c0 + depixel 14, 24 ld a, $2a ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL call InitSpriteAnimStruct ret @@ -1123,7 +1128,7 @@ Intro_AnimateFireball: inc [hl] and 3 ret nz - ld de, $6454 + depixel 12, 10, 4, 4 ld a, $2b ; SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL call InitSpriteAnimStruct ld hl, hSCX @@ -1133,13 +1138,13 @@ Intro_AnimateFireball: ret Intro_LoadBlastoiseObject: - ld de, $b008 + depixel 22, 1 ld a, $2c ; SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE call InitSpriteAnimStruct ret Intro_LoadVenusaurObject: - ld de, $b0a0 + depixel 22, 20 ld a, $2d ; SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR call InitSpriteAnimStruct ret diff --git a/engine/movie/title.asm b/engine/movie/title.asm index 26d6f8b..23baa2f 100644 --- a/engine/movie/title.asm +++ b/engine/movie/title.asm @@ -161,12 +161,12 @@ TitleSequenceInit:: ret FirePositionTable:: - dw $4CE0 - dw $58A0 - dw $6490 - dw $70D0 - dw $7CB0 - dw $8800 + dbpixel 28, 9, 0, 4 + dbpixel 20, 11, 0, 0 + dbpixel 18, 12, 0, 4 + dbpixel 26, 14, 0, 0 + dbpixel 22, 15, 0, 4 + dbpixel 0, 17, 0, 0 TitleFireGFX:: INCBIN "gfx/title/fire.2bpp" TitleNotesGFX:: INCBIN "gfx/title/notes.2bpp" -- cgit v1.2.3 From 05ee40e73c4cca832e28a21039d4dd1c53b69c5c Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 23:35:43 +0700 Subject: Use dbpixel for intro bubble data --- engine/movie/opening_cutscene.asm | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/engine/movie/opening_cutscene.asm b/engine/movie/opening_cutscene.asm index bd475f8..49c4035 100644 --- a/engine/movie/opening_cutscene.asm +++ b/engine/movie/opening_cutscene.asm @@ -362,12 +362,12 @@ Intro_InitBubble: ret .pixel_table - db $30, $74 - db $70, $94 - db $50, $84 - db $60, $78 - db $20, $68 - db $40, $88 + dbpixel 6, 14, 0, 4 + dbpixel 14, 18, 0, 4 + dbpixel 10, 16, 0, 4 + dbpixel 12, 15, 0, 0 + dbpixel 4, 13, 0, 0 + dbpixel 8, 17, 0, 0 Intro_InitMagikarps: depixel 8, 7, 0, 7 -- cgit v1.2.3 From 66be373dbc955a230657e04030dfd00c5a239b79 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 10 Dec 2020 23:47:23 +0700 Subject: Create sprite_anim_constants.asm --- constants.asm | 1 + constants/sprite_anim_constants.asm | 40 +++++++++++++++++++++++++++++++++++++ engine/dumps/bank02.asm | 10 +++++----- engine/menu/text_entry.asm | 14 ++++++------- engine/movie/game_freak_intro.asm | 6 +++--- engine/movie/opening_cutscene.asm | 38 +++++++++++++++++------------------ engine/movie/title.asm | 2 +- 7 files changed, 76 insertions(+), 35 deletions(-) create mode 100755 constants/sprite_anim_constants.asm diff --git a/constants.asm b/constants.asm index 5c29a51..19c002d 100644 --- a/constants.asm +++ b/constants.asm @@ -31,6 +31,7 @@ INCLUDE "constants/item_data_constants.asm" INCLUDE "constants/trainer_constants.asm" INCLUDE "constants/trainer_data_constants.asm" INCLUDE "constants/sprite_constants.asm" +INCLUDE "constants/sprite_anim_constants.asm" INCLUDE "constants/battle_constants.asm" INCLUDE "constants/palette_constants.asm" INCLUDE "constants/music_constants.asm" diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm new file mode 100755 index 0000000..b9ade3a --- /dev/null +++ b/constants/sprite_anim_constants.asm @@ -0,0 +1,40 @@ +; wSpriteAnimDict keys + const_def + const SPRITE_ANIM_DICT_DEFAULT ; 0 + const SPRITE_ANIM_DICT_GS_INTRO ; 1 + const SPRITE_ANIM_DICT_GS_INTRO_2 ; 2 + const_skip 2 ; unused + const SPRITE_ANIM_DICT_TEXT_CURSOR ; 5 + const SPRITE_ANIM_DICT_GS_SPLASH ; 6 + const SPRITE_ANIM_DICT_SLOTS ; 7 + const SPRITE_ANIM_DICT_ARROW_CURSOR ; 8 +; wSpriteAnimDict size (see ram/wram.asm) +NUM_SPRITEANIMDICT_ENTRIES EQU 10 + +; SpriteAnimSeqData indexes +SPRITE_ANIM_INDEX_08 EQU $08 + +SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE EQU $21 +SPRITE_ANIM_INDEX_GS_INTRO_OMANYTE EQU $22 +SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP EQU $23 +SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL EQU $24 +SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS EQU $25 +SPRITE_ANIM_INDEX_GS_INTRO_NOTE EQU $26 +SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE EQU $27 +SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF EQU $28 +SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU EQU $29 +SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL EQU $2a +SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL EQU $2b +SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE EQU $2c +SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR EQU $2d + +SPRITE_ANIM_INDEX_GS_TITLE_FLAME_NOTE EQU $2e + +SPRITE_ANIM_INDEX_39 EQU $39 +SPRITE_ANIM_INDEX_GAMEFREAK_LOGO EQU $3a +SPRITE_ANIM_INDEX_GS_INTRO_STAR EQU $3b +SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE EQU $3c +SPRITE_ANIM_INDEX_40 EQU $40 +SPRITE_ANIM_INDEX_41 EQU $41 +SPRITE_ANIM_INDEX_44 EQU $44 +SPRITE_ANIM_INDEX_4B EQU $4b diff --git a/engine/dumps/bank02.asm b/engine/dumps/bank02.asm index 86f11e6..aa9ec80 100755 --- a/engine/dumps/bank02.asm +++ b/engine/dumps/bank02.asm @@ -1151,7 +1151,7 @@ Function886a: lb bc, BANK(GoldSpriteGFX), $04 call Request2bpp depixel 0, 0 - ld a, $41 + ld a, SPRITE_ANIM_INDEX_41 call InitSpriteAnimStruct ld hl, $0003 add hl, bc @@ -1189,7 +1189,7 @@ Function88b3: lb bc, BANK(PidgeySpriteGFX), $04 call Request2bpp depixel 0, 0 - ld a, $41 + ld a, SPRITE_ANIM_INDEX_41 call InitSpriteAnimStruct ld hl, $0003 add hl, bc @@ -1444,7 +1444,7 @@ Function8c21: ld [hli], a ld [hl], $7c depixel 4, 3, 4, 4 - ld a, $44 + ld a, SPRITE_ANIM_INDEX_44 call InitSpriteAnimStruct call Function8c1c ret @@ -1569,7 +1569,7 @@ Function8cb7: call PrintText call WaitBGMap depixel 9, 4, 4, 3 - ld a, $44 + ld a, SPRITE_ANIM_INDEX_44 call InitSpriteAnimStruct ld hl, $0002 add hl, bc @@ -1578,7 +1578,7 @@ Function8cb7: add hl, bc ld [hl], $7c depixel 8, 6 - ld a, $4b + ld a, SPRITE_ANIM_INDEX_4B call InitSpriteAnimStruct ld hl, $0003 add hl, bc diff --git a/engine/menu/text_entry.asm b/engine/menu/text_entry.asm index 0c9bf75..f6700f2 100644 --- a/engine/menu/text_entry.asm +++ b/engine/menu/text_entry.asm @@ -148,7 +148,7 @@ GetNamingScreenSetup: ld [hl+], a ld [hl], $00 depixel 4, 4, 4, 0 - ld a, $41 + ld a, SPRITE_ANIM_INDEX_41 call InitSpriteAnimStruct ld hl, $0001 add hl, bc @@ -181,7 +181,7 @@ GetNamingScreenSetup: ld [hli], a ld [hl], $00 depixel 4, 4, 4, 0 - ld a, $41 + ld a, SPRITE_ANIM_INDEX_41 call InitSpriteAnimStruct ret @@ -302,7 +302,7 @@ NamingScreenJoypadLoop: .InitCursor: depixel 11, 3, 0, 0 - ld a, $39 + ld a, SPRITE_ANIM_INDEX_39 call InitSpriteAnimStruct ld a, c ld [wNamingScreenCursorObjectPointer], a @@ -729,13 +729,13 @@ ComposeMailMessage: ld [hli], a ld [hl], 0 depixel 4, 4, 4, 0 - ld a, 8 + ld a, SPRITE_ANIM_INDEX_08 call InitSpriteAnimStruct ld hl, $0002 add hl, bc ld [hl], 0 depixel 11, 3, 0, 0 - ld a, $39 + ld a, SPRITE_ANIM_INDEX_39 call InitSpriteAnimStruct ld a, c ld [wNamingScreenCursorObjectPointer], a @@ -946,13 +946,13 @@ SetupMail: ld [hli], a ld [hl], 0 depixel 4, 4, 4, 0 - ld a, 8 + ld a, SPRITE_ANIM_INDEX_08 call InitSpriteAnimStruct ld hl, $0002 add hl, bc ld [hl], 0 depixel 12, 3, 0, 0 - ld a, $40 + ld a, SPRITE_ANIM_INDEX_40 call InitSpriteAnimStruct ld a, c ld [wNamingScreenCursorObjectPointer], a diff --git a/engine/movie/game_freak_intro.asm b/engine/movie/game_freak_intro.asm index f3f888c..456197d 100644 --- a/engine/movie/game_freak_intro.asm +++ b/engine/movie/game_freak_intro.asm @@ -169,7 +169,7 @@ GameFreakPresents_Star: xor a ld [wIntroSceneFrameCounter], a depixel 10, 11, 4, 0 - ld a, $3b ; SPRITE_ANIM_INDEX_GS_INTRO_STAR + ld a, SPRITE_ANIM_INDEX_GS_INTRO_STAR call InitSpriteAnimStruct ld hl, $000c ; SPRITEANIMSTRUCT_VAR1 @@ -187,7 +187,7 @@ GameFreakPresents_PlaceLogo: ret z depixel 10, 11, 4, 0 - ld a, $3a ; SPRITE_ANIM_INDEX_GAMEFREAK_LOGO + ld a, SPRITE_ANIM_INDEX_GAMEFREAK_LOGO call InitSpriteAnimStruct call GameFreakPresents_NextScene @@ -293,7 +293,7 @@ GameFreakPresents_Sparkle: ; set up a new sparkle sprite push af depixel 11, 11 - ld a, $3c + ld a, SPRITE_ANIM_INDEX_GS_INTRO_SPARKLE call InitSpriteAnimStruct pop af diff --git a/engine/movie/opening_cutscene.asm b/engine/movie/opening_cutscene.asm index 49c4035..4b60625 100644 --- a/engine/movie/opening_cutscene.asm +++ b/engine/movie/opening_cutscene.asm @@ -123,9 +123,9 @@ IntroScene1: ; 43b8 jr nz, .draw_gfx ld hl, wSpriteAnimDict - ld a, $21 + ld a, SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE ld [hli], a - ld a, $00 + ld a, SPRITE_ANIM_DICT_DEFAULT ld [hli], a xor a @@ -357,7 +357,7 @@ Intro_InitBubble: ld e, [hl] inc hl ld d, [hl] - ld a, $21 ; SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE + ld a, SPRITE_ANIM_INDEX_GS_INTRO_BUBBLE call InitSpriteAnimStruct ret @@ -407,7 +407,7 @@ Intro_InitMagikarps: ret .PlaceMagikarp: - ld a, $23 ; SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP + ld a, SPRITE_ANIM_INDEX_GS_INTRO_MAGIKARP call InitSpriteAnimStruct ret @@ -420,7 +420,7 @@ Intro_InitOmanyte: ; fallback .PlaceOmanyte: - ld a, $22 ; SPRITE_ANIM_INDEX_GS_INTRO_SHELLDER + ld a, SPRITE_ANIM_INDEX_GS_INTRO_OMANYTE call InitSpriteAnimStruct ret @@ -429,13 +429,13 @@ Intro_InitLapras: and %00011111 ret nz depixel 16, 24 - ld a, $25 ; SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS + ld a, SPRITE_ANIM_INDEX_GS_INTRO_LAPRAS call InitSpriteAnimStruct ret Intro_UnusedInitAerodactyl: ; unreferenced depixel 2, 0 - ld a, $24 ; SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL + ld a, SPRITE_ANIM_INDEX_UNUSED_INTRO_AERODACTYL call InitSpriteAnimStruct ret @@ -634,9 +634,9 @@ IntroScene6: jr nz, .load ld hl, wSpriteAnimDict - ld a, $22 + ld a, SPRITE_ANIM_INDEX_GS_INTRO_OMANYTE ld [hli], a - ld a, $00 + ld a, SPRITE_ANIM_DICT_DEFAULT ld [hli], a xor a ldh [hSCY], a @@ -758,30 +758,30 @@ Intro_InitNote: jr z, .SmallerNote depixel 11, 6, 4, 0 - ld a, $26 ; SPRITE_ANIM_INDEX_GS_INTRO_NOTE + ld a, SPRITE_ANIM_INDEX_GS_INTRO_NOTE call InitSpriteAnimStruct ret .SmallerNote: depixel 10, 6, 4, 0 - ld a, $27 ; SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE + ld a, SPRITE_ANIM_INDEX_GS_INTRO_SMALLER_NOTE call InitSpriteAnimStruct ret Intro_InitJigglypuff: depixel 14, 6 - ld a, $28 ; SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF + ld a, SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF call InitSpriteAnimStruct ret Intro_InitPikachu: depixel 14, 24 - ld a, $29 ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU + ld a, SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU call InitSpriteAnimStruct depixel 14, 24 - ld a, $2a ; SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL + ld a, SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU_TAIL call InitSpriteAnimStruct ret @@ -812,9 +812,9 @@ IntroScene10: call Request2bpp ld hl, wSpriteAnimDict - ld a, $22 ; SPRITE_ANIM_DICT_GS_INTRO + ld a, SPRITE_ANIM_INDEX_GS_INTRO_OMANYTE ld [hli], a - ld a, $00 + ld a, SPRITE_ANIM_DICT_DEFAULT ld [hli], a ld a, 0 @@ -1129,7 +1129,7 @@ Intro_AnimateFireball: and 3 ret nz depixel 12, 10, 4, 4 - ld a, $2b ; SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL + ld a, SPRITE_ANIM_INDEX_GS_INTRO_FIREBALL call InitSpriteAnimStruct ld hl, hSCX dec [hl] @@ -1139,13 +1139,13 @@ Intro_AnimateFireball: Intro_LoadBlastoiseObject: depixel 22, 1 - ld a, $2c ; SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE + ld a, SPRITE_ANIM_INDEX_GS_INTRO_BLASTOISE call InitSpriteAnimStruct ret Intro_LoadVenusaurObject: depixel 22, 20 - ld a, $2d ; SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR + ld a, SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR call InitSpriteAnimStruct ret diff --git a/engine/movie/title.asm b/engine/movie/title.asm index 23baa2f..d84d8c5 100644 --- a/engine/movie/title.asm +++ b/engine/movie/title.asm @@ -152,7 +152,7 @@ TitleSequenceInit:: ld d, [hl] inc hl push hl - ld a, $2E ; Title fire/note object effect type? + ld a, SPRITE_ANIM_INDEX_GS_TITLE_FLAME_NOTE call InitSpriteAnimStruct pop hl pop bc -- cgit v1.2.3 From a5cc084ca33932b902369bbe477b58ae07f4506f Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Fri, 11 Dec 2020 11:19:32 +0700 Subject: Begin disassembly of Pikachu minigame (auto-generated) --- engine/games/pikachu_minigame.asm | 1334 +++++++++++++++++++++++++++++++++++++ layout.link | 1 + shim.sym | 2 - 3 files changed, 1335 insertions(+), 2 deletions(-) create mode 100644 engine/games/pikachu_minigame.asm diff --git a/engine/games/pikachu_minigame.asm b/engine/games/pikachu_minigame.asm new file mode 100644 index 0000000..c186320 --- /dev/null +++ b/engine/games/pikachu_minigame.asm @@ -0,0 +1,1334 @@ +INCLUDE "constants.asm" + +SECTION "engine/games/pikachu_minigame.asm@Pikachu Minigame", ROMX + +PikachuMiniGame:: + ld a, HIGH(vBGMap1) + ldh [hBGMapAddress + 1], a + call .Init + call DelayFrame +.loop + call PikachuMiniGame_RunFrame + jr nc, .loop + + ld a, HIGH(vBGMap0) + ldh [hBGMapAddress + 1], a + ld de, MUSIC_NONE + call PlayMusic + ret + + +.Init: + call DisableLCD + ld b, SGB_BETA_PIKACHU_MINIGAME + call GetSGBLayout + + callab InitEffectObject + + call PikachuMiniGame_ClearBothTilemaps + ld hl, $5def + ld de, vChars2 + ld bc, $0800 + ld a, $39 + call FarCopyData + ld hl, $626f + ld de, vChars0 + +Jump_038_4041: + ld bc, $0900 + ld a, $39 + call FarCopyData + ld a, $42 + ld [$c625], a + ld a, $48 + ld [$c626], a + ld hl, vBGMap0 + ld a, l + ld [$c621], a + ld a, h + ld [$c622], a + ld de, $47b2 + ld a, e + ld [$c623], a + ld a, d + ld [$c624], a + call Call_038_4197 + ld hl, wSpriteAnimDict + ld a, $22 + ld [hli], a + ld a, $00 + ld [hli], a + call Call_038_4126 + xor a + ldh [hSCY], a + ld [wc4c7], a + ldh [hSCX], a + ld [wc4c8], a + ld [$c620], a + ld [$c617], a + ld [$c609], a + ld [$c60a], a + ld [$c60b], a + ld [$c60c], a + ld [$c611], a + ld [$c612], a + ld [$c613], a + ld [$c614], a + ld [$c608], a + ld [$c60d], a + ld [$c60e], a + ld [$c615], a + ld [$c618], a + ld [$c619], a + ld [$c61a], a + ld [$c61d], a + ld [$c61e], a + ld a, $9e + ld [$c61b], a + ld a, $47 + ld [$c61c], a + ld a, $7c + ldh [hWY], a + ld a, $e3 + ldh [rLCDC], a + ld a, [wSGB] + and a + jr nz, jr_038_40de + + ld a, $94 + ldh [rBGP], a + ld a, $e4 + ldh [rOBP0], a + jr jr_038_40e4 + +jr_038_40de: + ld a, $e4 + ldh [rBGP], a + ldh [rOBP0], a + +jr_038_40e4: + ld de, $7058 + ld a, $2f + call InitSpriteAnimStruct + ld a, c + ld [wLYOverrides], a + ld a, b + ld [$c601], a + ld de, $7058 + ld a, $30 + call InitSpriteAnimStruct + ld a, c + ld [$c602], a + ld a, b + ld [$c603], a + ret + + +PikachuMiniGame_ClearBothTilemaps: + ld hl, vBGMap1 + ld bc, $0280 + +jr_038_410b: + ld [hl], $00 + inc hl + dec bc + ld a, b + or c + jr nz, jr_038_410b + + ld hl, wVirtualOAMEnd + ld bc, VBlank.return + +jr_038_4119: + ld [hl], $00 + inc hl + dec bc + ld a, b + or c + jr nz, jr_038_4119 + + ld a, $07 + ldh [hWX], a + ret + + +Call_038_4126: + ld hl, $4362 + ld de, $8900 + ld bc, $0380 + ld a, $3e + call FarCopyDataDouble + ld hl, $46f2 + ld de, $9320 + ld bc, $0080 + ld a, $3e + call FarCopyDataDouble + ret + + +Call_038_4143: + ldh a, [hSCX] + ld d, a + and $7f + ret nz + + bit 7, d + jr nz, jr_038_4160 + + xor a + ld hl, $c2a5 + ld [hl], a + ld hl, $c2ad + ld [hl], a + ld hl, $c2b5 + ld c, $0f + +jr_038_415b: + ld [hli], a + dec c + jr nz, jr_038_415b + + ret + + +jr_038_4160: + ld de, $c2b5 + ld hl, $417b + +jr_038_4166: + ld a, [hli] + and a + jr z, jr_038_4170 + + add $10 + ld [de], a + inc de + jr jr_038_4166 + +jr_038_4170: + ld a, $f5 + ld hl, $c2a5 + ld [hl], a + ld hl, $c2ad + ld [hl], a + ret + + + db $8c, $8f, $e3, $93, $9c, $8f, $ab, $ed, $8f, $81, $93, $a6, $b6, $d2, $de, $00 + + ld bc, $0800 + +jr_038_418e: + ld a, [de] + inc de + ld [hli], a + dec bc + ld a, c + or b + jr nz, jr_038_418e + + ret + + +Call_038_4197: + ld b, $10 + +jr_038_4199: + push hl + ld c, $10 + +jr_038_419c: + call Call_038_41ad + dec c + jr nz, jr_038_419c + + pop hl + push bc + ld bc, $0040 + add hl, bc + pop bc + dec b + jr nz, jr_038_4199 + + ret + + +Call_038_41ad: + push bc + push de + push hl + push hl + push hl + ld a, [de] + ld l, a + ld h, $00 + ld a, [$c625] + ld e, a + ld a, [$c626] + ld d, a + add hl, hl + add hl, hl + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop hl + ld bc, $0020 + add hl, bc + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop hl + inc hl + inc hl + pop de + inc de + pop bc + ret + + +PikachuMiniGame_RunFrame: + call GetJoypad + ld hl, hJoyState + ld a, [hl] + and $08 + jr nz, jr_038_4224 + + ld a, [$c620] + bit 7, a + jr nz, jr_038_4224 + + ld a, [$c610] + and a + jr z, jr_038_41fe + + xor a + ld [$c610], a + ld de, $0030 + call PlaySFX + +jr_038_41fe: + call Call_038_42ee + +Jump_038_4201: + ld a, $23 + ld hl, $4d13 + call FarCall_hl + ld a, $01 + ldh [hBGMapMode], a + call Call_038_4616 + call Call_038_4262 + ld de, $c2c6 + ld hl, $c609 + call Call_038_4293 + call Call_038_4143 + call DelayFrame + and a + ret + + +jr_038_4224: + ld hl, $4cfd + ld a, $23 + call FarCall_hl + ld hl, wVirtualOAM + ld c, $a0 + xor a + +jr_038_4232: + ld [hli], a + dec c + jr nz, jr_038_4232 + + call DelayFrame + xor a + ldh [hSCX], a + ldh [hSCY], a + ld a, $90 + ldh [hWY], a + scf + ret + + +Call_038_4244: + ld hl, $c611 + ld a, [hl] + add $01 + daa + ld [hl], a + cp $60 + ret c + + ld [hl], $00 + ld hl, $c612 + ld a, [hl] + add $01 + daa + ld [hl], a + cp $60 + ret c + + ld a, $02 + ld [$c620], a + ret + + +Call_038_4262: + ldh a, [hSCX] + ld e, a + and $07 + ret nz + + ld a, $48 + add e + and $f8 + ld e, a + srl e + srl e + srl e + ld d, $00 + ld hl, $9900 + add hl, de + ld de, $c627 + ld a, e + ld [wVBCopyDst], a + ld a, d + ld [$cb66], a + ld a, l + ld [wVBCopySrc], a + ld a, h + ld [$cb64], a + ld a, $01 + ld [wVBCopySize], a + ret + + +Call_038_4293: + push hl + push de + push bc + ld c, [hl] + inc hl + ld b, [hl] + ld l, e + ld h, d + ld a, b + swap a + and $0f + jr nz, jr_038_42d0 + + ld a, b + and $0f + jr nz, jr_038_42c0 + + ld a, c + swap a + and $0f + jr nz, jr_038_42b4 + + ld a, c + call Call_038_42e8 + jr jr_038_42e4 + +jr_038_42b4: + ld a, c + call Call_038_42e8 + ld a, c + swap a + call Call_038_42e8 + jr jr_038_42e4 + +jr_038_42c0: + ld a, c + call Call_038_42e8 + ld a, c + swap a + call Call_038_42e8 + ld a, b + call Call_038_42e8 + jr jr_038_42e4 + +jr_038_42d0: + ld a, c + call Call_038_42e8 + ld a, c + swap a + call Call_038_42e8 + ld a, b + call Call_038_42e8 + ld a, b + swap a + call Call_038_42e8 + +jr_038_42e4: + pop bc + pop de + pop hl + ret + + +Call_038_42e8: + and $0f + add $36 + ld [hld], a + ret + + +Call_038_42ee: + ld a, [$c620] + ld e, a + ld d, $00 + ld hl, $42fd + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + + + db $09, $43, $89, $43, $18, $43, $21, $43 + + ld l, $43 + + db $3e, $43 + + ld a, $04 + ld [$c617], a + ld a, $31 + ld [$c605], a + ld hl, $c620 + inc [hl] + ret + + + ld a, $40 + ld [$c61f], a + ld hl, $c620 + inc [hl] + ld hl, $c61f + ld a, [hl] + and a + jr z, jr_038_432a + + dec [hl] + ret + + +jr_038_432a: + ld hl, $c620 + inc [hl] + ld de, $70c0 + ld a, $32 + call InitSpriteAnimStruct + xor a + ld [$c61f], a + ld hl, $c620 + inc [hl] + ld a, [$c617] + and a + ret nz + + ld a, [$c61f] + srl a + srl a + srl a + srl a + ld e, a + ld d, $00 + ld hl, $4377 + add hl, de + ld a, [hl] + cp $ff + jr z, jr_038_4371 + + ldh [rBGP], a + ld hl, $4380 + add hl, de + ld a, [wSGB] + and a + jr z, jr_038_4369 + + ld a, [hl] + ldh [rBGP], a + +jr_038_4369: + ld a, [hl] + ldh [rOBP0], a + ld hl, $c61f + inc [hl] + ret + + +jr_038_4371: + ld hl, $c620 + set 7, [hl] + ret + + + db $94, $94, $94, $94, $94, $50, $40, $00, $ff, $e4, $e4, $e4, $e4, $e4, $90, $40 + db $00 + + rst $38 + + call Call_038_4244 + ldh a, [hSCX] + and $20 + ld hl, $c608 + cp [hl] + jr nz, jr_038_4397 + + ret + + +jr_038_4397: + ld a, [hl] + xor $20 + ld [hl], a + call Call_038_43d0 + jr c, jr_038_43cb + + call Call_038_43f4 + ret c + + ldh a, [hSCX] + and $1f + ld e, a + ld a, $00 + sub e + ld e, a + ld a, $03 + ld [$c4bc], a + ld a, $31 + call InitSpriteAnimStruct + ld hl, $c60b + ld e, [hl] + inc hl + ld d, [hl] + ld a, $01 + add e + daa + ld e, a + ld a, d + adc $00 + daa + ld d, a + ld [hl], d + dec hl + ld [hl], e + ret + + +jr_038_43cb: + ld hl, $c620 + inc [hl] + ret + + +Call_038_43d0: + ld a, [$c60d] + ld l, a + ld h, $00 + ld de, $43e5 + add hl, de + ld a, [hl] + cp $ff + jr nz, jr_038_43e3 + + xor a + ld [$c60d], a + +jr_038_43e3: + and a + ret + + + db $00, $01, $02, $03, $04, $05, $06, $00, $01, $02, $03, $04, $05, $06, $ff + +Call_038_43f4: + ld l, a + ld h, $00 + add hl, hl + add hl, hl + add hl, hl + ld de, $441f + add hl, de + ld a, [$c60e] + and $07 + ld e, a + inc a + cp $08 + jr c, jr_038_440f + + push hl + ld hl, $c60d + inc [hl] + pop hl + +jr_038_440f: + ld [$c60e], a + ld d, $00 + add hl, de + ld a, [hl] + cp $ff + jr z, jr_038_441d + + ld d, a + and a + ret + + +jr_038_441d: + scf + ret + + + db $70, $60, $50, $48, $48, $48, $48, $38, $28, $20, $28, $ff, $ff, $ff, $48, $48 + db $70, $70, $ff, $58, $ff, $ff, $48, $38, $28, $20, $28, $38, $48, $ff, $ff, $ff + db $70, $70, $70, $70, $60, $50, $48, $38, $ff, $28, $30, $38, $48, $48, $48, $48 + db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff + + ld a, [wLYOverrides] + ld c, a + ld a, [$c601] + ld b, a + call Call_038_459c + call Call_038_44df + ld hl, $000b + add hl, bc + ld e, [hl] + ld d, $00 + ld hl, $4475 + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + + + db $7d, $44, $89, $44, $b4, $44, $d6, $44 + + ld hl, $000b + add hl, bc + ld [hl], $01 + ld a, $02 + ld [$c604], a + ret + + + ldh a, [hJoyState] + ld hl, $c605 + and [hl] + ld d, a + and $01 + jr nz, jr_038_449f + + ld a, [$c617] + and a + ret nz + + ld a, $01 + ld [$c604], a + ret + + +jr_038_449f: + ld hl, $000b + add hl, bc + inc [hl] + ld a, $40 + ld [$c607], a + ld a, $03 + ld [$c604], a + ld a, $10 + ld [$c606], a + ret + + + ld hl, $c607 + ld a, [hl] + cp $20 + jr c, jr_038_44cf + + dec [hl] + ld d, $30 + ld e, a + ld a, $33 + ld hl, $625d + call FarCall_hl + ld a, e + ld hl, $0007 + add hl, bc + ld [hl], a + ret + + +jr_038_44cf: + ld hl, $000b + add hl, bc + ld [hl], $03 + ret + + + ld hl, $0005 + add hl, bc + inc [hl] + inc [hl] + inc [hl] + inc [hl] + ret + + +Call_038_44df: + xor a + ld [$c60f], a + ld hl, $0005 + add hl, bc + ld a, [hl] + ld hl, $0007 + add hl, bc + add [hl] + add $10 + ld e, a + sub $20 + ld d, a + push bc + ld bc, $c41c + ld a, $0a + +jr_038_44f9: + push af + push de + ld hl, $0000 + add hl, bc + +Jump_038_44ff: + ld a, [hl] + and a + jr z, jr_038_450f + + ld hl, $0001 + add hl, bc + ld a, [hl] + cp $07 + jr nz, jr_038_450f + + call Call_038_451f + +jr_038_450f: + ld hl, $0010 + add hl, bc + ld c, l + ld b, h + pop de + pop af + dec a + jr nz, jr_038_44f9 + + pop bc + call Call_038_4544 + ret + + +Call_038_451f: + ld a, $48 + ld hl, $0004 + add hl, bc + cp [hl] + ret nc + + ld a, $68 + cp [hl] + ret c + + ld a, d + ld hl, $0005 + add hl, bc + cp [hl] + ret nc + + ld a, e + cp [hl] + ret c + + ld a, $01 + ld [$c610], a + ld hl, $000b + add hl, bc + inc [hl] + ld hl, $c60f + inc [hl] + ret + + +Call_038_4544: + ld hl, $c609 + ld e, [hl] + inc hl + ld d, [hl] + ld a, [$c60f] + add e + daa + ld e, a + ld a, d + adc $00 + daa + ld d, a + ld [hl], d + dec hl + ld [hl], e + ret + + + ld a, [wLYOverrides] + ld e, a + ld a, [$c601] + ld d, a + ld a, [$c602] + ld c, a + ld a, [$c603] + ld b, a + ld hl, $0009 + add hl, de + ld a, [hl] + ld hl, $0009 + add hl, bc + ld [hl], a + ld hl, $0005 + add hl, de + ld a, [hl] + ld hl, $0005 + add hl, bc + ld [hl], a + ld hl, $0007 + add hl, de + ld a, [hl] + ld hl, $0007 + add hl, bc + ld [hl], a + ld hl, $0004 + add hl, de + ld a, [hl] + ld hl, $0004 + add hl, bc + ld [hl], a + ld hl, $0006 + add hl, de + ld a, [hl] + ld hl, $0006 + add hl, bc + ld [hl], a + ret + + +Call_038_459c: + ld hl, $0007 + add hl, bc + ld a, [hl] + ld hl, $0005 + add hl, bc + add [hl] + ld d, a + ld hl, $000b + add hl, bc + ld a, [hl] + cp $02 + jr z, jr_038_45c3 + + cp $03 + jr z, jr_038_45e3 + + ld a, d + cp $70 + ret z + + call Call_038_4602 + ret nz + + ld hl, $000b + add hl, bc + ld [hl], $03 + ret + + +jr_038_45c3: + ld a, [$c607] + cp $3e + ret nc + + call Call_038_4602 + ret z + + ld hl, $000b + add hl, bc + ld [hl], $00 + ld hl, $0007 + add hl, bc + ld a, [hl] + ld [hl], $00 + ld hl, $0005 + add hl, bc + add [hl] + and $f8 + ld [hl], a + ret + + +jr_038_45e3: + ld a, d + cp $70 + jr z, jr_038_45ec + + call Call_038_4602 + ret z + +jr_038_45ec: + ld hl, $000b + add hl, bc + ld [hl], $00 + ld hl, $0007 + add hl, bc + ld a, [hl] + ld [hl], $00 + ld hl, $0005 + add hl, bc + add [hl] + and $f8 + ld [hl], a + ret + + +Call_038_4602: + ld a, d + cp $40 + jr z, jr_038_4609 + + xor a + ret + + +jr_038_4609: + ld hl, $c627 + ld a, $16 + cp [hl] + ret nz + + inc hl + cp [hl] + ret nz + + inc hl + cp [hl] + ret + + +Call_038_4616: + ld hl, $c617 + ldh a, [hSCX] + sub [hl] + ldh [hSCX], a + and $10 + ld hl, $c615 + cp [hl] + jr nz, jr_038_4627 + + ret + + +jr_038_4627: + ld a, [hl] + xor $10 + ld [hl], a + xor a + ldh [hBGMapMode], a + call Call_038_464d + ldh a, [hSCX] + and $f0 + srl a + srl a + srl a + ld e, a + ld d, $00 + ld hl, vBGMap0 + add hl, de + ld a, l + ldh [hRedrawRowOrColumnDest], a + ld a, h + ldh [$ffe7], a + ld a, $01 + ldh [hRedrawRowOrColumnMode], a + ret + + +Call_038_464d: + call Call_038_46b4 + ret nc + + ld l, a + ld h, $00 + add hl, hl + add hl, hl + add hl, hl + ld de, $4661 + add hl, de + ld e, l + ld d, h + call Call_038_4681 + ret + + + db $05, $0d, $02, $09, $14, $14, $14, $0b, $04, $0c, $02, $08, $14, $14, $14, $0b + db $05, $0d, $02, $09, $15, $14, $14, $0b, $04, $0c, $02, $08, $15, $14, $14, $0b + +Call_038_4681: + push de + ld hl, wRedrawFlashlightDst0 + ld c, $08 + +jr_038_4687: + ld a, [de] + call Call_038_4691 + inc de + dec c + jr nz, jr_038_4687 + + pop de + ret + + +Call_038_4691: + push bc + push de + push hl + ld l, a + ld h, $00 + ld a, [$c625] + ld e, a + ld a, [$c626] + ld d, a + add hl, hl + add hl, hl + add hl, de + ld e, l + ld d, h + pop hl + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + ld a, [de] + inc de + ld [hli], a + pop de + pop bc + ret + + +Call_038_46b4: +jr_038_46b4: + call Call_038_478e + cp $f0 + ret c + + call Call_038_46bf + jr jr_038_46b4 + +Call_038_46bf: + sub $f0 + ld e, a + ld d, $00 + ld hl, $46cd + add hl, de + add hl, de + ld a, [hli] + ld h, [hl] + ld l, a + jp hl + + + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + db $ed + ld b, [hl] + ld e, h + ld b, a + ld h, e + ld b, a + ld l, b + ld b, a + + db $1e, $47 + + dec hl + ld b, a + nop + ld b, a + xor $46 + ret + + + ld hl, $c618 + res 0, [hl] + ld hl, $c619 + ld e, [hl] + inc hl + ld d, [hl] + ld hl, $c61b + ld [hl], e + inc hl + ld [hl], d + ret + + + call Call_038_478e + ld e, a + call Call_038_478e + ld hl, $c61b + ld c, [hl] + inc hl + ld b, [hl] + ld hl, $c619 + ld [hl], c + inc hl + ld [hl], b + ld hl, $c61c + ld [hld], a + ld [hl], e + ld hl, $c618 + set 0, [hl] + ret + + + call Call_038_478e + ld e, a + call Call_038_478e + ld hl, $c61c + ld [hld], a + ld [hl], e + ret + + + call Call_038_478e + ld hl, $c618 + bit 1, [hl] + jr nz, jr_038_473e + + and a + jr z, jr_038_4746 + + dec a + ld [$c61d], a + set 1, [hl] + +jr_038_473e: + ld hl, $c61d + ld a, [hl] + and a + jr z, jr_038_4753 + + dec [hl] + +jr_038_4746: + call Call_038_478e + ld e, a + call Call_038_478e + ld hl, $c61c + ld [hld], a + ld [hl], e + ret + + +jr_038_4753: + ld hl, $c618 + res 2, [hl] + call Call_038_4782 + ret + + + + call Call_038_478e + ld [$c61e], a + ret + + + ld hl, $c61e + inc [hl] + ret + + + call Call_038_478e + ld hl, $c61e + cp [hl] + jr z, jr_038_4775 + + call Call_038_4782 + ret + + +jr_038_4775: + call Call_038_478e + ld e, a + call Call_038_478e + ld hl, $c61c + ld [hld], a + ld [hl], e + ret + + +Call_038_4782: + ld hl, $c61b + ld e, [hl] + inc hl + ld d, [hl] + inc de + inc de + ld [hl], d + dec hl + ld [hl], e + ret + + +Call_038_478e: + push hl + push de + ld hl, $c61b + ld e, [hl] + inc hl + ld d, [hl] + ld a, [de] + inc de + ld [hl], d + dec hl + ld [hl], e + pop de + pop hl + ret diff --git a/layout.link b/layout.link index 0a298c0..d2bf1f1 100644 --- a/layout.link +++ b/layout.link @@ -884,6 +884,7 @@ ROMX $37 ROMX $38 org $4000 + "engine/games/pikachu_minigame.asm@Pikachu Minigame" org $5403 "gfx.asm@Poker GFX" org $5f93 diff --git a/shim.sym b/shim.sym index 237f5e3..63e4f3f 100755 --- a/shim.sym +++ b/shim.sym @@ -151,8 +151,6 @@ 33:625D BattleAnim_Sine_e 33:6263 BattleAnim_Cosine_e -38:4000 PikachuMiniGame - 3A:441D Functione841d 3A:45D8 Functione85d8 3A:47F9 Functione87f9 -- cgit v1.2.3 From 87ae0e358884f4156f9e5afd2e836c9b19041364 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Fri, 11 Dec 2020 17:05:58 +0700 Subject: Start labelling Pikachu minigame --- constants/sprite_anim_constants.asm | 3 + engine/games/pikachu_minigame.asm | 477 +++++++++++++++++++----------------- ram/wram.asm | 63 ++++- 3 files changed, 322 insertions(+), 221 deletions(-) diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index b9ade3a..53ad260 100755 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -30,6 +30,9 @@ SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR EQU $2d SPRITE_ANIM_INDEX_GS_TITLE_FLAME_NOTE EQU $2e +SPRITE_ANIM_INDEX_2F EQU $2f +SPRITE_ANIM_INDEX_30 EQU $30 + SPRITE_ANIM_INDEX_39 EQU $39 SPRITE_ANIM_INDEX_GAMEFREAK_LOGO EQU $3a SPRITE_ANIM_INDEX_GS_INTRO_STAR EQU $3b diff --git a/engine/games/pikachu_minigame.asm b/engine/games/pikachu_minigame.asm index c186320..d90af87 100644 --- a/engine/games/pikachu_minigame.asm +++ b/engine/games/pikachu_minigame.asm @@ -26,52 +26,57 @@ PikachuMiniGame:: callab InitEffectObject call PikachuMiniGame_ClearBothTilemaps - ld hl, $5def + + ld hl, IntroForestGFX ld de, vChars2 - ld bc, $0800 - ld a, $39 + ld bc, $80 tiles + ld a, BANK(IntroForestGFX) call FarCopyData - ld hl, $626f - ld de, vChars0 -Jump_038_4041: - ld bc, $0900 - ld a, $39 + ld hl, IntroJigglypuffPikachuGFX + ld de, vChars0 + ld bc, $90 tiles + ld a, BANK(IntroJigglypuffPikachuGFX) call FarCopyData - ld a, $42 + + ld a, LOW($4842) ld [$c625], a - ld a, $48 - ld [$c626], a + ld a, HIGH($4842) ; XXX + ld [$c626], a ; subroutine pointer? + ld hl, vBGMap0 ld a, l - ld [$c621], a + ld [wPikachuMinigameBGMapPointer], a ld a, h - ld [$c622], a - ld de, $47b2 + ld [wPikachuMinigameBGMapPointer + 1], a ; bgmap pointer? + + ld de, $47b2 ; XXX ld a, e ld [$c623], a ld a, d ld [$c624], a call Call_038_4197 + ld hl, wSpriteAnimDict - ld a, $22 + ld a, $22 ; anim dict values? ld [hli], a - ld a, $00 + ld a, SPRITE_ANIM_DICT_DEFAULT ld [hli], a - call Call_038_4126 + call PikachuMiniGame_LoadFont + xor a ldh [hSCY], a ld [wc4c7], a ldh [hSCX], a ld [wc4c8], a - ld [$c620], a - ld [$c617], a - ld [$c609], a - ld [$c60a], a + ld [wPikachuMinigameJumptableIndex], a + ld [wPikachuMinigameScrollSpeed], a + ld [wPikachuMinigameScore], a + ld [wPikachuMinigameScore + 1], a ld [$c60b], a ld [$c60c], a - ld [$c611], a - ld [$c612], a + ld [wPikachuMinigameTimeFrames], a + ld [wPikachuMinigameTimeSeconds], a ld [$c613], a ld [$c614], a ld [$c608], a @@ -83,40 +88,48 @@ Jump_038_4041: ld [$c61a], a ld [$c61d], a ld [$c61e], a - ld a, $9e + + ld a, LOW($479e) ; XXX ld [$c61b], a - ld a, $47 + ld a, HIGH($479e) ; XXX ld [$c61c], a + ld a, $7c ldh [hWY], a + ld a, $e3 ldh [rLCDC], a + ld a, [wSGB] and a - jr nz, jr_038_40de + jr nz, .not_sgb - ld a, $94 + ld a, %10010100 ldh [rBGP], a - ld a, $e4 + ld a, %11100100 ldh [rOBP0], a - jr jr_038_40e4 + jr .next -jr_038_40de: - ld a, $e4 +.not_sgb +; Normal palette if on GB / GBC + ld a, %11100100 ldh [rBGP], a ldh [rOBP0], a -jr_038_40e4: +.next ld de, $7058 - ld a, $2f + ld a, SPRITE_ANIM_INDEX_2F call InitSpriteAnimStruct + ld a, c ld [wLYOverrides], a ld a, b ld [$c601], a + ld de, $7058 - ld a, $30 + ld a, SPRITE_ANIM_INDEX_30 call InitSpriteAnimStruct + ld a, c ld [$c602], a ld a, b @@ -127,97 +140,103 @@ jr_038_40e4: PikachuMiniGame_ClearBothTilemaps: ld hl, vBGMap1 ld bc, $0280 - -jr_038_410b: - ld [hl], $00 +.clear_bgmap + ld [hl], 0 inc hl dec bc ld a, b or c - jr nz, jr_038_410b - - ld hl, wVirtualOAMEnd - ld bc, VBlank.return + jr nz, .clear_bgmap -jr_038_4119: - ld [hl], $00 + ld hl, wTileMap + ld bc, $0168 +.clear_tilemap + ld [hl], 0 inc hl dec bc ld a, b or c - jr nz, jr_038_4119 + jr nz, .clear_tilemap - ld a, $07 + ld a, 7 ldh [hWX], a ret -Call_038_4126: - ld hl, $4362 - ld de, $8900 - ld bc, $0380 - ld a, $3e +PikachuMiniGame_LoadFont: + ld hl, FontGFX + ld de, vFont tile $10 + ld bc, (112 / 2) tiles + ld a, BANK(FontGFX) call FarCopyDataDouble - ld hl, $46f2 - ld de, $9320 - ld bc, $0080 - ld a, $3e + + ld hl, FontGFX tile $39 + ld de, vChars2 tile $32 + ld bc, ( (14 / 2) + 1) tiles + ld a, BANK(FontGFX) call FarCopyDataDouble ret -Call_038_4143: +PikachuMiniGame_BlinkText: +; Blink the window text according to the current X scroll position. +; 00 - 7f = hide text +; 80 - ff = show text + ldh a, [hSCX] ld d, a and $7f ret nz - bit 7, d - jr nz, jr_038_4160 + jr nz, .DisplayText +; clear dakutens xor a - ld hl, $c2a5 + hlcoord 5, 0 ld [hl], a - ld hl, $c2ad + hlcoord 13, 0 ld [hl], a - ld hl, $c2b5 - ld c, $0f -jr_038_415b: +; clear text + hlcoord 1, 1 + ld c, 15 +.text_clear ld [hli], a dec c - jr nz, jr_038_415b - + jr nz, .text_clear ret - -jr_038_4160: - ld de, $c2b5 - ld hl, $417b - -jr_038_4166: +.DisplayText: + decoord 1, 1 + ld hl, .text +.render_text ld a, [hli] and a - jr z, jr_038_4170 + jr z, .render_dakutens - add $10 + add $10 ; tiles are shifted ld [de], a inc de - jr jr_038_4166 + jr .render_text + +.render_dakutens +; Render dakuten marks separately + ld a, "゙" + $10 -jr_038_4170: - ld a, $f5 - ld hl, $c2a5 + hlcoord 5, 0 ld [hl], a - ld hl, $c2ad + + hlcoord 13, 0 ld [hl], a ret +.text + db "スタートホタン▶タイトルかめん" + ; "スタートボタン▶タイトルがめん" + db 0 ; terminator - db $8c, $8f, $e3, $93, $9c, $8f, $ab, $ed, $8f, $81, $93, $a6, $b6, $d2, $de, $00 - +Func418b: ld bc, $0800 - jr_038_418e: ld a, [de] inc de @@ -300,89 +319,90 @@ PikachuMiniGame_RunFrame: call GetJoypad ld hl, hJoyState ld a, [hl] - and $08 - jr nz, jr_038_4224 + and %00001000 ; Start button + jr nz, .Done - ld a, [$c620] + ld a, [wPikachuMinigameJumptableIndex] bit 7, a - jr nz, jr_038_4224 + jr nz, .Done - ld a, [$c610] + ld a, [wPikachuMinigameNoteCaught] and a - jr z, jr_038_41fe + jr z, .skip_playing_sfx xor a - ld [$c610], a - ld de, $0030 + ld [wPikachuMinigameNoteCaught], a + ld de, $30 ; PAY_DAY call PlaySFX -jr_038_41fe: - call Call_038_42ee +.skip_playing_sfx + call PikachuMiniGame_PerformGameFunction + callba EffectObjectJumpNoDelay -Jump_038_4201: - ld a, $23 - ld hl, $4d13 - call FarCall_hl - ld a, $01 + ld a, 1 ldh [hBGMapMode], a - call Call_038_4616 - call Call_038_4262 - ld de, $c2c6 - ld hl, $c609 - call Call_038_4293 - call Call_038_4143 + + call PikachuMiniGame_ScrollScene + call PikachuMiniGame_ReloadCollisions + + decoord 18, 1 ; last digit + ld hl, wPikachuMinigameScore + call PikachuMiniGame_PrintBCD + + call PikachuMiniGame_BlinkText + call DelayFrame and a ret +.Done: + callab InitEffectObject -jr_038_4224: - ld hl, $4cfd - ld a, $23 - call FarCall_hl ld hl, wVirtualOAM ld c, $a0 xor a - -jr_038_4232: +.clear_oam ld [hli], a dec c - jr nz, jr_038_4232 + jr nz, .clear_oam call DelayFrame + xor a ldh [hSCX], a ldh [hSCY], a - ld a, $90 + + ld a, 144 ldh [hWY], a scf ret -Call_038_4244: - ld hl, $c611 +PikachuMiniGame_RunTimer: + ld hl, wPikachuMinigameTimeFrames ld a, [hl] - add $01 + add 1 daa ld [hl], a - cp $60 + cp $60 ; 1 second = 60 frames ret c - ld [hl], $00 - ld hl, $c612 + ld [hl], 0 ; reset frame counter + ld hl, wPikachuMinigameTimeSeconds ld a, [hl] - add $01 + add 1 daa ld [hl], a - cp $60 + cp $60 ; 1 minute ret c +; end game here ld a, $02 - ld [$c620], a + ld [wPikachuMinigameJumptableIndex], a ret -Call_038_4262: +PikachuMiniGame_ReloadCollisions: ldh a, [hSCX] ld e, a and $07 @@ -412,194 +432,214 @@ Call_038_4262: ret -Call_038_4293: +PikachuMiniGame_PrintBCD: +; Print the BCD number in HL to DE, least-significant +; digit first. + push hl push de push bc + ld c, [hl] inc hl ld b, [hl] + ld l, e ld h, d + ld a, b swap a - and $0f - jr nz, jr_038_42d0 + and %00001111 ; in the thousandths range? + jr nz, .four_digits ld a, b - and $0f - jr nz, jr_038_42c0 + and %00001111 ; in the hundreds range? + jr nz, .three_digits ld a, c swap a - and $0f - jr nz, jr_038_42b4 + and %00001111 ; in the tens range? + jr nz, .two_digits +; got one digit ld a, c - call Call_038_42e8 - jr jr_038_42e4 + call .PlaceDigit + jr .finished -jr_038_42b4: +.two_digits ld a, c - call Call_038_42e8 + call .PlaceDigit ld a, c swap a - call Call_038_42e8 - jr jr_038_42e4 + call .PlaceDigit + jr .finished -jr_038_42c0: +.three_digits ld a, c - call Call_038_42e8 + call .PlaceDigit ld a, c swap a - call Call_038_42e8 + call .PlaceDigit ld a, b - call Call_038_42e8 - jr jr_038_42e4 + call .PlaceDigit + jr .finished -jr_038_42d0: +.four_digits ld a, c - call Call_038_42e8 + call .PlaceDigit ld a, c swap a - call Call_038_42e8 + call .PlaceDigit ld a, b - call Call_038_42e8 + call .PlaceDigit ld a, b swap a - call Call_038_42e8 + call .PlaceDigit -jr_038_42e4: +.finished pop bc pop de pop hl ret -Call_038_42e8: +.PlaceDigit: and $0f add $36 ld [hld], a ret -Call_038_42ee: - ld a, [$c620] - ld e, a - ld d, $00 - ld hl, $42fd - add hl, de - add hl, de - ld a, [hli] - ld h, [hl] - ld l, a - jp hl - - - db $09, $43, $89, $43, $18, $43, $21, $43 +PikachuMiniGame_PerformGameFunction: + jumptable .jumptable, wPikachuMinigameJumptableIndex - ld l, $43 +.jumptable +; jumptable here + dw Func4309 + dw Func4389 + dw PikachuMiniGame_SetNextSceneTimer + dw PikachuMiniGame_WaitAndGotoNextScene + dw PikachuMiniGame_ShowJigglypuff + dw PikachuMiniGame_FadeOut - db $3e, $43 - - ld a, $04 - ld [$c617], a +Func4309: +; Set scroll speed here + ld a, 4 + ld [wPikachuMinigameScrollSpeed], a ld a, $31 - ld [$c605], a - ld hl, $c620 + ld [wc605], a + ld hl, wPikachuMinigameJumptableIndex inc [hl] ret - +PikachuMiniGame_SetNextSceneTimer: ld a, $40 - ld [$c61f], a - ld hl, $c620 + ld [wPikachuMinigameSceneTimer], a + ld hl, wPikachuMinigameJumptableIndex inc [hl] - ld hl, $c61f + +PikachuMiniGame_WaitAndGotoNextScene: + ld hl, wPikachuMinigameSceneTimer ld a, [hl] and a - jr z, jr_038_432a - + jr z, .next_scene dec [hl] ret - -jr_038_432a: - ld hl, $c620 +.next_scene + ld hl, wPikachuMinigameJumptableIndex inc [hl] + +PikachuMiniGame_ShowJigglypuff: ld de, $70c0 ld a, $32 call InitSpriteAnimStruct + xor a - ld [$c61f], a - ld hl, $c620 + ld [wPikachuMinigameSceneTimer], a + ld hl, wPikachuMinigameJumptableIndex inc [hl] - ld a, [$c617] + +PikachuMiniGame_FadeOut: + ld a, [wPikachuMinigameScrollSpeed] and a ret nz - ld a, [$c61f] + ld a, [wPikachuMinigameSceneTimer] srl a srl a srl a srl a + ld e, a - ld d, $00 - ld hl, $4377 + ld d, 0 + ld hl, .DMGPals add hl, de + ld a, [hl] - cp $ff - jr z, jr_038_4371 + cp -1 + jr z, .end_minigame ldh [rBGP], a - ld hl, $4380 + + ld hl, .Obj_SGBPals add hl, de + ld a, [wSGB] and a - jr z, jr_038_4369 + jr z, .not_sgb ld a, [hl] ldh [rBGP], a -jr_038_4369: +.not_sgb ld a, [hl] ldh [rOBP0], a - ld hl, $c61f + +; from this point, the timer *increments* instead + ld hl, wPikachuMinigameSceneTimer inc [hl] ret -jr_038_4371: - ld hl, $c620 +.end_minigame +; once everything fades out, the minigame ends here +; leading to the title screen + + ld hl, wPikachuMinigameJumptableIndex set 7, [hl] ret - - db $94, $94, $94, $94, $94, $50, $40, $00, $ff, $e4, $e4, $e4, $e4, $e4, $90, $40 - db $00 - - rst $38 - - call Call_038_4244 +.DMGPals: + db $94, $94 + db $94, $94 + db $94, $50 + db $40, $00 + db -1 + +.Obj_SGBPals: + db $e4, $e4 + db $e4, $e4 + db $e4, $90 + db $40, $00 + db -1 + +Func4389: + call PikachuMiniGame_RunTimer ldh a, [hSCX] and $20 ld hl, $c608 cp [hl] - jr nz, jr_038_4397 - + jr nz, .jump4397 ret - - -jr_038_4397: +.jump4397 ld a, [hl] xor $20 ld [hl], a call Call_038_43d0 - jr c, jr_038_43cb - + jr c, .next_scene call Call_038_43f4 ret c - ldh a, [hSCX] and $1f ld e, a @@ -626,10 +666,8 @@ jr_038_4397: dec hl ld [hl], e ret - - -jr_038_43cb: - ld hl, $c620 +.next_scene + ld hl, wPikachuMinigameJumptableIndex inc [hl] ret @@ -638,20 +676,17 @@ Call_038_43d0: ld a, [$c60d] ld l, a ld h, $00 - ld de, $43e5 + ld de, .data43e5 add hl, de ld a, [hl] cp $ff - jr nz, jr_038_43e3 - + jr nz, .jr_038_43e3 xor a ld [$c60d], a - -jr_038_43e3: +.jr_038_43e3 and a ret - - +.data43e5 db $00, $01, $02, $03, $04, $05, $06, $00, $01, $02, $03, $04, $05, $06, $ff Call_038_43f4: @@ -727,13 +762,13 @@ jr_038_441d: ldh a, [hJoyState] - ld hl, $c605 + ld hl, wc605 and [hl] ld d, a and $01 jr nz, jr_038_449f - ld a, [$c617] + ld a, [wPikachuMinigameScrollSpeed] and a ret nz @@ -862,7 +897,7 @@ Call_038_451f: ret c ld a, $01 - ld [$c610], a + ld [wPikachuMinigameNoteCaught], a ld hl, $000b add hl, bc inc [hl] @@ -872,7 +907,7 @@ Call_038_451f: Call_038_4544: - ld hl, $c609 + ld hl, wPikachuMinigameScore ld e, [hl] inc hl ld d, [hl] @@ -1032,8 +1067,8 @@ jr_038_4609: ret -Call_038_4616: - ld hl, $c617 +PikachuMiniGame_ScrollScene: + ld hl, wPikachuMinigameScrollSpeed ldh a, [hSCX] sub [hl] ldh [hSCX], a @@ -1332,3 +1367,5 @@ Call_038_478e: pop de pop hl ret + +; Map 479e diff --git a/ram/wram.asm b/ram/wram.asm index 5c07810..6e8b4e6 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -168,8 +168,69 @@ wLYOverrides2:: ds SCREEN_HEIGHT_PX wLYOverrides2End:: NEXTU -; Battle-related +; Pikachu minigame + +wc600:: ds 1 +wc601:: ds 1 +wc602:: ds 1 +wc603:: ds 1 +wc604:: ds 1 +wc605:: ds 1 +wc606:: ds 1 +wc607:: ds 1 +wc608:: ds 1 +wPikachuMinigameScore:: ds 2 +wc60b:: ds 1 +wc60c:: ds 1 +wc60d:: ds 1 +wc60e:: ds 1 +wc60f:: ds 1 +wPikachuMinigameNoteCaught:: ds 1 + +; Time keeping +wPikachuMinigameTimeFrames:: ds 1 +wPikachuMinigameTimeSeconds:: ds 1 + +wc613:: ds 1 +wc614:: ds 1 +wc615:: ds 1 +wc616:: ds 1 +wPikachuMinigameScrollSpeed:: ds 1 +wc618:: ds 1 +wc619:: ds 1 +wc61a:: ds 1 +wc61b:: ds 1 +wc61c:: ds 1 +wc61d:: ds 1 +wc61e:: ds 1 +wPikachuMinigameSceneTimer:: ds 1 +wPikachuMinigameJumptableIndex:: ds 1 +wPikachuMinigameBGMapPointer:: ds 2 +wc622:: ds 2 +wc623:: ds 2 +wc624:: ds 1 +wc625:: ds 1 +wc626:: ds 1 +wc627:: ds 1 +wc628:: ds 1 +wc629:: ds 1 +wc62a:: ds 1 +wc62b:: ds 1 +wc62c:: ds 1 +wc62d:: ds 1 +wc62e:: ds 1 +wc62f:: ds 1 +wc630:: ds 1 +wc631:: ds 1 +wc632:: ds 1 +wc633:: ds 1 +wc634:: ds 1 +wc635:: ds 1 +wc636:: ds 1 + +NEXTU +; Battle-related ds $1ea wActiveBGEffects:: -- cgit v1.2.3 From 7ce11f0e85198bb2a8458181370b5e631ec393f6 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Fri, 11 Dec 2020 20:26:49 +0700 Subject: More progress on disassembling Pikachu minigame --- constants/sprite_anim_constants.asm | 24 +- engine/games/pikachu_minigame.asm | 722 ++++++++++++++++++------------------ gfx/gfx.mk | 3 + gfx/minigames/pikachu_blockmap.bin | 16 + gfx/minigames/pikachu_blockset.bin | Bin 0 -> 96 bytes ram/wram.asm | 64 ++-- 6 files changed, 427 insertions(+), 402 deletions(-) create mode 100644 gfx/minigames/pikachu_blockmap.bin create mode 100644 gfx/minigames/pikachu_blockset.bin diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index 53ad260..1b20a60 100755 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -1,3 +1,23 @@ +; sprite_anim_struct members (see macros/wram.asm) + const_def + const SPRITEANIMSTRUCT_INDEX ; 0 + const SPRITEANIMSTRUCT_FRAMESET_ID ; 1 + const SPRITEANIMSTRUCT_ANIM_SEQ_ID ; 2 + const SPRITEANIMSTRUCT_TILE_ID ; 3 + const SPRITEANIMSTRUCT_XCOORD ; 4 + const SPRITEANIMSTRUCT_YCOORD ; 5 + const SPRITEANIMSTRUCT_XOFFSET ; 6 + const SPRITEANIMSTRUCT_YOFFSET ; 7 + const SPRITEANIMSTRUCT_DURATION ; 8 + const SPRITEANIMSTRUCT_DURATIONOFFSET ; 9 + const SPRITEANIMSTRUCT_FRAME ; a + const SPRITEANIMSTRUCT_JUMPTABLE_INDEX ; b + const SPRITEANIMSTRUCT_0C ; c + const SPRITEANIMSTRUCT_0D ; d + const SPRITEANIMSTRUCT_0E ; e + const SPRITEANIMSTRUCT_0F ; f +SPRITEANIMSTRUCT_LENGTH EQU const_value + ; wSpriteAnimDict keys const_def const SPRITE_ANIM_DICT_DEFAULT ; 0 @@ -30,8 +50,8 @@ SPRITE_ANIM_INDEX_GS_INTRO_VENUSAUR EQU $2d SPRITE_ANIM_INDEX_GS_TITLE_FLAME_NOTE EQU $2e -SPRITE_ANIM_INDEX_2F EQU $2f -SPRITE_ANIM_INDEX_30 EQU $30 +SPRITE_ANIM_INDEX_MINIGAME_PIKACHU EQU $2f +SPRITE_ANIM_INDEX_MINIGAME_PIKACHU_TAIL EQU $30 SPRITE_ANIM_INDEX_39 EQU $39 SPRITE_ANIM_INDEX_GAMEFREAK_LOGO EQU $3a diff --git a/engine/games/pikachu_minigame.asm b/engine/games/pikachu_minigame.asm index d90af87..e46faa5 100644 --- a/engine/games/pikachu_minigame.asm +++ b/engine/games/pikachu_minigame.asm @@ -11,13 +11,13 @@ PikachuMiniGame:: call PikachuMiniGame_RunFrame jr nc, .loop +; exit ld a, HIGH(vBGMap0) ldh [hBGMapAddress + 1], a ld de, MUSIC_NONE call PlayMusic ret - .Init: call DisableLCD ld b, SGB_BETA_PIKACHU_MINIGAME @@ -39,23 +39,26 @@ PikachuMiniGame:: ld a, BANK(IntroJigglypuffPikachuGFX) call FarCopyData - ld a, LOW($4842) - ld [$c625], a - ld a, HIGH($4842) ; XXX - ld [$c626], a ; subroutine pointer? +; Metatiles + ld a, LOW(PikachuMiniGame_Meta) + ld [wPikachuMinigameTilesPointer], a + ld a, HIGH(PikachuMiniGame_Meta) + ld [wPikachuMinigameTilesPointer + 1], a +; BG map destination ld hl, vBGMap0 ld a, l ld [wPikachuMinigameBGMapPointer], a ld a, h - ld [wPikachuMinigameBGMapPointer + 1], a ; bgmap pointer? + ld [wPikachuMinigameBGMapPointer + 1], a - ld de, $47b2 ; XXX +; Block map + ld de, PikachuMiniGame_Blockmap ld a, e - ld [$c623], a + ld [wPikachuMinigameTilemapPointer], a ld a, d - ld [$c624], a - call Call_038_4197 + ld [wPikachuMinigameTilemapPointer + 1], a + call PikachuMiniGame_DrawBackground ld hl, wSpriteAnimDict ld a, $22 ; anim dict values? @@ -66,33 +69,33 @@ PikachuMiniGame:: xor a ldh [hSCY], a - ld [wc4c7], a + ld [wGlobalAnimYOffset], a ldh [hSCX], a - ld [wc4c8], a + ld [wGlobalAnimXOffset], a ld [wPikachuMinigameJumptableIndex], a ld [wPikachuMinigameScrollSpeed], a ld [wPikachuMinigameScore], a ld [wPikachuMinigameScore + 1], a - ld [$c60b], a - ld [$c60c], a + ld [wPikachuMinigameNoteCounter], a + ld [wPikachuMinigameNoteCounter + 1], a ld [wPikachuMinigameTimeFrames], a ld [wPikachuMinigameTimeSeconds], a - ld [$c613], a - ld [$c614], a - ld [$c608], a - ld [$c60d], a - ld [$c60e], a - ld [$c615], a - ld [$c618], a - ld [$c619], a - ld [$c61a], a - ld [$c61d], a - ld [$c61e], a - - ld a, LOW($479e) ; XXX - ld [$c61b], a - ld a, HIGH($479e) ; XXX - ld [$c61c], a + ld [wc613], a + ld [wc614], a + ld [wPikachuMinigameNoteTimer], a + ld [wPikachuMinigameSpawnTypeIndex], a + ld [wPikachuMinigameSpawnDataIndex], a + ld [wPikachuMinigameRedrawTimer], a + ld [wc618], a + ld [wc619], a + ld [wc61a], a + ld [wPikachuMinigameSavedColumnPointer], a + ld [wPikachuMinigameSavedColumnPointer + 1], a + + ld a, LOW(PikachuMiniGame_Columns) + ld [wPikachuMinigameColumnPointer], a + ld a, HIGH(PikachuMiniGame_Columns) + ld [wPikachuMinigameColumnPointer + 1], a ld a, $7c ldh [hWY], a @@ -108,35 +111,36 @@ PikachuMiniGame:: ldh [rBGP], a ld a, %11100100 ldh [rOBP0], a - jr .next + jr .load_pikachu .not_sgb + ; Normal palette if on GB / GBC ld a, %11100100 ldh [rBGP], a ldh [rOBP0], a -.next - ld de, $7058 - ld a, SPRITE_ANIM_INDEX_2F +.load_pikachu + depixel 14, 11 + ld a, SPRITE_ANIM_INDEX_MINIGAME_PIKACHU call InitSpriteAnimStruct ld a, c - ld [wLYOverrides], a + ld [wPikachuMinigamePikachuObjectPointer], a ld a, b - ld [$c601], a + ld [wPikachuMinigamePikachuObjectPointer + 1], a - ld de, $7058 - ld a, SPRITE_ANIM_INDEX_30 +; load Pikachu's tail object + depixel 14, 11 + ld a, SPRITE_ANIM_INDEX_MINIGAME_PIKACHU_TAIL call InitSpriteAnimStruct ld a, c - ld [$c602], a + ld [wPikachuMinigamePikachuTailObjectPointer], a ld a, b - ld [$c603], a + ld [wPikachuMinigamePikachuTailObjectPointer + 1], a ret - PikachuMiniGame_ClearBothTilemaps: ld hl, vBGMap1 ld bc, $0280 @@ -162,7 +166,6 @@ PikachuMiniGame_ClearBothTilemaps: ldh [hWX], a ret - PikachuMiniGame_LoadFont: ld hl, FontGFX ld de, vFont tile $10 @@ -177,7 +180,6 @@ PikachuMiniGame_LoadFont: call FarCopyDataDouble ret - PikachuMiniGame_BlinkText: ; Blink the window text according to the current X scroll position. ; 00 - 7f = hide text @@ -214,7 +216,8 @@ PikachuMiniGame_BlinkText: and a jr z, .render_dakutens - add $10 ; tiles are shifted +; Tiles are shifted so add $10 to each character + add $10 ld [de], a inc de jr .render_text @@ -228,6 +231,7 @@ PikachuMiniGame_BlinkText: hlcoord 13, 0 ld [hl], a + ret .text @@ -235,55 +239,50 @@ PikachuMiniGame_BlinkText: ; "スタートボタン▶タイトルがめん" db 0 ; terminator -Func418b: +Func418b: ; unreferenced? ld bc, $0800 -jr_038_418e: +.loop ld a, [de] inc de ld [hli], a dec bc ld a, c or b - jr nz, jr_038_418e - + jr nz, .loop ret - -Call_038_4197: +PikachuMiniGame_DrawBackground: ld b, $10 - -jr_038_4199: +.outer_loop push hl ld c, $10 - -jr_038_419c: - call Call_038_41ad +.inner_loop + call PikachuMiniGame_Draw2x2Tile dec c - jr nz, jr_038_419c - + jr nz, .inner_loop pop hl push bc - ld bc, $0040 + ld bc, BG_MAP_HEIGHT * 2 add hl, bc pop bc dec b - jr nz, jr_038_4199 - + jr nz, .outer_loop ret - -Call_038_41ad: +PikachuMiniGame_Draw2x2Tile: push bc push de push hl + push hl + push hl ld a, [de] ld l, a - ld h, $00 - ld a, [$c625] + ld h, 0 + ld a, [wPikachuMinigameTilesPointer] ld e, a - ld a, [$c626] + ld a, [wPikachuMinigameTilesPointer + 1] ld d, a add hl, hl add hl, hl @@ -291,14 +290,17 @@ Call_038_41ad: ld e, l ld d, h pop hl + ld a, [de] inc de ld [hli], a ld a, [de] inc de ld [hli], a + pop hl - ld bc, $0020 + + ld bc, BG_MAP_WIDTH add hl, bc ld a, [de] inc de @@ -306,16 +308,22 @@ Call_038_41ad: ld a, [de] inc de ld [hli], a + pop hl + inc hl inc hl + pop de inc de + pop bc ret PikachuMiniGame_RunFrame: +; Run a single frame of the minigame + call GetJoypad ld hl, hJoyState ld a, [hl] @@ -402,7 +410,7 @@ PikachuMiniGame_RunTimer: ret -PikachuMiniGame_ReloadCollisions: +PikachuMiniGame_ReloadCollisions: ; XXX ? ldh a, [hSCX] ld e, a and $07 @@ -415,18 +423,18 @@ PikachuMiniGame_ReloadCollisions: srl e srl e srl e - ld d, $00 - ld hl, $9900 + ld d, 0 + hlbgcoord 0, 8 add hl, de - ld de, $c627 + ld de, wPikachuMinigameColumnBuffer ld a, e ld [wVBCopyDst], a ld a, d - ld [$cb66], a + ld [wVBCopyDst + 1], a ld a, l ld [wVBCopySrc], a ld a, h - ld [$cb64], a + ld [wVBCopySrc + 1], a ld a, $01 ld [wVBCopySize], a ret @@ -515,25 +523,27 @@ PikachuMiniGame_PerformGameFunction: .jumptable ; jumptable here - dw Func4309 - dw Func4389 + dw PikachuMiniGame_SetupScene + dw PikachuMiniGame_NoteSpawner dw PikachuMiniGame_SetNextSceneTimer dw PikachuMiniGame_WaitAndGotoNextScene dw PikachuMiniGame_ShowJigglypuff dw PikachuMiniGame_FadeOut -Func4309: -; Set scroll speed here +PikachuMiniGame_SetupScene: +; Set scroll speed and joypad enable here ld a, 4 ld [wPikachuMinigameScrollSpeed], a - ld a, $31 - ld [wc605], a + + ld a, %00110001 + ld [wPikachuMinigameControlEnable], a + ld hl, wPikachuMinigameJumptableIndex inc [hl] ret PikachuMiniGame_SetNextSceneTimer: - ld a, $40 + ld a, 64 ld [wPikachuMinigameSceneTimer], a ld hl, wPikachuMinigameJumptableIndex inc [hl] @@ -551,7 +561,7 @@ PikachuMiniGame_WaitAndGotoNextScene: inc [hl] PikachuMiniGame_ShowJigglypuff: - ld de, $70c0 + depixel 14, 24 ld a, $32 call InitSpriteAnimStruct @@ -601,7 +611,6 @@ PikachuMiniGame_FadeOut: inc [hl] ret - .end_minigame ; once everything fades out, the minigame ends here ; leading to the title screen @@ -624,22 +633,26 @@ PikachuMiniGame_FadeOut: db $40, $00 db -1 -Func4389: +PikachuMiniGame_NoteSpawner: call PikachuMiniGame_RunTimer ldh a, [hSCX] and $20 - ld hl, $c608 + ld hl, wPikachuMinigameNoteTimer cp [hl] - jr nz, .jump4397 + jr nz, .spawn_note ret -.jump4397 + +.spawn_note ld a, [hl] xor $20 ld [hl], a - call Call_038_43d0 + + call .DetermineSpawnType jr c, .next_scene - call Call_038_43f4 - ret c + + call .DetermineSpawnParameters + ret c ; skip spawning if y = $FF + ldh a, [hSCX] and $1f ld e, a @@ -647,174 +660,184 @@ Func4389: sub e ld e, a ld a, $03 - ld [$c4bc], a - ld a, $31 + ld [$c4bc], a ; Hardcoded object loc + + ld a, $31 ; NOTE call InitSpriteAnimStruct - ld hl, $c60b + +; add one to the note counter + ld hl, wPikachuMinigameNoteCounter ld e, [hl] inc hl ld d, [hl] - ld a, $01 + ld a, 1 add e daa ld e, a ld a, d - adc $00 + adc 0 daa ld d, a ld [hl], d dec hl ld [hl], e ret -.next_scene + +.next_scene ; can this be reached? ld hl, wPikachuMinigameJumptableIndex inc [hl] ret -Call_038_43d0: - ld a, [$c60d] +.DetermineSpawnType: + ld a, [wPikachuMinigameSpawnTypeIndex] ld l, a - ld h, $00 - ld de, .data43e5 + ld h, 0 + ld de, .SpawnTypes add hl, de ld a, [hl] - cp $ff - jr nz, .jr_038_43e3 + cp -1 + jr nz, .got_type xor a - ld [$c60d], a -.jr_038_43e3 + ld [wPikachuMinigameSpawnTypeIndex], a +.got_type and a ret -.data43e5 - db $00, $01, $02, $03, $04, $05, $06, $00, $01, $02, $03, $04, $05, $06, $ff -Call_038_43f4: +.SpawnTypes: +; or .SpawnParameters indices + db $00, $01, $02, $03, $04, $05, $06, $00, $01, $02, $03, $04, $05, $06 + db -1 + +.DetermineSpawnParameters: +; a = spawn type (index of spawn data) + +; returns d = Y-starting position of a note +; carry, if no note is to be spawned ($FF) + ld l, a - ld h, $00 + ld h, 0 add hl, hl add hl, hl add hl, hl - ld de, $441f + ld de, .SpawnParameters add hl, de - ld a, [$c60e] + + ld a, [wPikachuMinigameSpawnDataIndex] and $07 ld e, a inc a cp $08 - jr c, jr_038_440f + jr c, .determine_y_coords +; next spawn type push hl - ld hl, $c60d + ld hl, wPikachuMinigameSpawnTypeIndex inc [hl] pop hl -jr_038_440f: - ld [$c60e], a - ld d, $00 +.determine_y_coords + ld [wPikachuMinigameSpawnDataIndex], a + ld d, 0 add hl, de ld a, [hl] cp $ff - jr z, jr_038_441d - + jr z, .skip_spawning_note ld d, a and a ret - -jr_038_441d: +.skip_spawning_note scf ret - - db $70, $60, $50, $48, $48, $48, $48, $38, $28, $20, $28, $ff, $ff, $ff, $48, $48 - db $70, $70, $ff, $58, $ff, $ff, $48, $38, $28, $20, $28, $38, $48, $ff, $ff, $ff - db $70, $70, $70, $70, $60, $50, $48, $38, $ff, $28, $30, $38, $48, $48, $48, $48 - db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff - - ld a, [wLYOverrides] +.SpawnParameters: + db $70, $60, $50, $48, $48, $48, $48, $38 ; 00 + db $28, $20, $28, $ff, $ff, $ff, $48, $48 ; 01 + db $70, $70, $ff, $58, $ff, $ff, $48, $38 ; 02 + db $28, $20, $28, $38, $48, $ff, $ff, $ff ; 03 + db $70, $70, $70, $70, $60, $50, $48, $38 ; 04 + db $ff, $28, $30, $38, $48, $48, $48, $48 ; 05 + db $ff, $ff, $ff, $ff, $ff, $ff, $ff, $ff ; 06 + +MinigamePikachuDoMovement:: +; called from sprite animation routine + ld a, [wPikachuMinigamePikachuObjectPointer] ld c, a - ld a, [$c601] + ld a, [wPikachuMinigamePikachuObjectPointer + 1] ld b, a call Call_038_459c - call Call_038_44df + call .ResetScoreModifiersAndCheckNoteCollision ld hl, $000b add hl, bc ld e, [hl] - ld d, $00 - ld hl, $4475 + ld d, 0 + ld hl, .jump add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a jp hl - - - db $7d, $44, $89, $44, $b4, $44, $d6, $44 - - ld hl, $000b +.jump + dw .Func447d + dw .Func4489 + dw .Func44b4 + dw .Func44d6 + +.Func447d: + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc ld [hl], $01 ld a, $02 - ld [$c604], a + ld [wPikachuMinigamePikachuNextAnim], a ret - +.Func4489: ldh a, [hJoyState] - ld hl, wc605 + ld hl, wPikachuMinigameControlEnable and [hl] ld d, a and $01 - jr nz, jr_038_449f - + jr nz, .jr_038_449f ld a, [wPikachuMinigameScrollSpeed] and a ret nz - ld a, $01 - ld [$c604], a + ld [wPikachuMinigamePikachuNextAnim], a ret - - -jr_038_449f: - ld hl, $000b +.jr_038_449f + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc inc [hl] ld a, $40 - ld [$c607], a + ld [wPikachuMinigamePikachuYOffset], a ld a, $03 - ld [$c604], a + ld [wPikachuMinigamePikachuNextAnim], a ld a, $10 - ld [$c606], a + ld [wc606], a ret - - ld hl, $c607 +.Func44b4: + ld hl, wPikachuMinigamePikachuYOffset ld a, [hl] cp $20 - jr c, jr_038_44cf - + jr c, .jr_038_44cf dec [hl] ld d, $30 ld e, a - ld a, $33 - ld hl, $625d - call FarCall_hl + callba BattleAnim_Sine_e ld a, e ld hl, $0007 add hl, bc ld [hl], a ret - - -jr_038_44cf: +.jr_038_44cf ld hl, $000b add hl, bc ld [hl], $03 ret - - +.Func44d6: ld hl, $0005 add hl, bc inc [hl] @@ -823,10 +846,9 @@ jr_038_44cf: inc [hl] ret - -Call_038_44df: +.ResetScoreModifiersAndCheckNoteCollision: xor a - ld [$c60f], a + ld [wPikachuMinigameScoreModifier], a ld hl, $0005 add hl, bc ld a, [hl] @@ -838,29 +860,23 @@ Call_038_44df: sub $20 ld d, a push bc - ld bc, $c41c + ld bc, $c41c ; Pikachu object, hardcoded ld a, $0a - -jr_038_44f9: +.jr_038_44f9 push af push de ld hl, $0000 add hl, bc - -Jump_038_44ff: ld a, [hl] and a - jr z, jr_038_450f - + jr z, .jr_038_450f ld hl, $0001 add hl, bc ld a, [hl] cp $07 - jr nz, jr_038_450f - - call Call_038_451f - -jr_038_450f: + jr nz, .jr_038_450f + call .Call_038_451f +.jr_038_450f ld hl, $0010 add hl, bc ld c, l @@ -868,50 +884,46 @@ jr_038_450f: pop de pop af dec a - jr nz, jr_038_44f9 - + jr nz, .jr_038_44f9 pop bc - call Call_038_4544 + call PikachuMiniGame_AddToScore ret - - -Call_038_451f: +.Call_038_451f: ld a, $48 - ld hl, $0004 + ld hl, $4 add hl, bc cp [hl] ret nc - ld a, $68 cp [hl] ret c - ld a, d ld hl, $0005 add hl, bc cp [hl] ret nc - ld a, e cp [hl] ret c - ld a, $01 +; Pikachu caught a note + ld a, 1 ld [wPikachuMinigameNoteCaught], a - ld hl, $000b + + ld hl, $b add hl, bc inc [hl] - ld hl, $c60f + ld hl, wPikachuMinigameScoreModifier inc [hl] ret -Call_038_4544: +PikachuMiniGame_AddToScore: ld hl, wPikachuMinigameScore ld e, [hl] inc hl ld d, [hl] - ld a, [$c60f] + ld a, [wPikachuMinigameScoreModifier] add e daa ld e, a @@ -924,48 +936,61 @@ Call_038_4544: ld [hl], e ret +CopyPikachuObjDataToTailObj:: +; copies the object data for Pikachu to Pikachu's tail object +; called from sprite animation routine - ld a, [wLYOverrides] + ld a, [wPikachuMinigamePikachuObjectPointer] ld e, a - ld a, [$c601] + ld a, [wPikachuMinigamePikachuObjectPointer + 1] ld d, a - ld a, [$c602] + + ld a, [wPikachuMinigamePikachuTailObjectPointer] ld c, a - ld a, [$c603] + ld a, [wPikachuMinigamePikachuTailObjectPointer + 1] ld b, a - ld hl, $0009 + + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET add hl, de ld a, [hl] - ld hl, $0009 + + ld hl, SPRITEANIMSTRUCT_DURATIONOFFSET add hl, bc ld [hl], a - ld hl, $0005 + + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, de ld a, [hl] - ld hl, $0005 + + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc ld [hl], a - ld hl, $0007 + + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, de ld a, [hl] - ld hl, $0007 + + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld [hl], a - ld hl, $0004 + + ld hl, SPRITEANIMSTRUCT_XCOORD add hl, de ld a, [hl] - ld hl, $0004 + + ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc ld [hl], a - ld hl, $0006 + + ld hl, SPRITEANIMSTRUCT_XOFFSET add hl, de ld a, [hl] - ld hl, $0006 + + ld hl, SPRITEANIMSTRUCT_XOFFSET add hl, bc ld [hl], a ret - Call_038_459c: ld hl, $0007 add hl, bc @@ -978,32 +1003,26 @@ Call_038_459c: add hl, bc ld a, [hl] cp $02 - jr z, jr_038_45c3 - + jr z, .jr_038_45c3 cp $03 - jr z, jr_038_45e3 - + jr z, .jr_038_45e3 ld a, d cp $70 ret z - call Call_038_4602 ret nz - ld hl, $000b add hl, bc ld [hl], $03 ret -jr_038_45c3: - ld a, [$c607] +.jr_038_45c3 + ld a, [wPikachuMinigamePikachuYOffset] cp $3e ret nc - call Call_038_4602 ret z - ld hl, $000b add hl, bc ld [hl], $00 @@ -1017,17 +1036,13 @@ jr_038_45c3: and $f8 ld [hl], a ret - - -jr_038_45e3: +.jr_038_45e3 ld a, d cp $70 - jr z, jr_038_45ec - + jr z, .jr_038_45ec call Call_038_4602 ret z - -jr_038_45ec: +.jr_038_45ec ld hl, $000b add hl, bc ld [hl], $00 @@ -1046,22 +1061,17 @@ jr_038_45ec: Call_038_4602: ld a, d cp $40 - jr z, jr_038_4609 - + jr z, .jr_038_4609 xor a ret - - -jr_038_4609: - ld hl, $c627 +.jr_038_4609 + ld hl, wPikachuMinigameColumnBuffer ld a, $16 cp [hl] ret nz - inc hl cp [hl] ret nz - inc hl cp [hl] ret @@ -1073,20 +1083,17 @@ PikachuMiniGame_ScrollScene: sub [hl] ldh [hSCX], a and $10 - ld hl, $c615 + ld hl, wPikachuMinigameRedrawTimer cp [hl] - jr nz, jr_038_4627 - + jr nz, .new_column ret - - -jr_038_4627: +.new_column ld a, [hl] xor $10 ld [hl], a xor a ldh [hBGMapMode], a - call Call_038_464d + call PikachuMiniGame_RenderColumn ldh a, [hSCX] and $f0 srl a @@ -1105,51 +1112,53 @@ jr_038_4627: ret -Call_038_464d: - call Call_038_46b4 +PikachuMiniGame_RenderColumn: + call PikachuMiniGame_GetNextColumn ret nc ld l, a - ld h, $00 + ld h, 0 add hl, hl add hl, hl add hl, hl - ld de, $4661 + ld de, .ColumnSet add hl, de ld e, l ld d, h - call Call_038_4681 + call PikachuMiniGame_UpdateColumn ret +.ColumnSet: +; The "level" block set +; top to bottom - db $05, $0d, $02, $09, $14, $14, $14, $0b, $04, $0c, $02, $08, $14, $14, $14, $0b - db $05, $0d, $02, $09, $15, $14, $14, $0b, $04, $0c, $02, $08, $15, $14, $14, $0b + db $05, $0d, $02, $09, $14, $14, $14, $0b ; 00 + db $04, $0c, $02, $08, $14, $14, $14, $0b ; 01 + db $05, $0d, $02, $09, $15, $14, $14, $0b ; 02 + db $04, $0c, $02, $08, $15, $14, $14, $0b ; 03 -Call_038_4681: +PikachuMiniGame_UpdateColumn: push de - ld hl, wRedrawFlashlightDst0 - ld c, $08 - -jr_038_4687: + ld hl, wRedrawRowOrColumnSrcTiles + ld c, 8 +.update ld a, [de] - call Call_038_4691 + call PikachuMiniGame_DrawTileToBuffer inc de dec c - jr nz, jr_038_4687 - + jr nz, .update pop de ret - -Call_038_4691: +PikachuMiniGame_DrawTileToBuffer: push bc push de push hl ld l, a - ld h, $00 - ld a, [$c625] + ld h, 0 + ld a, [wPikachuMinigameTilesPointer] ld e, a - ld a, [$c626] + ld a, [wPikachuMinigameTilesPointer + 1] ld d, a add hl, hl add hl, hl @@ -1173,21 +1182,19 @@ Call_038_4691: pop bc ret - -Call_038_46b4: -jr_038_46b4: - call Call_038_478e +PikachuMiniGame_GetNextColumn: + call .GetNextByte cp $f0 ret c - call Call_038_46bf - jr jr_038_46b4 + call .GetColumnCommand + jr PikachuMiniGame_GetNextColumn -Call_038_46bf: +.GetColumnCommand: sub $f0 ld e, a - ld d, $00 - ld hl, $46cd + ld d, 0 + ld hl, .table add hl, de add hl, de ld a, [hli] @@ -1195,152 +1202,126 @@ Call_038_46bf: ld l, a jp hl - - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - db $ed - ld b, [hl] - ld e, h - ld b, a - ld h, e - ld b, a - ld l, b - ld b, a - - db $1e, $47 - - dec hl - ld b, a - nop - ld b, a - xor $46 +.table + dw .DummyCommand ; f0 + dw .DummyCommand ; f1 + dw .DummyCommand ; f2 + dw .DummyCommand ; f3 + dw .DummyCommand ; f4 + dw .DummyCommand ; f5 + dw .DummyCommand ; f6 + dw .DummyCommand ; f7 + dw .DummyCommand ; f8 + dw .CommandF9 ; f9 + dw .CommandFA ; fa + dw .CommandFB ; fb + dw .JumpCommand ; fc + dw .CommandFD ; fd + dw .CommandFE ; fe + dw .CommandFF ; ff + +.DummyCommand: ret - - ld hl, $c618 +.CommandFF: + ld hl, wc618 res 0, [hl] - ld hl, $c619 + ld hl, wc619 ld e, [hl] inc hl ld d, [hl] - ld hl, $c61b + ld hl, wPikachuMinigameColumnPointer ld [hl], e inc hl ld [hl], d ret - - call Call_038_478e +.CommandFE: + call .GetNextByte ld e, a - call Call_038_478e - ld hl, $c61b + call .GetNextByte + ld hl, wPikachuMinigameColumnPointer ld c, [hl] inc hl ld b, [hl] - ld hl, $c619 + ld hl, wc619 ld [hl], c inc hl ld [hl], b - ld hl, $c61c + ld hl, wPikachuMinigameColumnPointer + 1 ld [hld], a ld [hl], e - ld hl, $c618 + ld hl, wc618 set 0, [hl] ret - - call Call_038_478e +.JumpCommand: + call .GetNextByte ld e, a - call Call_038_478e - ld hl, $c61c + call .GetNextByte + ld hl, wPikachuMinigameColumnPointer + 1 ld [hld], a ld [hl], e ret - - call Call_038_478e - ld hl, $c618 +.CommandFD: + call .GetNextByte + ld hl, wc618 bit 1, [hl] - jr nz, jr_038_473e - + jr nz, .jr_038_473e and a - jr z, jr_038_4746 - + jr z, .jr_038_4746 dec a - ld [$c61d], a + ld [wPikachuMinigameSavedColumnPointer], a set 1, [hl] - -jr_038_473e: - ld hl, $c61d +.jr_038_473e + ld hl, wPikachuMinigameSavedColumnPointer ld a, [hl] and a - jr z, jr_038_4753 - + jr z, .jr_038_4753 dec [hl] - -jr_038_4746: - call Call_038_478e +.jr_038_4746 + call .GetNextByte ld e, a - call Call_038_478e - ld hl, $c61c + call .GetNextByte + ld hl, wPikachuMinigameColumnPointer + 1 ld [hld], a ld [hl], e ret - - -jr_038_4753: - ld hl, $c618 +.jr_038_4753 + ld hl, wc618 res 2, [hl] - call Call_038_4782 + call .ReplaceColumnPointer ret - - - call Call_038_478e - ld [$c61e], a +.CommandF9: + call .GetNextByte + ld [wPikachuMinigameSavedColumnPointer + 1], a ret - - ld hl, $c61e +.CommandFA: + ld hl, wPikachuMinigameSavedColumnPointer + 1 inc [hl] ret - - call Call_038_478e - ld hl, $c61e +.CommandFB: + call .GetNextByte + ld hl, wPikachuMinigameSavedColumnPointer + 1 cp [hl] - jr z, jr_038_4775 - - call Call_038_4782 + jr z, .jr_038_4775 + call .ReplaceColumnPointer ret - - -jr_038_4775: - call Call_038_478e +.jr_038_4775 + call .GetNextByte ld e, a - call Call_038_478e - ld hl, $c61c + call .GetNextByte + ld hl, wPikachuMinigameColumnPointer + 1 ld [hld], a ld [hl], e ret - -Call_038_4782: - ld hl, $c61b +.ReplaceColumnPointer: + ld hl, wPikachuMinigameColumnPointer ld e, [hl] inc hl ld d, [hl] @@ -1351,11 +1332,10 @@ Call_038_4782: ld [hl], e ret - -Call_038_478e: +.GetNextByte: push hl push de - ld hl, $c61b + ld hl, wPikachuMinigameColumnPointer ld e, [hl] inc hl ld d, [hl] @@ -1368,4 +1348,24 @@ Call_038_478e: pop hl ret -; Map 479e +PikachuMiniGame_Columns: +; Essentially the "level design" of the minigame +; Also see PikachuMiniGame_RenderColumn.ColumnSet + + db $00, $01 + db $00, $01 + db $00, $01 + db $00, $01 + db $02, $03 + db $02, $03 + db $02, $03 + db $02, $03 + db $FC + dw PikachuMiniGame_Columns + db $FF + +PikachuMiniGame_Blockmap: +INCBIN "gfx/minigames/pikachu_blockmap.bin" + +PikachuMiniGame_Meta: +INCBIN "gfx/minigames/pikachu_blockset.bin" diff --git a/gfx/gfx.mk b/gfx/gfx.mk index ac19398..0de08dc 100644 --- a/gfx/gfx.mk +++ b/gfx/gfx.mk @@ -20,5 +20,8 @@ $(BUILD)/gfx/intro/jigglypuff_pikachu.2bpp: tools/gfx += --trim-whitespace $(BUILD)/gfx/intro/%.bin: gfx/intro/%.bin cp $< $@ +$(BUILD)/gfx/minigames/%.bin: gfx/minigames/%.bin + cp $< $@ + $(BUILD)/gfx/battle_anims/attack_animations_1.2bpp: tools/gfx += --trim-whitespace $(BUILD)/gfx/battle_anims/attack_animations_2.2bpp: tools/gfx += --trim-whitespace diff --git a/gfx/minigames/pikachu_blockmap.bin b/gfx/minigames/pikachu_blockmap.bin new file mode 100644 index 0000000..b905b55 --- /dev/null +++ b/gfx/minigames/pikachu_blockmap.bin @@ -0,0 +1,16 @@ +               + + + + + + + + + + + + + + + diff --git a/gfx/minigames/pikachu_blockset.bin b/gfx/minigames/pikachu_blockset.bin new file mode 100644 index 0000000..cf13546 Binary files /dev/null and b/gfx/minigames/pikachu_blockset.bin differ diff --git a/ram/wram.asm b/ram/wram.asm index 6e8b4e6..8ff99b1 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -171,21 +171,23 @@ NEXTU ; Pikachu minigame -wc600:: ds 1 -wc601:: ds 1 -wc602:: ds 1 -wc603:: ds 1 -wc604:: ds 1 -wc605:: ds 1 +wPikachuMinigamePikachuObjectPointer:: ds 2 +wPikachuMinigamePikachuTailObjectPointer:: ds 2 +wPikachuMinigamePikachuNextAnim:: ds 1 + +wPikachuMinigameControlEnable:: ds 1 + wc606:: ds 1 -wc607:: ds 1 -wc608:: ds 1 + +wPikachuMinigamePikachuYOffset:: ds 1 +wPikachuMinigameNoteTimer:: ds 1 wPikachuMinigameScore:: ds 2 -wc60b:: ds 1 -wc60c:: ds 1 -wc60d:: ds 1 -wc60e:: ds 1 -wc60f:: ds 1 +wPikachuMinigameNoteCounter:: ds 2 ; not used for anything meaningful? + +wPikachuMinigameSpawnTypeIndex:: ds 1 +wPikachuMinigameSpawnDataIndex:: ds 1 +wPikachuMinigameScoreModifier:: ds 1 + wPikachuMinigameNoteCaught:: ds 1 ; Time keeping @@ -194,40 +196,24 @@ wPikachuMinigameTimeSeconds:: ds 1 wc613:: ds 1 wc614:: ds 1 -wc615:: ds 1 +wPikachuMinigameRedrawTimer:: ds 1 wc616:: ds 1 wPikachuMinigameScrollSpeed:: ds 1 wc618:: ds 1 wc619:: ds 1 wc61a:: ds 1 -wc61b:: ds 1 -wc61c:: ds 1 -wc61d:: ds 1 -wc61e:: ds 1 +wPikachuMinigameColumnPointer:: ds 2 +wPikachuMinigameSavedColumnPointer:: ds 2 + wPikachuMinigameSceneTimer:: ds 1 + wPikachuMinigameJumptableIndex:: ds 1 + wPikachuMinigameBGMapPointer:: ds 2 -wc622:: ds 2 -wc623:: ds 2 -wc624:: ds 1 -wc625:: ds 1 -wc626:: ds 1 -wc627:: ds 1 -wc628:: ds 1 -wc629:: ds 1 -wc62a:: ds 1 -wc62b:: ds 1 -wc62c:: ds 1 -wc62d:: ds 1 -wc62e:: ds 1 -wc62f:: ds 1 -wc630:: ds 1 -wc631:: ds 1 -wc632:: ds 1 -wc633:: ds 1 -wc634:: ds 1 -wc635:: ds 1 -wc636:: ds 1 +wPikachuMinigameTilemapPointer:: ds 2 +wPikachuMinigameTilesPointer:: ds 2 + +wPikachuMinigameColumnBuffer:: ds 16 NEXTU ; Battle-related -- cgit v1.2.3 From 4f0e8ce39c6c8f0b7bb087a7911077e9fac0008a Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Sat, 12 Dec 2020 13:56:19 +0700 Subject: Label more stuff in the Pikachu minigame --- engine/games/pikachu_minigame.asm | 362 ++++++++++++++++++++++---------------- ram/wram.asm | 14 +- 2 files changed, 221 insertions(+), 155 deletions(-) diff --git a/engine/games/pikachu_minigame.asm b/engine/games/pikachu_minigame.asm index e46faa5..c87c5fe 100644 --- a/engine/games/pikachu_minigame.asm +++ b/engine/games/pikachu_minigame.asm @@ -22,9 +22,7 @@ PikachuMiniGame:: call DisableLCD ld b, SGB_BETA_PIKACHU_MINIGAME call GetSGBLayout - callab InitEffectObject - call PikachuMiniGame_ClearBothTilemaps ld hl, IntroForestGFX @@ -86,17 +84,18 @@ PikachuMiniGame:: ld [wPikachuMinigameSpawnTypeIndex], a ld [wPikachuMinigameSpawnDataIndex], a ld [wPikachuMinigameRedrawTimer], a - ld [wc618], a - ld [wc619], a - ld [wc61a], a + ld [wPikachuMinigameColumnFlags], a ld [wPikachuMinigameSavedColumnPointer], a ld [wPikachuMinigameSavedColumnPointer + 1], a + ld [wPikachuMinigameRepeatColumnCounter], a + ld [wPikachuMinigameRepeatColumnCounter2], a ld a, LOW(PikachuMiniGame_Columns) ld [wPikachuMinigameColumnPointer], a ld a, HIGH(PikachuMiniGame_Columns) ld [wPikachuMinigameColumnPointer + 1], a +; Set status bar position ld a, $7c ldh [hWY], a @@ -114,7 +113,6 @@ PikachuMiniGame:: jr .load_pikachu .not_sgb - ; Normal palette if on GB / GBC ld a, %11100100 ldh [rBGP], a @@ -125,6 +123,7 @@ PikachuMiniGame:: ld a, SPRITE_ANIM_INDEX_MINIGAME_PIKACHU call InitSpriteAnimStruct +; Save pointer to the newly initialized Pikachu object ld a, c ld [wPikachuMinigamePikachuObjectPointer], a ld a, b @@ -211,6 +210,7 @@ PikachuMiniGame_BlinkText: .DisplayText: decoord 1, 1 ld hl, .text + .render_text ld a, [hli] and a @@ -239,8 +239,8 @@ PikachuMiniGame_BlinkText: ; "スタートボタン▶タイトルがめん" db 0 ; terminator -Func418b: ; unreferenced? - ld bc, $0800 +PikachuMiniGame_Copy128Tiles: ; unreferenced? + ld bc, $80 tiles .loop ld a, [de] inc de @@ -253,9 +253,11 @@ Func418b: ; unreferenced? PikachuMiniGame_DrawBackground: ld b, $10 + .outer_loop push hl ld c, $10 + .inner_loop call PikachuMiniGame_Draw2x2Tile dec c @@ -297,7 +299,6 @@ PikachuMiniGame_Draw2x2Tile: ld a, [de] inc de ld [hli], a - pop hl ld bc, BG_MAP_WIDTH @@ -308,7 +309,6 @@ PikachuMiniGame_Draw2x2Tile: ld a, [de] inc de ld [hli], a - pop hl inc hl @@ -327,7 +327,9 @@ PikachuMiniGame_RunFrame: call GetJoypad ld hl, hJoyState ld a, [hl] - and %00001000 ; Start button + +; Skip minigame on pressing Start + and %00001000 jr nz, .Done ld a, [wPikachuMinigameJumptableIndex] @@ -351,9 +353,10 @@ PikachuMiniGame_RunFrame: ldh [hBGMapMode], a call PikachuMiniGame_ScrollScene - call PikachuMiniGame_ReloadCollisions + call PikachuMiniGame_UpdateBlocks - decoord 18, 1 ; last digit +; Print minigame score, starting from the last digit + decoord 18, 1 ld hl, wPikachuMinigameScore call PikachuMiniGame_PrintBCD @@ -388,14 +391,18 @@ PikachuMiniGame_RunFrame: PikachuMiniGame_RunTimer: ld hl, wPikachuMinigameTimeFrames + +; Run BCD frame counter ld a, [hl] add 1 daa ld [hl], a - cp $60 ; 1 second = 60 frames + cp $60 ret c - ld [hl], 0 ; reset frame counter +; Clear frame counter upon passing one second and increment the +; seconds counter instead + ld [hl], 0 ld hl, wPikachuMinigameTimeSeconds ld a, [hl] add 1 @@ -404,13 +411,13 @@ PikachuMiniGame_RunTimer: cp $60 ; 1 minute ret c -; end game here +; When gameplay time reaches 1 minute, end the game here ld a, $02 ld [wPikachuMinigameJumptableIndex], a ret -PikachuMiniGame_ReloadCollisions: ; XXX ? +PikachuMiniGame_UpdateBlocks: ldh a, [hSCX] ld e, a and $07 @@ -455,18 +462,21 @@ PikachuMiniGame_PrintBCD: ld l, e ld h, d +; in the thousandths range? ld a, b swap a - and %00001111 ; in the thousandths range? + and %00001111 jr nz, .four_digits +; in the hundredths range? ld a, b - and %00001111 ; in the hundreds range? + and %00001111 jr nz, .three_digits +; in the tenths range? ld a, c swap a - and %00001111 ; in the tens range? + and %00001111 jr nz, .two_digits ; got one digit @@ -510,14 +520,12 @@ PikachuMiniGame_PrintBCD: pop hl ret - .PlaceDigit: and $0f add $36 ld [hld], a ret - PikachuMiniGame_PerformGameFunction: jumptable .jumptable, wPikachuMinigameJumptableIndex @@ -606,7 +614,7 @@ PikachuMiniGame_FadeOut: ld a, [hl] ldh [rOBP0], a -; from this point, the timer *increments* instead +; from this point, the timer increments*instead ld hl, wPikachuMinigameSceneTimer inc [hl] ret @@ -634,6 +642,8 @@ PikachuMiniGame_FadeOut: db -1 PikachuMiniGame_NoteSpawner: +; Spawn notes from the left side of the screen. +; call PikachuMiniGame_RunTimer ldh a, [hSCX] and $20 @@ -650,8 +660,9 @@ PikachuMiniGame_NoteSpawner: call .DetermineSpawnType jr c, .next_scene - call .DetermineSpawnParameters - ret c ; skip spawning if y = $FF +; Skip spawning if y = $FF + call .DetermineSpawnPosition + ret c ldh a, [hSCX] and $1f @@ -688,7 +699,6 @@ PikachuMiniGame_NoteSpawner: inc [hl] ret - .DetermineSpawnType: ld a, [wPikachuMinigameSpawnTypeIndex] ld l, a @@ -705,22 +715,22 @@ PikachuMiniGame_NoteSpawner: ret .SpawnTypes: -; or .SpawnParameters indices +; or .SpawnPositions indices db $00, $01, $02, $03, $04, $05, $06, $00, $01, $02, $03, $04, $05, $06 db -1 -.DetermineSpawnParameters: +.DetermineSpawnPosition: ; a = spawn type (index of spawn data) ; returns d = Y-starting position of a note -; carry, if no note is to be spawned ($FF) +; carry, if no note is to be spawned ld l, a ld h, 0 add hl, hl add hl, hl add hl, hl - ld de, .SpawnParameters + ld de, .SpawnPositions add hl, de ld a, [wPikachuMinigameSpawnDataIndex] @@ -751,7 +761,7 @@ PikachuMiniGame_NoteSpawner: scf ret -.SpawnParameters: +.SpawnPositions: db $70, $60, $50, $48, $48, $48, $48, $38 ; 00 db $28, $20, $28, $ff, $ff, $ff, $48, $48 ; 01 db $70, $70, $ff, $58, $ff, $ff, $48, $38 ; 02 @@ -766,9 +776,10 @@ MinigamePikachuDoMovement:: ld c, a ld a, [wPikachuMinigamePikachuObjectPointer + 1] ld b, a - call Call_038_459c + call MinigamePikachuCheckFloorCollision call .ResetScoreModifiersAndCheckNoteCollision - ld hl, $000b + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc ld e, [hl] ld d, 0 @@ -780,65 +791,72 @@ MinigamePikachuDoMovement:: ld l, a jp hl .jump - dw .Func447d - dw .Func4489 - dw .Func44b4 - dw .Func44d6 + dw .InitPikachuMovement + dw .ControlPikachu + dw .PikachuJumping + dw .FallDown -.Func447d: +.InitPikachuMovement: ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], $01 - ld a, $02 + ld [hl], 1 + ld a, 2 ld [wPikachuMinigamePikachuNextAnim], a ret -.Func4489: +.ControlPikachu: ldh a, [hJoyState] ld hl, wPikachuMinigameControlEnable and [hl] ld d, a - and $01 - jr nz, .jr_038_449f + +; Only read the A button + and %00000001 + jr nz, .do_jump + +; Don't animate Pikachu when the screen is still ld a, [wPikachuMinigameScrollSpeed] and a ret nz - ld a, $01 + + ld a, 1 ld [wPikachuMinigamePikachuNextAnim], a ret -.jr_038_449f + +.do_jump ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc inc [hl] - ld a, $40 + ld a, 64 ld [wPikachuMinigamePikachuYOffset], a - ld a, $03 + ld a, 3 ld [wPikachuMinigamePikachuNextAnim], a ld a, $10 ld [wc606], a ret -.Func44b4: +.PikachuJumping: ld hl, wPikachuMinigamePikachuYOffset ld a, [hl] - cp $20 - jr c, .jr_038_44cf + cp 32 + jr c, .fall_down_from_jump dec [hl] ld d, $30 ld e, a callba BattleAnim_Sine_e ld a, e - ld hl, $0007 + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld [hl], a ret -.jr_038_44cf - ld hl, $000b +.fall_down_from_jump + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], $03 + ld [hl], 3 ret -.Func44d6: - ld hl, $0005 + +.FallDown: + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc inc [hl] inc [hl] @@ -849,59 +867,80 @@ MinigamePikachuDoMovement:: .ResetScoreModifiersAndCheckNoteCollision: xor a ld [wPikachuMinigameScoreModifier], a - ld hl, $0005 + + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc ld a, [hl] - ld hl, $0007 + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc add [hl] + +; Set the Y-collision range between Pikachu and note +; between y-$10 and y+$10 + add $10 ld e, a - sub $20 + sub ($10 * 2) ld d, a push bc + +; Check if the Pikachu object collides with any of the note +; objects. + ld bc, $c41c ; Pikachu object, hardcoded - ld a, $0a -.jr_038_44f9 + ld a, 10 ; Number of objects to check +.check_note_object push af push de - ld hl, $0000 + ld hl, SPRITEANIMSTRUCT_INDEX add hl, bc ld a, [hl] and a - jr z, .jr_038_450f - ld hl, $0001 +; Deinitialized object, get the next object + jr z, .get_next_object + +; Is the current object a note? + ld hl, SPRITEANIMSTRUCT_FRAMESET_ID add hl, bc ld a, [hl] - cp $07 - jr nz, .jr_038_450f - call .Call_038_451f -.jr_038_450f - ld hl, $0010 + cp 7 + jr nz, .get_next_object + +; Check if note collides with Pikachu + call .IsNoteColliding + +.get_next_object + ld hl, SPRITEANIMSTRUCT_LENGTH add hl, bc ld c, l ld b, h pop de pop af dec a - jr nz, .jr_038_44f9 + jr nz, .check_note_object pop bc call PikachuMiniGame_AddToScore ret -.Call_038_451f: + +.IsNoteColliding: +; Is the note object within $48 - $68 (middle of the screen)? ld a, $48 - ld hl, $4 + ld hl, SPRITEANIMSTRUCT_XCOORD add hl, bc cp [hl] ret nc + ld a, $68 cp [hl] ret c + +; Is the note object within collision range? ld a, d - ld hl, $0005 + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc cp [hl] ret nc + ld a, e cp [hl] ret c @@ -910,14 +949,15 @@ MinigamePikachuDoMovement:: ld a, 1 ld [wPikachuMinigameNoteCaught], a - ld hl, $b +; Delete the note object + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc inc [hl] + ld hl, wPikachuMinigameScoreModifier inc [hl] ret - PikachuMiniGame_AddToScore: ld hl, wPikachuMinigameScore ld e, [hl] @@ -928,7 +968,7 @@ PikachuMiniGame_AddToScore: daa ld e, a ld a, d - adc $00 + adc 0 daa ld d, a ld [hl], d @@ -991,80 +1031,92 @@ CopyPikachuObjDataToTailObj:: ld [hl], a ret -Call_038_459c: - ld hl, $0007 +MinigamePikachuCheckFloorCollision: + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld a, [hl] - ld hl, $0005 + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc add [hl] ld d, a - ld hl, $000b + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc ld a, [hl] - cp $02 - jr z, .jr_038_45c3 - cp $03 - jr z, .jr_038_45e3 + +; Pikachu is jumping + cp 2 + jr z, .jumping + +; Pikachu is falling + cp 3 + jr z, .falling + ld a, d cp $70 ret z - call Call_038_4602 + + call .CheckCollidingFloor ret nz - ld hl, $000b + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], $03 + ld [hl], 3 ret - -.jr_038_45c3 +.jumping ld a, [wPikachuMinigamePikachuYOffset] cp $3e ret nc - call Call_038_4602 + + call .CheckCollidingFloor ret z - ld hl, $000b + + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], $00 - ld hl, $0007 + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld a, [hl] - ld [hl], $00 - ld hl, $0005 + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc add [hl] - and $f8 + and %11111000 ld [hl], a ret -.jr_038_45e3 + +.falling ld a, d cp $70 - jr z, .jr_038_45ec - call Call_038_4602 + jr z, .landed + call .CheckCollidingFloor ret z -.jr_038_45ec - ld hl, $000b + +.landed + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], $00 - ld hl, $0007 + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld a, [hl] - ld [hl], $00 - ld hl, $0005 + ld [hl], 0 + ld hl, SPRITEANIMSTRUCT_YCOORD add hl, bc add [hl] - and $f8 + and %11111000 ld [hl], a ret +.CheckCollidingFloor: +; Returns z if we collided with a platform. -Call_038_4602: ld a, d - cp $40 - jr z, .jr_038_4609 + cp 64 + jr z, .check_tile_below xor a ret -.jr_038_4609 +.check_tile_below ld hl, wPikachuMinigameColumnBuffer ld a, $16 cp [hl] @@ -1194,7 +1246,7 @@ PikachuMiniGame_GetNextColumn: sub $f0 ld e, a ld d, 0 - ld hl, .table + ld hl, .Jumptable add hl, de add hl, de ld a, [hli] @@ -1202,31 +1254,34 @@ PikachuMiniGame_GetNextColumn: ld l, a jp hl -.table - dw .DummyCommand ; f0 - dw .DummyCommand ; f1 - dw .DummyCommand ; f2 - dw .DummyCommand ; f3 - dw .DummyCommand ; f4 - dw .DummyCommand ; f5 - dw .DummyCommand ; f6 - dw .DummyCommand ; f7 - dw .DummyCommand ; f8 - dw .CommandF9 ; f9 - dw .CommandFA ; fa - dw .CommandFB ; fb - dw .JumpCommand ; fc - dw .CommandFD ; fd - dw .CommandFE ; fe - dw .CommandFF ; ff +.Jumptable: + dw .DummyCommand ; f0 + dw .DummyCommand ; f1 + dw .DummyCommand ; f2 + dw .DummyCommand ; f3 + dw .DummyCommand ; f4 + dw .DummyCommand ; f5 + dw .DummyCommand ; f6 + dw .DummyCommand ; f7 + dw .DummyCommand ; f8 + dw .CommandF9 ; f9 + dw .CommandFA ; fa + dw .CommandFB ; fb + dw .JumpCommand ; fc + dw .CommandFD ; fd + dw .CallCommand ; fe + dw .ReturnCommand ; ff .DummyCommand: ret -.CommandFF: - ld hl, wc618 +.ReturnCommand: +; End level subpart + + ld hl, wPikachuMinigameColumnFlags res 0, [hl] - ld hl, wc619 + + ld hl, wPikachuMinigameSavedColumnPointer ld e, [hl] inc hl ld d, [hl] @@ -1236,7 +1291,9 @@ PikachuMiniGame_GetNextColumn: ld [hl], d ret -.CommandFE: +.CallCommand: +; Call a level subpart + call .GetNextByte ld e, a call .GetNextByte @@ -1244,18 +1301,23 @@ PikachuMiniGame_GetNextColumn: ld c, [hl] inc hl ld b, [hl] - ld hl, wc619 + + ld hl, wPikachuMinigameSavedColumnPointer ld [hl], c inc hl ld [hl], b + ld hl, wPikachuMinigameColumnPointer + 1 ld [hld], a ld [hl], e - ld hl, wc618 + + ld hl, wPikachuMinigameColumnFlags set 0, [hl] ret .JumpCommand: +; Jump to another part of the level + call .GetNextByte ld e, a call .GetNextByte @@ -1266,21 +1328,21 @@ PikachuMiniGame_GetNextColumn: .CommandFD: call .GetNextByte - ld hl, wc618 + ld hl, wPikachuMinigameColumnFlags bit 1, [hl] - jr nz, .jr_038_473e + jr nz, .flag_set and a - jr z, .jr_038_4746 + jr z, .update_pointer dec a - ld [wPikachuMinigameSavedColumnPointer], a + ld [wPikachuMinigameRepeatColumnCounter], a set 1, [hl] -.jr_038_473e - ld hl, wPikachuMinigameSavedColumnPointer +.flag_set + ld hl, wPikachuMinigameRepeatColumnCounter ld a, [hl] and a - jr z, .jr_038_4753 + jr z, .done dec [hl] -.jr_038_4746 +.update_pointer call .GetNextByte ld e, a call .GetNextByte @@ -1288,30 +1350,30 @@ PikachuMiniGame_GetNextColumn: ld [hld], a ld [hl], e ret -.jr_038_4753 - ld hl, wc618 +.done + ld hl, wPikachuMinigameColumnFlags res 2, [hl] call .ReplaceColumnPointer ret .CommandF9: call .GetNextByte - ld [wPikachuMinigameSavedColumnPointer + 1], a + ld [wPikachuMinigameRepeatColumnCounter2], a ret .CommandFA: - ld hl, wPikachuMinigameSavedColumnPointer + 1 + ld hl, wPikachuMinigameRepeatColumnCounter2 inc [hl] ret .CommandFB: call .GetNextByte - ld hl, wPikachuMinigameSavedColumnPointer + 1 + ld hl, wPikachuMinigameRepeatColumnCounter2 cp [hl] - jr z, .jr_038_4775 + jr z, .got_match call .ReplaceColumnPointer ret -.jr_038_4775 +.got_match call .GetNextByte ld e, a call .GetNextByte @@ -1350,7 +1412,7 @@ PikachuMiniGame_GetNextColumn: PikachuMiniGame_Columns: ; Essentially the "level design" of the minigame -; Also see PikachuMiniGame_RenderColumn.ColumnSet +; See also PikachuMiniGame_RenderColumn.ColumnSet db $00, $01 db $00, $01 diff --git a/ram/wram.asm b/ram/wram.asm index 8ff99b1..287d044 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -177,7 +177,7 @@ wPikachuMinigamePikachuNextAnim:: ds 1 wPikachuMinigameControlEnable:: ds 1 -wc606:: ds 1 +wc606:: ds 1 ; written to, but is this read from? wPikachuMinigamePikachuYOffset:: ds 1 wPikachuMinigameNoteTimer:: ds 1 @@ -194,16 +194,20 @@ wPikachuMinigameNoteCaught:: ds 1 wPikachuMinigameTimeFrames:: ds 1 wPikachuMinigameTimeSeconds:: ds 1 +; are these two used? wc613:: ds 1 wc614:: ds 1 + wPikachuMinigameRedrawTimer:: ds 1 wc616:: ds 1 wPikachuMinigameScrollSpeed:: ds 1 -wc618:: ds 1 -wc619:: ds 1 -wc61a:: ds 1 -wPikachuMinigameColumnPointer:: ds 2 + +wPikachuMinigameColumnFlags:: ds 1 wPikachuMinigameSavedColumnPointer:: ds 2 +wPikachuMinigameColumnPointer:: ds 2 + +wPikachuMinigameRepeatColumnCounter:: ds 1 +wPikachuMinigameRepeatColumnCounter2:: ds 1 wPikachuMinigameSceneTimer:: ds 1 -- cgit v1.2.3 From 1a131d1ce01bfd12cdb3cf61719e41bff7b699db Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Sat, 12 Dec 2020 14:37:11 +0700 Subject: Some adjustments --- constants/sprite_anim_constants.asm | 2 + engine/games/pikachu_minigame.asm | 88 ++++++++++++++++++++++--------------- ram/wram.asm | 16 +++++++ 3 files changed, 70 insertions(+), 36 deletions(-) diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index 1b20a60..928b601 100755 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -52,6 +52,8 @@ SPRITE_ANIM_INDEX_GS_TITLE_FLAME_NOTE EQU $2e SPRITE_ANIM_INDEX_MINIGAME_PIKACHU EQU $2f SPRITE_ANIM_INDEX_MINIGAME_PIKACHU_TAIL EQU $30 +SPRITE_ANIM_INDEX_MINIGAME_NOTE EQU $31 +SPRITE_ANIM_INDEX_MINIGAME_JIGGLYPUFF EQU $32 SPRITE_ANIM_INDEX_39 EQU $39 SPRITE_ANIM_INDEX_GAMEFREAK_LOGO EQU $3a diff --git a/engine/games/pikachu_minigame.asm b/engine/games/pikachu_minigame.asm index c87c5fe..6f6283f 100644 --- a/engine/games/pikachu_minigame.asm +++ b/engine/games/pikachu_minigame.asm @@ -1,5 +1,21 @@ INCLUDE "constants.asm" +; MinigamePikachuDoMovement.Jumptable constants + const_def + const MINIGAME_PIKACHU_INIT ; 00 + const MINIGAME_PIKACHU_CONTROL ; 01 + const MINIGAME_PIKACHU_JUMPING ; 02 + const MINIGAME_PIKACHU_FALLING ; 03 + +; PikachuMiniGame_PerformGameFunction.Jumptable constants + const_def + const PIKACHU_MINIGAME_SETUP ; 00 + const PIKACHU_MINIGAME_NOTE_SPAWNER ; 01 + const PIKACHU_MINIGAME_SET_NEXT_SCENE_TIMER ; 02 + const PIKACHU_MINIGAME_WAIT_AND_GOTO_NEXT ; 03 + const PIKACHU_MINIGAME_SHOW_JIGGLYPUFF ; 04 + const PIKACHU_MINIGAME_FADE_OUT ; 05 + SECTION "engine/games/pikachu_minigame.asm@Pikachu Minigame", ROMX PikachuMiniGame:: @@ -59,7 +75,7 @@ PikachuMiniGame:: call PikachuMiniGame_DrawBackground ld hl, wSpriteAnimDict - ld a, $22 ; anim dict values? + ld a, SPRITE_ANIM_INDEX_GS_INTRO_OMANYTE ld [hli], a ld a, SPRITE_ANIM_DICT_DEFAULT ld [hli], a @@ -142,7 +158,7 @@ PikachuMiniGame:: PikachuMiniGame_ClearBothTilemaps: ld hl, vBGMap1 - ld bc, $0280 + ld bc, SCREEN_WIDTH * BG_MAP_HEIGHT .clear_bgmap ld [hl], 0 inc hl @@ -152,7 +168,7 @@ PikachuMiniGame_ClearBothTilemaps: jr nz, .clear_bgmap ld hl, wTileMap - ld bc, $0168 + ld bc, SCREEN_WIDTH * SCREEN_HEIGHT .clear_tilemap ld [hl], 0 inc hl @@ -329,7 +345,7 @@ PikachuMiniGame_RunFrame: ld a, [hl] ; Skip minigame on pressing Start - and %00001000 + and START jr nz, .Done ld a, [wPikachuMinigameJumptableIndex] @@ -370,7 +386,7 @@ PikachuMiniGame_RunFrame: callab InitEffectObject ld hl, wVirtualOAM - ld c, $a0 + ld c, SPRITEOAMSTRUCT_LENGTH * NUM_SPRITE_OAM_STRUCTS xor a .clear_oam ld [hli], a @@ -408,11 +424,11 @@ PikachuMiniGame_RunTimer: add 1 daa ld [hl], a - cp $60 ; 1 minute + cp $60 ret c ; When gameplay time reaches 1 minute, end the game here - ld a, $02 + ld a, PIKACHU_MINIGAME_SET_NEXT_SCENE_TIMER ld [wPikachuMinigameJumptableIndex], a ret @@ -420,7 +436,7 @@ PikachuMiniGame_RunTimer: PikachuMiniGame_UpdateBlocks: ldh a, [hSCX] ld e, a - and $07 + and 7 ret nz ld a, $48 @@ -442,7 +458,7 @@ PikachuMiniGame_UpdateBlocks: ld [wVBCopySrc], a ld a, h ld [wVBCopySrc + 1], a - ld a, $01 + ld a, 1 ld [wVBCopySize], a ret @@ -465,18 +481,18 @@ PikachuMiniGame_PrintBCD: ; in the thousandths range? ld a, b swap a - and %00001111 + and $0f jr nz, .four_digits ; in the hundredths range? ld a, b - and %00001111 + and $0f jr nz, .three_digits ; in the tenths range? ld a, c swap a - and %00001111 + and $0f jr nz, .two_digits ; got one digit @@ -527,9 +543,9 @@ PikachuMiniGame_PrintBCD: ret PikachuMiniGame_PerformGameFunction: - jumptable .jumptable, wPikachuMinigameJumptableIndex + jumptable .Jumptable, wPikachuMinigameJumptableIndex -.jumptable +.Jumptable: ; jumptable here dw PikachuMiniGame_SetupScene dw PikachuMiniGame_NoteSpawner @@ -543,7 +559,7 @@ PikachuMiniGame_SetupScene: ld a, 4 ld [wPikachuMinigameScrollSpeed], a - ld a, %00110001 + ld a, D_LEFT | D_RIGHT | A_BUTTON ld [wPikachuMinigameControlEnable], a ld hl, wPikachuMinigameJumptableIndex @@ -570,7 +586,7 @@ PikachuMiniGame_WaitAndGotoNextScene: PikachuMiniGame_ShowJigglypuff: depixel 14, 24 - ld a, $32 + ld a, SPRITE_ANIM_INDEX_MINIGAME_JIGGLYPUFF call InitSpriteAnimStruct xor a @@ -667,13 +683,13 @@ PikachuMiniGame_NoteSpawner: ldh a, [hSCX] and $1f ld e, a - ld a, $00 + ld a, 0 sub e ld e, a - ld a, $03 - ld [$c4bc], a ; Hardcoded object loc + ld a, 3 + ld [wSpriteAnimCount], a - ld a, $31 ; NOTE + ld a, SPRITE_ANIM_INDEX_MINIGAME_NOTE ; NOTE call InitSpriteAnimStruct ; add one to the note counter @@ -734,10 +750,10 @@ PikachuMiniGame_NoteSpawner: add hl, de ld a, [wPikachuMinigameSpawnDataIndex] - and $07 + and 7 ld e, a inc a - cp $08 + cp 8 jr c, .determine_y_coords ; next spawn type @@ -783,14 +799,15 @@ MinigamePikachuDoMovement:: add hl, bc ld e, [hl] ld d, 0 - ld hl, .jump + ld hl, .Jumptable add hl, de add hl, de ld a, [hli] ld h, [hl] ld l, a jp hl -.jump + +.Jumptable: dw .InitPikachuMovement dw .ControlPikachu dw .PikachuJumping @@ -799,7 +816,7 @@ MinigamePikachuDoMovement:: .InitPikachuMovement: ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], 1 + ld [hl], MINIGAME_PIKACHU_CONTROL ld a, 2 ld [wPikachuMinigamePikachuNextAnim], a ret @@ -810,8 +827,7 @@ MinigamePikachuDoMovement:: and [hl] ld d, a -; Only read the A button - and %00000001 + and A_BUTTON jr nz, .do_jump ; Don't animate Pikachu when the screen is still @@ -852,7 +868,7 @@ MinigamePikachuDoMovement:: .fall_down_from_jump ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], 3 + ld [hl], MINIGAME_PIKACHU_FALLING ret .FallDown: @@ -887,7 +903,7 @@ MinigamePikachuDoMovement:: ; Check if the Pikachu object collides with any of the note ; objects. - ld bc, $c41c ; Pikachu object, hardcoded + ld bc, wSpriteAnim1 ld a, 10 ; Number of objects to check .check_note_object push af @@ -1045,11 +1061,11 @@ MinigamePikachuCheckFloorCollision: ld a, [hl] ; Pikachu is jumping - cp 2 + cp MINIGAME_PIKACHU_JUMPING jr z, .jumping ; Pikachu is falling - cp 3 + cp MINIGAME_PIKACHU_FALLING jr z, .falling ld a, d @@ -1061,7 +1077,7 @@ MinigamePikachuCheckFloorCollision: ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], 3 + ld [hl], MINIGAME_PIKACHU_FALLING ret .jumping @@ -1074,7 +1090,7 @@ MinigamePikachuCheckFloorCollision: ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], 0 + ld [hl], MINIGAME_PIKACHU_INIT ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld a, [hl] @@ -1096,7 +1112,7 @@ MinigamePikachuCheckFloorCollision: .landed ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc - ld [hl], 0 + ld [hl], MINIGAME_PIKACHU_INIT ld hl, SPRITEANIMSTRUCT_YOFFSET add hl, bc ld a, [hl] @@ -1152,13 +1168,13 @@ PikachuMiniGame_ScrollScene: srl a srl a ld e, a - ld d, $00 + ld d, 0 ld hl, vBGMap0 add hl, de ld a, l ldh [hRedrawRowOrColumnDest], a ld a, h - ldh [$ffe7], a + ldh [hRedrawRowOrColumnDest + 1], a ld a, $01 ldh [hRedrawRowOrColumnMode], a ret diff --git a/ram/wram.asm b/ram/wram.asm index 287d044..95ac322 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -93,6 +93,22 @@ NEXTU wSpriteAnimDict:: ds 10 * 2 ; NUM_SPRITEANIMDICT_ENTRIES * 2 +wSpriteAnimationStructs:: +; field 0: index +; fields 1-3: loaded from SpriteAnimSeqData +wSpriteAnim1:: sprite_anim_struct wSpriteAnim1 +wSpriteAnim2:: sprite_anim_struct wSpriteAnim2 +wSpriteAnim3:: sprite_anim_struct wSpriteAnim3 +wSpriteAnim4:: sprite_anim_struct wSpriteAnim4 +wSpriteAnim5:: sprite_anim_struct wSpriteAnim5 +wSpriteAnim6:: sprite_anim_struct wSpriteAnim6 +wSpriteAnim7:: sprite_anim_struct wSpriteAnim7 +wSpriteAnim8:: sprite_anim_struct wSpriteAnim8 +wSpriteAnim9:: sprite_anim_struct wSpriteAnim9 +wSpriteAnim10:: sprite_anim_struct wSpriteAnim10 +wSpriteAnimationStructsEnd:: + +wSpriteAnimCount:: db NEXTU ds 1 -- cgit v1.2.3 From 039a2bd71576f96e0819f4657fc3ef44fd8ae4d2 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 17 Dec 2020 23:41:14 +0700 Subject: Suggested changes to #83 --- constants.asm | 1 + constants/sfx_constants.asm | 4 ++ constants/sprite_anim_constants.asm | 12 +--- engine/dumps/bank02.asm | 8 +-- engine/movie/game_freak_intro.asm | 12 ++-- engine/movie/opening_cutscene.asm | 136 ++++++++++++++++++------------------ gfx/gfx.asm | 2 + gfx/intro/forest_log.png | Bin 0 -> 5480 bytes gfx/intro/forest_tilemap.bin | Bin 288 -> 256 bytes ram/wram.asm | 1 + 10 files changed, 90 insertions(+), 86 deletions(-) create mode 100644 constants/sfx_constants.asm create mode 100644 gfx/intro/forest_log.png diff --git a/constants.asm b/constants.asm index 19c002d..1e79e49 100644 --- a/constants.asm +++ b/constants.asm @@ -35,6 +35,7 @@ INCLUDE "constants/sprite_anim_constants.asm" INCLUDE "constants/battle_constants.asm" INCLUDE "constants/palette_constants.asm" INCLUDE "constants/music_constants.asm" +INCLUDE "constants/sfx_constants.asm" INCLUDE "constants/landmark_constants.asm" INCLUDE "constants/map_constants.asm" INCLUDE "constants/map_setup_constants.asm" diff --git a/constants/sfx_constants.asm b/constants/sfx_constants.asm new file mode 100644 index 0000000..9000814 --- /dev/null +++ b/constants/sfx_constants.asm @@ -0,0 +1,4 @@ +; TODO + +SFX_GAME_FREAK_LOGO_RG EQU $31 + diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index 928b601..af60e02 100755 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -19,15 +19,9 @@ SPRITEANIMSTRUCT_LENGTH EQU const_value ; wSpriteAnimDict keys - const_def - const SPRITE_ANIM_DICT_DEFAULT ; 0 - const SPRITE_ANIM_DICT_GS_INTRO ; 1 - const SPRITE_ANIM_DICT_GS_INTRO_2 ; 2 - const_skip 2 ; unused - const SPRITE_ANIM_DICT_TEXT_CURSOR ; 5 - const SPRITE_ANIM_DICT_GS_SPLASH ; 6 - const SPRITE_ANIM_DICT_SLOTS ; 7 - const SPRITE_ANIM_DICT_ARROW_CURSOR ; 8 +SPRITE_ANIM_DICT_DEFAULT EQU $00 +SPRITE_ANIM_DICT_GS_SPLASH EQU $27 + ; wSpriteAnimDict size (see ram/wram.asm) NUM_SPRITEANIMDICT_ENTRIES EQU 10 diff --git a/engine/dumps/bank02.asm b/engine/dumps/bank02.asm index aa9ec80..1db4285 100755 --- a/engine/dumps/bank02.asm +++ b/engine/dumps/bank02.asm @@ -2486,19 +2486,19 @@ Function9604: ld [hl], e ret -Function962d: +LoadMagikarpPalettes_Intro: ld hl, Data997c jp Function964b -Function9633: +LoadForestPalettes2_Intro: ld hl, Data986c jp Function964b -Function9639: +LoadVenusaurPalettes_Intro: ld hl, Data99ac jp Function964b -Function963f: +LoadCharizardPalettes_Intro: ld hl, Data99bc jp Function964b diff --git a/engine/movie/game_freak_intro.asm b/engine/movie/game_freak_intro.asm index 456197d..9ae95c9 100644 --- a/engine/movie/game_freak_intro.asm +++ b/engine/movie/game_freak_intro.asm @@ -80,7 +80,7 @@ GameFreakIntro:: callba InitEffectObject ld hl, wSpriteAnimDict - ld a, $27 ; SPRITE_ANIM_DICT_GS_SPLASH + ld a, SPRITE_ANIM_DICT_GS_SPLASH ld [hli], a ld a, $8d ld [hl], a @@ -172,11 +172,11 @@ GameFreakPresents_Star: ld a, SPRITE_ANIM_INDEX_GS_INTRO_STAR call InitSpriteAnimStruct - ld hl, $000c ; SPRITEANIMSTRUCT_VAR1 + ld hl, SPRITEANIMSTRUCT_0C add hl, bc ld [hl], $a0 ; star path radius - ld de, $0031 ; SFX_GAME_FREAK_LOGO (metronome?) + ld de, SFX_GAME_FREAK_LOGO_RG call PlaySFX call GameFreakPresents_NextScene ret @@ -309,15 +309,15 @@ GameFreakPresents_Sparkle: ; set the angle and distance for this sprite ld e, l ld d, h - ld hl, $b ; SPRITEANIMSTRUCT_JUMPTABLE_INDEX + ld hl, SPRITEANIMSTRUCT_JUMPTABLE_INDEX add hl, bc ld a, [de] ld [hl], a ; angle inc de - ld hl, $c ; SPRITEANIMSTRUCT_VAR1 + ld hl, SPRITEANIMSTRUCT_0C add hl, bc ld [hl], 0 - inc hl ; SPRITEANIMSTRUCT_VAR2 + inc hl ; SPRITEANIMSTRUCT_0D ld a, [de] ld [hl], a ; distance ret diff --git a/engine/movie/opening_cutscene.asm b/engine/movie/opening_cutscene.asm index 4b60625..c98050d 100644 --- a/engine/movie/opening_cutscene.asm +++ b/engine/movie/opening_cutscene.asm @@ -19,7 +19,7 @@ OpeningCutscene:: .PlayFrame: ld hl, hJoypadDown ld a, [hl] - and %00001111 + and $f jr nz, .Finish ; check done flag @@ -70,7 +70,7 @@ IntroSceneJumper: dw IntroScene16 dw IntroScene17 -IntroScene1: ; 43b8 +IntroScene1: ; Set up water cutscene ld hl, wIntroJumptableIndex inc [hl] @@ -101,8 +101,8 @@ IntroScene1: ; 43b8 ld a, h ld [wIntroBGMapPointer + 1], a -; Load water tilemap - ld de, Intro_WaterTilemap + 15 tiles +; Load water tilemap (shifted to starting position) + ld de, Intro_WaterTilemap + $F0 ld a, e ld [wIntroTilemapPointer + 0], a ld a, d @@ -159,7 +159,7 @@ IntroScene1: ; 43b8 call Intro_InitOmanyte ret -IntroScene2: ; 444a +IntroScene2: call Intro_UpdateLYOverrides ld hl, wIntroFrameCounter1 ld a, [hl] @@ -194,7 +194,7 @@ IntroScene4: ld hl, wIntroFrameCounter2 inc [hl] ld a, [hl] - and $07 + and $7 jr nz, .skip_move_left ld hl, hSCX dec [hl] @@ -210,7 +210,7 @@ IntroScene4: ld [wIntroFrameCounter1], a IntroScene5: -; fade out +; scroll right and fade out to white ld hl, wIntroFrameCounter1 ld a, [hl] inc [hl] @@ -235,11 +235,11 @@ IntroScene5: ret .palettes: - db %11100100 - db %11100100 - db %10010000 - db %01000000 - db %00000000 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 0, 0, 0, 0 db -1 IntroScene17: @@ -287,7 +287,8 @@ IntroScene3_ScrollToSurface: IntroScene3_Jumper: jumptable .subroutines, wIntroFrameCounter1 -.subroutines + +.subroutines: dw .scene3_2 dw .scene3_2 dw .scene3_2 @@ -310,8 +311,9 @@ IntroScene3_Jumper: call Intro_InitLapras ld a, %11100100 ldh [rOBP0], a +; fallthrough -.scene3_2: ; fallthrough +.scene3_2: call Intro_AnimateOceanWaves ret @@ -328,7 +330,7 @@ IntroScene3_Jumper: call Intro_InitMagikarps ret .load_palettes - callab Function962d ; load magikarp palettes + callab LoadMagikarpPalettes_Intro ret .scene3_5: @@ -343,14 +345,14 @@ IntroScene3_Jumper: Intro_InitBubble: ld hl, wIntroFrameCounter1 ld a, [hl] - and $0f + and $f ret nz ld a, [hl] and $70 swap a ld e, a - ld d, $00 + ld d, 0 ld hl, .pixel_table add hl, de add hl, de @@ -361,7 +363,7 @@ Intro_InitBubble: call InitSpriteAnimStruct ret -.pixel_table +.pixel_table: dbpixel 6, 14, 0, 4 dbpixel 14, 18, 0, 4 dbpixel 10, 16, 0, 4 @@ -417,7 +419,7 @@ Intro_InitOmanyte: depixel 14, 10 call .PlaceOmanyte depixel 16, 15 -; fallback +; fallthrough .PlaceOmanyte: ld a, SPRITE_ANIM_INDEX_GS_INTRO_OMANYTE @@ -448,7 +450,7 @@ Intro_UpdateTilemapAndBGMap: ld e, a ld a, [wIntroTilemapPointer + 1] ld d, a - ld hl, -$10 + ld hl, -BG_MAP_WIDTH / 2 add hl, de ld a, l ld e, l @@ -490,7 +492,6 @@ Intro_UpdateTilemapAndBGMap: pop hl ret - Intro_AnimateOceanWaves: ; uses a 2bpp request to copy tile IDs to the BG map ld hl, wIntroFrameCounter2 @@ -513,13 +514,14 @@ endr ld [wVBCopySrc], a ld a, h ld [wVBCopySrc + 1], a - ld a, LOW(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 + ld a, LOW(vBGMap0 + 15 * BG_MAP_WIDTH) ld [wVBCopyDst], a - ld a, HIGH(vBGMap0 + (15 * BG_MAP_WIDTH)) ; vBGMap0 row 15 + ld a, HIGH(vBGMap0 + 15 * BG_MAP_WIDTH) ld [wVBCopyDst + 1], a ld a, 2 ld [wVBCopySize], a ret + .wave_tiles: ; Fill an entire bg map row with each frame rept 8 @@ -593,7 +595,7 @@ Intro_UpdateLYOverrides: ret IntroScene6: -; Set up grass cutscene (Pikachu/Jigglypuff) +; Set up grass cutscene (Pikachu / Jigglypuff) ld hl, wIntroJumptableIndex inc [hl] call DisableLCD @@ -614,7 +616,7 @@ IntroScene6: ld [wIntroBGMapPointer + 0], a ld a, h ld [wIntroBGMapPointer + 1], a - ld de, Intro_GrassTilemap + 2 tiles + ld de, Intro_GrassTilemap ld a, e ld [wIntroTilemapPointer + 0], a ld a, d @@ -622,7 +624,7 @@ IntroScene6: call Intro_DrawBackground ld hl, IntroJigglypuffPikachuGFX ld de, vChars0 - ld bc, $0a00 + ld bc, 160 tiles ; last 16 tiles actually belong to charizard's gfx .load ld a, [hli] @@ -648,7 +650,7 @@ IntroScene6: xor a ld [wIntroFrameCounter2], a call EnableLCD - ld a, $e4 + ld a, %11100100 ldh [rBGP], a ldh [rOBP0], a call Intro_InitJigglypuff @@ -661,7 +663,7 @@ IntroScene7: ld hl, wIntroFrameCounter2 ld a, [hl] inc [hl] - and $03 + and $3 ret z ld hl, hSCX @@ -698,7 +700,7 @@ IntroScene8: ld [wIntroFrameCounter1], a ld hl, wIntroJumptableIndex inc [hl] - callab Function9633 + callab LoadForestPalettes2_Intro ret IntroScene9: @@ -706,9 +708,9 @@ IntroScene9: ld a, [hl] inc [hl] swap a - and $0f + and $f ld e, a - ld d, $00 + ld d, 0 ld hl, .palettes add hl, de ld a, [hl] @@ -729,20 +731,19 @@ IntroScene9: .palettes: ; fade out to black - db %11100100 - db %11100100 - db %11100100 - db %11100100 - db %11100100 - db %11111001 - db %11111110 - db %11111111 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 2, 1, 0 + dc 3, 3, 2, 1 + dc 3, 3, 3, 2 + dc 3, 3, 3, 3 db 0 Intro_DummyFunction: ret - Intro_InitNote: ld a, [wIntroSpriteStateFlag] and a @@ -768,14 +769,12 @@ Intro_InitNote: call InitSpriteAnimStruct ret - Intro_InitJigglypuff: depixel 14, 6 ld a, SPRITE_ANIM_INDEX_GS_INTRO_JIGGLYPUFF call InitSpriteAnimStruct ret - Intro_InitPikachu: depixel 14, 24 ld a, SPRITE_ANIM_INDEX_GS_INTRO_PIKACHU @@ -884,10 +883,10 @@ IntroScene12: ret .palettes: - db %01101010 - db %10100101 - db %11100100 - db %00000000 + dc 1, 2, 2, 2 + dc 2, 2, 1, 1 + dc 3, 2, 1, 0 + dc 0, 0, 0, 0 IntroScene13: ; Charizard mouth open @@ -951,13 +950,13 @@ IntroScene16: ld a, [hl] inc [hl] swap a - and $07 + and $7 ld e, a - ld d, $00 + ld d, 0 ld hl, .palettes add hl, de ld a, [hl] - cp $ff + cp -1 jr z, .next ldh [rBGP], a ldh [rOBP0], a @@ -966,16 +965,18 @@ IntroScene16: ld hl, wIntroJumptableIndex inc [hl] ret + .palettes: - db %11100100 - db %10010000 - db %01000000 - db %00000000 + dc 3, 2, 1, 0 + dc 2, 1, 0, 0 + dc 1, 0, 0, 0 + dc 0, 0, 0, 0 db -1 Intro_BlankTilemapAndBGMap: hlcoord 0, 0 ld bc, SCREEN_WIDTH * SCREEN_HEIGHT + .blank_tilemap ld [hl], 0 inc hl @@ -984,8 +985,9 @@ Intro_BlankTilemapAndBGMap: or c jr nz, .blank_tilemap - ld hl, wOverworldMapBlocks ; $c600, buffer + ld hl, wc600 ld bc, BG_MAP_WIDTH * BG_MAP_HEIGHT + .blank_bgmap ld [hl], 0 inc hl @@ -995,12 +997,11 @@ Intro_BlankTilemapAndBGMap: jr nz, .blank_bgmap ld hl, vBGMap0 - ld de, wOverworldMapBlocks ; $c600, buffer + ld de, wc600 lb bc, BANK(@), $40 call Request2bpp ret - Intro_CheckSCYEvent: ldh a, [hSCY] ld c, a @@ -1056,14 +1057,13 @@ Intro_FlashSilhouette: ret Intro_LoadVenusaurPalette: - callab Function9639 + callab LoadVenusaurPalettes_Intro ret Intro_LoadCharizardPalette: - callab Function963f + callab LoadCharizardPalettes_Intro ret - DrawIntroCharizardGraphic: push af hlcoord 0, 6 @@ -1076,7 +1076,7 @@ DrawIntroCharizardGraphic: pop af ld e, a - ld d, $00 + ld d, 0 ld hl, .charizard_data rept 5 add hl, de @@ -1117,10 +1117,15 @@ endr ldh [hBGMapMode], a ret -.charizard_data - db $00, $08, $08, $22, $c3 - db $40, $09, $08, $21, $c3 - db $88, $09, $08, $20, $c3 +.charizard_data: +intro_graphic_def: MACRO + db \1 + db \2, \3 + dwcoord \4, \5 +ENDM + intro_graphic_def $00, 8, 8, 10, 6 + intro_graphic_def $40, 9, 8, 9, 6 + intro_graphic_def $88, 9, 8, 8, 6 Intro_AnimateFireball: ld hl, wIntroFrameCounter2 @@ -1161,7 +1166,6 @@ Intro_Copy128Tiles: jr nz, .loop ret - Intro_DrawBackground: ld b, BG_MAP_WIDTH / 2 .outer_loop @@ -1180,7 +1184,6 @@ Intro_DrawBackground: jr nz, .outer_loop ret - Intro_Draw2x2Tiles: push bc push de @@ -1223,7 +1226,6 @@ Intro_Draw2x2Tiles: pop bc ret - Intro_ResetLYOverrides: ld hl, wLYOverrides xor a diff --git a/gfx/gfx.asm b/gfx/gfx.asm index 9613e8a..8c3fb8a 100644 --- a/gfx/gfx.asm +++ b/gfx/gfx.asm @@ -556,6 +556,8 @@ INCBIN "gfx/intro/water_pokemon.2bpp" SECTION "gfx.asm@Intro Forest GFX", ROMX IntroForestGFX:: INCBIN "gfx/intro/forest.2bpp" +IntroForestLogGFX:: +INCBIN "gfx/intro/forest_log.2bpp" Intro_GrassTilemap:: INCBIN "gfx/intro/forest_tilemap.bin" Intro_GrassMeta:: diff --git a/gfx/intro/forest_log.png b/gfx/intro/forest_log.png new file mode 100644 index 0000000..deb5987 Binary files /dev/null and b/gfx/intro/forest_log.png differ diff --git a/gfx/intro/forest_tilemap.bin b/gfx/intro/forest_tilemap.bin index fb1179d..c3a8420 100644 Binary files a/gfx/intro/forest_tilemap.bin and b/gfx/intro/forest_tilemap.bin differ diff --git a/ram/wram.asm b/ram/wram.asm index 95ac322..c861704 100644 --- a/ram/wram.asm +++ b/ram/wram.asm @@ -172,6 +172,7 @@ wMapBufferEnd:: UNION +wc600:: wOverworldMapBlocks:: ds 1300 wOverworldMapBlocksEnd:: -- cgit v1.2.3 From 7850d38cc01b5a025f7117587c485932b3fc95c7 Mon Sep 17 00:00:00 2001 From: Zumi Daxuya Date: Thu, 17 Dec 2020 23:53:01 +0700 Subject: Suggested changes to #84 --- constants/sfx_constants.asm | 1 + engine/games/pikachu_minigame.asm | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/constants/sfx_constants.asm b/constants/sfx_constants.asm index 9000814..881ff52 100644 --- a/constants/sfx_constants.asm +++ b/constants/sfx_constants.asm @@ -1,4 +1,5 @@ ; TODO +SFX_PAY_DAY EQU $30 SFX_GAME_FREAK_LOGO_RG EQU $31 diff --git a/engine/games/pikachu_minigame.asm b/engine/games/pikachu_minigame.asm index 6f6283f..de930da 100644 --- a/engine/games/pikachu_minigame.asm +++ b/engine/games/pikachu_minigame.asm @@ -184,13 +184,13 @@ PikachuMiniGame_ClearBothTilemaps: PikachuMiniGame_LoadFont: ld hl, FontGFX ld de, vFont tile $10 - ld bc, (112 / 2) tiles + ld bc, 112 * LEN_1BPP_TILE ld a, BANK(FontGFX) call FarCopyDataDouble ld hl, FontGFX tile $39 ld de, vChars2 tile $32 - ld bc, ( (14 / 2) + 1) tiles + ld bc, 16 * LEN_1BPP_TILE ld a, BANK(FontGFX) call FarCopyDataDouble ret @@ -252,7 +252,6 @@ PikachuMiniGame_BlinkText: .text db "スタートホタン▶タイトルかめん" - ; "スタートボタン▶タイトルがめん" db 0 ; terminator PikachuMiniGame_Copy128Tiles: ; unreferenced? @@ -268,11 +267,11 @@ PikachuMiniGame_Copy128Tiles: ; unreferenced? ret PikachuMiniGame_DrawBackground: - ld b, $10 + ld b, BG_MAP_HEIGHT / 2 .outer_loop push hl - ld c, $10 + ld c, BG_MAP_WIDTH / 2 .inner_loop call PikachuMiniGame_Draw2x2Tile @@ -358,7 +357,7 @@ PikachuMiniGame_RunFrame: xor a ld [wPikachuMinigameNoteCaught], a - ld de, $30 ; PAY_DAY + ld de, SFX_PAY_DAY call PlaySFX .skip_playing_sfx @@ -481,18 +480,18 @@ PikachuMiniGame_PrintBCD: ; in the thousandths range? ld a, b swap a - and $0f + and $f jr nz, .four_digits ; in the hundredths range? ld a, b - and $0f + and $f jr nz, .three_digits ; in the tenths range? ld a, c swap a - and $0f + and $f jr nz, .two_digits ; got one digit @@ -546,7 +545,6 @@ PikachuMiniGame_PerformGameFunction: jumptable .Jumptable, wPikachuMinigameJumptableIndex .Jumptable: -; jumptable here dw PikachuMiniGame_SetupScene dw PikachuMiniGame_NoteSpawner dw PikachuMiniGame_SetNextSceneTimer @@ -689,7 +687,7 @@ PikachuMiniGame_NoteSpawner: ld a, 3 ld [wSpriteAnimCount], a - ld a, SPRITE_ANIM_INDEX_MINIGAME_NOTE ; NOTE + ld a, SPRITE_ANIM_INDEX_MINIGAME_NOTE call InitSpriteAnimStruct ; add one to the note counter @@ -896,7 +894,7 @@ MinigamePikachuDoMovement:: add $10 ld e, a - sub ($10 * 2) + sub $10 * 2 ld d, a push bc @@ -904,7 +902,7 @@ MinigamePikachuDoMovement:: ; objects. ld bc, wSpriteAnim1 - ld a, 10 ; Number of objects to check + ld a, NUM_SPRITE_ANIM_STRUCTS .check_note_object push af push de -- cgit v1.2.3 From 37e60a9457643720dae714f8d2df0cf5ad31d919 Mon Sep 17 00:00:00 2001 From: Rangi <35663410+Rangi42@users.noreply.github.com> Date: Thu, 17 Dec 2020 14:56:00 -0500 Subject: Define NUM_SPRITE_ANIM_STRUCTS --- constants/sprite_anim_constants.asm | 1 + 1 file changed, 1 insertion(+) diff --git a/constants/sprite_anim_constants.asm b/constants/sprite_anim_constants.asm index af60e02..08f6d69 100755 --- a/constants/sprite_anim_constants.asm +++ b/constants/sprite_anim_constants.asm @@ -17,6 +17,7 @@ const SPRITEANIMSTRUCT_0E ; e const SPRITEANIMSTRUCT_0F ; f SPRITEANIMSTRUCT_LENGTH EQU const_value +NUM_SPRITE_ANIM_STRUCTS EQU 10 ; see wSpriteAnimationStructs ; wSpriteAnimDict keys SPRITE_ANIM_DICT_DEFAULT EQU $00 -- cgit v1.2.3