From fa0155887621e38dbb73c42ee64682f5cfc785de Mon Sep 17 00:00:00 2001 From: W0LFB0MB <40838642+W0LFB0MB@users.noreply.github.com> Date: Mon, 2 Oct 2023 16:09:30 +0100 Subject: [PATCH] impr(sound): add support for various error sounds (W0LFB0MB) (#4679) * Add files via upload * Delete frontend/static/sound/error/triangle.wav * Delete frontend/static/sound/error/damage.wav * modified error sound code to support multiple sound options and added two error sound alternatives * added compatability for previous users of the error sound, converts legacy true/false config values to 1 or off * fixed opiton names and values in commandline * fix: auto switch theme behavior & footer theme indicator (#4677) * fix: auto switch theme behavior & footer indicator Changing manually to a preset or custom theme now turns auto switch theme mode off with a notification. And now the auto switch mode does override the custom theme as well (statement in settings also updated) if it is the later one set. Fixes #4659, that is the footer theme is now correctly displayed with auto switch themes as well. * removed unnecessary function --------- Co-authored-by: Miodec * fixed off config value * moved compatibilty code to replaceLegacyValues --------- Co-authored-by: Sanidhya Singh Co-authored-by: Miodec --- backend/src/api/schemas/config-schema.ts | 2 +- .../ts/commandline/lists/sound-on-error.ts | 30 ++++++++-- frontend/src/ts/config.ts | 13 +++- frontend/src/ts/constants/default-config.ts | 2 +- .../src/ts/controllers/input-controller.ts | 4 +- .../src/ts/controllers/sound-controller.ts | 56 +++++++++++++++--- frontend/src/ts/pages/settings.ts | 2 +- frontend/src/ts/test/replay.ts | 2 +- frontend/src/ts/types/types.d.ts | 4 +- frontend/static/html/pages/settings.html | 24 ++++++-- .../sound/{error.wav => error1/error1_1.wav} | Bin frontend/static/sound/error2/error2_1.wav | Bin 0 -> 16640 bytes frontend/static/sound/error3/error3_1.wav | Bin 0 -> 16534 bytes 13 files changed, 113 insertions(+), 26 deletions(-) rename frontend/static/sound/{error.wav => error1/error1_1.wav} (100%) create mode 100644 frontend/static/sound/error2/error2_1.wav create mode 100644 frontend/static/sound/error3/error3_1.wav diff --git a/backend/src/api/schemas/config-schema.ts b/backend/src/api/schemas/config-schema.ts index 3a4fbcb54..9203bed67 100644 --- a/backend/src/api/schemas/config-schema.ts +++ b/backend/src/api/schemas/config-schema.ts @@ -88,7 +88,7 @@ const CONFIG_SCHEMA = joi.object({ alwaysShowWordsHistory: joi.boolean(), singleListCommandLine: joi.string().valid("manual", "on"), capsLockWarning: joi.boolean(), - playSoundOnError: joi.boolean(), + playSoundOnError: joi.string().valid("off", ..._.range(1, 4).map(_.toString)), playSoundOnClick: joi .string() .valid("off", ..._.range(1, 14).map(_.toString)), diff --git a/frontend/src/ts/commandline/lists/sound-on-error.ts b/frontend/src/ts/commandline/lists/sound-on-error.ts index 27024f8f5..8c5628484 100644 --- a/frontend/src/ts/commandline/lists/sound-on-error.ts +++ b/frontend/src/ts/commandline/lists/sound-on-error.ts @@ -8,17 +8,35 @@ const subgroup: MonkeyTypes.CommandsSubgroup = { { id: "setPlaySoundOnErrorOff", display: "off", - configValue: false, + configValue: "off", exec: (): void => { - UpdateConfig.setPlaySoundOnError(false); + UpdateConfig.setPlaySoundOnError("off"); }, }, { - id: "setPlaySoundOnErrorOn", - display: "on", - configValue: true, + id: "setPlaySoundOnError1", + display: "damage", + configValue: "1", exec: (): void => { - UpdateConfig.setPlaySoundOnError(true); + UpdateConfig.setPlaySoundOnError("1"); + SoundController.playError(); + }, + }, + { + id: "setPlaySoundOnError2", + display: "triangle", + configValue: "2", + exec: (): void => { + UpdateConfig.setPlaySoundOnError("2"); + SoundController.playError(); + }, + }, + { + id: "setPlaySoundOnError3", + display: "square", + configValue: "3", + exec: (): void => { + UpdateConfig.setPlaySoundOnError("3"); SoundController.playError(); }, }, diff --git a/frontend/src/ts/config.ts b/frontend/src/ts/config.ts index d53d71817..97ea7d2b7 100644 --- a/frontend/src/ts/config.ts +++ b/frontend/src/ts/config.ts @@ -137,8 +137,13 @@ export function setMode(mode: MonkeyTypes.Mode, nosave?: boolean): boolean { return true; } -export function setPlaySoundOnError(val: boolean, nosave?: boolean): boolean { - if (!isConfigValueValid("play sound on error", val, ["boolean"])) { +export function setPlaySoundOnError( + val: MonkeyTypes.PlaySoundOnError, + nosave?: boolean +): boolean { + if ( + !isConfigValueValid("play sound on error", val, [["off", "1", "2", "3"]]) + ) { return false; } @@ -1985,6 +1990,10 @@ function replaceLegacyValues( configObj.showAverage = "speed"; } + if (typeof configObj.playSoundOnError === "boolean") { + configObj.playSoundOnError = configObj.playSoundOnError ? "1" : "off"; + } + return configObj; } diff --git a/frontend/src/ts/constants/default-config.ts b/frontend/src/ts/constants/default-config.ts index 9ce97f182..352edf770 100644 --- a/frontend/src/ts/constants/default-config.ts +++ b/frontend/src/ts/constants/default-config.ts @@ -59,7 +59,7 @@ export default { alwaysShowWordsHistory: false, singleListCommandLine: "manual", capsLockWarning: true, - playSoundOnError: false, + playSoundOnError: "off", playSoundOnClick: "off", soundVolume: "0.5", startGraphsAtZero: true, diff --git a/frontend/src/ts/controllers/input-controller.ts b/frontend/src/ts/controllers/input-controller.ts index fbb6b4249..37ed38475 100644 --- a/frontend/src/ts/controllers/input-controller.ts +++ b/frontend/src/ts/controllers/input-controller.ts @@ -216,7 +216,7 @@ function handleSpace(): void { } } else { if (!nospace) { - if (!Config.playSoundOnError || Config.blindMode) { + if (Config.playSoundOnError === "off" || Config.blindMode) { Sound.playClick(); } else { Sound.playError(); @@ -550,7 +550,7 @@ function handleChar( if (thisCharCorrect) { Sound.playClick(); } else { - if (!Config.playSoundOnError || Config.blindMode) { + if (Config.playSoundOnError === "off" || Config.blindMode) { Sound.playClick(); } else { Sound.playError(); diff --git a/frontend/src/ts/controllers/sound-controller.ts b/frontend/src/ts/controllers/sound-controller.ts index 4ea7cd850..316e14c5b 100644 --- a/frontend/src/ts/controllers/sound-controller.ts +++ b/frontend/src/ts/controllers/sound-controller.ts @@ -17,12 +17,47 @@ interface ClickSounds { }[]; } -let errorSound: Howler.Howl | null = null; +interface ErrorSounds { + [key: string]: { + sounds: Howler.Howl[]; + counter: number; + }[]; +} + +let errorSounds: ErrorSounds | null = null; let clickSounds: ClickSounds | null = null; function initErrorSound(): void { - if (errorSound !== null) return; - errorSound = new Howl({ src: ["../sound/error.wav"] }); + if (errorSounds !== null) return; + errorSounds = { + 1: [ + { + sounds: [ + new Howl({ src: "../sound/error1/error1_1.wav" }), + new Howl({ src: "../sound/error1/error1_1.wav" }), + ], + counter: 0, + }, + ], + 2: [ + { + sounds: [ + new Howl({ src: "../sound/error2/error2_1.wav" }), + new Howl({ src: "../sound/error2/error2_1.wav" }), + ], + counter: 0, + }, + ], + 3: [ + { + sounds: [ + new Howl({ src: "../sound/error3/error3_1.wav" }), + new Howl({ src: "../sound/error3/error3_1.wav" }), + ], + counter: 0, + }, + ], + }; } function init(): void { @@ -504,10 +539,17 @@ export function playClick(codeOverride?: string): void { } export function playError(): void { - if (!Config.playSoundOnError) return; - if (errorSound === null) initErrorSound(); - (errorSound as Howler.Howl).seek(0); - (errorSound as Howler.Howl).play(); + if (Config.playSoundOnError === "off") return; + if (errorSounds === null) initErrorSound(); + + const randomSound = randomElementFromArray( + (errorSounds as ErrorSounds)[Config.playSoundOnError] + ); + + randomSound.counter++; + if (randomSound.counter === 2) randomSound.counter = 0; + randomSound.sounds[randomSound.counter].seek(0); + randomSound.sounds[randomSound.counter].play(); } function setVolume(val: number): void { diff --git a/frontend/src/ts/pages/settings.ts b/frontend/src/ts/pages/settings.ts index a6fc485aa..d31c68a55 100644 --- a/frontend/src/ts/pages/settings.ts +++ b/frontend/src/ts/pages/settings.ts @@ -251,7 +251,7 @@ async function initGroups(): Promise { UpdateConfig.setPlaySoundOnError, "button", () => { - if (Config.playSoundOnError) Sound.playError(); + if (Config.playSoundOnError !== "off") Sound.playError(); } ) as SettingsGroup; groups["playSoundOnClick"] = new SettingsGroup( diff --git a/frontend/src/ts/test/replay.ts b/frontend/src/ts/test/replay.ts index 5ef88f1c2..e84f81016 100644 --- a/frontend/src/ts/test/replay.ts +++ b/frontend/src/ts/test/replay.ts @@ -87,7 +87,7 @@ export function pauseReplay(): void { function playSound(error = false): void { if (error) { - if (config.playSoundOnError) { + if (config.playSoundOnError !== "off") { Sound.playError(); } else { Sound.playClick(); diff --git a/frontend/src/ts/types/types.d.ts b/frontend/src/ts/types/types.d.ts index 4e45bd533..5a81fe778 100644 --- a/frontend/src/ts/types/types.d.ts +++ b/frontend/src/ts/types/types.d.ts @@ -138,6 +138,8 @@ declare namespace MonkeyTypes { | "12" | "13"; + type PlaySoundOnError = "off" | "1" | "2" | "3"; + type SoundVolume = "0.1" | "0.5" | "1.0"; type PaceCaret = "off" | "average" | "pb" | "last" | "custom" | "daily"; @@ -470,7 +472,7 @@ declare namespace MonkeyTypes { alwaysShowWordsHistory: boolean; singleListCommandLine: SingleListCommandLine; capsLockWarning: boolean; - playSoundOnError: boolean; + playSoundOnError: PlaySoundOnError; playSoundOnClick: PlaySoundOnClick; soundVolume: SoundVolume; startGraphsAtZero: boolean; diff --git a/frontend/static/html/pages/settings.html b/frontend/static/html/pages/settings.html index 9fe203e26..86b7c690e 100644 --- a/frontend/static/html/pages/settings.html +++ b/frontend/static/html/pages/settings.html @@ -1041,7 +1041,7 @@ -
+
play sound on error @@ -1053,7 +1053,7 @@
@@ -1061,11 +1061,27 @@
- on + damage +
+
+ triangle +
+
+ square
diff --git a/frontend/static/sound/error.wav b/frontend/static/sound/error1/error1_1.wav similarity index 100% rename from frontend/static/sound/error.wav rename to frontend/static/sound/error1/error1_1.wav diff --git a/frontend/static/sound/error2/error2_1.wav b/frontend/static/sound/error2/error2_1.wav new file mode 100644 index 0000000000000000000000000000000000000000..bfe123845686ade61d3f6650346b9473aea68052 GIT binary patch literal 16640 zcmX||1$5h5)3pU=$99;x4K`&+A!TM}W@cu%x6E|Q%*@P8DYr>e46_4fTl8(I@Bgn^ zN0uGemd=@ZX3reATiaHx98CzKchg=iM@^g&?oJQ{32SkdAXfDu35swhMhu-XbQ9iF zK=+W{k;Tc^%U$weidTw6^V84O zXXslS&KkVkXS@G#Z|ZTzL+d%iGu5+!*I_T2_c-rl?;1Y;`8a$A`QG=9@>}6o0E@5oKi-fSsiz=s9u2p42mBK15svfNBtlF#E`D*IwBdg!39#msujrTPoYA&gn zTC-}cwY4&9HK@IU2yzmdGdetb4YuqFSLRqhcu5NbXyhPu` zb9LI($*eu6wqNZtwc6K8ueqqEPtB_}+SVwlzOZ^k^{dr-S1Yc%u4+`(M^y$_aa7(> zxq9XI3F8w~2}dh6tMog5L408R)wn)!#@KDK@v-k>#>A*&jzzbQ&W!puDm>~@#i141 z3WqDyuaFrzH!>pfPQ;K1Cj3x%Qg~L_!mx^A4?{f*N(HZ$Jov+&zxd>a-Ylutjy5k(-^maaSOmPG|lI?TtvGx?(a$5~s zmUWZ0iM79wUE*Hy z+Bn-7Yy4BZy1039Y0+yM+@A!wbI_{9BMzP?Uc#zem12|8Cx-yzsnlxvO#; z<(hMj<@C>S&v}wPH@ix9M%J#Z_E~h+jm(Le5t(Tj>ob~Xu<2*g$EEwHfBm!KPqRPf z-xq!l`yKfE^RHFE8vSB^p8h%hXW-A&9~*wO{K0*{@qNPg*zdp7cBXYs)1*E8w%}Wh zZzZY6QU|97rhZIWm(nVQ|9a=^w69gZ=6yNxrT>?JFYi8Y{M_<0{rTRf*`I2DD*br! z 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 Lt5LIq>$d*`kU)!N literal 0 HcmV?d00001