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


#Requires AutoHotkey v2.0
#SingleInstance Force

; ============================================================
; НАСТРОЙКИ — ИЗМЕНЯТЬ В ПЕРВУЮ ОЧЕРЕДЬ ЗДЕСЬ
; ============================================================

; ----- ОБЛАСТЬ ПОИСКА ЗЕЛЁНОГО ЦВЕТА -----
; X1/Y1 — левый верхний угол области
; X2/Y2 — правый нижний угол области
;
; !!! ПОМЕНЯЙ ЭТИ 4 КООРДИНАТЫ ПОД СВОЙ ЭКРАН !!!

SearchX1 := 500
SearchY1 := 300
SearchX2 := 1400
SearchY2 := 800


; ----- ЗЕЛЁНЫЙ ЦВЕТ -----
; Укажи здесь HEX-код нужного зелёного цвета.
;
; Например:
; 0x00FF00 = чистый зелёный
;
; Если твой цвет, например, #35C95A,
; нужно написать:
; GreenColor := 0x35C95A
;
; !!! ПОМЕНЯЙ ЭТО ЗНАЧЕНИЕ !!!

GreenColor := 0x00FF00


; ----- БЕЛЫЙ ЦВЕТ -----
; Цвет, который появляется после изменения зелёного.
;
; 0xFFFFFF = чистый белый
;
; Если используется другой оттенок белого,
; поменяй это значение.
;
; !!! ПОМЕНЯЙ ПРИ НЕОБХОДИМОСТИ !!!

WhiteColor := 0xFFFFFF


; ----- ДОПУСК ЦВЕТА -----
; Чем больше число, тем больше оттенков цвета
; будет считаться подходящими.
;
; 0 = практически точное совпадение
; 10 = небольшой допуск
; 30 = большой допуск
;
; Если цвет немного отличается из-за сглаживания,
; попробуй 10–30.

ColorTolerance := 20


; ----- КОЛИЧЕСТВО КРУГОВ ДО НАЖАТИЯ B -----
RoundsBeforeB := 10


; ----- ПАУЗА ПОСЛЕ НАЖАТИЯ E -----
; Время в миллисекундах.
;
; Увеличь, если после E объект появляется
; не сразу.

DelayAfterE := 100


; ----- ПАУЗА ПОСЛЕ НАЖАТИЯ SPACE -----
; Нужна для защиты от повторного срабатывания.

DelayAfterSpace := 100


; ----- ИНТЕРВАЛ ПРОВЕРКИ ПИКСЕЛЯ -----
; Чем меньше число — тем чаще проверка.
;
; 5 = очень быстро
; 10 = обычно достаточно
; 20 = медленнее

CheckInterval := 10


; ============================================================
; ПЕРЕМЕННЫЕ
; ============================================================

Running := false
Paused := false

RoundCount := 0

TrackedX := 0
TrackedY := 0


; ============================================================
; F7 — ЗАПУСК
; ============================================================

F7::
{
    global Running, Paused, RoundCount

    ; Если скрипт уже работает — ничего не делаем
    if Running
        return

    Running := true
    Paused := false
    RoundCount := 0

    ; Запускаем основной цикл
    SetTimer(MainLoop, 10)

    ToolTip("СКРИПТ ЗАПУЩЕН")
    SetTimer(() => ToolTip(), -1000)
}


; ============================================================
; F8 — ПАУЗА / ПРОДОЛЖЕНИЕ
; ============================================================

F8::
{
    global Running, Paused

    ; Если скрипт не запущен — ничего не делаем
    if !Running
        return

    Paused := !Paused

    if Paused
        ToolTip("ПАУЗА")
    else
        ToolTip("ПРОДОЛЖЕНИЕ")

    SetTimer(() => ToolTip(), -1000)
}


; ============================================================
; F9 — ПОЛНОЕ ВЫКЛЮЧЕНИЕ
; ============================================================

F9::
{
    global Running

    Running := false

    ; Останавливаем основной цикл
    SetTimer(MainLoop, 0)

    ToolTip("СКРИПТ ВЫКЛЮЧЕН")
    SetTimer(() => ToolTip(), -1000)
}


