diff --git a/resources/lang/en.json b/resources/lang/en.json index 55b302322d..314cbbad79 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -540,9 +540,11 @@ "emoji_menu_modifier_desc": "Hold this key while clicking to open the emoji menu.", "attack_ratio_controls": "Attack Ratio Controls", "attack_ratio_up": "Increase Attack Ratio", - "attack_ratio_up_desc": "Increase attack ratio by 10%", + "attack_ratio_up_desc": "Increase attack ratio by {amount}%", "attack_ratio_down": "Decrease Attack Ratio", - "attack_ratio_down_desc": "Decrease attack ratio by 10%", + "attack_ratio_down_desc": "Decrease attack ratio by {amount}%", + "attack_ratio_increment_label": "Attack Ratio Keybind Increment", + "attack_ratio_increment_desc": "How much the attack ratio keybinds change per press.", "attack_keybinds": "Attack Keybinds", "boat_attack": "Boat Attack", "boat_attack_desc": "Send a boat attack to the tile under your cursor.", diff --git a/src/client/InputHandler.ts b/src/client/InputHandler.ts index 45d1188a3b..27eb82ede3 100644 --- a/src/client/InputHandler.ts +++ b/src/client/InputHandler.ts @@ -378,12 +378,14 @@ export class InputHandler { if (e.code === this.keybinds.attackRatioDown) { e.preventDefault(); - this.eventBus.emit(new AttackRatioEvent(-10)); + const increment = this.userSettings.attackRatioIncrement(); + this.eventBus.emit(new AttackRatioEvent(-increment)); } if (e.code === this.keybinds.attackRatioUp) { e.preventDefault(); - this.eventBus.emit(new AttackRatioEvent(10)); + const increment = this.userSettings.attackRatioIncrement(); + this.eventBus.emit(new AttackRatioEvent(increment)); } if (e.code === this.keybinds.centerCamera) { @@ -538,7 +540,8 @@ export class InputHandler { private onShiftScroll(event: WheelEvent) { if (event.shiftKey) { const scrollValue = event.deltaY === 0 ? event.deltaX : event.deltaY; - const ratio = scrollValue > 0 ? -10 : 10; + const increment = this.userSettings.attackRatioIncrement(); + const ratio = scrollValue > 0 ? -increment : increment; this.eventBus.emit(new AttackRatioEvent(ratio)); } } diff --git a/src/client/UserSettingModal.ts b/src/client/UserSettingModal.ts index 70f4251f80..7b0c975138 100644 --- a/src/client/UserSettingModal.ts +++ b/src/client/UserSettingModal.ts @@ -5,6 +5,7 @@ import { UserSettings } from "../core/game/UserSettings"; import "./components/baseComponents/setting/SettingKeybind"; import { SettingKeybind } from "./components/baseComponents/setting/SettingKeybind"; import "./components/baseComponents/setting/SettingNumber"; +import "./components/baseComponents/setting/SettingSelect"; import "./components/baseComponents/setting/SettingSlider"; import "./components/baseComponents/setting/SettingToggle"; import { BaseModal } from "./components/BaseModal"; @@ -361,6 +362,23 @@ export class UserSettingModal extends BaseModal { } } + private changeAttackRatioIncrement( + e: CustomEvent<{ value: number | string }>, + ) { + const rawValue = e.detail?.value; + const value = + typeof rawValue === "number" ? rawValue : parseInt(String(rawValue), 10); + if (!Number.isFinite(value)) { + console.warn("Select event missing detail.value", e); + return; + } + this.userSettings.setFloat( + "settings.attackRatioIncrement", + Math.round(value), + ); + this.requestUpdate(); + } + private toggleTerritoryPatterns(e: CustomEvent<{ checked: boolean }>) { const enabled = e.detail?.checked; if (typeof enabled !== "boolean") return; @@ -616,7 +634,9 @@ export class UserSettingModal extends BaseModal { + + + ${this.showEasterEggSettings ? html` String(option.value) === input.value, + ); + const selectedValue = selected?.value ?? input.value; + this.value = String(selectedValue); + + this.dispatchEvent( + new CustomEvent("change", { + detail: { value: selectedValue }, + bubbles: true, + composed: true, + }), + ); + } + + render() { + return html` +
+
+ +
+ ${this.description} +
+
+
+ + +
+
+ `; + } +} diff --git a/src/core/game/UserSettings.ts b/src/core/game/UserSettings.ts index 83991941ac..e4c410dcb5 100644 --- a/src/core/game/UserSettings.ts +++ b/src/core/game/UserSettings.ts @@ -206,6 +206,14 @@ export class UserSettings { this.setFloat("settings.backgroundMusicVolume", volume); } + attackRatioIncrement(): number { + const increment = Math.round( + this.getFloat("settings.attackRatioIncrement", 10), + ); + if (!Number.isFinite(increment) || increment <= 0) return 10; + return increment; + } + soundEffectsVolume(): number { return this.getFloat("settings.soundEffectsVolume", 1); }