From e90f23661d778d4f3adee971601bcb7d645a923c Mon Sep 17 00:00:00 2001 From: MeirGavish Date: Tue, 16 Dec 2025 10:32:04 +0200 Subject: [PATCH] Sound effects for score accumulation and blind menu pop-up (#313) --- audio/chips_accum.wav | Bin 0 -> 6878 bytes audio/pop.wav | Bin 0 -> 7976 bytes include/def_state_info_table.h | 2 +- source/game.c | 29 ++++++++++++++++++++++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) create mode 100644 audio/chips_accum.wav create mode 100644 audio/pop.wav diff --git a/audio/chips_accum.wav b/audio/chips_accum.wav new file mode 100644 index 0000000000000000000000000000000000000000..607fd5b9c4e256c93244db7a8a589cd21eeccd60 GIT binary patch literal 6878 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 S!y^-={m<-sa{qy6OaBF}6C`Z_ literal 0 HcmV?d00001 diff --git a/audio/pop.wav b/audio/pop.wav new file mode 100644 index 0000000000000000000000000000000000000000..0e5f2b54e1b0a76a9f522b9c0635e8b568fd89cb GIT binary patch literal 7976 zcmd^ETTfJ16h5X8^|234n!dEW*EA@JHZf`AJ+y+xV#QX1I1IzU0K+i%+nE{W%FHk@ z1IR^2q7JSPZ!}F$t1HDT8=s9PlgUgn>U}ii8S{F_Cj5GC&OP+d z^~A4F&aOo~dLcA7_h@`3mq{)?T|fBu%|CArU%hy~xzcJqUEkh$vAcJ4bac4)a;Lr3 zs?{5{N-E@^_6!gHa`p11o(nxcT>h!|-b0snI-JzAg<_#pt~Q#h>)Y*T?Va}a*5=03 zwdP{2R$D0M^jL6aVs!YAfjj*_-?(=5>b2{)Zr^+G$n6Wp=c`K_+dD7!{yI1~*!y$$ z#ZJ4uwYj<4T&h(HnN&0!3I+mxzuz}8<{J8a;O^c2f%^}KT$6LrTy=46y}i5l>h=EN zo1?@1y%*2do7Gw|lL&?bfS;TkANRQ2uHnZc!^1<5haZo+J)TK_Fs9F!m)19*?;ac; z{SEcK-rLz)TdtQ2*`}+s` z`>*yO*X@nfrD`#g4EufFF}E8c5Gx#wCxI|OKVK-8D+|@d#!|Dj`gDC`b8EZZezvu- zw$iAU=F_o|e`>-rHtKSXy2r*Rd^3SiB%$XDrAoC{tJfECHI|l_o6Tmc)od;=H5RLt zQa+Q0L}zDwKy|w@-BoAR;^YSD&6ZiW_>K|P=rVH}(nG#P4weq%LEMCX(a`z6Qd9F`ai zTu@*Unv6_QC_No~JK&Zc0d6=|94gENyNV0jfNjO1veY)34R}Qwz8vf_PoHW+Bvgal zl%dRSQz`sh@Wq(rK(h+4intZ1EYVCHDh-1gA#K%m8_>ak2qT;tLkS^=1<#m259T3SR;R?{ zXiht2V`VWPb!b#bgq0iGVVS}Bn?xD)1Y<7vkR&?Mj7z1`9hC}Ci7Xr-z;PYJA`cw< zT{QkRtAu2lWrC)UW8-yX0pE!zICz*5Y&XUz=_#eXo2L$ueXzgdR?SHzj(bwH ziBt16wYHl>PAU)YHU^6fax@uTcD72hqt%G*XceEI1X(dsdrZOrHW6>tgeI#yt7KBG z`V&Y7^#oWeL@=$&4=25&AZKn-pvvw3!YDb{WsPf?Jx4bDE)FxV)Bw-U6<@7Kd2p>}gBkK5-hzSx3 z$7w6~9h3eL4HS(rbPpTn3gdD;90&bcnamiNoH6Tj5JaAi5+ganPS zQ4m8s6M$yZA>U}1aZHs=OL!!nk_-UVylEnUVP`V1M3`QMo#5!gK#D{Kk}8zRvrfqy zNxX=UIR0Sg~(1Aeyizo5;kh@e%8BVFvMLcNXq`--yfIqiNpJo~|<5uJ?Qf zho+?m1_uY>g#WA7+|#a^QFlPQJrZ_Z?Ee1J_vgF2yL{d!;hDe_@0+P_gxv(&i7n8cmC4F{{VoPNI?Jq literal 0 HcmV?d00001 diff --git a/include/def_state_info_table.h b/include/def_state_info_table.h index 616eb96..781b325 100644 --- a/include/def_state_info_table.h +++ b/include/def_state_info_table.h @@ -5,7 +5,7 @@ DEF_STATE_INFO(GAME_STATE_MAIN_MENU, game_main_menu_on_init, game_main_menu_on_u DEF_STATE_INFO(GAME_STATE_PLAYING, game_round_on_init, game_playing_on_update, noop) DEF_STATE_INFO(GAME_STATE_ROUND_END, noop, game_round_end_on_update, game_round_end_on_exit) DEF_STATE_INFO(GAME_STATE_SHOP, noop, game_shop_on_update, game_shop_on_exit) -DEF_STATE_INFO(GAME_STATE_BLIND_SELECT, noop, game_blind_select_on_update, game_blind_select_on_exit) +DEF_STATE_INFO(GAME_STATE_BLIND_SELECT, game_blind_select_on_init, game_blind_select_on_update, game_blind_select_on_exit) DEF_STATE_INFO(GAME_STATE_LOSE, game_lose_on_init, game_lose_on_update, game_over_on_exit) DEF_STATE_INFO(GAME_STATE_WIN, game_win_on_init, game_win_on_update, game_over_on_exit) // clang-format on diff --git a/source/game.c b/source/game.c index ee12f9b..48f6d0a 100644 --- a/source/game.c +++ b/source/game.c @@ -195,6 +195,7 @@ static void game_round_end_on_update(void); static void game_round_end_on_exit(void); static void game_shop_on_update(void); static void game_shop_on_exit(void); +static void game_blind_select_on_init(void); static void game_blind_select_on_update(void); static void game_blind_select_on_exit(void); static void game_lose_on_init(void); @@ -2675,8 +2676,18 @@ static inline void play_ending_played_cards_update(int played_idx) { scored_card_index--; + /* SFX_CHIPS_ACCUM has been pitch shifted to perserve high frequencies in downsampling. + * Now it needs to be pitch shifted back to the original frequency. + */ + int static const CHIPS_ACCUM_SFX_PITCH_RATIO = 2; + if (scored_card_index == 0) { + play_sfx( + SFX_CHIPS_ACCUM, + CHIPS_ACCUM_SFX_PITCH_RATIO * MM_BASE_PITCH_RATE, + SFX_DEFAULT_VOLUME + ); timer = TM_ZERO; play_state = PLAY_ENDED; } @@ -2815,6 +2826,16 @@ static inline void game_playing_process_input_and_state(void) mult = 0; display_mult(); display_chips(); + + static const int SCORE_CALC_SFX_PITCH_SHIFT = -102; // -10% OF MM_BASE_PITCH_RATE + static const int SCORE_CALC_SFX_VOLUME = 204; // 80% MM_FULL_VOLUME + + // The chips calculation SFX is the same as button + play_sfx( + SFX_BUTTON, + MM_BASE_PITCH_RATE + SCORE_CALC_SFX_PITCH_SHIFT, + SCORE_CALC_SFX_VOLUME + ); } } else if (play_state == PLAY_ENDED) @@ -4171,6 +4192,13 @@ static void game_shop_on_exit() increment_blind(BLIND_STATE_DEFEATED); // TODO: Move to game_round_end()? } +static void game_blind_select_on_init() +{ + change_background(BG_BLIND_SELECT); + + play_sfx(SFX_POP, MM_BASE_PITCH_RATE, SFX_DEFAULT_VOLUME); +} + static void game_blind_select_on_update() { if (state_info[game_state].substate == BLIND_SELECT_MAX) @@ -4185,7 +4213,6 @@ static void game_blind_select_on_update() static void game_blind_select_start_anim_seq() { - change_background(BG_BLIND_SELECT); main_bg_se_copy_rect_1_tile_vert(POP_MENU_ANIM_RECT, SCREEN_UP); for (int i = 0; i < BLIND_TYPE_MAX; i++)