jemxx / autobot

Autobot for TSO
3 stars 2 forks source link

[NEED_TO_BE_TESTED] ЖдемГенерала с умным листанием #49

Closed LEKALA closed 3 years ago

LEKALA commented 3 years ago

"Умное листание" в данной функции очень похоже на подход, изложенный в статье про команду ЖдемВсехГенералов. Здесь так-же бот сначала находит экран, на котором расположены или активные И неактивные, или только неактивные картинки нужных ген. Поиск экрана осуществляется методом листания по 3 строки, если бот не видит в верхних трёх строках ни активных, ни пассивных картинок. Если экран с пассивными картинками найден, то бот располагает эти картинки в трёх верхних строках, затем прекращает листание и начинает ждать появления хоть одной активной картинки. Такая картинка может появиться на экране не только в результате ожидания, но и в процессе листания до верхней строки. Когда хотя бы одна активная картинка появится, бот фиксирует факт такого наличия и закрывает функцию "УСПЕХОМ". Основное логическое ограничение - количество ген любого типа не может превышать 3 строки на любом из экранов. Для реализации изложенного подхода были выделены 3 логических состояния картинок нужных генералов:

  1. Видим только неактивные картинки
  2. Не видим ни активных, ни неактивных картинок
  3. Видим хотя бы одну активную картинку

Случай "Видим только неактивные картинки" контролирует площадь окошка в 4 строки. Если условие истинно, то: Для звезды на домашнем острове - располагает даже одну неактивную картинку в верхней строке экрана. Начинает ждать появления хоть одной активной картинки. Когда первая активная картинка появится, условие перестаёт быть истинным. Для звезды в приключении - видит отсутствие ползунка, поэтому просто ждёт появления хоть одной активной картинки. Когда первая активная картинка появится, условие перестаёт быть истинным.

Случай "Не видим ни активных, ни неактивных картинок" контролирует площадь окошка в 3 верхних строки. Если условие истинно, то: Для звезды на домашнем острове - листает 3 строки, добавляет 1 к счётчику экранов. На следующем цикле, если опять ничего не найдено, снова листает 3 строки и опять добавляет 1 к счётчику экранов. И так далее, пока не исчерпаются экраны для листания. Количество экранов определяется по методу, предложенному Marsik-A, на основании количества генералов, указанного в .ini файле. Если на экране (три верхних строки) появляется активная или неактивная картинка нужного генерала, то условие перестаёт быть истинным. Если все экраны пролистаны, а условие по-прежнему истинно, то формируется +1 для счётчика большого цикла, в котором бот снова нажмёт вкладку "специалисты" и снова начнёт листать экраны по 3 строки. Если условие продолжает оставаться истинным, то формируется ОШИБКА бота - Вы не владеете генералами указанного типа или указанный тип не вернулся из приключения. Для звезды в приключении - видит отсутствие ползунка, поэтому участвует только в формировании ОШИБКИ - указанный тип генералов не отправлен в приключение или указанный тип уже покинул приключение.

Случай "Видим хотя бы одну активную картинку" контролирует площадь окошка в 3 верхних строки. Этот случай выполняется только, если оба предыдущих случая не являются истинными. Сначала бот проверяет условие отсутствия активных в 3 верхних строках. Если условие истинно, то: Для звезды на домашнем острове - располагает даже одну пассивную картинку в верхней строке экрана. Проверяет наличие хотя бы одной АКТИВНОЙ картинки в первых трёх строках экрана. Если имеется хотя бы одна активная, то условие перестаёт быть истинным, и начинает проверяться встречное условие - присутствует активная картинка, Для звезды в приключении - на единственном экране условие не может быть истинным (т.е. активная картинка уже присутствует в трёх верхних строках), поэтому сразу начинает проверяться встречное условие - присутствует активная картинка, Затем бот проверяет условие присутствует активная картинка. Если условие истинно, то: Для звезды на домашнем острове - никаких дополнительных листаний бот не выполняет, а сразу выходит из большого цикла и далее функция закрывается "УСПЕХОМ". Таким образом гена с активной картинкой, находящийся даже в правом углу третьей сверху строки, становится доступен для дальнейших манёвров (если пользователи сочтут необходимым добавить построчное листание и в этот блок, то труда это не составит, но я пока не вижу в этом смысла) Для звезды в приключении - на единственном экране условие может быть только истинным, поэтому бот сразу выходит из большого цикла и далее функция закрывается "УСПЕХОМ".

Ограничение для пользователя - генералы должны быть переименованы таким образом, чтобы все генералы любого типа были бы расположены на экране звезды цепочкой - подряд, друг за другом, без разрывов.

Поскольку данная функция работает кроме активных картинок также и с пассивными ($image_NA), то данная переменная добавлена в параметры функции. Это добавление потребовало корректировки кейса "ЖдемГенерала" в файле autobot.au3 в части параметров вызываемой функции. Собственно код: в файле autobot.au3 в кейсе "ЖдемГенерала" заменить код на следующий:

Case "ЖдемГенерала"
            $parametr = StringSplit($komanda[2], ",")
            $generalData = getGeneralData($parametr[1])
            Return ozidanierasstanovki2($generalData[0], $generalData[2], $parametr[2])

в файле globalfuncWAR.au3 заменить код функции ozidanierasstanovki2($image, $image_NA, $yes) на следующий:

