diff --git a/resources/lang/en.json b/resources/lang/en.json index b1c181b7a8..d77da2867b 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -683,6 +683,10 @@ "lobby_id_visibility_label": "Hidden Lobby IDs", "lobby_id_visibility_desc": "Hide Lobby ID in private lobby creation", "toggle_visibility": "Toggle Visibility", + "hold_middle_click_label": "Hold Middle-Click to Upgrade", + "hold_middle_click_desc": "Hold the middle mouse button to continuously upgrade a building.", + "hold_middle_click_speed_label": "Upgrade Hold Speed", + "hold_middle_click_speed_desc": "How fast buildings upgrade while holding middle-click. Lower = faster. (50–500ms)", "left_click_label": "Left Click to Open Menu", "left_click_desc": "When ON, left-click opens menu and sword button attacks. When OFF, left-click attacks directly.", "left_click_menu": "Left Click Menu", diff --git a/src/client/InputHandler.ts b/src/client/InputHandler.ts index 1c12cf61b3..45e6be35be 100644 --- a/src/client/InputHandler.ts +++ b/src/client/InputHandler.ts @@ -230,6 +230,11 @@ export class InputHandler { private readonly userSettings: UserSettings = new UserSettings(); + private holdUpgradeInterval: ReturnType | undefined = + undefined; + private holdUpgradeTimeout: ReturnType | undefined = + undefined; + constructor( private gameView: GameView, public uiState: UIState, @@ -581,6 +586,16 @@ export class InputHandler { if (event.button === 1) { event.preventDefault(); this.eventBus.emit(new AutoUpgradeEvent(event.clientX, event.clientY)); + + if (this.userSettings.holdMiddleClickUpgrade()) { + this.holdUpgradeTimeout = setTimeout(() => { + this.holdUpgradeInterval = setInterval(() => { + this.eventBus.emit( + new AutoUpgradeEvent(event.clientX, event.clientY), + ); + }, this.userSettings.holdMiddleClickUpgradeSpeed()); + }, 400); + } return; } @@ -637,6 +652,10 @@ export class InputHandler { onPointerUp(event: PointerEvent) { if (event.button === 1) { event.preventDefault(); + clearTimeout(this.holdUpgradeTimeout); + clearInterval(this.holdUpgradeInterval); + this.holdUpgradeTimeout = undefined; + this.holdUpgradeInterval = undefined; return; } diff --git a/src/client/UserSettingModal.ts b/src/client/UserSettingModal.ts index 1d599ad0dd..ce7dcdb00f 100644 --- a/src/client/UserSettingModal.ts +++ b/src/client/UserSettingModal.ts @@ -823,6 +823,34 @@ export class UserSettingModal extends BaseModal { @change=${this.toggleCursorCostLabel} > + + { + this.userSettings.toggleHoldMiddleClickUpgrade(); + this.requestUpdate(); + }} + > + + + ) => { + this.userSettings.setHoldMiddleClickUpgradeSpeed(e.detail.value); + }} + > + ${this.value}%${this.value}${this.unit}