Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Topics - Vint

Pages: 1 2 [3] 4
31
Ошибки / Ошибка в круглении ROUND
« on: March 16, 2015, 04:18:20 PM »
Пример:
Code: (clickermann) [Select]
print(round(4.115, -2))
print(round(4.125, -2))
print(round(4.135, -2))
print(round(4.145, -2))
print(round(4.155, -2))

Лог:
Code: [Select]
16:15:33 4.12
16:15:33 4.13
16:15:33 4.13
16:15:33 4.14
16:15:33 4.16

32
Такой себе Making of
Спросили тут у меня совета в победе над капчей...

Даже не в написании скрипта, а возможно ли в принципе решение с помощью Clickermann. Сначала думал случай с обычной капчей и совет был естесственный - Antigate.
Но капча, по описанию, в картинках. Есть 5 картинок. 2 из них одного предмета. Кликнуть нужно по одному из пары.
Капча на одном из сайтов заработка. Требует ответа при каждом действии и в силу других причин платный вариант от китайцев не подходит, если вообще возможен.
Тему не обсуждал на выкладывание, но думаю особого секрета здесь нет. Сайт не русский. d i g a d z . c o m

Присланный образец:


Появилось несколько задумок в вариантах решения. По анализу ещё 4 дополнительных скриншотов

Анализ задачи
удалось выявить следующие проблемы:
  • Фон не однородный, с рисунком. Иногда сдвигается на пиксел туда-сюда. В принципе легко убирается колормодом.
  • Расположение картинок "гуляет". Ни от центра, ни от края... варианты не предсказуемы.
  • Иногда поля картинок перекрываются, см. вариант с сатурном на последнем скрине.
  • Масштаб картинок меняется, вследствии чего...
  • Меняются практически все цвета и их относительное положение.

    и такие различия сильные вплоть до колормода 7

В принципе, разный цвет из-за сглаживания при пересчёте тоже решается колормодом, но Победить этим изменение масштаба нельзя.
Образец в COLORMODE(7)



Поиск путей решения
Первый шаг это вычленить и разделить поля под картинки для последующего их сравнения, поборов "плавание" зависящее от масштаба каждой. Наложив слоями в фотошопе и проанализировав решил пока действовать приближенно.
Почти всегда подходило разделение по 62 пикс в ширину в постоянном месте.
Привязавшись ко всему полю капчи по надписи через COLORMODE( 8 ) разделил на равные участки примерно подходящие для всех слоёв-образцов

Некоторое залезаниние на соседние участки оставил на потом, может и не понадобится.

Как же побороть главный недуг, масштаб? Посовещавшись уже было решено, что выхода нет и я предложил заготовить все размеры масштаба для каждой картинки, благо их не много пределы изменения масштаба конечны. Всё это, правда очень трудоёмко и затратно. Нужно отлавливать все варианты, накладывать, сравнивать, сортировать. Некоторый варианты возможно придётся ждать долго. Человек предложил не отлавливать, а сделать образцы в фотошопе, меняя масштаб и сохраняя варианты от самого большего, до наименьшего.
Боюсь это бы не прошло, т.к. у нас нет оригинала и не знаем применённый метод сглаживания. Все эти образцы не имели бы ничего общего с используемыми в капче.
Оставался отлов, крайний случай. Как говорится, если ничего не поможет.

Проба подсчёта цветов
Пришла идея сделать подсчёт количества пикселов по цветам. Благо их количество мы уменьшили до восьми.
И проанализировать закономерности. Понятно что точных и даже очень близких значений не будет. Но закономерность ожидалась.
При изменении масштаба количество пикселов каждого цвета должно пропорционально изменяться в ту или другую сторону. Могут быть и исключения, маленький участок другого цвета мог и вовсе исчезнуть либо трансформироваться в соседний цвет.

На этом этапе была запилена часть скрипта включающая привязку, разделение на зоны и подсчёт количества каждого из 7 цветов для каждой картинки в один псевдо двумерный массив. И вывод лога по результатам.
Почему цветов стало 7, а не 8? Чёрный я решил исключить из анализа, nn/r/ в него превращался фон. И смесь фон+наличие в картинке получалась очень случайная величина не поддающаяся анализу. Она только вредит.
Остались 7 основных цветов

Code: [Select]
16777215,8388607,8355839,8388479,16777087,16744319
Хм... Даже 6. Один я про..ал и только сейчас заметил  :) :) ;D Маженту.
Короче шесть.

Результат прогона подсчёта для 4 образцов:

Ряды - картинки слева на право. Колонки - количество пикселов по цветам.


Человеку определить подобные картинки анализируя результат не трудно, значит и скрипт попробуем научить.

Выбор методов сравнения

Бежать надо. Завтра допишу...

33
Есть приложение ВК Solo на клавиатуре http://vk.com/nabiraem.test?mid=66156092

В группе спрашивали на него скрипт. Посмотрев на приложение стало понятно что задача идеально подходит для начинающих скриптописцев. Скрипт по идее должен быть не сложным.
Понятно что вариантов реализации может быть несколько. Предлагайте свои варианты.



Мой вариант под катом и во вложении, но лучше попробуйте сначала сами
[spoiler]

Видео работы (много ошибок возникает из-за вмешательство пишущей программы)
http://vk.com/clickermann?z=video-14410794_171402933%2Fvideos-14410794

Code: (clickermann) [Select]
#name "solo"
// Author: Vint
// Version: 0.1.0 (04.02.2015)
// Скрипт для Clickermann v4.11 002
#logfile

$c = 4570476
$error = 0
MOVE($_xmax,0)
WAITMS(50)

GETSCREEN
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "keyb.bmp")
   $vX = $_return1-12
   $vY = $_return2+23
   $sh1_x = $vX + 50
   $sh1_y = $vY + 139
   $sh2_x = $vX + 510
   $sh2_y = $vY + 139
   
   $cl1_x = $vX + 40
   $cl1_y = $vY + 179
   $cl2_x = $vX + 530
   $cl2_y = $vY + 179
   
   $sp1_x = $vX + 212
   $sp1_y = $vY + 179
   $sp2_x = $vX + 330
   $sp2_y = $vY + 179
   
   $back_x = $vX + 512
   $back_y = $vY + 18
ELSE
   LOGWRITE ("Клавиатура не найдена")
   HINTPOPUP("Клавиатура не найдена", "Стоп")
   HALT
END_IF

STRSEPARATE("192,49,50,51,52,53,54,55,56,57,48,189,187", ",", $row1_arr)
STRSEPARATE("9,81,87,69,82,84,89,85,73,79,80,219,221,111", ",", $row2_arr)
STRSEPARATE("20,65,83,68,70,71,72,74,75,76,186,222,13", ",", $row3_arr)
STRSEPARATE("90,88,67,86,66,78,77,188,190,191", ",", $row4_arr)

