diff options
author | Astatin <[email protected]> | 2025-08-06 21:00:27 +0200 |
---|---|---|
committer | Astatin <[email protected]> | 2025-08-06 21:00:27 +0200 |
commit | 8b7594415a4ca28b0193d24d59c3089f046a3be1 (patch) | |
tree | cc73c7f8b59ff5a30d9989bc99508de8b7241c08 | |
parent | 4db56b6d877ee88a672f5361bbe372783086353d (diff) |
Add click sound effect on menu open, dialogue next & menu arrow moves
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | definitions.gbasm | 14 | ||||
-rw-r--r-- | gui.gbasm | 13 | ||||
-rw-r--r-- | main.gbasm | 10 | ||||
-rw-r--r-- | modes/dialoguemenu.gbasm | 1 | ||||
-rw-r--r-- | modes/dungeon.gbasm | 3 | ||||
-rw-r--r-- | modes/dungeongeneration.gbasm | 6 | ||||
-rw-r--r-- | modes/loading.gbasm | 1 | ||||
-rw-r--r-- | modes/titlescreen.gbasm | 40 | ||||
-rw-r--r-- | music/load.gbasm | 172 | ||||
-rw-r--r-- | music/morning-forest.fur | bin | 765 -> 773 bytes | |||
-rw-r--r-- | music/morning-forest.vgm | bin | 7127 -> 7022 bytes | |||
-rw-r--r-- | music/soundeffects.gbasm | 34 | ||||
-rw-r--r-- | music/soundeffects/click.gbasm | 36 | ||||
-rw-r--r-- | music/title-screen-music.fur | bin | 708 -> 707 bytes | |||
-rw-r--r-- | music/title-screen.vgm | bin | 0 -> 6221 bytes | |||
-rw-r--r-- | utils.gbasm | 16 |
17 files changed, 322 insertions, 26 deletions
@@ -58,7 +58,7 @@ build/game_linux_x86-64: build/makeself/start.sh build/makeself/main.rom build/m run: build/main.rom mkdir -p recordings - gb $< --record-input "./recordings/$(shell date -Iseconds).record" -v infos,errors,debug,halt_cycles + gb $< --record-input "./recordings/$(shell date -Iseconds).record" -v infos,errors,debug # ,halt_cycles sameboy: build/main.rom sameboy build/main.rom diff --git a/definitions.gbasm b/definitions.gbasm index d5f4bbb..7e9cecf 100644 --- a/definitions.gbasm +++ b/definitions.gbasm @@ -173,6 +173,20 @@ .DEFINE mem_current_vgm_pc $c070 ; Takes $c070 to $c072 (bank + ptr) +.DEFINE mem_current_vgm_header $c073 ; Takes $c073 to $c075 (bank + ptr) + +.DEFINE mem_sound_flags ($c076) +; bit 0 = 1 => music playing +; bit 1 = 1 => sound effect playing on channel 1 (music should not use it) +; bit 2 = 1 => sound effect playing on channel 2 (music should not use it) +; bit 3 = 1 => sound effect playing on channel 3 (music should not use it) +; bit 4 = 1 => sound effect playing on channel 4 (music should not use it) +; bit 5 = 1 => $mem_sound_effect_frame_count is going down + +.DEFINE mem_sound_effect_frame_count ($c077) + +.DEFINE mem_sound_effect_pc $c078 ; Takes $c078 - $c07a (bank + ptr) + ; ## WARNING THE SPACE BETWEEN $c400 and $c800 is used as a buffer for the loading map function during dungeon generation .DEFINE mem_map_loading_buffer $c400 @@ -181,6 +181,8 @@ Move_dialogue_cursor: CP B RET Z + .SET_SOUND_EFFECT =_sound_effect_Click + DEC A BIT 1, A JR Z, =.Vertical_axis @@ -258,8 +260,8 @@ Check_dialogue_action: CP $00 RET Z BIT 0, A + .SET_SOUND_EFFECT =_sound_effect_Click JP NZ, =Dialogue_script_step - RET .Dungeon_Menu: LD A, $mem_button_action @@ -274,6 +276,9 @@ Check_dialogue_action: BIT 0, A RET Z + LD A, $mem_menu_cursor_position + LD D, A + LD A, $mem_current_focused_attack_ep_cost LD B, A LD A, $mem_bunny_mana @@ -290,6 +295,11 @@ Check_dialogue_action: ADD L LD L, A + LD A, $mem_menu_cursor_position + CP D + JR NZ, =.moved_sound_effect + .SET_SOUND_EFFECT =_sound_effect_Click + .moved_sound_effect: LD A, (HL+) LD D, A LD A, (HL+) @@ -345,6 +355,7 @@ Open_dialogue_on_dungeon_menu_mode: AND $40 ; Keeping object additional tile OR $0d LD $mem_display_flag, A + .SET_SOUND_EFFECT =_sound_effect_Click RET @@ -4,6 +4,8 @@ Entrypoint: CALL =Initialize_RNG + LD A, $ff + LD ($mem_sound_effect_pc), A LD HL, $mem_bunny_attacks LD A, $01 @@ -23,13 +25,13 @@ Entrypoint: LD A, L LD ($mem_dungeon+2), A - CALL =Load_Music - ; JP =New_Dungeon .LOAD_BANK_OF =Title_Screen JP ptr(=Title_Screen) .INCLUDE "tiles.gbasm" +.INCLUDE "music/load.gbasm" +.INCLUDE "music/soundeffects.gbasm" .INCLUDE "rng.gbasm" .INCLUDE "dialogues/utils.gbasm" .INCLUDE "buttons.gbasm" @@ -53,7 +55,6 @@ Entrypoint: .INCLUDE "enemiesattacks.gbasm" .INCLUDE "dialogues/functions.gbasm" .INCLUDE "map/loading/dungeoninfos.gbasm" -.INCLUDE "music/load.gbasm" .PADTO $4000 .INCLUDE "modes/titlescreen.gbasm" @@ -62,6 +63,9 @@ Entrypoint: .INCLUDE "dialogues/dialogues.gbasm" .INCLUDE "map/maps.gbasm" .INCLUDE "map/dungeons.gbasm" +.INCLUDE "music/soundeffects/click.gbasm" _music_Dungeon: .INCLUDEBIN "music/morning-forest.vgm" +_music_TitleScreen: +.INCLUDEBIN "music/title-screen.vgm" diff --git a/modes/dialoguemenu.gbasm b/modes/dialoguemenu.gbasm index 306ea50..126495b 100644 --- a/modes/dialoguemenu.gbasm +++ b/modes/dialoguemenu.gbasm @@ -49,6 +49,7 @@ Dialogue_VBLANK_Entrypoint: LD $mem_loop_frame_timer, A CALL =Play_Music + CALL =Play_Sound_Effect .ENABLE_VBLANK_INTERRUPTS RETI diff --git a/modes/dungeon.gbasm b/modes/dungeon.gbasm index 9062425..e67847b 100644 --- a/modes/dungeon.gbasm +++ b/modes/dungeon.gbasm @@ -170,8 +170,8 @@ Dungeon_VBLANK_Entrypoint: CALL =Animation_Wait_Mode CALL =Update_Blinking_Counter - CALL =Update_Animation_Steps CALL =Check_Open_Menu_button + CALL =Update_Animation_Steps LD HL, $mem_entities_list CALL =Center_viewport_around_entity @@ -188,6 +188,7 @@ Dungeon_VBLANK_Entrypoint: LD $mem_loop_frame_timer, A CALL =Play_Music + CALL =Play_Sound_Effect .ENABLE_VBLANK_INTERRUPTS RETI diff --git a/modes/dungeongeneration.gbasm b/modes/dungeongeneration.gbasm index 11824de..b7affed 100644 --- a/modes/dungeongeneration.gbasm +++ b/modes/dungeongeneration.gbasm @@ -31,6 +31,9 @@ .END New_Dungeon: + .LOAD_MUSIC =_music_Dungeon + CALL =Start_Music + LD A, $20 LD $mem_bunny_health, A LD A, $30 @@ -222,6 +225,9 @@ Dungeon_generation_VBlank: CALL =Reset_Entities_Collision_Map + CALL =Reset_Music_Channels + LD A, $01 + LD $mem_sound_flags, A DI .DISABLE_MODE_2_INTERRUPT CALL =Update_VBlank_Handler diff --git a/modes/loading.gbasm b/modes/loading.gbasm index 649d474..aad23bd 100644 --- a/modes/loading.gbasm +++ b/modes/loading.gbasm @@ -33,6 +33,7 @@ Loading_VBLANK_Entrypoint: LD $mem_loop_frame_timer, A CALL =Play_Music + CALL =Play_Sound_Effect .ENABLE_VBLANK_INTERRUPTS RETI diff --git a/modes/titlescreen.gbasm b/modes/titlescreen.gbasm index 22640b2..2a53f48 100644 --- a/modes/titlescreen.gbasm +++ b/modes/titlescreen.gbasm @@ -2,6 +2,11 @@ Title_Screen: .ASSERT bank(.) bank(=Title_Screen_Sprite_Data) .ASSERT bank(.) bank(=Title_Screen_Sprite_Data.end) + .LOAD_MUSIC =_music_TitleScreen + .CALL_SAVE_BANK =Start_Music + LD A, $01 + LD $mem_sound_flags, A + LD HL, $9010 LD DE, ptr(=Title_Screen_Sprite_Data) LD BC, $07f0 @@ -55,19 +60,19 @@ Title_Screen: LD A, $lcdc_mapbg_tilemap LD $reg_lcd_controller, A - LD A, $80 + LD A, $00 .blink: .blink.loop1: CALL =Check_Frame_stuff INC A - CP $20 + CP $48 JR NZ =.blink.loop1 CALL =.blink.draw_text LD A, $00 .blink.loop2: CALL =Check_Frame_stuff INC A - CP $20 + CP $48 JR NZ =.blink.loop2 CALL =.blink.undraw_text LD A, $00 @@ -94,9 +99,16 @@ Title_Screen: RET Check_Frame_stuff: + PUSH AF + PUSH BC + PUSH DE + PUSH HL CALL =RNG_Step CALL =Pad_Button_Check - PUSH AF + .CALL_SAVE_BANK =Play_Music + POP HL + POP DE + POP BC LD A, $mem_button_action BIT 3, A JR NZ, =Title_Screen_Start_Pressed @@ -107,6 +119,26 @@ Check_Frame_stuff: Title_Screen_Start_Pressed: LD A, $00 + LD $mem_sound_flags, A + CALL =Reset_Music_Channels + + ; Magic sound effect stuff + LD A, $8f + LD ($26), A + LD A, $ee + LD ($25), A + LD A, $ff + LD ($24), A + LD A, $3f + LD ($20), A + LD A, $f2 + LD ($21), A + LD A, $01 + LD ($22), A + LD A, $80 + LD ($23), A + + LD A, $00 .loop: CALL =Next_VBlank_Wait INC A diff --git a/music/load.gbasm b/music/load.gbasm index 0634a2b..eac38ac 100644 --- a/music/load.gbasm +++ b/music/load.gbasm @@ -1,15 +1,57 @@ -Load_Music: - .LOAD_BANK_OF =_music_Dungeon +.MACRODEF LOAD_MUSIC =music_addr + LD A, bank(=music_addr) + LD ($mem_current_vgm_header), A + LD A, high(ptr(=music_addr)) + LD ($mem_current_vgm_header+1), A + LD A, low(ptr(=music_addr)) + LD ($mem_current_vgm_header+2), A +.END - LD HL, ptr(=_music_Dungeon+52) +Reset_Music_Channels: + LD A, $00 + LD ($11), A + LD ($12), A + LD ($13), A + LD ($14), A + LD ($16), A + LD ($17), A + LD ($18), A + LD ($19), A + LD ($1A), A + LD ($1B), A + LD ($1C), A + LD ($1D), A + LD ($1E), A + LD ($20), A + LD ($21), A + LD ($22), A + LD ($23), A + RET + +Start_Music: + LD A, ($mem_current_vgm_header) + .CHANGE_BANK_TO_A + LD A, ($mem_current_vgm_header+1) + LD H, A + LD A, ($mem_current_vgm_header+2) + LD L, A + + LD A, L + ADD $34 + LD L, A + LD A, H + ADC $00 + LD H, A + CALL =Fix_HL_Bank LD A, L ADD (HL) LD L, A LD A, H ADC $00 LD H, A + CALL =Fix_HL_Bank - LD A, bank(=_music_Dungeon) + LD A, $saved_rom_bank LD ($mem_current_vgm_pc), A LD A, H LD ($mem_current_vgm_pc+1), A @@ -18,23 +60,39 @@ Load_Music: RET Loop_Music: - .LOAD_BANK_OF =_music_Dungeon + LD A, ($mem_current_vgm_header) + .CHANGE_BANK_TO_A + LD A, ($mem_current_vgm_header+1) + LD H, A + LD A, ($mem_current_vgm_header+2) + LD L, A - LD HL, ptr(=_music_Dungeon+28) - LD BC, ptr(=_music_Dungeon+28) - LD E, bank(=_music_Dungeon+28) + LD A, L + ADD $1c + LD L, A + LD A, H + ADC $00 + LD H, A + CALL =Fix_HL_Bank + LD B, H + LD C, L + LD A, $saved_rom_bank + LD E, A LD A, B SUB $40 LD B, A - LD A, (HL+) + LD A, (HL) + CALL =Inc_HL_Fix_Bank ADD C LD C, A - LD A, (HL+) + LD A, (HL) + CALL =Inc_HL_Fix_Bank ADC B LD B, A - LD A, (HL+) + LD A, (HL) + CALL =Inc_HL_Fix_Bank ADC E LD E, A @@ -60,6 +118,11 @@ Loop_Music: Inc_HL_Fix_Bank: PUSH AF INC HL + CALL =Fix_HL_Bank + POP AF + RET + +Fix_HL_Bank: LD A, H CP $80 JR C, =.end @@ -71,10 +134,80 @@ Inc_HL_Fix_Bank: .CHANGE_BANK_TO_A .end: - POP AF + RET + +Check_Channel_Available: + ; TODO: Channel panning register in $FF25 is still impacted by music + CP $24 + RET NC + + PUSH BC + + CP $1A + JR NC =.channel_3_4 + .channel_1_2: + CP $16 + JR NC, =.channel_2 + + .channel_1: + LD C, A + LD A, $mem_sound_flags + BIT 1, A + LD A, C + JR Z, =.end + LD A, $00 + JR =.end + + .channel_2: + LD C, A + LD A, $mem_sound_flags + BIT 2, A + LD A, C + JR Z, =.end + LD A, $00 + JR =.end + + .channel_3_4: + CP $20 + JR NC, =.channel_4 + + .channel_3: + LD C, A + LD A, $mem_sound_flags + BIT 3, A + LD A, C + JR Z, =.end + LD A, $00 + JR =.end + + .channel_4: + LD C, A + LD A, $mem_sound_flags + BIT 4, A + LD A, C + JR Z, =.end + LD A, $00 + + .end: + POP BC RET Play_Music: + LD A, $mem_sound_flags + BIT 0, A + RET Z + BIT 5, A + JR Z, =.sound_effect_frame_count_dec_skip + LD A, $mem_sound_effect_frame_count + DEC A + LD $mem_sound_effect_frame_count, A + CP $00 + JR NZ, =.sound_effect_frame_count_dec_skip + + LD A, $mem_sound_flags + AND 0b11000001 + LD $mem_sound_flags, A + .sound_effect_frame_count_dec_skip: LD A, ($mem_current_vgm_pc) .CHANGE_BANK_TO_A LD A, ($mem_current_vgm_pc+1) @@ -90,10 +223,19 @@ Play_Music: .set_register: LD A, (HL) CALL =Inc_HL_Fix_Bank - ADD $10 LD C, A - LD A, (HL) + + LD B, (HL) CALL =Inc_HL_Fix_Bank + + LD A, C + ADD $10 + CALL =Check_Channel_Available + CP $00 + JR Z, =.next + LD C, A + + LD A, B LD (C), A JR =.next .set_register.end: @@ -113,7 +255,7 @@ Play_Music: .the61thingy.end: .panic: - DBG + LD A, $saved_rom_bank STOP .panic.end: diff --git a/music/morning-forest.fur b/music/morning-forest.fur Binary files differindex f5c4e0c..bb9b8d4 100644 --- a/music/morning-forest.fur +++ b/music/morning-forest.fur diff --git a/music/morning-forest.vgm b/music/morning-forest.vgm Binary files differindex fbedcce..b3f423d 100644 --- a/music/morning-forest.vgm +++ b/music/morning-forest.vgm diff --git a/music/soundeffects.gbasm b/music/soundeffects.gbasm new file mode 100644 index 0000000..f320aaf --- /dev/null +++ b/music/soundeffects.gbasm @@ -0,0 +1,34 @@ +Wait_Next_Frame: + POP DE + LD A, $saved_rom_bank + LD ($mem_sound_effect_pc), A + LD A, D + LD ($mem_sound_effect_pc+1), A + LD A, E + LD ($mem_sound_effect_pc+2), A + RET + +.MACRODEF RET_WAIT_NEXT_FRAME + CALL =Wait_Next_Frame +.END + +Play_Sound_Effect: + LD A, ($mem_sound_effect_pc) + CP $ff + RET Z + .CHANGE_BANK_TO_A + LD A, ($mem_sound_effect_pc+1) + LD D, A + LD A, ($mem_sound_effect_pc+2) + LD E, A + PUSH DE + RET + +.MACRODEF SET_SOUND_EFFECT =addr + LD A, bank(=addr) + LD ($mem_sound_effect_pc), A + LD A, high(ptr(=addr)) + LD ($mem_sound_effect_pc+1), A + LD A, low(ptr(=addr)) + LD ($mem_sound_effect_pc+2), A +.END diff --git a/music/soundeffects/click.gbasm b/music/soundeffects/click.gbasm new file mode 100644 index 0000000..8b811db --- /dev/null +++ b/music/soundeffects/click.gbasm @@ -0,0 +1,36 @@ +_sound_effect_Click: + LD A, $mem_sound_flags + SET 2, A + LD $mem_sound_flags, A + + ; LD A, $3f + LD A, $80 + LD ($16), A + ; LD A, $a1 + LD A, $f3 + LD ($17), A + ; LD A, $16 + LD A, $83 + LD ($18), A + ; LD A, $84 + LD A, $87 + LD ($19), A + + .RET_WAIT_NEXT_FRAME + ; .RET_WAIT_NEXT_FRAME + ; .RET_WAIT_NEXT_FRAME + ; .RET_WAIT_NEXT_FRAME + + LD A, $08 + LD ($17), A + LD A, $16 + LD ($18), A + LD A, $84 + LD ($19), A + + LD A, $mem_sound_flags + AND 0b11000001 + LD $mem_sound_flags, A + LD A, $ff + LD ($mem_sound_effect_pc), A + RET diff --git a/music/title-screen-music.fur b/music/title-screen-music.fur Binary files differindex f20eff8..9a474c5 100644 --- a/music/title-screen-music.fur +++ b/music/title-screen-music.fur diff --git a/music/title-screen.vgm b/music/title-screen.vgm Binary files differnew file mode 100644 index 0000000..4c6725b --- /dev/null +++ b/music/title-screen.vgm diff --git a/utils.gbasm b/utils.gbasm index 5d6f9e7..5c50ed3 100644 --- a/utils.gbasm +++ b/utils.gbasm @@ -409,7 +409,6 @@ VBlank_Wait: POP AF RET - .MACRODEF CHANGE_BANK_TO_A LD $reg_rom_bank, A LD $saved_rom_bank, A @@ -430,6 +429,21 @@ VBlank_Wait: CALL ptr(=addr) .END +Call_Save_Bank: ; Address in DE (bank 0) ; Breaks A + LD A, $saved_rom_bank + PUSH AF + .CALL_DE + LD A, $saved_rom_bank + POP AF + .CHANGE_BANK_TO_A + RET + +.MACRODEF CALL_SAVE_BANK =addr + .ASSERT bank(=addr) $00 + LD DE, ptr(=addr) + CALL =Call_Save_Bank +.END + .MACRODEF COPY_4BYTES dest src LD A, ($src) LD ($dest), A |