#SingleInstance Force
#Persistent
#WinActivateForce
#InstallKeybdHook
#InstallMouseHook
#KeyHistory 0
#NoEnv
ListLines Off
SetBatchLines -1
SetDefaultMouseSpeed 0
SetKeyDelay 0, 0
SetMouseDelay 0
SetWinDelay 0
SetControlDelay 0
SetTitleMatchMode 3
SetTitleMatchMode Fast
CoordMode Pixel, Screen
; Используя термин "шкала" - я имею в виду горизонтальные или вертикальные полоски прогресса/регресса, раз уж речь об играх, то для примера - шкалы здоровья, маны, применения и т.п.
; Все они имеют одну отличительную особенность - резкий переход по цвету и/или яркости пикселя, вот эту точку перехода мы и будем искать в скрипте.
; Создаём функцию которая будет создавать массивы.
; Параметры:
; CreateScaleDirectionInput - вводится пользователем - направление поиска "Horizontal" или "Vertical".
; CreateScaleColorTypeInput - вводится пользователем - искомый цвет "Red" или "Green" или "Blue" или "Brightness".
; CreateScaleColorValueInput - вводится пользователем - искомая яркость (целое число)
; CreateScalePositionInput, CreateScaleBegin, CreateScaleEnd - вводятся пользователем - координаты шкалы (Y,X1,X2 или X,Y1,Y2).
; CreateScaleArray - выводится функцией - имя создаваемого массива.
; CreateScaleDirectionOutput - выводится функцией - направление как переменная, для последующего поиска.
; CreateScaleColorTypeOutput - выводится функцией - искомый цвет как переменная, для последующего поиска.
; CreateScaleColorValueOutput - выводится функцией - искомая яркость как переменная, для последующего поиска.
; CreateScalePositionOutput - выводится функцией - начальная координата как переменная, для последующего поиска пикселя (Y или X).
; CreateScalePercentValue - выводится функцией - процентное значение одного пикселя, в искомой шкале.
CreateScale(CreateScaleDirectionInput, CreateScaleColorTypeInput, CreateScaleColorValueInput, CreateScalePositionInput, CreateScaleBegin, CreateScaleEnd, ByRef CreateScaleArray, ByRef CreateScaleDirectionOutput, ByRef CreateScaleColorTypeOutput, ByRef CreateScaleColorValueOutput, ByRef CreateScalePositionOutput, ByRef CreateScalePercentValue)
{
CreateScaleDirectionOutput := CreateScaleDirectionInput
CreateScaleColorTypeOutput := CreateScaleColorTypeInput
CreateScaleColorValueOutput := CreateScaleColorValueInput
CreateScalePositionOutput := CreateScalePositionInput
CreateScaleArray := []
CreateScaleArray.Push(CreateScaleBegin)
CreateScaleArrayCount := Abs(CreateScaleEnd-CreateScaleBegin)+1
CreateScalePercentValue := 100/CreateScaleArrayCount
While CreateScaleArray.MaxIndex()<CreateScaleArrayCount
{
If CreateScaleBegin<CreateScaleEnd
{
CreateScaleBegin := CreateScaleBegin+1
}
Else
{
CreateScaleBegin := CreateScaleBegin-1
}
CreateScaleArray.Push(CreateScaleBegin)
}
}
; Создаём функцию которая будет оценивать пиксели по яркости, внутри другой функции.
; Параметры:
; PixelX, PixelY - вводятся пользователем - но будут принимать переменные от других функций (координаты).
; PixelGetColorValueRed, PixelGetColorValueGreen, PixelGetColorValueBlue, PixelGetColorValueBrightness - выводятся функцией - яркость по цветам и общая.
PixelGetColorValue(PixelX, PixelY, ByRef PixelGetColorValueRed, ByRef PixelGetColorValueGreen, ByRef PixelGetColorValueBlue, ByRef PixelGetColorValueBrightness)
{
PixelGetColor PixelGetColorHex, PixelX, PixelY, RGB
PixelGetColorValueRed := (PixelGetColorHex & 0xFF0000) >> 16
PixelGetColorValueGreen := (PixelGetColorHex & 0xFF00) >> 8
PixelGetColorValueBlue := PixelGetColorHex & 0xFF
PixelGetColorValueBrightness := Max(PixelGetColorValueRed, PixelGetColorValueGreen, PixelGetColorValueBlue)
}
; Создаём функцию, которая будет выбирать пиксели на шкале для проверки яркости, внутри функции будет вызываться функция оценки яркости.
; За основу я взял бинарный поиск, но слегка видоизменил, ведь нужно найти не конкретное значение, а точку перехода от True к False, но основной принцип ведь тот же - левее True не может быть False а правее False не может быть True.
; Все параметры в функции - будут принимать переменные, выводимые из массива.
; Функция возвращает последний пиксель искомой яркости на шкале, в процентном выражении.
SearchScale(SearchScaleArray, SearchScaleDirection, SearchScaleColorType, SearchScaleColorValue, SearchScalePosition, SearchScalePercentValue)
{
SearchScaleBegin := SearchScaleArray.MinIndex()
SearchScaleEnd := SearchScaleArray.MaxIndex()
SearchScalePercent := 0
While SearchScaleBegin<=SearchScaleEnd
{
SearchScaleMiddle := Floor((SearchScaleBegin+SearchScaleEnd)/2)
If (SearchScaleDirection = "Vertical")
{
PixelGetColorValue(SearchScalePosition, SearchScaleArray[SearchScaleMiddle], SearchScaleRed, SearchScaleGreen, SearchScaleBlue, SearchScaleBrightness)
}
Else If (SearchScaleDirection = "Horizontal")
{
PixelGetColorValue(SearchScaleArray[SearchScaleMiddle], SearchScalePosition, SearchScaleRed, SearchScaleGreen, SearchScaleBlue, SearchScaleBrightness)
}
If (SearchScaleColorType = "Red")
{
If SearchScaleRed>%SearchScaleColorValue%
{
SearchScalePercent := SearchScaleMiddle
SearchScaleBegin := SearchScaleMiddle+1
}
Else
{
SearchScaleEnd := SearchScaleMiddle-1
}
}
Else If (SearchScaleColorType = "Green")
{
If SearchScaleGreen>%SearchScaleColorValue%
{
SearchScalePercent := SearchScaleMiddle
SearchScaleBegin := SearchScaleMiddle+1
}
Else
{
SearchScaleEnd := SearchScaleMiddle-1
}
}
Else If (SearchScaleColorType = "Blue")
{
If SearchScaleBlue>%SearchScaleColorValue%
{
SearchScalePercent := SearchScaleMiddle
SearchScaleBegin := SearchScaleMiddle+1
}
Else
{
SearchScaleEnd := SearchScaleMiddle-1
}
}
Else If (SearchScaleColorType = "Brightness")
{
If SearchScaleBrightness>%SearchScaleColorValue%
{
SearchScalePercent := SearchScaleMiddle
SearchScaleBegin := SearchScaleMiddle+1
}
Else
{
SearchScaleEnd := SearchScaleMiddle-1
}
}
}
Return Round(SearchScalePercent*SearchScalePercentValue)
}
; Единожды создаём массивы, вводим параметры ручками.
; Имена переменных параметров указываем соответственно как в массиве (который выводит данные в эти переменные), так и в функции поиска (которая принимает данные из этих переменных).
CreateScale("Horizontal", "Brightness", 165, 782, 802, 1090, HealthArray, HealthDirection, HealthColorType , HealthColorValue , HealthPosition, HealthPercentValue)
CreateScale("Horizontal", "Brightness", 165, 786, 1181, 1393, PetArray, PetDirection, PetColorType , PetColorValue , PetPosition, PetPercentValue)
CreateScale("Horizontal", "Brightness", 165, 826, 802, 1090, StaminaArray, StaminaDirection, StaminaColorType , StaminaColorValue , StaminaPosition, StaminaPercentValue)
SetTimer Spam, 50
Spam:
{
Health := SearchScale(HealthArray, HealthDirection, HealthColorType , HealthColorValue , HealthPosition, HealthPercentValue)
Pet := SearchScale(PetArray, PetDirection, PetColorType , PetColorValue , PetPosition, PetPercentValue)
Stamina := SearchScale(StaminaArray, StaminaDirection, StaminaColorType , StaminaColorValue , StaminaPosition, StaminaPercentValue)
ToolTip Health = %Health% Pet = %Pet% Stamina = %Stamina%
}
Return