LCLICK($vX+723,$vY-51)
WAITMS(300)

WHILE(1)
   $shift = 0
   $ctrl = 0
   $key = 0
   
   GETSCREEN($vX,$vY,$vX+574,$vY+199)
   IF((PXL($sh1_x,$sh1_y) = $c) | (PXL($sh2_x,$sh2_y) = $c))
      KEYDOWN(#SHIFT)
      $shift = 1
   END_IF
   IF((PXL($cl1_x,$cl1_y) = $c) | (PXL($cl2_x,$cl2_y) = $c))
      KEYDOWN(#CTRL)
      $ctrl = 1
   END_IF
   IF((PXL($sp1_x,$sp1_y) = $c) | (PXL($sp2_x,$sp2_y) = $c))
      KEYPRESS(#SPACE)
      $key = 1
      WAITMS(30)
   ELSE
      IF(PXL($back_x,$back_y) = 2237183)
         KEYPRESS(#BACKSPACE)
         $key = 1
         INC($error)
         LOGWRITE ("Ошибка набора!")
         HINTPOPUP(" ", "Ошибка набора!")
      END_IF
   END_IF
   
   // ряд 1
   IF($key = 0)
      $stx = $vX + 22
      FOR($i=0, $i < 13)
         IF(PXL(39*$i+$stx,$vY+18) = $c)
            KEYPRESS($row1_arr[$i])
            LOGWRITE ("кн ", $row1_arr[$i])
            HINTPOPUP(" ", $row1_arr[$i])
            $key = 1
            $i = 100
         END_IF
      END_CYC
   END_IF
   
   // ряд 2
   IF($key = 0)
      $stx = $vX + 40
      FOR($i=0, $i < 14)
         IF(PXL(39*$i+$stx,$vY+58) = $c)
            KEYPRESS($row2_arr[$i])
            LOGWRITE ("кн ", $row1_arr[$i])
            HINTPOPUP(" ", $row1_arr[$i])
            $key = 1
            $i = 100
         END_IF
      END_CYC
   END_IF
   
   // ряд 3
   IF($key = 0)
      $stx = $vX + 51
      FOR($i=0, $i < 13)
         IF(PXL(39*$i+$stx,$vY+98) = $c)
            KEYPRESS($row3_arr[$i])
            LOGWRITE ("кн ", $row1_arr[$i])
            HINTPOPUP(" ", $row1_arr[$i])
            $key = 1
            $i = 100
         END_IF
      END_CYC
   END_IF
   
   // ряд 4
   IF($key = 0)
      $stx = $vX + 95 + 22
      FOR($i=0, $i < 10)
         IF(PXL(39*$i+$stx,$vY+138) = $c)
            KEYPRESS($row4_arr[$i])
            LOGWRITE ("кн ", $row1_arr[$i])
            HINTPOPUP(" ", $row1_arr[$i])
            $key = 1
            $i = 100
         END_IF
      END_CYC
   END_IF
   
   IF($shift = 1)
      KEYUP(#SHIFT)
   END_IF
   IF($ctrl = 1)
      KEYUP(#CTRL)
   END_IF
   WAITMS(80)
END_CYC

HALT
[/spoiler]

34
Просьба не обижаться на шутливую форму, но всё на самом деле так.

Итак. Каждый начинающий в работе с программой Clickermann, особенно не знакомый с программированием просто обязан сделать следующие вещи ничего не пропуская:

1. Не зная ни одной команды и не написав ничего длиннее двух строк сразу же сделать привязку кликермэна к окну!
Не важно нужно ли это или нет и для чего это вообще делается.
Этот пункт важно выполнить самым первым. В редких случаях допускается немного подождать с ним, но пропускать категорически нельзя!
   1а. Сразу же начать возмущаться что ничего не работает. Ничего не видит и/или (лёгкая форма) не туда кликает.
   1б. Желательно использовать отдельный клиент какой нибудь деньгозависимой игры с миллионом защит.
   1в. Можно воспользоваться эмулятором андроида BlueStacks для начала или браузером хром.
   1г. Запросить помощь, т.к. кликермен в привязанном режиме видит всё чёрное.   
  (Всё это допустипые вопросы конечно, но не в первый час знакомства с программой.)
2. Запросить во всех темах в группе (можно и на форуме) скрипт вида:
    "чтобы ЛКМ кликала вот прямо здесь, бесконечно и очень, очень быстро".
[spoiler]
Code: (clickermann) [Select]
LCLICK(-1,-1)
WAITMS(10)
[/spoiler]
3. Поинтересоваться наконец: "а с помощью чего это всё запускать?". Возможна лёгкая форма: "где скачать программу Clickermann?".
[spoiler]
http://crapware.aidf.org/page/clickermann[/spoiler]
4. Никогда не использовать написание скрипта вручную. Запись Наше Всё.
5. Справки по командам нигде во вселенной НЕТ. (лёгкая форма: нашёл, но она не открывается). Да и вообще зачем она?
[spoiler]http://crapware.aidf.org/forum/index.php?topic=1031.0[/spoiler]
6. Аааааа... Как остановить работу скрипта по команде? Он шпарит по кругу...
[spoiler]
Code: (clickermann) [Select]
HALT
HALT(1)  // и закрыть кликермэн
[/spoiler]
7. Как запустить скрипт? Как остановить скрипт? Как привязаться к окну? Как вставить координаты?
   Тут главное не смотреть в настройки программы, нам это ни к чему.
[spoiler]
Code: [Select]
По умолчанию:
Пуск/продолжить Alt+A
Стоп/пауза Alt+S
Запись Alt+R
Привязка к окну - навести мышь и Alt+W
Вставка координат и цвета под курсором Alt+Q
[/spoiler]
8. Как сделать действие, если условие не выполняется?
[spoiler]IF($var = 3)
  // Если верно
ELSE
  // Если не верно
END_IF[/spoiler]
9. При просьбе помощи по скриптам, ограничится минимумом информации. Раз понятно мне - понятно всем.
10. Желающий помочь должен сам проявить недюжинную активность для достижения цели: найти страницу вопрошающего ВК, попросится в друзья, написать в личку с готовностью помочь (для форума), клещами вытягивать ответы и описание проблемы, регулярно исправлять очередные "я тут немного поправил" - для восстановления работоспособности. Всё это должно быть выполнено быстро и безотлагательно, желательно вчера.
Рекомендуемая форма просьбы: "У меня ничего не работает. Кто может помочь пишите мне в личку. Срочно!"
Кратко и лаконично.


Это были как десять заповедей. Второй этап. Начав всё таки писать кое какие команды в редакторе в количестве больше двух. Дальнейшие вопросы не критичны и не обязательны

Проблемы работы с экраном. Поиск картинки/пиксела.
11. Тонко намекнуть или начать возмущаться (зависит от воспитания) что: "программа плохо ищет. Сбойно. Нужно обязательно исправить это. Вот точно есть, а оно не находит. Непорядок."
[spoiler]Тут блин, даже не знаю что сказать. Целая статья нужна. Ссылка ожидается...[/spoiler]
12. Поинтересоваться, как при поиске картинки выполнить действие, если мы картинку не нашли. ELSE мы до сих пор не знаем, не смотря на пункт 8.
[spoiler]
Code: (clickermann) [Select]
GETSCREEN
IF_PICTURE_IN (0,0,$_xmax,$_ymax, "file.bmp",-1,100)
ELSE
   // действие если не нашли
END_IF
[/spoiler]

Текстовые проблемы
13. Столкнуться с аброкадаброй при использовании буфера или при вставке кода на форум/в группу
[spoiler]http://crapware.aidf.org/forum/index.php?topic=256.msg2237#msg2237[/spoiler]
14. Обязательно наткнуться на проблему с неправильным выбором языка при использовании KEYSTRING("мама мыла раму").
[spoiler]http://crapware.aidf.org/forum/index.php?topic=91.msg1104#msg1104[/spoiler]


Работа в режиме привязки
n-1. Стараться до победного конца не признавать факт, что некоторые команды не работают (или работают не так) в режиме привязки.
[spoiler](LDOWN, LUP, KEYDOWN, KEYUP, WHEELDOWN, WHEELUP, система отсчёта координат)[/spoiler]



n. Далi буде. (Продолжение следует)

35
No comment...

36
Вот спрашивали ВК. Поиск адреса e-mail в буфере обмена. Попробовал сделать.
Пока ограничился вариантом если вокруг почты пробелы или край строки.
Code: (clickermann) [Select]
#name "Поиск в строке почтового адреса"
// Author: Vint
// Version: 1.1 (15.08.2014)

LOGCLEAR

$str = FROMCLIP()
//LOGWRITE ("$str = ", $str)
$at = STRPOS ($str, "@")

IF($at = 0)
   LOGWRITE ("Почтового адреса нет")
   $mail = ""
ELSE
   $str_end = STRCUT2 ($str, $at, STRLEN($str))

   // обрезаем зад
   $end = STRPOS ($str_end, " ")
   IF($end = 0)
      $end = $at + STRLEN($str_end)-1
   ELSE
      $end = $at + $end-2
   END_IF
   $str = STRCUT2 ($str, 1, $end)
   
   // обрезаем перёд   
   $find = 0
   WHILE($find = 0)
      $space = STRPOS ($str, " ")
      IF($space = 0)
         $mail = $str
         $find = 1
      ELSE
         $str = STRCUT2 ($str, $space+1, STRLEN($str))
      END_IF
   END_CYC   
   LOGWRITE ("Email: ", $mail)
END_IF

HALT

В однострочном варианте всё правильно. В многострочном, если почта в начале строки не могу выпилить перевод строки, адрес так и остаётся с ним. Не хватает команды. Пробовал найти как обычно "\n" не прокатило.
Нужно бы ввести поиск перевода строки. Ну и заодно ввести экранирование, заодно решится в строках символы $ " ( )


...............
Посидел, подумал и удалось отфильтровать. Теперь ограничений нет кроме того, что адрес берётся только первый если их несколько
Code: (clickermann) [Select]
#name "Поиск в строке почтового адреса"
// Author: Vint
// Version: 1.2 (15.08.2014)

LOGCLEAR

$str = FROMCLIP()
//LOGWRITE ("$str = ", $str)
$at = STRPOS ($str, "@")

IF($at = 0)
   LOGWRITE ("Почтового адреса нет")
   $mail = ""
ELSE
   $str_end = STRCUT2 ($str, $at, STRLEN($str))
   
   // обрезаем зад
   $end = STRPOS ($str_end, " ")
   IF($end = 0)
      $end = $at + STRLEN($str_end)-1
   ELSE
      $end = $at + $end-2
   END_IF
   $str = STRCUT2 ($str, 1, $end)
   
   // обрезаем перёд
   $find = 0
   WHILE($find = 0)
      $space = STRPOS ($str, " ")
      IF($space = 0)
         $mail = $str
         $find = 1
      ELSE
         $str = STRCUT2 ($str, $space+1, STRLEN($str))
      END_IF
   END_CYC
   
   // удаление обрамления
   $good = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-.@_"
   $len = STRLEN($mail)
   $at = STRPOS ($mail, "@")
   $start = 1
   $end = $len
   FOR($i=1, $i < $len+1)
      $lit = STRCUT($mail, $i, 1)
      IF(STRPOS($good, STRCUT($mail, $i, 1)) = 0)
         IF($i < $at)
            $start = $i+1
         ELSE
            $end = $i-1
            $i = $len+10
         END_IF
      END_IF
   END_CYC
   $mail = STRCUT2 ($mail, $start, $end)   
   LOGWRITE ("Email: ", $mail)
END_IF
HALT

37
Есть предложения по расширению команд для более удобной работы с массивами.
Понятно, что всё можно реализовать (и реализовано) с помощью группы других команд, но всё же некоторые вещи не удобны и почти все не очевидны для новичков.
Предлагаю ввести команды

1. Простое заполнение массива. Вместо заполнения по одному
Code: (clickermann) [Select]
arrpush($arr, 435)
arrpush($arr, 532)
arrpush($arr, 943)

Сейчас для массива более 3 элементов я использую код:
Code: (clickermann) [Select]
$data = "1,1,-5,7,-4,14,-4,14,-7,14,14,4,-5,5,12,6,-12,2,14,-4,-7,10,8,-2,9,5,-12,2,10,-7,-14,-6,14,4,10,4,2,5,4,6,6,-22,12,0,-14,2,-15,4,-10,6,8,8,-14,-6,10,6,-9,-2,4,-2"
WHILE(STRLEN($data) > 0)
   IF(STRPOS($data,",") > 0)
      $num = INT(STRCUT2($data, 1, STRPOS($data,",")-1))
      $data = STRCUT2($data, STRPOS($data,",")+1, 99999)
   ELSE
      $num = INT($data)
      $data = ""
   END_IF
   ARRPUSH($arr, $num)
END_CYC
LOGWRITE ("Размер массива: ",ARRSIZE($arr))

Предлагаю ввести что нибудь типа
Code: (clickermann) [Select]
arrset($arr, data1, data2,  data3, data4, ...)
или
arrset($arr, "data1, data2,  data3, data4, ...")
Первый вариант наглядней, второй даёт возможность подставлять всего одну строковую переменную (получаемую, допустим, из файла) содержащую все данные.
Если команда будет не обнулять входящий массив, то ещё удобней, можно этой же командой добавлять сразу несколько значений в конец уже существующего массива.
Code: (clickermann) [Select]
arradd($arr, 1, 2,  3)
// содержание $arr = 1, 2, 3
arradd($arr, 4,5,6)
// содержание $arr = 1, 2, 3, 4, 5, 6

2. Всё таки ввести возможность прямого присвоения массива, хоть это тоже реализуется одним циклом.
Code: (clickermann) [Select]
$arr2 = $arr1
3. Починить/реализовать возможность передачи массива как параметр в подпрограмму. И эта же проблема с выводом в лог. Сейчас от массива остаётся одиночная переменная $var[0]

4. ARRPOP($arr)  возвращает всегда строку. При извлечении по индексу всё правильно строка-строка, число-число. Не удобно.



И относящиеся не только к массивам.
*Попутно вылез косяк с передачей строковой переменной как параметра в SUB
строка вида "1,-2,3,-2" передаётся как просто "-2"
В общем, при передаче он строковую переменную опять пытается посчитать, видимо во время присваивания внутренней переменной саба. Это нужно лечить. Уже исправляли переприсваивание строковой переменной и вот при передаче в саб оно опять вылезло. При чём если минусы далеко в середине прокатывает иногда.


*Ввести команду принудительного присвоения переменной типа "строка" по аналогии с результатом INT()...
Code: (clickermann) [Select]
STR($var)
Сейчас приходится мудрить всякие
Code: (clickermann) [Select]
TOCLIP($var)
$var = FROMCLIP()


*Для напоминания, костыль с вычислением SIN COS иногда вылазит
Code: (clickermann) [Select]
LOGWRITE (COS(90))Выдаёт правильно, 0. Но к нему нельзя ничего прибавлять/умножать... Для примера
Code: (clickermann) [Select]
LOGWRITE (COS(90)+0)или
Code: (clickermann) [Select]
LOGWRITE (COS(90)*1)даёт -22.7105054312138


*Поправить подсветку синтаксиса на форуме для всех новых команд.

38
Ошибки / Параметры подпрограммы
« on: July 09, 2014, 10:59:53 AM »
Переменная содержащая массив не передаётся в качестве параметра для подпрограммы.
От массива остаётся нулевой элемент.
Code: (clickermann) [Select]
LOGCLEAR

SUB(LOG_ARR, $ARR_LOG)
   LOGWRITE ("Размер массива: ",ARRSIZE($ARR_LOG))
   FOR($INARR,$INARR<ARRSIZE($ARR_LOG))
      LOGWRITE ("[",$INARR,"] = ",$ARR_LOG[$INARR])
   END_CYC
   LOGWRITE (" ")
END_SUB

ARRPUSH($arr, 5)
ARRPUSH($arr, 6)
ARRPUSH($arr, 7)
ARRPUSH($arr, 8)
LOGWRITE ("Настоящий размер ", ARRSIZE($arr))
LOGWRITE ("Подпрограмма:")
LOG_ARR($arr)

Лог:
Code: [Select]
11:59:33 Настоящий размер 4
11:59:33 Подпрограмма:
11:59:33 Размер массива: 1
11:59:33 [0] = 5
11:59:33 

39
Вот решил выложить, чем пользуюсь довольно часто...
В связи с изменением вызова подпрограмм в версии 4.9 и что самое главное, появившейся возможностью передачи параметров, некоторые старые инклюды переделал в новые и немного сгруппировал по темам.
Понятно, что это делается, чтобы из скрипта в скрипт не копировать целые куски.
Пока довольно мало написано/перенесено на 4.9, но всё же когда-то нужно начинать.
Заделал себе папку Libs и из неё подключаю библиотеки.

Пока выкладываю только 4 инклюда (для самой первой версии):
[spoiler]
  • m-move.cms
     Содержит всего 2 подпрограммы
    • m-move    - плавное перемещение мыши в координаты
    • m-lclick      - клик по координатам, перемещение в координаты плавное
  • logger.cms
     Содержит 3 подпрограммы
    • LOG_ARR     - вывод в лог элементов массива
    • LOG_ARR2   - вывод в лог парных элементов массива (для массива координат X-Y)
    • logXY           - вывод в лог координат $_return1, $_return2  (шоб було)
  • Copy_Paste.cms
     Содержит 4 подпрограммы работы с буфером обмена
    • copy          - копировать Ctrl+С
    • paste        - вставить Ctrl+V
    • Selekt_All  - выделить всё Ctrl+A
    • Del_All       - выделить всё Ctrl+A и удалить DEL
  • m-click.cms
     Содержит 7 подпрограмм, клики и поиск картинок
     Подпрограммы из этого блока которые содержат клики могут использоваться совместно с плавным перемещением мыши m-move.
     За это отвечает переменная в основном скрипте $mmov. Если $mmov = 1 будет использовано плавное перемещение.
     Клики разделены на нажать-отпустить.
    • клик_return                  - КЛИК без параметров по коорд. $_return1, $_return2
    • клик                              - КЛИК по координатам
    • клик_смещение            - КЛИК со смещением относительно $_return1, $_return2
    • FIND_PIC_NW               - поиск картинки без ожидания (область, имя,%,COLORMODE)
    • FIND_PIC                       - поиск картинки с ожиданием 10 сек. (область, имя,%,COLORMODE)
    • FIND_PIC_PREDCLICK   - поиск картинки с ожиданием 20 сек. и возможностью дублирования предшествующего клика каждые 6 сек. (область, имя,%,COLORMODE,предклик да/нет,координаты клика)
    • FIND_ARR                      - поиск всех картинок в массив (область, имя,%,COLORMODE)
Внутри скриптов написано, какие параметры можно передавать и пример вызова.

И, не подпрограмма, а просто скрипт скриншотов во всех режимах COLORMODE  - "снимки в colormode.cms"[/spoiler]


Добавляйтесь  :) 
Хотел ещё запилить отдельную библиотеку для работы с браузером:
  • вперёд/назад/обновить страницу, закрыть браузер, новое окно, закрыть окно
  • работа с вкладками - открыть/закрыть/следующая/по номеру/последняя
  • поиск текста на странице/следующее-преведущее найденное
  • ...
Короче оскриптить сочетания горячих клавиш + поиск

40
Ошибки / Скорость указателя мыши.
« on: February 27, 2014, 08:29:46 AM »
У меня это уже с мохнатых версий, куча неудобства.

При включении лупы скорость перемещения указателя мыши снижается как прописано в настройках. При выключении возвращается назад. Всё нормально.
Но, как всегда, блин в 90% случаев при закрытии программы я забываю отключить лупу если только что пользовался. Приходится бурча лезть в панель управления и восстанавливать "умирающую" мышь. :)

Нужно добавить, чтобы при выходе из программы скорость восстанавливалась. Или лупа отключалась, что одно и то же.

41
Использование / Три в ряд
« on: February 11, 2014, 11:41:35 AM »
Основа для автоматизации игр типа "три в ряд".
 "Сокровища Мантесумы", бой в "Небеса" и т.п.


вопрос возникал здесь http://crapware.aidf.org/forum/index.php?topic=359.0
и ВКонтакте http://vk.com/topic-14410794_29283841

Захотелось решить хотя бы основы. Базис для подобных игр.

Скрипт писался для версии Clickermann v4.9 004
Пробовал и отлаживал на Небеса-х.
Скрипт ищет и выстраивает элементы в комбинации. Проходит последовательно по каждому рисунку и определяет возможный ход. По нахождению определяется "вес" хода - сколько фишек совпало. Вес "сквозной" через все изображения, т.е. итоговый ход будет по элементу с большим весом и встретившийся раньше.
Возможно применение общего COLORMODE и % совпадения для каждого.

Оптимизации:
  • один GETSCREEN,
  • при нахождении большего веса, варианты с меньшим уже не анализируются,
  • поиск начинается с большего веса, чтобы отбросить возможно ненужный поиск меньшего,
  • при предварительном отборе вариантов хода, во избежании повторений и заходов в одну комбинацию с разных сторон, отобрал только необходимые и сделал основной поиск парной клетки только вправо-вниз (за исключением 2-х трёшек которые ищутся отдельно),
  • в переменные не определяются элементы за краем поля.

Как работает:
  • Если нужно, определяем положение поля.
  • Делаем скрин, если необходимо применяем COLORMODE.
  • По очереди обрабатываем все типы элементов (цвета):
    • Производим поиск в массив всех элементов данного типа.
    • Определяем в какую клетку попадает каждый найденный элемент и формируем псевдо-двумерный массив-карту для элемента. (остановился на этом варианте, т.к. удобнее задавать возможные комбинации, вычислять ход и в дальнейшем масштабировать решения)
    • Обходим по очереди все занятые места на поле-карте и в каждой ищем возможные варианты комбинаций. При этом переходим на "локальные" координаты-смещения относительно главной сканируемой клетки.
    • Если находим записываем в глобальные переменные значения "массы" и хода (пересчитанное в глобальное смещение
  • Пересчитываем глобальные смещения хода в конкретные координаты
  • Делаем ход.

Зачем заносил поля вокруг главной анализируемой клетки в переменные когда они и так в переменных массива? Чтобы не пересчитывать необходимый индекс массива для каждого опорного случая. Попробовал сразу на прямую, но после написания проверочных условий на 2 самых простейших комбинации из 3 элементов код выглядел жутко и уже начал немного путаться. Испугавшись того, что будет дальше, решил ввести дополнительные лишние действия для упрощения восприятия. И редактировать/дополнять будет намного проще.
Код модульный разбил на подпрограммы.

Болванку кода можно дописывать под конкретную игру с её особенностями и желание выбора приоритетов в очерёдности ходов. Для мантесумы можно ввести на поле универсальные элементы, которые подходят всем цветам или не подходят никому. Можно отдать предпочтение ходам подряд одного цвета и т.д.

Сам код:
Code: (clickermann) [Select]
#name "Три в ряд"
// Author: Vint
// Version: 0.4 (09.02.2014)
// For Clickermann v4.9 004

//===== ОПЦИИ ==========================//
//////////////////////////////////////////

// выводить окно лога  (1 - Выводить, 0 - Не выводить)
$log = 0

// Размер поля
$max_X = 6
$max_Y = 6

// Размер ячейки
$step = 41

// Координаты левого верхнего угла (или находить потом)
$startcoord_X = 518
$startcoord_Y = 413

// Имена картинок участников
$bmp_1 = "skull.bmp"
$bmp_2 = "kross.bmp"
$bmp_3 = "red.bmp"
$bmp_4 = "green.bmp"
$bmp_5 = "yellow.bmp"

// Префикс. Папка с картинками
$prefix = "textures\"
$colormode = 0        // режим колормода

// " строка для правильного отображения на форуме. Убрать!
//////////////////////////////////////////


// автоопределение ЛВУ в игре
//MOVE($_xmax, $_ymax)
//WAITMS(30)
//GETSCREEN
//IF_PICTURE_IN (0,0, $_xmax,$_ymax, STRCONCAT($prefix,"base.bmp"))
//   $startcoord_X = $_return1-119
//   $startcoord_Y = $_return2+93
//ELSE
//   LOGWRITE ("Не привязались")
//   HINTPOPUP("Не привязались", "Внимание!")
//   HALT
//END_IF


//==============================================================================
SUB(LOG_c)  //==== переменные "с" в лог. Отладка ===============================
   LOGWRITE ("$c1 = ", $c1)
   LOGWRITE ("$c2 = ", $c2)
   LOGWRITE ("$c3 = ", $c3)
   LOGWRITE ("$c4 = ", $c4)
   LOGWRITE ("$c5 = ", $c5)
   LOGWRITE ("$c6 = ", $c6)
   LOGWRITE ("$c7 = ", $c7)
   LOGWRITE ("$c8 = ", $c8)
   LOGWRITE ("$c9 = ", $c9)
   LOGWRITE ("$c10 = ", $c10)
   LOGWRITE ("$c12 = ", $c12)
   LOGWRITE ("$c13 = ", $c13)
   LOGWRITE ("$c15 = ", $c15)
   LOGWRITE ("$c16 = ", $c16)
   LOGWRITE ("$c17 = ", $c17)
   LOGWRITE ("$c18 = ", $c18)
   LOGWRITE ("$c19 = ", $c19)
   LOGWRITE ("$c20 = ", $c20)
   LOGWRITE ("$c21 = ", $c21)
   LOGWRITE ("$c22 = ", $c22)
   LOGWRITE ("$c25 = ", $c25)
   LOGWRITE ("$c26 = ", $c26)
   LOGWRITE ("$c27 = ", $c27)
END_SUB

//==============================================================================
SUB(FIND, $name_image, $percent, $num)  //==== поиск картинки ==================
   SCANPICTURE($arr_find, $startcoord_X,$startcoord_Y,$startcoord_X+($max_X*$step), $startcoord_Y+($max_Y*$step), STRCONCAT($prefix,$name_image), -1, $percent)
   IF($log=1)
      LOGWRITE ("найдено ", $num, "-х элементов:  ", ARRSIZE($arr_find)/2)
   END_IF
   //UNDEFINE($arr_find)
END_SUB

//==============================================================================
SUB(GET, $dif_X, $dif_Y)  //==== проверка клетки ===============================
   $target_X = $main_X+$dif_X
   $target_Y = $main_Y+$dif_Y
   IF(($target_X > -1) & ($target_Y > -1) & ($target_X < $max_X) & ($target_Y < $max_Y))
      $ret = $map[$target_X+$target_Y*$max_X]  // читаем ячейку
   ELSE
      $ret = -1  // вышли за край поля
   END_IF
END_SUB

//==============================================================================
SUB(SET, $tmass, $trun_X,$trun_Y,$trunin_X,$trunin_Y)  //=== установка хода ====
   IF($tmass > $mass)
      $mass = $tmass
      $run_X = $trun_X + $main_X
      $run_Y = $trun_Y + $main_Y
      $runin_X = $trunin_X + $main_X
      $runin_Y = $trunin_Y + $main_Y
      IF($log=1)
         LOGWRITE ("$mass ", $mass)
         LOGWRITE ("$main ", $main_X, " / ", $main_Y)
         LOGWRITE ("Относит. ", $trun_X, " / ", $trun_Y, ", ", $trunin_X, " / ", $trunin_Y)
      END_IF
   END_IF
END_SUB

//==============================================================================
SUB(OBRABOTKA_CELL)  //==== обработка ячейки главная ===========================
   // формат хода (вес, откудаX,Y, кудаX,Y)
   
   // пропускаем поиск, когда уже лучший вариант
   IF($mass < 7)
      //SET(0,0,0,0,0)  // сбрасываем массу
      $c1 = 0
      $c2 = 0
      $c3 = 0
      $c4 = 0
      $c5 = 0
      $c6 = 0
      $c7 = 0
      $c8 = 0
      $c9 = 0
      $c10 = 0
      $c12 = 0
      $c13 = 0
      $c15 = 0
      $c16 = 0
      $c17 = 0
      $c18 = 0
      $c19 = 0
      $c20 = 0
      $c21 = 0
      $c22 = 0
      $c25 = 0
      $c26 = 0
      $c27 = 0
     
      GET(1,0)
      $c1 = $ret
      IF($c1 ! -1)
         GET(2,0)
         $c2 = $ret
         GET(3,0)
         $c3 = $ret
         GET(4,0)
         $c4 = $ret
      END_IF
     
      GET(-1,0)
      $c9 = $ret
      IF($c9 ! -1)
         GET(-2,0)
         $c10 = $ret
      END_IF
     
      GET(0,1)
      $c15 = $ret
      IF($c15 ! -1)
         GET(0,3)
         $c17 = $ret
         GET(0,4)
         $c18 = $ret
      END_IF
     
      GET(0,-1)
      $c12 = $ret
      IF($c12 ! -1)
         GET(0,-2)
         $c13 = $ret
      END_IF
     
      IF(($c1 ! -1) & ($c15 ! -1))
         GET(2,1)
         $c7 = $ret
         GET(2,2)
         $c8 = $ret
         GET(1,2)
         $c26 = $ret
      END_IF
     
      IF(($c1 ! -1) & ($c12 ! -1))
         GET(2,-1)
         $c5 = $ret
         GET(2,-2)
         $c6 = $ret
         GET(1,-1)
         $c25 = $ret
      END_IF
     
      IF(($c9 ! -1) & ($c12 ! -1))
         GET(-1,-1)
         $c19 = $ret
         GET(-1,-2)
         $c20 = $ret
      END_IF
     
      IF(($c9 ! -1) & ($c15 ! -1))
         GET(-1,1)
         $c21 = $ret
         GET(-1,2)
         $c22 = $ret
      END_IF
     
      // горизонтальные
      IF($c1 = 1)
         IF($mass < 7)
            IF(($c5=1) & ($c6=1) & ($c7=1) & ($c8=1) & ($c3=1))
               SET(7,3,0,2,0)
            ELSE
               IF(($c19=1) & ($c20=1) & ($c21=1) & ($c22=1) & ($c10=1))
                  SET(7,-2,0,-1,0)
               ELSE
                  IF(($c3=1) & ($c4=1) & ($c7=1) & ($c8=1) & ($c5=1))
                     SET(7,2,-1,2,0)
                  ELSE
                     IF(($c3=1) & ($c4=1) & ($c5=1) & ($c6=1) & ($c7=1))
                        SET(7,2,1,2,0)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 6)
            IF(($c5=1) & ($c6=1) & ($c3=1) & ($c7=1))
               SET(6,3,0,2,0)
            ELSE
               IF(($c19=1) & ($c20=1) & ($c10=1) & ($c21=1))
                  SET(6,-2,0,-1,0)
               ELSE
                  IF(($c7=1) & ($c8=1) & ($c3=1) & ($c5=1))
                     SET(6,3,0,2,0)
                  ELSE
                     IF(($c21=1) & ($c22=1) & ($c19=1) & ($c10=1))
                        SET(6,-2,0,-1,0)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 5)
            IF(($c5=1) & ($c7=1) & ($c3=1))
               SET(5,3,0,2,0)
            ELSE
               IF(($c19=1) & ($c21=1) & ($c10=1))
                  SET(5,-2,0,-1,0)
               ELSE
                  IF(($c3=1) & ($c4=1) & ($c5=1))
                     SET(5,2,-1,2,0)
                  ELSE
                     IF(($c3=1) & ($c4=1) & ($c7=1))
                        SET(5,2,1,2,0)
                     ELSE
                        IF(($c5=1) & ($c6=1) & ($c3=1))
                           SET(5,3,0,2,0)
                        ELSE
                           IF(($c5=1) & ($c6=1) & ($c7=1))
                              SET(5,2,1,2,0)
                           ELSE
                              IF(($c19=1) & ($c20=1) & ($c10=1))
                                 SET(5,-2,0,-1,0)
                              ELSE
                                 IF(($c19=1) & ($c20=1) & ($c21=1))
                                    SET(5,-1,1,-1,0)
                                 ELSE
                                    IF(($c7=1) & ($c8=1) & ($c3=1))
                                       SET(5,3,0,2,0)
                                    ELSE
                                       IF(($c7=1) & ($c8=1) & ($c5=1))
                                          SET(5,2,-1,2,0)
                                       ELSE
                                          IF(($c21=1) & ($c22=1) & ($c10=1))
                                             SET(5,-2,0,-1,0)
                                          ELSE
                                             IF(($c21=1) & ($c22=1) & ($c19=1))
                                                SET(5,-1,-1,-1,0)
                                             END_IF
                                          END_IF
                                       END_IF
                                    END_IF
                                 END_IF
                              END_IF
                           END_IF
                        END_IF
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 4)
            IF(($c3=1) & ($c5=1))
               SET(4,2,-1,2,0)
            ELSE
               IF(($c3=1) & ($c7=1))
                  SET(4,2,1,2,0)
               ELSE
                  IF(($c10=1) & ($c19=1))
                     SET(4,-1,-1,-1,0)
                  ELSE
                     IF(($c10=1) & ($c21=1))
                        SET(4,-1,1,-1,0)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 3)
            IF(($c3=1))
               SET(3,3,0,2,0)
            ELSE
               IF(($c5=1))
                  SET(3,2,-1,2,0)
               ELSE
                  IF(($c7=1))
                     SET(3,2,1,2,0)
                  ELSE
                     IF(($c10=1))
                        SET(3,-2,0,-1,0)
                     ELSE
                        IF(($c19=1))
                           SET(3,-1,-1,-1,0)
                        ELSE
                           IF(($c21=1))
                              SET(3,-1,1,-1,0)
                           END_IF
                        END_IF
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
     
      // вертикальные
      IF($c15 = 1)
         IF($mass < 5)
            IF(($c22=1) & ($c26=1) & ($c17=1))
               SET(5,0,3,0,2)
            ELSE
               IF(($c19=1) & ($c25=1) & ($c13=1))
                  SET(5,0,-2,0,-1)
               ELSE
                  IF(($c17=1) & ($c18=1) & ($c22=1))
                     SET(5,-1,2,0,2)
                  ELSE
                     IF(($c17=1) & ($c18=1) & ($c26=1))
                        SET(5,1,2,0,2)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 4)
            IF(($c17=1) & ($c22=1))
               SET(4,-1,2,0,2)
            ELSE
               IF(($c17=1) & ($c26=1))
                  SET(4,1,2,0,2)
               ELSE
                  IF(($c13=1) & ($c19=1))
                     SET(4,-1,-1,0,-1)
                  ELSE
                     IF(($c13=1) & ($c25=1))
                        SET(4,1,-1,0,-1)
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
         
         IF($mass < 3)
            IF(($c13=1))
               SET(3,0,-2,0,-1)
            ELSE
               IF(($c19=1))
                  SET(3,-1,-1,0,-1)
               ELSE
                  IF(($c25=1))
                     SET(3,1,-1,0,-1)
                  ELSE
                     IF(($c17=1))
                        SET(3,0,3,0,2)
                     ELSE
                        IF(($c22=1))
                           SET(3,-1,2,0,2)
                        ELSE
                           IF(($c26=1))
                              SET(3,1,2,0,2)
                           END_IF
                        END_IF
                     END_IF
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
     
      IF($mass < 3)
         GET(1,1)
         $c27 = $ret
         GET(0,2)
         $c16 = $ret
         // уникальная тройка гор.
         IF(($c2=1) & ($c25=1))
            SET(3,1,-1,1,0)
         ELSE
            IF(($c2=1) & ($c27=1))
               SET(3,1,1,1,0)
            ELSE
               // уникальная тройка вер.
               IF(($c16=1) & ($c21=1))
                  SET(3,-1,1,0,1)
               ELSE
                  IF(($c16=1) & ($c27=1))
                     SET(3,1,1,0,1)
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
//      IF(($main_X=4) & ($main_Y=2))
//         LOGWRITE ("$main ", $main_X, " / ", $main_Y)
//         LOG_c()
//      END_IF
   END_IF
