Загрузка данных


-- Твои основные настройки
local startStep = 4
local endStep = 9
local rampMs = 1000
local delayMs = 6

-- Сила при каждом запуске профиля
local defaultPower = 100

-- Управление
local toggleButton = 5
local powerStep = 5
local minPower = 50
local maxPower = 200

-- Служебные переменные
local enabled = false
local power = defaultPower
local sideWasDown = false

local function ClampPower(value)
    return math.max(minPower, math.min(maxPower, value))
end

local function ShowStatus()
    local state = enabled and "ON" or "OFF"
    OutputLogMessage("%s | POWER: %d%%\n", state, power)
end

local function CheckControls()
    local sideIsDown = IsMouseButtonPressed(toggleButton)

    -- Одно действие на одно нажатие
    if sideIsDown and not sideWasDown then
        local shift = IsModifierPressed("shift")
        local ctrl = IsModifierPressed("ctrl")

        if shift and ctrl then
            -- При одновременном Shift + Ctrl ничего не меняем.
        elseif shift then
            power = ClampPower(power + powerStep)
            ShowStatus()
        elseif ctrl then
            power = ClampPower(power - powerStep)
            ShowStatus()
        else
            enabled = not enabled
            ShowStatus()
        end
    end

    sideWasDown = sideIsDown
end

function OnEvent(event, arg)
    if event == "PROFILE_ACTIVATED" then
        EnablePrimaryMouseButtonEvents(true)
        enabled = false
        power = ClampPower(defaultPower)
        sideWasDown = IsMouseButtonPressed(toggleButton)
        ShowStatus()
        return
    end

    if event == "PROFILE_DEACTIVATED" then
        enabled = false
        return
    end

    if event ~= "MOUSE_BUTTON_PRESSED"
        and event ~= "MOUSE_BUTTON_RELEASED" then
        return
    end

    CheckControls()

    if not enabled or not IsMouseButtonPressed(1) then
        return
    end

    local startedAt = GetRunningTime()
    local remainder = 0

    while IsMouseButtonPressed(1) do
        -- Кнопка работает и во время удержания ЛКМ
        CheckControls()

        if not enabled then
            break
        end

        local elapsed = GetRunningTime() - startedAt
        local progress = math.min(
            elapsed / math.max(rampMs, 1), 1
        )

        -- Исходное усиление от startStep до endStep
        local baseStep = math.floor(
            startStep + (endStep - startStep) * progress
        )

        -- Применяем проценты и сохраняем дробный остаток
        local movement = baseStep * power / 100 + remainder
        local wholeStep = math.floor(movement)
        remainder = movement - wholeStep

        if wholeStep ~= 0 then
            MoveMouseRelative(0, wholeStep)
        end

        Sleep(math.max(delayMs, 1))
    end
end