Author Topic: Might & Magic Heroes VI  (Read 3050 times)

0 Members and 1 Guest are viewing this topic.

vaduxa

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Might & Magic Heroes VI
« on: March 15, 2015, 04:12:42 AM »
Скрипт для передачи любых отрядов между героями или в замке, по одной кнопке

Автоматическое определение направления лево/право или верх/низ для передачи:
   - если один из героев пуст, передача происодит в сторону пустого героя
   - если, с одной стороны, отрядов меньше, передача происодит от меньшего к большему
   - если кол-во отрядов одинаково, передача слева направо
   - если кол-во отрядов с обеих сторон максимально, армии зеркально меняются местами

Сохранение порядка расстановки отрядов (по принимающей стороне) при передаче:
   - если порядок расстановки отрядов сохранить невозможно, передача происходит в первую найденую свободную ячейку

Автообъединение войск при передаче:
    - сходные отряды передаются не в новые, а в теже ячейки

Не зависит от скриншотов отрядов различных войск в ячейках
   - Исключение, нужны скрины пустой ячейки 0.bmp и замка zam.bmp
   - Минус, жесткая привязка по координатам, но изменить думаю легко, тк в самом алгоритме привязка идет к массивам $DX[]:$DY[] (проставленные в примере координаты для оконного фудхд)

Code: (clickermann) [Select]
//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 Автору Огромное Спасибо за лучший кликер :)
« Last Edit: March 18, 2015, 05:15:30 PM by vaduxa »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Might & Magic Heroes VI
« Reply #1 on: March 15, 2015, 10:17:27 AM »
Строка 83, имя картинки не в кавычках.
правильно так
Code: (clickermann) [Select]
IF_PICTURE_IN ($DX[$a1]-$addX, $DY[$a1]-$addY, $DX[$a1]+$addX, $DY[$a1]+$addY, "0.bmp", -1, 1)
Это нормально что у тебя 1 GETSCREEN на скрипт? То есть в ходе выполнения скрипте на экране нет изменений, и новых снимков не нужно?

1% совпадения О_о это все равно что молотком забивать шурупы. Используй цветокоррекцию! Количество оттенков сократится и процент можно поставить на 70-90

Ну и если уж и выкладываешь скрипт то сложи в архив все прилагаемые к нему файлы.

vaduxa

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Might & Magic Heroes VI
« Reply #2 on: March 15, 2015, 12:10:55 PM »
Это нормально что у тебя 1 GETSCREEN на скрипт? То есть в ходе выполнения скрипте на экране нет изменений, и новых снимков не нужно?
GETSCREEN нужен:
 для первоначального определения наличия или отсутствия отрядов в ячейках (sub init), те заполнения $DLR[]
 для сравнения скринов непустых ячеек слева и справа в SUB DUBL(), тк это первая функция, вызывающая sub MOVE(), изменений экрана до ее работы еще не было, а после ее работы все отряды уже разнотипны и никакой привязки к скринам уже не требуется

Далее располжение отрядов на экране отслеживаются с помощью массива $DLR[], если происходит передача MOVE, соответсвующие ячейкам элементы массива DLR[] при передаче помечаются
« Last Edit: March 15, 2015, 12:49:59 PM by vaduxa »

vaduxa

  • Зашел в гости
  • *
  • Posts: 5
    • View Profile
Re: Might & Magic Heroes VI
« Reply #3 on: March 18, 2015, 05:22:08 PM »
Переделал, под colormode, прозрычный фон конечно убивает, еле поборол