END_SUB

//==============================================================================
SUB(RUN)  //=== ход ============================================================
   $CStart_X = ($startcoord_X + $run_X*$step) + RND(10,$step-10)
   $CStart_Y = ($startcoord_Y + $run_Y*$step) + RND(10,$step-10)
   $CEnd_X = ($startcoord_X + $runin_X*$step) + RND(10,$step-10)
   $CEnd_Y = ($startcoord_Y + $runin_Y*$step) + RND(10,$step-10)
   LCLICK($CStart_X,$CStart_Y)
   WAITMS(200)
   LCLICK($CEnd_X,$CEnd_Y)
   WAITMS(200)
   MOVE($_xmax, $_ymax)
   WAITMS(300)
END_SUB

//==============================================================================
SUB(PROCESSING)  //==== обработка полученного массива ==========================
   // заполняем массив 0
   UNDEFINE($map)
   FOR($i,$i < $max_X*$max_Y)
      ARRPUSH($map, 0)
   END_CYC
   //LOGWRITE ("размер $map  ", ARRSIZE($map))
   
   // строим карту найденных
   FOR($i, $i < ARRSIZE($arr_find), 2)
      $find_X = $arr_find[$i]
      $find_Y = $arr_find[$i+1]
     
      $sost_X = INT(($find_X-$startcoord_X)/$step)
      $sost_Y = INT(($find_Y-$startcoord_Y)/$step)
      //LOGWRITE ("ячейка ",$sost_X+$sost_Y*$max_X)
      //LOGWRITE ("коорд. ",$sost_X, " / ", $sost_Y)
      $map[$sost_X+$sost_Y*$max_X] = 1
   END_CYC
   
   // выводим поле в лог
   IF($log=1)
      FOR($i, $i < ARRSIZE($map), $max_X)
         LOGWRITE ($map[$i],$map[$i+1],$map[$i+2],$map[$i+3],$map[$i+4],$map[$i+5])
      END_CYC
      LOGWRITE (" ")
   END_IF
   UNDEFINE($arr_find)
   
   // обходим поле
   FOR($cell, $cell < ARRSIZE($map))
      $main_Y = INT($cell/$max_X)
      $main_X = $cell-$main_Y*$max_X
      //LOGWRITE ("ячейка ", $main_X, " / ", $main_Y)
     
      IF($map[$cell] = 1)
         OBRABOTKA_CELL()
      END_IF
   END_CYC
   IF($log=1)
      LOGWRITE ("$mass ", $mass)
      LOGWRITE ("Лучший на цвет ", $run_X, " / ", $run_Y, ", ", $runin_X, " / ", $runin_Y)
   END_IF
