diff options
-rwxr-xr-x | engine/gamefreak.asm | 160 | ||||
-rwxr-xr-x | engine/intro.asm | 143 | ||||
-rwxr-xr-x | engine/overworld/npc_movement.asm | 2 | ||||
-rwxr-xr-x | wram.asm | 3 |
4 files changed, 169 insertions, 139 deletions
diff --git a/engine/gamefreak.asm b/engine/gamefreak.asm index 32dda60e..38c66793 100755 --- a/engine/gamefreak.asm +++ b/engine/gamefreak.asm @@ -28,67 +28,78 @@ AnimateShootingStar: ; 70044 (1c:4044) call LoadShootingStarGraphics ld a, (SFX_1f_67 - SFX_Headers_1f) / 3 call PlaySound + +; Move the big star down and left across the screen. ld hl, wOAMBuffer ld bc, $a004 -.asm_70052 +.bigStarLoop push hl push bc -.asm_70054 - ld a, [hl] - add $4 +.bigStarInnerLoop + ld a, [hl] ; Y + add 4 ld [hli], a - ld a, [hl] - add $fc + ld a, [hl] ; X + add -4 ld [hli], a inc hl inc hl dec c - jr nz, .asm_70054 - ld c, $1 + jr nz, .bigStarInnerLoop + ld c, 1 call CheckForUserInterruption pop bc pop hl ret c ld a, [hl] - cp $50 - jr nz, .asm_70070 - jr .asm_70052 -.asm_70070 + cp 80 + jr nz, .next + jr .bigStarLoop +.next cp b - jr nz, .asm_70052 + jr nz, .bigStarLoop + +; Clear big star OAM. ld hl, wOAMBuffer - ld c, $4 - ld de, $4 -.asm_7007b - ld [hl], $a0 + ld c, 4 + ld de, 4 +.clearOAMLoop + ld [hl], 160 add hl, de dec c - jr nz, .asm_7007b - ld b, $3 -.asm_70083 + jr nz, .clearOAMLoop + +; Make Gamefreak logo flash. + ld b, 3 +.flashLogoLoop ld hl, rOBP0 rrc [hl] rrc [hl] - ld c, $a + ld c, 10 call CheckForUserInterruption ret c dec b - jr nz, .asm_70083 + jr nz, .flashLogoLoop + +; Copy 24 instances of the small stars OAM data. +; Note that their coordinates put them off-screen. ld de, wOAMBuffer - ld a, $18 -.asm_70098 + ld a, 24 +.initSmallStarsOAMLoop push af - ld hl, OAMData_700ee - ld bc, $4 + ld hl, SmallStarsOAM + ld bc, 4 call CopyData pop af dec a - jr nz, .asm_70098 + jr nz, .initSmallStarsOAMLoop + +; Animate the small stars falling from the Gamefreak logo. xor a - ld [wWhichTrade], a - ld hl, PointerTable_700f2 - ld c, $6 -.asm_700af + ld [wMoveDownSmallStarsOAMCount], a + ld hl, SmallStarsWaveCoordsPointerTable + ld c, 6 +.smallStarsLoop ld a, [hli] ld e, a ld a, [hli] @@ -96,100 +107,109 @@ AnimateShootingStar: ; 70044 (1c:4044) push bc push hl ld hl, wOAMBuffer + $50 - ld c, $4 -.asm_700ba + ld c, 4 +.smallStarsInnerLoop ; introduce new wave of 4 small stars OAM entries ld a, [de] cp $ff - jr z, .asm_700d5 - ld [hli], a + jr z, .next2 + ld [hli], a ; Y inc de ld a, [de] - ld [hli], a + ld [hli], a ; X inc de inc hl inc hl dec c - jr nz, .asm_700ba - ld a, [wWhichTrade] - cp $18 - jr z, .asm_700d5 - add $6 - ld [wWhichTrade], a -.asm_700d5 - call Func_7011f + jr nz, .smallStarsInnerLoop + ld a, [wMoveDownSmallStarsOAMCount] + cp 24 + jr z, .next2 + add 6 ; should be 4, but the extra 2 aren't visible on screen + ld [wMoveDownSmallStarsOAMCount], a +.next2 + call MoveDownSmallStars push af + +; shift the existing OAM entries down to make room for the next wave ld hl, wOAMBuffer + $10 ld de, wOAMBuffer ld bc, $50 call CopyData + pop af pop hl pop bc ret c dec c - jr nz, .asm_700af + jr nz, .smallStarsLoop and a ret -OAMData_700ee: ; 700ee (1c:40ee) +SmallStarsOAM: ; 700ee (1c:40ee) db $00,$00,$A2,$90 -PointerTable_700f2: ; 700f2 (1c:40f2) - dw OAMData_700fe - dw OAMData_70106 - dw OAMData_7010e - dw OAMData_70116 - dw OAMData_7011e - dw OAMData_7011e +SmallStarsWaveCoordsPointerTable: ; 700f2 (1c:40f2) + dw SmallStarsWave1Coords + dw SmallStarsWave2Coords + dw SmallStarsWave3Coords + dw SmallStarsWave4Coords + dw SmallStarsEmptyWave + dw SmallStarsEmptyWave -; each entry is only half of an OAM tile -OAMData_700fe: ; 700fe (1c:40fe) +; The stars that fall from the Gamefreak logo come in 4 waves of 4 OAM entries. +; These arrays contain the Y and X coordinates of each OAM entry. + +SmallStarsWave1Coords: ; 700fe (1c:40fe) db $68,$30 db $68,$40 db $68,$58 db $68,$78 -OAMData_70106: ; 70106 (1c:4106) +SmallStarsWave2Coords: ; 70106 (1c:4106) db $68,$38 db $68,$48 db $68,$60 db $68,$70 -OAMData_7010e: ; 7010e (1c:410e) +SmallStarsWave3Coords: ; 7010e (1c:410e) db $68,$34 db $68,$4C db $68,$54 db $68,$64 -OAMData_70116: ; 70116 (1c:4116) +SmallStarsWave4Coords: ; 70116 (1c:4116) db $68,$3C db $68,$5C db $68,$6C db $68,$74 -OAMData_7011e: ; 7011e (1c:411e) +SmallStarsEmptyWave: ; 7011e (1c:411e) db $FF -Func_7011f: ; 7011f (1c:411f) - ld b, $8 -.asm_70121 +MoveDownSmallStars: ; 7011f (1c:411f) + ld b, 8 +.loop ld hl, wOAMBuffer + $5c - ld a, [wWhichTrade] - ld de, $fffc + ld a, [wMoveDownSmallStarsOAMCount] + ld de, -4 ld c, a -.asm_7012b - inc [hl] +.innerLoop + inc [hl] ; Y add hl, de dec c - jr nz, .asm_7012b + jr nz, .innerLoop + +; Toggle the palette so that the lower star in the small stars tile blinks in +; and out. ld a, [rOBP1] - xor $a0 + xor %10100000 ld [rOBP1], a - ld c, $3 + + ld c, 3 call CheckForUserInterruption ret c dec b - jr nz, .asm_70121 + jr nz, .loop ret GameFreakLogoOAMData: ; 70140 (1c:4140) diff --git a/engine/intro.asm b/engine/intro.asm index c306555d..bbe47cdb 100755 --- a/engine/intro.asm +++ b/engine/intro.asm @@ -22,16 +22,16 @@ PlayIntroScene: ; 4169d (10:569d) ld [rOBP1], a xor a ld [hSCX], a - ld b, $3 - call Func_4183f + ld b, $3 ; Gengar tiles + call IntroCopyTiles ld a, 0 ld [W_BASECOORDX], a ld a, 80 ld [W_BASECOORDY], a ld bc, $606 - call Func_417c7 - ld de, $28ff - call Func_4180e + call InitIntroNidorinoOAM + ld de, $28ff ; move Nidorino right by 80 pixels + call IntroMoveMon ret c ; hip @@ -66,22 +66,22 @@ PlayIntroScene: ; 4169d (10:569d) ; raise ld b, $4 - call Func_4183f + call IntroCopyTiles ld a, (SFX_1f_61 - SFX_Headers_1f) / 3 call PlaySound - ld de, $401 - call Func_4180e + ld de, $401 ; move Gengar left by 8 pixels + call IntroMoveMon ld c, $1e call CheckForUserInterruption ret c ; slash ld b, $5 - call Func_4183f + call IntroCopyTiles ld a, (SFX_1f_62 - SFX_Headers_1f) / 3 call PlaySound - ld de, $800 - call Func_4180e + ld de, $800 ; move Gengar right by 16 pixels + call IntroMoveMon ; hip ld a, (SFX_1f_5f - SFX_Headers_1f) / 3 call PlaySound @@ -93,10 +93,10 @@ PlayIntroScene: ; 4169d (10:569d) call CheckForUserInterruption ret c - ld de, $401 - call Func_4180e + ld de, $401 ; move Gengar left by 8 pixels + call IntroMoveMon ld b, $3 - call Func_4183f + call IntroCopyTiles ld c, $3c call CheckForUserInterruption ret c @@ -142,19 +142,19 @@ AnimateIntroNidorino: ; 41793 (10:5793) ld a, [de] ld [W_BASECOORDX], a push de - ld c, $24 - call Func_417ae + ld c, 6 * 6 + call UpdateIntroNidorinoOAM ld c, 5 call DelayFrames pop de inc de jr AnimateIntroNidorino -Func_417ae: ; 417ae (10:57ae) +UpdateIntroNidorinoOAM: ; 417ae (10:57ae) ld hl, wOAMBuffer ld a, [wd09f] ld d, a -.asm_417b5 +.loop ld a, [W_BASECOORDY] add [hl] ld [hli], a @@ -166,105 +166,111 @@ Func_417ae: ; 417ae (10:57ae) inc hl inc d dec c - jr nz, .asm_417b5 + jr nz, .loop ret -Func_417c7: ; 417c7 (10:57c7) +InitIntroNidorinoOAM: ; 417c7 (10:57c7) ld hl, wOAMBuffer - ld d, $0 -.asm_417cc + ld d, 0 +.loop push bc ld a, [W_BASECOORDY] ld e, a -.asm_417d1 +.innerLoop ld a, e - add $8 + add 8 ld e, a - ld [hli], a + ld [hli], a ; Y ld a, [W_BASECOORDX] - ld [hli], a + ld [hli], a ; X ld a, d - ld [hli], a + ld [hli], a ; tile ld a, $80 - ld [hli], a + ld [hli], a ; attributes inc d dec c - jr nz, .asm_417d1 + jr nz, .innerLoop ld a, [W_BASECOORDX] - add $8 + add 8 ld [W_BASECOORDX], a pop bc dec b - jr nz, .asm_417cc + jr nz, .loop ret -Func_417f0: ; 417f0 (10:57f0) +IntroClearScreen: ; 417f0 (10:57f0) ld hl, vBGMap1 ld bc, $240 - jr asm_417fe + jr IntroClearCommon -Func_417f8: ; 417f8 (10:57f8) +IntroClearMiddleOfScreen: ; 417f8 (10:57f8) +; clear the area of the tile map between the black bars on the top and bottom hlCoord 0, 4 - ld bc, $c8 -asm_417fe: ; 417fe (10:57fe) + ld bc, SCREEN_WIDTH * 10 + +IntroClearCommon: ; 417fe (10:57fe) ld [hl], $0 inc hl dec bc ld a, b or c - jr nz, asm_417fe + jr nz, IntroClearCommon ret -Func_41807: ; 41807 (10:5807) +IntroPlaceBlackTiles: ; 41807 (10:5807) ld a, $1 -.asm_41809 +.loop ld [hli], a dec c - jr nz, .asm_41809 + jr nz, .loop ret -Func_4180e: ; 4180e (10:580e) +IntroMoveMon: ; 4180e (10:580e) +; d = number of times to move the mon (2 pixels each time) +; e: $00 = move Gengar right, $01 = move Gengar left, $ff = move Nidorino right ld a, e cp $ff - jr z, .asm_4181d + jr z, .moveNidorinoRight cp $1 - jr z, .asm_4182d + jr z, .moveGengarLeft +; move Gengar right ld a, [hSCX] dec a dec a - jr .asm_41831 -.asm_4181d + jr .next +.moveNidorinoRight push de - ld a, $2 + ld a, 2 ld [W_BASECOORDX], a xor a ld [W_BASECOORDY], a - ld c, $24 - call Func_417ae + ld c, 6 * 6 + call UpdateIntroNidorinoOAM pop de -.asm_4182d +.moveGengarLeft ld a, [hSCX] inc a inc a -.asm_41831 +.next ld [hSCX], a push de - ld c, $2 + ld c, 2 call CheckForUserInterruption pop de ret c dec d - jr nz, Func_4180e + jr nz, IntroMoveMon ret -Func_4183f: ; 4183f (10:583f) +IntroCopyTiles: ; 4183f (10:583f) hlCoord 13, 7 CopyTileIDsFromList_ZeroBaseTileID: ; 41842 (10:5842) - ld c, $0 + ld c, 0 predef_jump CopyTileIDsFromList -Func_41849: ; 41849 (10:5849) +PlayMoveSoundB: ; 41849 (10:5849) +; unused predef GetMoveSoundB ld a, b jp PlaySound @@ -303,7 +309,7 @@ PlayShootingStar: ; 4188a (10:588a) call DisableLCD xor a ld [W_CUROPPONENT], a - call Func_418e9 + call IntroDrawBlackBars call LoadIntroGraphics call EnableLCD ld hl, rLCDC @@ -314,36 +320,37 @@ PlayShootingStar: ; 4188a (10:588a) callba AnimateShootingStar push af pop af - jr c, .asm_418d0 + jr c, .next ; skip the delay if the user interrupted the animation ld c, 40 call DelayFrames -.asm_418d0 +.next ld a, BANK(Music_IntroBattle) ld [wc0ef], a ld [wc0f0], a ld a, MUSIC_INTRO_BATTLE ld [wc0ee], a call PlaySound - call Func_417f8 + call IntroClearMiddleOfScreen call ClearSprites jp Delay3 -Func_418e9: ; 418e9 (10:58e9) - call Func_417f0 +IntroDrawBlackBars: ; 418e9 (10:58e9) +; clear the screen and draw black bars on the top and bottom + call IntroClearScreen hlCoord 0, 0 - ld c, $50 - call Func_41807 + ld c, SCREEN_WIDTH * 4 + call IntroPlaceBlackTiles hlCoord 0, 14 - ld c, $50 - call Func_41807 + ld c, SCREEN_WIDTH * 4 + call IntroPlaceBlackTiles ld hl, vBGMap1 ld c, $80 - call Func_41807 + call IntroPlaceBlackTiles ld hl, vBGMap1 + $1c0 ld c, $80 - jp Func_41807 + jp IntroPlaceBlackTiles -Func_4190c: ; 4190c (10:590c) +EmptyFunc4: ; 4190c (10:590c) ret IntroNidorinoAnimation0: ; 4190d (10:590d) diff --git a/engine/overworld/npc_movement.asm b/engine/overworld/npc_movement.asm index aabc2de8..fcef55e0 100755 --- a/engine/overworld/npc_movement.asm +++ b/engine/overworld/npc_movement.asm @@ -74,7 +74,7 @@ PalletMovementScript_OakMoveLeft: ; 1a44c (6:644c) jr .done ; The player is on the left tile of the northern path out of Pallet Town and ; Prof. Oak is below. -; Prof. Oak is already on the right tile. +; Prof. Oak is already where he needs to be. .playerOnLeftTile ld a, $3 ld [wNPCMovementScriptFunctionNum], a @@ -634,6 +634,9 @@ wOverrideSimulatedJoypadStatesMask:: ; cd3b ds 1 +wMoveDownSmallStarsOAMCount:: ; cd3d +; the number of small stars OAM entries to move down + wChargeMoveNum:: ; cd3d wCoordIndex:: ; cd3d |