diff --git a/resources/lang/en.json b/resources/lang/en.json
index f3ef57e7d..f4165a490 100644
--- a/resources/lang/en.json
+++ b/resources/lang/en.json
@@ -380,7 +380,8 @@
"terrain_disabled": "Terrain view disabled",
"exit_game_label": "Exit Game",
"exit_game_info": "Return to main menu",
- "background_music_volume": "Background Music Volume"
+ "background_music_volume": "Background Music Volume",
+ "sound_effects_volume": "Sound Effects Volume"
},
"chat": {
"title": "Quick Chat",
diff --git a/resources/sounds/effects/ka-ching.mp3 b/resources/sounds/effects/ka-ching.mp3
new file mode 100644
index 000000000..fc506bdcf
Binary files /dev/null and b/resources/sounds/effects/ka-ching.mp3 differ
diff --git a/src/client/graphics/layers/FxLayer.ts b/src/client/graphics/layers/FxLayer.ts
index 0c39d9802..731976f9a 100644
--- a/src/client/graphics/layers/FxLayer.ts
+++ b/src/client/graphics/layers/FxLayer.ts
@@ -7,6 +7,7 @@ import {
RailroadUpdate,
} from "../../../core/game/GameUpdates";
import { GameView, UnitView } from "../../../core/game/GameView";
+import SoundManager, { SoundEffect } from "../../sound/SoundManager";
import { renderNumber } from "../../Utils";
import { AnimatedSpriteLoader } from "../AnimatedSpriteLoader";
import { conquestFxFactory } from "../fx/ConquestFx";
@@ -216,6 +217,8 @@ export class FxLayer implements Layer {
return;
}
+ SoundManager.playSoundEffect(SoundEffect.KaChing);
+
const conquestFx = conquestFxFactory(
this.animatedSpriteLoader,
conquest,
diff --git a/src/client/graphics/layers/SettingsModal.ts b/src/client/graphics/layers/SettingsModal.ts
index 8c49995a4..2bfc57349 100644
--- a/src/client/graphics/layers/SettingsModal.ts
+++ b/src/client/graphics/layers/SettingsModal.ts
@@ -50,6 +50,7 @@ export class SettingsModal extends LitElement implements Layer {
SoundManager.setBackgroundMusicVolume(
this.userSettings.backgroundMusicVolume(),
);
+ SoundManager.setSoundEffectsVolume(this.userSettings.soundEffectsVolume());
this.eventBus.on(ShowSettingsModalEvent, (event) => {
this.isVisible = event.isVisible;
this.shouldPause = event.shouldPause;
@@ -162,6 +163,13 @@ export class SettingsModal extends LitElement implements Layer {
this.requestUpdate();
}
+ private onSoundEffectsVolumeChange(event: Event) {
+ const volume = parseFloat((event.target as HTMLInputElement).value) / 100;
+ this.userSettings.setSoundEffectsVolume(volume);
+ SoundManager.setSoundEffectsVolume(volume);
+ this.requestUpdate();
+ }
+
render() {
if (!this.isVisible) {
return null;
@@ -221,6 +229,33 @@ export class SettingsModal extends LitElement implements Layer {
+
+

+
+
+ ${translateText("user_setting.sound_effects_volume")}
+
+
+
+
+ ${Math.round(this.userSettings.soundEffectsVolume() * 100)}%
+
+
+