END_SUB

//==============================================================================


//===== ПРОГРАММА ==============================================================

LOGCLEAR
IF($log=1)
   LOGSHOW (1,$_xmax-335,28) // отображение окна лога
   WNDSIZE(WNDFIND("Clickermann - Лог"),336,560) // изменения размеров окна лога 260
END_IF

$start = $_ms
$mass = 0
$run_X = 0
$run_Y = 0
$runin_X = 0
$runin_Y = 0
$ret = 0

// делаем скрин
MOVE($_xmax, $_ymax)
WAITMS(30)
GETSCREEN
IF($colormode ! 0)
   COLORMODE($colormode, $startcoord_X,$startcoord_Y,$startcoord_X+($max_X*$step), $startcoord_Y+($max_Y*$step))
END_IF

// ищем все первые элементы и заносим в массив
FIND($bmp_1, 100, 1)
PROCESSING()

// ищем все вторые элементы и заносим в массив
FIND($bmp_2, 75, 2)
PROCESSING()

// ищем все третьи элементы и заносим в массив
FIND($bmp_3, 100, 3)
PROCESSING()

// ищем все четвёртые элементы и заносим в массив
FIND($bmp_4, 100, 4)
PROCESSING()

// ищем все пятые элементы и заносим в массив
FIND($bmp_5, 100, 5)
PROCESSING()