; ============================================================
; ОСНОВНОЙ ЦИКЛ
; ============================================================

MainLoop()
{
    global Running
    global Paused
    global RoundCount
    global TrackedX
    global TrackedY

    global SearchX1
    global SearchY1
    global SearchX2
    global SearchY2

    global GreenColor
    global WhiteColor
    global ColorTolerance

    global DelayAfterE
    global DelayAfterSpace
    global RoundsBeforeB


    ; --------------------------------------------------------
    ; Если скрипт выключен — ничего не делаем
    ; --------------------------------------------------------

    if !Running
        return


    ; --------------------------------------------------------
    ; Если стоит пауза — ничего не делаем
    ; --------------------------------------------------------

    if Paused
        return


    ; --------------------------------------------------------
    ; ЭТАП 1
    ; Нажимаем E
    ; --------------------------------------------------------

    Send("e")

    ; Ждём появления объекта
    Sleep(DelayAfterE)


    ; --------------------------------------------------------
    ; ЭТАП 2
    ; Ищем зелёный пиксель
    ; --------------------------------------------------------

    try
    {
        Found := PixelSearch(
            &FoundX,
            &FoundY,
            SearchX1,
            SearchY1,
            SearchX2,
            SearchY2,
            GreenColor,
            ColorTolerance
        )
    }
    catch
    {
        return
    }


    ; --------------------------------------------------------
    ; Если зелёный найден
    ; --------------------------------------------------------

    if Found
    {
        ; Запоминаем координату найденного зелёного пикселя
        TrackedX := FoundX
        TrackedY := FoundY


        ; ----------------------------------------------------
        ; ЭТАП 3
        ; Следим за этим пикселем,
        ; пока зелёный не превратится в белый
        ; ----------------------------------------------------

        Loop
        {
            ; Если нажали F9
            if !Running
                return

            ; Если нажали F8 — ждём снятия паузы
            while Paused
            {
                if !Running
                    return

                Sleep(50)
            }


            ; Получаем текущий цвет запомненного пикселя
            CurrentColor := PixelGetColor(
                TrackedX,
                TrackedY,
                "RGB"
            )


            ; ------------------------------------------------
            ; Проверяем, стал ли пиксель белым
            ; ------------------------------------------------

            if IsColorMatch(
                CurrentColor,
                WhiteColor,
                ColorTolerance
            )
            {
                ; --------------------------------------------
                ; ЗЕЛЁНЫЙ → БЕЛЫЙ
                ; Нажимаем SPACE
                ; --------------------------------------------

                Send("{Space}")


                ; Увеличиваем количество завершённых кругов
                RoundCount++


                ; Небольшая задержка
                Sleep(DelayAfterSpace)


                ; --------------------------------------------
                ; Проверяем, достигли ли 10 кругов
                ; --------------------------------------------

                if RoundCount >= RoundsBeforeB
                {
                    ; Нажимаем B
                    Send("b")

                    ; Обнуляем счётчик
                    RoundCount := 0

                    ; Небольшая задержка после B
                    Sleep(DelayAfterSpace)
                }


                ; Этот круг завершён
                break
            }


            ; Частота проверки пикселя
            Sleep(CheckInterval)
        }
    }


    ; --------------------------------------------------------
    ; Если зелёный не найден — через следующий тик
    ; снова будет выполнен E и поиск
    ; --------------------------------------------------------

    return
}


; ============================================================
; ФУНКЦИЯ ПРОВЕРКИ ЦВЕТА
; ============================================================

IsColorMatch(Color1, Color2, Tolerance)
{
    ; Получаем RGB первого цвета

    R1 := (Color1 >> 16) & 0xFF
    G1 := (Color1 >> 8) & 0xFF
    B1 := Color1 & 0xFF


    ; Получаем RGB второго цвета

    R2 := (Color2 >> 16) & 0xFF
    G2 := (Color2 >> 8) & 0xFF
    B2 := Color2 & 0xFF


    ; Сравниваем каждый канал RGB

    return (
        Abs(R1 - R2) <= Tolerance
        && Abs(G1 - G2) <= Tolerance
        && Abs(B1 - B2) <= Tolerance
    )
}