Скрипт для передачи любых отрядов между героями или в замке, по одной кнопке
Автоматическое определение направления лево/право или верх/низ для передачи:
- если один из героев пуст, передача происодит в сторону пустого героя
- если, с одной стороны, отрядов меньше, передача происодит от меньшего к большему
- если кол-во отрядов одинаково, передача слева направо
- если кол-во отрядов с обеих сторон максимально, армии зеркально меняются местами
Сохранение порядка расстановки отрядов (по принимающей стороне) при передаче:
- если порядок расстановки отрядов сохранить невозможно, передача происходит в первую найденую свободную ячейку
Автообъединение войск при передаче:
- сходные отряды передаются не в новые, а в теже ячейки
Не зависит от скриншотов отрядов различных войск в ячейках
- Исключение, нужны скрины пустой ячейки 0.bmp и замка zam.bmp
- Минус, жесткая привязка по координатам, но изменить думаю легко, тк в самом алгоритме привязка идет к массивам $DX[]:$DY[] (проставленные в примере координаты для оконного фудхд)
//GETSCREEN
//LOGCLEAR
//COLORMODE(5, 50,50, 1900, 1050)
/////////////////////////////////////////////////////////////
// Левый герой Правый герой
//a: (1) (2) (3) (4) (8) (9) (10) (11)
// (5) (6) (7) (12) (13) (14)
//
// $DLR[$a] Массив занятых(>0) / пустых(=0) ячеек
// $DX[$a]:$DY[$a] координаты ячеек
// $PIC[$a] скриншоты ячеек
// Скрины: [пустой ячейки 0.bmp] [замка zam.bmp]
// getscreen
/////////////////////////////////////////////////////////////
$addX=10 //IF_PICTURE_IN Пустые ячейки
$addY=10
$addX1=15 //IF_PICTURE_IN Отряды
$addY1=15
$Luck=25
$DELAY=75 //Задержка в move
$ACT=0 //temp
$delim=0
$mid=960 //Центр экрана, между левыми и правыми ячейками
//////////////////////////////////////////
//ОК-на пропуске хода
GETSCREEN(1793,942, 1854, 995)
COLORMODE(5, 1794,943, 1853, 994)
if (PXL(1800,950)=2039583)
LCLICK(963,186)
GOTO(end)
end_if
//////////////////////////////////////////
//Координаты и тп////////////////////////////////////////////
//Заполнение массива координат ячеек - замок=zam.bmp иначе между героями
// SCREENSHOTEX(1795,944, 1852, 993)
IF_PICTURE_IN (1793, 942, 1854, 995, "123.bmp", -1, 50)
$Zam=1
//Если замок (ячейки верх/низ верх(1)..(7) низ(8)..(14))
$DX[1]=712 //$DX[1]:$DY[1] левая верхняя ячейка (1)
$DY[1]=915
$a=2
FOR($a, $a < 15)
$DX[$a]=$DX[$a-1]+99
$DY[$a]=$DY[$a-1]
if ($a=8)
$DX[8]=$DX[1] //левая нижняя ячейка (8)
$DY[8]=1022
end_if
END_CYC
ELSE
$Zam=0
//Если в героях (ячейки лево/право и верх/низ)
$DX[1]=612 //$DX[1]:$DY[1] верх первая ячейка левого героя (1)
$DY[1]=211
$a=2
FOR($a, $a < 15)
$DX[$a]=$DX[$a-1]+97
$DY[$a]=$DY[$a-1]
if ($a=5) //низ первая ячейка левого героя (5)
$DX[5]=$DX[1]+50
$DY[5]=$DY[1]+104
end_if
if ($a=8) //верх первая ячейка правого героя (8)
$DX[8]=$DX[1]+409
$DY[8]=$DY[1]
end_if
if ($a=12) //низ первая ячейка правого героя (12)
$DX[12]=$DX[1]+459
$DY[12]=$DY[5]
end_if
END_CYC
END_IF
//Названия скринов ячеек (имена из сlickermann) [в конце должны удалятся батником]
$PIC[1]="screens\shot0000.bmp"
$PIC[2]="screens\shot0001.bmp"
$PIC[3]="screens\shot0002.bmp"
$PIC[4]="screens\shot0003.bmp"
$PIC[5]="screens\shot0004.bmp"
$PIC[6]="screens\shot0005.bmp"
$PIC[7]="screens\shot0006.bmp"
$PIC[8]="screens\shot0007.bmp"
$PIC[9]="screens\shot0008.bmp"
$PIC[10]="screens\shot0009.bmp"
$PIC[11]="screens\shot0010.bmp"
$PIC[12]="screens\shot0011.bmp"
$PIC[13]="screens\shot0012.bmp"
$PIC[14]="screens\shot0013.bmp"
// $PIC[15]="screens\shot0014.bmp"
// $PIC[16]="screens\shot0015.bmp"
/////////////////////////////////////////////////////////////
SUB (DELETE)
TFCLEAR("screens\shot0000.bmp", 1)
TFCLEAR("screens\shot0001.bmp", 1)
TFCLEAR("screens\shot0002.bmp", 1)
TFCLEAR("screens\shot0003.bmp", 1)
TFCLEAR("screens\shot0004.bmp", 1)
TFCLEAR("screens\shot0005.bmp", 1)
TFCLEAR("screens\shot0006.bmp", 1)
TFCLEAR("screens\shot0007.bmp", 1)
TFCLEAR("screens\shot0008.bmp", 1)
TFCLEAR("screens\shot0009.bmp", 1)
TFCLEAR("screens\shot0010.bmp", 1)
TFCLEAR("screens\shot0011.bmp", 1)
TFCLEAR("screens\shot0012.bmp", 1)
TFCLEAR("screens\shot0013.bmp", 1)
//TFCLEAR("screens\*.bmp", 1)
//TFCLEAR("screens\shot0015.bmp", 1)
END_SUB
DELETE()
/////////////////////////////////////////////////////////////
SUB (SCR, $a, $bx1, $by1, $ex2, $ey2)
SCREENSHOTEX($DX[$a]+$bx1,$DY[$a]+$by1,$DX[$a]+$ex2,$DY[$a]+$ey2)
END_SUB
/////////////////////////////////////////////////////////////
SUB (GSCR, $a, $cm)
GETSCREEN($DX[$a]-52,$DY[$a]-52,$DX[$a]+52,$DY[$a]+52)
COLORMODE($cm, $DX[$a]-51,$DY[$a]-51,$DX[$a]+51,$DY[$a]+51)
//$PPXL=PXL($DX[$a],$DY[$a])
//LOGWRITE ($a, " PXL: ",$PPXL)
END_SUB
////////////////////////////////////////////
// определение занятых/пустых ячеек (заполняет DLR[$a]) пустая_ячейка=0.bmp
SUB (INIT, $a1, $a2, $m) //от ячейки ($a1) до ($a1)
FOR($a1, $a1 < $a2+1)
GSCR ($a1, $m)
SCR ($a1,-14,-14,14,14)
IF_PICTURE_IN ($DX[$a1]-17,$DY[$a1]-17,$DX[$a1]+17,$DY[$a1]+17, "empty.bmp", -1, 65)
$DLR[$a1]=0 //пусто
ELSE
$DLR[$a1]=4 //занято
END_IF
END_CYC
END_SUB
/////////////////////////////////////////////////////////////
// передещение отряда из ячейки ($a1) в ($a2) (изменяет $ACT, $DLR[$a])
SUB (MOVE, $a1, $a2)
//LCLICK($DX[$a1],$DY[$a1])
//WAITMS(10)
LDOWN($DX[$a1],$DY[$a1]) //откуда
$DLR[$a1]=0
LCLICK($DX[$a2],$DY[$a2]) //куда
$DLR[$a2]=3
WAITMS($DELAY)
$ACT=1 //если хоть раз передали, то SUB (MOVEFORCE) ненужна
END_SUB
/////////////////////////////////////////////////////////////
// выбор направления перемещения (определяет $SideLR, $SideS)
SUB (SIDE)
$a1=0
$a2=0
$a=1
//считаем кол-во отрядов слева и справа
FOR($a, $a < 15)
IF ($DLR[$a]>0)
if ($a<8)
INC($a1) //+лево
else
INC($a2) //+право
end_if
END_IF
END_CYC
//Выбор стороны для передачи отрядов
IF ($a2>$a1)
$SideLR=8 //Л->П
$SideS=7 //коофициент
ELSE
$SideLR=15 //П->Л
$SideS=-7//коофициент
END_IF
END_SUB
/////////////////////////////////////////////////////////////
// перемещение всех занятых ячеек
SUB (MOVEFORCE) //(выполняется, если другим функциям нечего делать)
$tSideLR=$SideLR+$SideS //Вычисление верхней границы
$tSideS=-$SideS //сохранение расстановки отряда
$d=$tSideLR-7 //Вычисление нижней границы
FOR($d, $d < $tSideLR) //Среди ячеек передающей стороны
if ($DLR[$d]>0) //для каждой занятой ячейки
$dd=$d+$tSideS //куда передать
MOVE($d, $dd) //передаем
end_if
END_CYC
END_SUB
/////////////////////////////////////////////////////////////
// передача разных отрядов (те такого же отряда с другой стороны нет)
SUB (MOVEADD)
$i1=$SideLR-7 //Вычисление нижней границы
$i3=$i1+$SideS //Вычисление верхней границы
FOR($i1, $i1 < $SideLR) //Среди ячеек передающей стороны
IF ($DLR[$i1]>0) //для каждой занятой ячейки
$i4=$i1+$SideS //сохранение расстановки отряда
IF ($DLR[$i4]>0) //если позиция в принимающей стороне занята
$i2=$i3
//Ищем любую свободную ячейку в принимающей стороне
FOR($i2, $i2 < $SideLR+$SideS)
if ($DLR[$i2]<1) //если свободна
MOVE($i1,$i2) //передаем в свободную ячейку
$i2=404 //выход из цикла принимающей
end_if
END_CYC
ELSE //если позиция в принимающей стороне свободна
MOVE($i1,$i4) //передаем с сохранением расстановки отряда
END_IF
END_IF
END_CYC
END_SUB
/////////////////////////////////////////////////////////////
// передача одинаковых отрядов (те с другой стороны есть такой же отряд )
SUB (DUBL)
$i1=$SideLR-7 //Вычисление нижней границы
$i3=$i1+$SideS //Вычисление верхней границы
FOR($i1, $i1 < $SideLR) //Среди ячеек передающей стороны
IF ($DLR[$i1]>0) //для каждой занятой ячейки
$i2=$i3
//Ищем данный отряд по $PIC[$i1] в принимающей стороне
FOR($i2, $i2 < $SideLR+$SideS)
IF_PICTURE_IN ($DX[$i2]-$addX1, $DY[$i2]-$addY1, $DX[$i2]+$addX1, $DY[$i2]+$addY1, $PIC[$i1], -1, $Luck)
MOVE($i1,$i2) //если скрины ячеек с обоих сторон совпали, передаем в туже ячейку
$i2=404 //выход из цикла принимающей
END_IF
END_CYC
END_IF
END_CYC
END_SUB
/////////////////////////////////////////////////////////////
//Делим
SUB (DELIM)
$XX=$_xmouse //Считываем указатель
$YY=$_ymouse
$a=15
$b=0
WHILE(iskeydown(#MOUSE2)=1)
WAITMS(300)
LCLICK ($XX,$YY)
//WAIT MS(100)
WHEELDOWN (99)
//LCLICK($XX,$YY)
$b=1
END_CYC
if ($b=1)
GOTO(end)
end_if
END_SUB
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
DELIM()
$pmv=0
$sm=47
//Если с пробелом
IF ( iskeydown(#space)=1 )
$XX=$_xmouse //Считываем указатель
$YY=$_ymouse
INIT(1,14,5)
$a=1
for ($a, $a<15) //Среди всех ячеек
if ($DX[$a]>$XX-$sm) //Если Х_ячейки > Текущего Положения Мыши -25
IF ($DX[$a]<$XX+$sm) //И если Х_ячейки < тпм+25
if ($DY[$a]>$YY-$sm)
if ($DY[$a]<$YY+$sm)
IF ( $XX<$mid ) //определение стороны для обнуления ячеек, кроме текущей
$i=1
for($i,$i<8) //Лево
$DLR[$i]=0 //все 0
if ($i=$a)
$DLR[$i]=1 //текущая 1
end_if
end_cyc
$SideLR=8
$SideS=7
$pmv=1 //вернуть курсор на место
goto(mv)
ELSE
$i=8
for($i,$i<15) //Право
$DLR[$i]=0 //все 0
if ($i=$a)
$DLR[$i]=1 //текущая 1
end_if
end_cyc
$SideLR=15
$SideS=-7
$pmv=1 //вернуть курсор на место
goto(mv)
END_IF
end_if
end_if
END_IF
end_if
end_cyc
GOTO(end)
END_IF
/////////////////////////////////////////////////////////////
INIT(1,14,5) //Проверяем все ячейки
SIDE() //Находим направление перемещения
mv:
DUBL() //перемещаем одинаковые
MOVEADD() //перемещаем разные
IF ($ACT<1) //если перемещать нечего
MOVEFORCE() //перемещаем все подряд
END_IF
if ($pmv=1)
//LUP($XX,$YY)
goto(end)
end_if
skip:
WAITMS($DELAY)
IF ($Zam<1) //перемещение указателя на кнопку выхода
LUP(1260,815) //если между героями
ELSE
LUP(1830,974) //если в замке
END_IF
//execute (del.cmd) //del.cmd= del screens\*.bmp
end:
/////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////
ps Автору Огромное Спасибо за лучший кликер