LOGWRITE ("Время выполнения ", $_ms-$start, " мс")

IF($mass ! 0)
   RUN()
END_IF

HALT

Схемы отобранных комбинаций и скрипт во вложении.
Некоторые тесты, на которых тренировался из "небеса" здесь: http://yadi.sk/d/i-qJoA5jHgcNo


42
Зомби ферма. Дарение бесплатных подарков v 1.4

Скрипт для Clickermann v4.7 SE/4.8

Скрипт дарит бесплатку по хотелке. У кого нет в хотелке бесплаток дарит заданный в $last_step
Code: (clickermann) [Select]
// Подарок всем остальным
$last_step = 6
//0 - Случайный подарок
//1 - Время
//2 - Цемент
//3 - Доска
//4 - Мир
//5 - Металл
//6 - Шестерня
//7 - Стекло
//8 - Капля
//9 - Рогатка

Писался для использования в большом скрипте (где и работал). Это отдельная версия. Часть кода может являтся неподчищенным мусором.

43
Зомби ферма. Закапывание друзей по списку  v 1.1

Писал ещё для версии кликера 4.7 SE. В 4.8 тоже будет работать.
Скрипт выковырян из большого общего скрипта, поэтому в коде могут остаться неиспользуемые куски и мусор.

В настройках задаём имена для закапывания:
Code: (clickermann) [Select]
$mozg1 = "имя 1"
$mozg2 = "имя 2"
$mozg3 = "имя 3"
$mozg4 = "имя 4"