Func ozidanierasstanovki2($image, $image_NA, $yes)
    ; Ждём генерала от LEKALA (ака Андрей)
    Local $tx = 0, $ty = 0, $i = 1, $ii = 0, $count_list = 5, $count_line = 3, $count_gen_in_line = 9
    ; $count_list - задаем количество листаний звезды - число ген из ини файла делим на количество ген на одном экране звезды (3 верхних строки по 9 ген в строке) Идея и реализация от Marsik-A.
    $count_list = int(read_ini(4)/($count_line * $count_gen_in_line))
    Sleep(500 * $tormoza)
    openzvezdap()
    while ($ii < 2)
        selecttabatzvezda("specialisti", 0)
        $i = 1
        while ($i < $count_list)
            Select
                Case haveimageAREA($image_NA, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3]) = 1 AND haveimageAREA($image, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3]) = 0 
                    ;Если условие выполняется на первом экране, то ждём появления хотя бы одного активного.
                    If (_imagesearcharea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 1, 300, 300, @DesktopWidth-200, @DesktopHeight, $tx, $ty, 45)) = 0 Then
                        TrayTip("Отсутствует ползунок", "Нашли только пассивных на одном экране, ждём появления одного активного.", 5)
                        sleepwhile($image, 30, 900/$count_list)
                    EndIf                   
                    ;Если условие выполняется на 4 строки, то проверяем выполнение условия в первой строке.
                    while (_imagesearcharea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 1, 300, 300, @DesktopWidth-200, @DesktopHeight, $tx, $ty, 45)) <> 0
                        TrayTip("Видим только пассивных", "Нашли только пассивных, листаем по 1 строке до первой и ждём появления одного активного.", 5)
                        If (haveimageAREA($image_NA, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 250) = 1) AND (haveimageAREA($image, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 250) = 0) Then
                            sleepwhile($image, 30, 900/$count_list)
                            ExitLoop
                        Else
                            zvezdamovepolzunokdown(0)
                        EndIf
                    Wend
                    $i = $i + 1
                Case haveimageAREA($image_NA, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 82) = 0 AND haveimageAREA($image, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 82) = 0
                    ;Если условие выполняется на 3 верхних строки, то листаем 3 строки и добавляем счётчик экранов.
                    If (_imagesearcharea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 1, 300, 300, @DesktopWidth-200, @DesktopHeight, $tx, $ty, 45)) = 0 Then
                        TrayTip("Отсутствует ползунок", "Не нашли ни активных, ни пассивных на одном экране. Надо куда-то выйти", 5)
                        ExitLoop
                    EndIf                   
                    TrayTip("Не видим никого", "Не нашли ни активных, ни пассивных, листаем 3 строки", 5)
                    zvezdamovepolzunokdown(0)
                    zvezdamovepolzunokdown(0)
                    zvezdamovepolzunokdown(0)
                    sleep(500*tormoza)
                    $i = $i + 1
                Case Else
                ;Если оба предыдущих условия не являются истинными, то проверяем отсутствие активных в 3 верхних строках. 
                    If (haveimageAREA($image, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 82) = 0) Then
                        while (_imagesearcharea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 1, 300, 300, @DesktopWidth-200, @DesktopHeight, $tx, $ty, 45)) <> 0
                            ;Если активные в 3 верхних строках отсутствуют, то, листая построчно, проверяем наличие пассивных ИЛИ активных в первой строке.
                            If (haveimageAREA($image, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 250) = 1) OR (haveimageAREA($image_NA, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 250) = 1)Then
                                ExitLoop
                            Else
                                zvezdamovepolzunokdown(0)
                            EndIf
                        Wend
                    ;Если отсутствие активных в 3 верхних строках становится не истинным, то без лишнего листания выходим на закрытие функции УСПЕХОМ.
                    ;Листание по 1 строке до верхней можно добавить, если тестеры пожелают, но я пока не вижу в этом необходимости.
                    ElseIf (haveimageAREA($image, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 82) = 1) Then
                        TrayTip("Видим одного активного", "Нашли хотя бы одного активного, выходим", 5)
                        ExitLoop 2
                    EndIf
            EndSelect       
        Wend
        $ii = $ii + 1
        If $i > $count_list Then ExitLoop   
    Wend
    If $ii = 2 Then
        TrayTip("ОШИБКА", "Не нашли ни одного из выбранных ген!", 5)
        Return 0
    EndIf
    If ($yes = 1) Then
        zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
    EndIf
        TrayTip("УСПЕХ", "Нашли хотя бы одного активного из выбранных ген!", 5)
    Return 1
EndFunc

После завершения тестирования все TrayTip и лишние комментарии из кода можно удалить. ВНИМАНИЕ! В связи с переходом тестового сервера на работу под клиентом, у меня возникли трудности с тестированием данной функции для случаев большого количества экранов (3 и более 7) и большого количества ген одного типа (11 и более). Поэтому очень прошу участников репозитория со столь развитым количеством генералов поучаствовать в тестировании? ЭТО ВАЖНО! У меня на двух экранах в звезде команда работает безукоризненно.

LEKALA commented 3 years ago

jemxx, прошу Вас добавить к этому топику лейбл [NEED_TO_BE_TESTED]? И я вплотную смогу заняться исправлением недостатков команд "Набрать" и "ОтправитьДомой". ))