diff --git a/src/field.asm b/src/field.asm index 12b2e62..2edd26a 100644 --- a/src/field.asm +++ b/src/field.asm @@ -1238,12 +1238,8 @@ FieldProcess:: ldh [hCurrentPieceY], a xor a, a ldh [hCurrentLockDelayRemaining], a - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jp nz, .draw - call SFXKill ld a, SFX_LOCK - call SFXEnqueue + call SFXTriggerNoise jp .draw ; If we press down, we want to do a soft drop. @@ -1342,12 +1338,8 @@ FieldProcess:: ; Play the firm drop sound, and also reset the lock delay since the piece stepped down. .playfirmdropsound - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jr nz, .postcheckforfirmdropsound - call SFXKill ld a, SFX_LAND - call SFXEnqueue + call SFXTriggerNoise ; If the down button is held, lock. .postcheckforfirmdropsound @@ -1428,12 +1420,8 @@ FieldProcess:: ; Play the locking sound and draw the piece. .dolock - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jr nz, .draw - call SFXKill ld a, SFX_LOCK - call SFXEnqueue + call SFXTriggerNoise jr .draw ; If we weren't grounded, reset the lock force. @@ -1825,12 +1813,8 @@ FieldDelay:: ret nz call ClearLines - ldh a, [hCurrentIntegerGravity] - cp a, 1 - jr nz, :+ - call SFXKill ld a, SFX_LINE_CLEAR - call SFXEnqueue + call SFXTriggerNoise : ldh a, [hCurrentLineARE] ldh [hRemainingDelay], a diff --git a/src/main.asm b/src/main.asm index b27346e..9012594 100644 --- a/src/main.asm +++ b/src/main.asm @@ -131,6 +131,7 @@ Main:: EventLoop:: ; Play the sound effect, if any. call SFXPlay + call SFXPlayNoise ; Wrangle inputs and timers at the start of every frame. call GetInput diff --git a/src/res/sfx_data.inc b/src/res/sfx_data.inc index 634f632..bdf9b84 100644 --- a/src/res/sfx_data.inc +++ b/src/res/sfx_data.inc @@ -2,10 +2,8 @@ IF !DEF(SFX_DATA_INC) DEF SFX_DATA_INC EQU 1 SECTION "SFX Data", ROMX, BANK[2] +; These sound effects can contain any channel. sSFXPieceI:: - db REG_NR12_CH1_VOLEV, $00, REG_NR14_CH1_FRQHI, $80, REG_NR22_CH2_VOLEV, $00, REG_NR24_CH2_FRQHI, $80 - db REG_NR32_CH3_VOLUM, $00, REG_NR34_CH3_FRQHI, $80, REG_NR42_CH4_VOLEV, $00, REG_NR44_CH4_CNTRL, $80 - db REG_NR10_CH1_SWEEP, $00, REG_NR52_MASTERCTL, $8F, REG_NR51_MASTERPAN, $FF, REG_NR50_MVOLVINPN, $77 db REG_NR12_CH1_VOLEV, $F0, REG_NR22_CH2_VOLEV, $F0, REG_NR11_CH1_LENDT, $BF, REG_NR11_CH1_LENDT, $BF db REG_NR12_CH1_VOLEV, $F0, REG_NR13_CH1_FRQLO, $AC, REG_NR14_CH1_FRQHI, $85, REG_NR21_CH2_LENDT, $7F db REG_NR21_CH2_LENDT, $7F, REG_NR22_CH2_VOLEV, $80, REG_NR23_CH2_FRQLO, $14, REG_NR24_CH2_FRQHI, $87 @@ -1352,101 +1350,6 @@ sSFXIHSIRS:: db REG_NR12_CH1_VOLEV, $08, REG_NR12_CH1_VOLEV, $09, REG_NR12_CH1_VOLEV, $11, REG_NR12_CH1_VOLEV, $08 db REG_NR12_CH1_VOLEV, $09, REG_NR12_CH1_VOLEV, $11, REG_NR12_CH1_VOLEV, $08, $FE sSFXIHSIRSEnd:: -sSFXLineClear:: - db REG_NR12_CH1_VOLEV, $F0, REG_NR32_CH3_VOLUM, $20, REG_NR42_CH4_VOLEV, $F1, REG_NR11_CH1_LENDT, $7F - db REG_NR11_CH1_LENDT, $7F, REG_NR12_CH1_VOLEV, $F0, REG_NR13_CH1_FRQLO, $9D, REG_NR14_CH1_FRQHI, $84 - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $57, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR13_CH1_FRQLO, $12, REG_NR14_CH1_FRQHI, $03, $FF - - db REG_NR13_CH1_FRQLO, $D2, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR11_CH1_LENDT, $7F, REG_NR11_CH1_LENDT, $7F, REG_NR12_CH1_VOLEV, $80, REG_NR13_CH1_FRQLO, $39 - db REG_NR14_CH1_FRQHI, $81, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $47 - db REG_NR44_CH4_CNTRL, $80, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR12_CH1_VOLEV, $08, REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $80, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FF - - db REG_NR13_CH1_FRQLO, $01, REG_NR14_CH1_FRQHI, $00, $FE -sSFXLineClearEnd:: -sSFXLand:: - db REG_NR42_CH4_VOLEV, $21, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $C1, REG_NR43_CH4_FQRND, $00 - db REG_NR44_CH4_CNTRL, $80, $FE -sSFXLandEnd:: -sSFXLock:: - db REG_NR42_CH4_VOLEV, $F2, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $14 - db REG_NR44_CH4_CNTRL, $80, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F2, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $22, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 - db $FF - - db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF - - db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FE -sSFXLockEnd:: sSFXLevelLock:: db REG_NR12_CH1_VOLEV, $F1, REG_NR11_CH1_LENDT, $7F, REG_NR11_CH1_LENDT, $7F, REG_NR12_CH1_VOLEV, $F1 db REG_NR13_CH1_FRQLO, $A7, REG_NR14_CH1_FRQHI, $87, $FF, $FF, $FF, $FF @@ -2016,4 +1919,62 @@ sSFXReadyGo:: db REG_NR22_CH2_VOLEV, $11, REG_NR22_CH2_VOLEV, $08, $FE sSFXReadyGoEnd:: +; These sound effects contain only noise. +sSFXLineClear:: + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $57, REG_NR44_CH4_CNTRL, $80 + db $FF, $FF, $FF, $FF, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F1, REG_NR43_CH4_FQRND, $47, REG_NR44_CH4_CNTRL, $80, + db $FE +sSFXLineClearEnd:: +sSFXLand:: + db REG_NR42_CH4_VOLEV, $21, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $C1, REG_NR43_CH4_FQRND, $00 + db REG_NR44_CH4_CNTRL, $80, $FE +sSFXLandEnd:: +sSFXLock:: + db REG_NR42_CH4_VOLEV, $F2, REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $14 + db REG_NR44_CH4_CNTRL, $80, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $F2, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 + db $FF + + db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $22, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 + db $FF + + db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR41_CH4_LENGT, $3F, REG_NR42_CH4_VOLEV, $12, REG_NR43_CH4_FQRND, $A4, REG_NR44_CH4_CNTRL, $80 + db $FF + + db REG_NR43_CH4_FQRND, $75, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $55, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $35, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $14, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FF + + db REG_NR43_CH4_FQRND, $00, REG_NR44_CH4_CNTRL, $00, $FE +sSFXLockEnd:: + ENDC diff --git a/src/res/sources/sfx.fur b/src/res/sources/sfx.fur index c7e70a7..b2b5f81 100644 Binary files a/src/res/sources/sfx.fur and b/src/res/sources/sfx.fur differ diff --git a/src/sfx.asm b/src/sfx.asm index 0f1dc8b..a8ee8e4 100644 --- a/src/sfx.asm +++ b/src/sfx.asm @@ -66,6 +66,7 @@ INCLUDE "res/music_data.inc" SECTION "High SFX Variables", HRAM hPlayhead:: ds 2 hPlayQueue:: ds 4 +hNoisePlayhead:: ds 2 SECTION "SFX Functions", ROM0 @@ -86,6 +87,8 @@ SFXInit:: xor a, a ldh [hPlayhead], a ldh [hPlayhead+1], a + ldh [hNoisePlayhead], a + ldh [hNoisePlayhead+1], a ret @@ -151,6 +154,32 @@ SFXProcessQueue: ret +SFXTriggerNoise:: + cp a, SFX_LINE_CLEAR + jr nz, :+ + ld a, LOW(sSFXLineClear) + ldh [hNoisePlayhead], a + ld a, HIGH(sSFXLineClear) + ldh [hNoisePlayhead+1], a + ret + +: cp a, SFX_LAND + jr nz, :+ + ld a, LOW(sSFXLand) + ldh [hNoisePlayhead], a + ld a, HIGH(sSFXLand) + ldh [hNoisePlayhead+1], a + ret + +: cp a, SFX_LOCK + ret nz + ld a, LOW(sSFXLock) + ldh [hNoisePlayhead], a + ld a, HIGH(sSFXLock) + ldh [hNoisePlayhead+1], a + ret + + ; Attempt to play the sound effect in A. Will enqueue the sound effect if the play routine is currently busy. SFXEnqueue:: ; If the playhead isn't null, then we're already playing something. @@ -340,35 +369,6 @@ SFXEnqueue:: ret - ; Pieces dropping -: cp a, SFX_LINE_CLEAR - jr nz, :+ - ld a, LOW(sSFXLineClear) - ldh [hPlayhead], a - ld a, HIGH(sSFXLineClear) - ldh [hPlayhead+1], a - call SFXPlay - ret - -: cp a, SFX_LAND - jr nz, :+ - ld a, LOW(sSFXLand) - ldh [hPlayhead], a - ld a, HIGH(sSFXLand) - ldh [hPlayhead+1], a - call SFXPlay - ret - -: cp a, SFX_LOCK - jr nz, :+ - ld a, LOW(sSFXLock) - ldh [hPlayhead], a - ld a, HIGH(sSFXLock) - ldh [hPlayhead+1], a - call SFXPlay - ret - - ; Leveling : cp a, SFX_LEVELLOCK jr nz, :+ @@ -435,6 +435,59 @@ SFXKill:: ret +SFXPlayNoise:: + ; Get the noise playhead. + ldh a, [hNoisePlayhead] + ld l, a + ldh a, [hNoisePlayhead+1] + ld h, a + or a, l + + ; Bail if it's null + ret z + + ld b, BANK("SFX Data") + rst RSTSwitchBank + + ; Get the register to write to +.noisereg + ld a, [hl] + inc hl + + ; If it's $FE, then we're done. + cp a, $FE + jr nz, :+ + rst RSTRestoreBank + xor a, a + ldh [hNoisePlayhead], a + ldh [hNoisePlayhead+1], a + ret + + ; If it's $FF, then we're done for this frame. +: cp a, $FF + jr z, .savenoiseplayhead + + ; Otherwise, put the register in C. + ld c, a + + ; Get the value to write. + ld a, [hl] + inc hl + + ; Write it and loop. + ldh [$ff00+c], a + jr .noisereg + + ; Save the playhead position. +.savenoiseplayhead + ld a, l + ldh [hNoisePlayhead], a + ld a, h + ldh [hNoisePlayhead+1], a + rst RSTRestoreBank + ret + + ; This play routine must be called every frame. SFXPlay:: ; Bank to correct bank.