Переключение языка происходит автоматически. На одном компе у меня всё работает как часы (Мозила, Опера), на другом переключалка не срабатывает (на хроме). Не разбирался.

Имя должно быть достаточное для поиска. Нужный друг должен выводится на первом месте.
Я использую для закопки фэйков. Желательно дать им уникальные имена, что бы не совпали с новыми друзьями.

44
Архив / Переменная $_hwnd
« on: January 10, 2014, 10:30:05 AM »
В справке про $_hwnd написано:
Текущий hwnd (если 0, то привязки к окну нет).

Она действительно 0... в начале, после запуска кликера. Далее, если привязка будет включена скриптом или горячими клавишами хоть раз, переменная уже не 0, даже если привязка отключена.

Т.е. $_hwnd не сбрасывается в 0 если нет привязки, поэтому узнать что кликер не привязан нельзя.
Запустили кликер Alt+W - 2 раза
Code: (clickermann) [Select]
LOGWRITE ("$_hwnd = ",$_hwnd)
HALT
старт.
$_hwnd не равно 0


45
Предложения / Мелочи... Кучей
« on: November 08, 2013, 01:05:41 PM »
1. Просьба исправить, чтобы при вызове #include,  #name из инклюда не читался и не затирал основной #name. Тяжело имя окна искать, когда оно меняется как попало.

2. Знаю что просили... Но всё же. Можно добавить команду выхода из скрипта с закрытием климкермэна. Exit?
Посылка wm_close не работает.
$hwnd = wndfind("Clickermann - name2",1)
PostMessage($hwnd ,0x0010,0,0)
Закрывать посылая нажатия Alt+F4 можно только если нет привязки, в фоне кнопки не посылает. Как минимум Alt+ не удастся.
Закрывать убивая процесс... так и делал, если процесс один. Но проблема возникла если запущено 2+ копии. Один основной запускает и после убивает (должен, не вышло) в определённое время другие копии со своим скриптом. Зачем это сделано? Чтобы завершать скрипты в любом месте выполнения и даже если произошёл сбой-зацикливание.
Убивание процесса закрывает все копии сразу и без разбора.

3. Тоже говорилось, но очень давно. Добавить что-то типа BREAK или ExitLoop для прерывания циклов. Сейчас для "правильности" приходится вводить кучу временных переменных которые позволяют Ифами пропускать остатки кода в цикле. BREAK чтобы был многоуровневый BREAK() или BREAK(1) выходит из одного цикла, BREAK(3) из 3 вложенных...

То-же самое иногда мешает выскакивать из подпрограмм, даже по GOTO в конец подпрограммы.

4. Я понимаю, что вызов подпрограмм с параметрами пока не доделан. В принципе очень удобная штука будет.
Планируется вводить в подпрограммы локальные переменные? Те что принимают параметры становятся локальными по умолчанию. Остальные если нужно, можно объявить локальными списком. Само сабой это для освобождения памяти (которая "уже трещит по швам") при выходе из саба и главное не нужно следить за пересечением имён в основной части и подпрограммах. Правда не знаю как быть с вложенностью... но думаю решаемо.

5. Ну и для того, чтобы всё было в куче...  INPUTBOX и DIALOGBOX поверх всех окон.
   5а. Поле ввода в INPUTBOX активно, уже с курсором внутри если нет значения по умолчанию. И возможность завершать ввод Enter. Не знаю как, но избавиться от "мышь-клавиатура-мышь".

6. Исправить в справке код #ESCAPE на #ESC

7. баг когда вылетают внутренности условий, если попадается инструкция в которой есть 6-8 параметров.
упомянут в сообщении http://crapware.aidf.org/forum/index.php?topic=359.msg2934#msg2934
"По иронии судьбы под этот шаблон попадает лишь logwrite / print держите инфу в уме. баг присутствует в версиях 4.7-4.8"
- Под этот шаблон попадает и SCANPICTURE вместе с SCANPXL, а это уже серьёзно

8. Добавить логическим операторам возможность задавать порядок выполнения, с помощью скобок.

9. В редакторе, в пару к кнопке "Сделать комментарий" добавить кнопку "Убрать комментарий".
Нужно для нескольких строк. Удалять должно только первые // в строке, если до них кроме пробелов и TAB ничего нет.
Иначе перед каждым использованием для большого куска, думаешь о том как будешь материться стирая вручную в каждой по отдельности.

10. Неправильно высчитывается COS 90°, 270° и соответственно SIN 0°, 90°


Что забыл, добавляйте.

Pages: 1 2 [3] 4