jemxx / autobot

Autobot for TSO
3 stars 2 forks source link

Отправка разведов и геологов #20

Closed ghost closed 4 years ago

ghost commented 4 years ago

Подправил отправку спецов.

Разведы - у меня их много, даже не так, очень много, поэтому у меня не докручивало звезду до конца и подвисало из-за этого, приходилось докручивать ползунок до низа руками. Какая логика лежала в основе этой функции у автора, я хз. В частности зачем нужен счетчик ii в первом цикле и зачем нужно условие ii > 5 для проверки ползунка в звезде - выше моего понимания. Плюс еще бесило, зачем при поиске артов бот сначала прыгает на поиск сокровища, а потом перепрыгивает на арты. Заменил так. У меня за вчера-сегодня при цикла поиска отбегало, еще тестил случай, когда слать было некого, все тоже отработало. Пока писал, возникло такое предложение - раз у нас есть конфиг для разведов, может введем туда признак для любого разведа, специализируется ли он на поисках приклов, и если да - то пусть тоже идет за приклами (а не только Бесстрашная и Безудержная тетки). К примеру у меня за приклами ходят авантюристки, знаю тех, у кого ходят туда зеленые леприконы. И тогда при настройке флагов ВСЕ разведы вне ивента будут отправяться одной командой, например,

Разведчики=1,1,1,Сокровища,Длительный

Func runrazved($tetki, $arti, $vidpoiska, $tippoiska, $kakih)
    Local $seychactetka = 0
    Local $i = 0, $ii = 0, $tx, $ty

    Local $vidrazvedov[0]
    Local $allScoutsJson = getDataGroupSpecialists("scouts")
    Local $count = UBound($allScoutsJson) - 1
    For $j = 0 To $count  Step + 1
        _ArrayAdd($vidrazvedov, "media\" & Json_Get($allScoutsJson, '[' & $j & '].img_active'))
    Next

    WinActivate("The Settlers Онлайн")
    Switch $tippoiska
        Case "Быстрый"
            $kartinkatippoiska = "media\search_treasure_fast.bmp"
            $kartinkatippoiska2 = "media\search_treasure_fast_.bmp"
        Case "Средний"
            $kartinkatippoiska = "media\search_treasure_sredny.bmp"
            $kartinkatippoiska2 = "media\search_treasure_sredny_.bmp"
        Case "Долгий"
            $kartinkatippoiska = "media\search_treasure_long.bmp"
            $kartinkatippoiska2 = "media\search_treasure_long_.bmp"
        Case "ОченьДолгий"
            $kartinkatippoiska = "media\search_treasure_very_long.bmp"
            $kartinkatippoiska2 = "media\search_treasure_very_long_.bmp"
        Case "Длительный"
            $kartinkatippoiska = "media\search_treasure_super_long.bmp"
            $kartinkatippoiska2 = "media\search_treasure_super_long_.bmp"
    EndSwitch
    Switch $vidpoiska
        Case "Сокровища"
            $kartinkavidpoiska = "media\search_treasure_button.bmp"
            $kartinkavidpoiska2 = "media\search_treasure_button_.bmp"
        Case "Приключения"
            $kartinkavidpoiska = "media\poisk_prikla.bmp"
            $kartinkavidpoiska2 = "media\poisk_prikla_.bmp"
    EndSwitch
    chatoff()
    drugioff()
    If openzvezda() = 0 Then Return 0
    If selecttabatzvezda("specialisti", 0) = 0 Then Return 0
    If $kakih == 0 Then
        While 1
            If openzvezda() = 1 Then
                While 1
                    If _imagesearcharea($vidrazvedov[0], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[1], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[2], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[3], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[4], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[5], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                        If $tetki = 1 Then $seychactetka = 1
                        ExitLoop
                    EndIf
                    If _imagesearcharea($vidrazvedov[6], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[7], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[8], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[9], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[10], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[11], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[12], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[13], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                        If $tetki = 1 Then $seychactetka = 1
                        ExitLoop
                    EndIf
;                   $ii = $ii + 1
;                   zvezdamovepolzunokdown(0)
;                   zvezdamovepolzunokdown(0)
;                   Sleep(Random(500, 1000, 1) * $tormoza)

;                   If $ii > 5 Then
                        If haveimagearea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 70, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25) = 1 Then
                            zvezdamovepolzunokdown(1)
                            Sleep(Random(500, 1000, 1) * $tormoza)
                        Else
                            zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
                            Return 1
                        EndIf
;                   EndIf
                WEnd
                $ii = 0
                While $ii < 6
                    MouseMove($tx, $ty, 10 * $tormoza)
                    Sleep(300 * $tormoza)
                    MouseClick("left", $tx + Random(-2, 2, 1), $ty + Random(-2, 2, 1), 1)
                    removemouse(543, 0, 100)
                    sleepwhile("media\search_treasure_menu.bmp", 20, 10)
                    If haveimage("media\search_treasure_menu.bmp", 20) = 1 Then ExitLoop
                    $ii = $ii + 1
                    If $ii = 6 Then Return 0
                WEnd
                If $seychactetka = 1 Then
                    zmemsmennuyukartinku("media\poisk_prikla.bmp", 30, "media\poisk_prikla_.bmp", 30)
                    go5()
                    $seychactetka = 0
                    If $kartinkatippoiska = "media\search_treasure_super_long.bmp" Then
                        zmemsmennuyukartinkuizdem("media\search_treasure_very_long.bmp", 30, "media\search_treasure_very_long_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                        zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
                    EndIf
                Else
                    zmemsmennuyukartinku($kartinkavidpoiska, 30, $kartinkavidpoiska2, 30)
                    go5()
                    removemouse(500, 0, 500)
;                   zmemsmennuyukartinkuizdem($kartinkatippoiska, 30, $kartinkatippoiska2, 30, "media\search_button_OK_enabled.bmp", 20)
                    If ($arti = 1) and (haveimage("media\search_artifact.bmp", 20) = 1) Then
                        zmemsmennuyukartinkuizdem("media\search_artifact.bmp", 30, "media\search_artifact_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                    Else
                        zmemsmennuyukartinkuizdem($kartinkatippoiska, 30, $kartinkatippoiska2, 30, "media\search_button_OK_enabled.bmp", 20)
                    EndIf
                    zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
                EndIf
            EndIf
        WEnd
    Else
        While 1
            If openzvezda() = 1 Then
                While 1
                    If _imagesearcharea($kakih, 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                        If ($kakih = $vidrazvedov[5] Or $kakih = $vidrazvedov[13]) Then
                            If $tetki = 1 Then $seychactetka = 1
                        EndIf
                        ExitLoop
                    EndIf
;                   $ii = $ii + 1
;                   zvezdamovepolzunokdown(0)
;                   zvezdamovepolzunokdown(0)
;                   Sleep(Random(500, 1000, 1) * $tormoza)
;                   If $ii > 5 Then
                        If haveimagearea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 70, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25) = 1 Then
                            zvezdamovepolzunokdown(1)
                            Sleep(Random(500, 1000, 1) * $tormoza)
                        Else
                            zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
                            Return 1
                        EndIf
;                   EndIf
                WEnd
                $ii = 0
                While $ii < 6
                    MouseMove($tx, $ty, 10 * $tormoza)
                    Sleep(300 * $tormoza)
                    MouseClick("left", $tx + Random(-2, 2, 1), $ty + Random(-2, 2, 1), 1)
                    removemouse(543, 0, 100)
                    sleepwhile("media\search_treasure_menu.bmp", 20, 10)
                    If haveimage("media\search_treasure_menu.bmp", 20) = 1 Then ExitLoop
                    $ii = $ii + 1
                    If $ii = 6 Then Return 0
                WEnd
                If $seychactetka = 1 Then
                    zmemsmennuyukartinku("media\poisk_prikla.bmp", 30, "media\poisk_prikla.bmp_", 30)
                    go5()
                    $seychactetka = 0
                    If $kartinkatippoiska = "media\search_treasure_super_long.bmp" Then
                        zmemsmennuyukartinkuizdem("media\search_treasure_very_long.bmp", 30, "media\search_treasure_very_long_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                        zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
                    EndIf
                Else
                    zmemsmennuyukartinku($kartinkavidpoiska, 30, $kartinkavidpoiska2, 30)
                    go5()
;                   zmemsmennuyukartinkuizdem($kartinkatippoiska, 30, $kartinkatippoiska2, 30, "media\search_button_OK_enabled.bmp", 20)
                    If ($arti = 1) and (haveimage("media\search_artifact.bmp", 20) = 1) Then
                        zmemsmennuyukartinkuizdem("media\search_artifact.bmp", 30, "media\search_artifact_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                    Else
                        zmemsmennuyukartinkuizdem($kartinkatippoiska, 30, $kartinkatippoiska2, 30, "media\search_button_OK_enabled.bmp", 20)
                    EndIf
                    zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
                EndIf
            EndIf
        WEnd
    EndIf
 EndFunc
jemxx commented 4 years ago

Пока писал, возникло такое предложение - раз у нас есть конфиг для разведов, может введем туда признак для любого разведа, специализируется ли он на поисках приклов, и если да - то пусть тоже идет за приклами

Вобщем то можно, думаю хуже не будет. Надо еще отскиринть на тесте новых спецов и добавить их в бот.

ghost commented 4 years ago

хорошо, в ближайшие пару дней отскриню и скину архивом. Как-то сам про тестовый не сообразил

Upd. Тестовый лежит, как очухается - заскриню

Upd2. Архив с иконками новых спецов specs.zip

ghost commented 4 years ago

А как Вы относитесь к тому, чтобы обернуть все if-ы в поиске разведов в один for и сократить код?

И второе предложение - возникло в ивент, дополнить функцию отправки разведов новым функционалом, а именно расширить параметр КакойРазведчик списком

Разведчики=Флаг, Поведение_Бесстрашный_Исследователь, Артефакты, Вид_поиска, Тип_поиска, [Опционально: Какой_Разведчик]

Например, так Разведчики=0,0,0,Сокровища,Долгий,Простой,Искренний,Скромный

И тогда все три типа медленных уйдут в Долгий поиск.

jemxx commented 4 years ago

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

По второму варианту, это можно было бы сделать.

ghost commented 4 years ago

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

Вот эти ифы оборачиваются в for и один if

                    If _imagesearcharea($vidrazvedov[0], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[1], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[2], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[3], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[4], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[5], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                        If $tetki = 1 Then $seychactetka = 1
                        ExitLoop
                    EndIf
                    If _imagesearcharea($vidrazvedov[6], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[7], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[8], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[9], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[10], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[11], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[12], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then ExitLoop
                    If _imagesearcharea($vidrazvedov[13], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                        If $tetki = 1 Then $seychactetka = 1
                        ExitLoop
                    EndIf
ghost commented 4 years ago

Отправки чего? разведов/геологов? У меня все как часики бегает который день.

jemxx commented 4 years ago

Разумеется разведчики. Геологи то не правились. На каком расширении экрана у вас сейчас листает без проблем?

jemxx commented 4 years ago

Вот эти ифы оборачиваются в for и один if

Ну не знаю что получится. Тут ифы и не зря. Какой тип разведа первый нашелся в видимой части тот отправляется. Порядок ифов тут роли не играет.

jemxx commented 4 years ago

А вы хотите в форе по порядку их перебирать. Не самоелучшее решение

ghost commented 4 years ago

да хочу в for-е перебирать. Почему нет? А 14 if-ов чем лучше? Если получится обернуть в for, то 2ю часть моей задумки будет проще сделать

ghost commented 4 years ago

Вот эти ифы оборачиваются в for и один if

Ну не знаю что получится. Тут ифы и не зря. Какой тип разведа первый нашелся в видимой части тот отправляется. Порядок ифов тут роли не играет.

не совсем) Там перебор - сначала ищутся все развед[0], когда они кончились, ищутся все развед1 и .т.д. до 13го

ghost commented 4 years ago

на работе 1920х1080, дома скажу позже. А почему не листает-то? Я не вижу причин чтобы не листало, если условия правильно расставлены?

ghost commented 4 years ago

Там в видимой части ищутся все разведы от 0 до 13, если в видимой части не нашли никого - т.е. ни один из if не отработал и не вышли из while по exitloop, то проверяется условие

можно ли листнуть звезду

If haveimagearea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 70, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25) = 1 Then
                            zvezdamovepolzunokdown(1)
                            Sleep(Random(500, 1000, 1) * $tormoza)
                        Else
                            zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
                            Return 1
                        EndIf

если можно, - if () = 1 - то листается быстро (, т.е. на весь экран zvezdamovepolzunokdown(1)), и засыпает если нельзя - else - то звезда закрывается и ретурн 1

jemxx commented 4 years ago

не совсем) Там перебор - сначала ищутся все развед[0], когда они кончились, ищутся все развед1 и .т.д. до 13го

А вы никогда не обращали внимания как они оправляются? Я не однократно видел, то о чем пишу. Сначала отправляются все типы разведов из видимой области, затем листает вниз. И это логично вверх то он не умеет листать. А вы хотите фором это все сломать.

ghost commented 4 years ago

Я когда что-то правлю, смотрю естественно)) И не один раз) Ничего не сломаетсЯ, т.к. каждый раз будет фор заново запускаться. Если у вас 10 зеленых стоят первым, то каждый фор пойдет сначала. Там будет exitloop 2, т.е. выход на не некстфор, а на ендвайл

я же внешний вайл-то оставлю, а вместо if-ов сделаю for. Я так уже сделал в отправке разведов через окно прикла, все отлично отправляется.

jemxx commented 4 years ago

Еще есть такой момент что они могут идти не попорядку. Например сортировка не стандартная или названы по хитрому. Код автора с этим работает нормально. Да и вообще работает так зачем его трогать?))

ghost commented 4 years ago

Еще есть такой момент что они могут идти не попорядку. Например сортировка не стандартная или названы по хитрому. Код автора с этим работает нормально. Да и вообще работает так зачем его трогать?))

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

jemxx commented 4 years ago

А вообще попробуйте) Может будет лучше и проще)

ghost commented 4 years ago

Дома на ноутбуке тоже 1920х1080 разрешение. Я не вижу проблем по коду нелистания звезды, только если ее бегунок не виден на экране. Последите и опишите проблему поподробнее?

Каэшн будет проще потом - не надо каждый раз менять число спецов! В каунте развездов уже вся инфа же будет, всем будет рулить секция конфига.

ghost commented 4 years ago

совсем другое дело!!

Первый while меняется на этот while

While 1
    For $j = 0 To $count  Step + 1
        If _imagesearcharea($vidrazvedov[$j], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
            If (($j = 5) or ($j = 13)) and ($tetki = 1) Then $seychactetka = 1
            ExitLoop 2
        EndIf
    Next

;   $ii = $ii + 1
;   zvezdamovepolzunokdown(0)
;   zvezdamovepolzunokdown(0)
;   Sleep(Random(500, 1000, 1) * $tormoza)

;   If $ii > 8 Then
        If haveimagearea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 70, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25) = 1 Then
            zvezdamovepolzunokdown(1)
;           zvezdamovepolzunokdown(0)
            Sleep(Random(500, 1000, 1) * $tormoza)
        Else
            zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
            Return 1
        EndIf
;   EndIf
WEnd

PS! Вдруг Вы знаете как убрать/добавить одним сочетанием структурные отступы в коде? Был бы благодарен, а то сам не нашел(

jemxx commented 4 years ago

Неа, не знаю. Завтра затестю на отправке разведчиков.

ghost commented 4 years ago

я на тестовом угнал часть зеленых и золотых на 2й экран, и все отослало, как и должно. Последите, если не будет листать звезду то в какой момент? По идее логика такая - на открытом экране звезды ищутся все разведы в порядке, указанном в Справке

Следопыт, Опытный, Везучий, Простой, Храбрый, Бесстрашный, Авантюрист, Зои, Искренний, Скромный, Зачарованный, Милый, Настойчивый, Безудержный

Если на экране нет активных разведов, то звезда листается на полный эран и снова ищутся скауты. Если листать некуда - звезда закрывается и команда считается выполненной.

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

ghost commented 4 years ago

и вдогонку, если добавили новых спецов, может добавите флаг в конфиг для разведов - искать или нет прикл? у Вас это быстрее получится, и мне проще будет уже финальный код допиливать с учетом отправки за приклами если надо. Спасибо!

ghost commented 4 years ago

я вот еще что подумал - а Вы файл media\zvezda_polzunok_ewe_mojno_vniz.bmp не трогали? а то я писал как-то, что не листало у меня звезду, и я его перескринивал, но потом обратно вернул на оригинальный, т.к. в другом месте не листало. И сейчас мой отправка разведов работает с оригинальным скрином

jemxx commented 4 years ago

а как передать в функцию массив значений? или просто по имени и уже в функции перебирать значения?

Просто передаете, а в функции перебираете

и вдогонку, если добавили новых спецов, может добавите флаг в конфиг для разведов - искать или нет прикл?

Да, добавлю

я вот еще что подумал - а Вы файл media\zvezda_polzunok_ewe_mojno_vniz.bmp не трогали?

Нет, не трогал. Отправил около 200 разведчиков с новым кодом . Все листается, но пару строк перелистнул и не отправил. Возможно это связано с скоростью, она у меня 0,2 на отправку. Пришлось еще раз запускать отправку.

ghost commented 4 years ago

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

У меня на 0.3 нормально шлет, 0.2 даже не пробовал, т.к. 0.3 вполне себе хватает.

jemxx commented 4 years ago

Надо еще проверить отправку на зафиксированой звезде, когда она каждый раз не открывается, а открыта постоянно.

ghost commented 4 years ago

С открытой звездой будет глючить, т.к. при открытой звезде иконка отправленного разведа не сразу сереет и бот будет тычить на уже ушедшего разведа. Чтобы это победить, надо переделывать отправку ища первого активного разведа.

jemxx commented 4 years ago

не сразу сереет

Не сразу сереет если вы до этого посетили остров друга или приключение. Если никуда не заходили сереет моментально)

ghost commented 4 years ago

не сразу сереет

Не сразу сереет если вы до этого посетили остров друга или приключение. Если никуда не заходили сереет моментально)

да??? фигасе! И как, потестили? работает?

jemxx commented 4 years ago

Нет, с утра потестю. Но эта фишка давно известна, что если только зайти в игру и ни ходить к другу иили в приключение, то сереет нормально. Как только куда то сходил, все ломается.

ghost commented 4 years ago

спасибо, не знал. Щас я добавлю код, по проблеме с 1 бойцом, поправил и проверил.

jemxx commented 4 years ago

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

ghost commented 4 years ago

В исходном коде логика листания для меня вообще так и не поддалась никакому объяснению, какой-то счетчик до 6ти, какой-то иф если счетчик больше 5, какая-то левая проверка на 0, есть ли картинка ползунка.

Мне странно почему у Вас пропускает, тем более много, плохой коннект или высокая скорость бота? У меня и у со-ги - тестера все норм всю дорогу.

попробуйте скорость понизить до 0.4 или до 0.5 и проверить.

Замените zvezdamovepolzunokdown(1)

на

zvezdamovepolzunokdown(0)

ghost commented 4 years ago

Всю голову сломал, что я делаю не так?((( Не хочет работать с массивом , $Arr_kakih я уже что только не перепробовал и _AddArray-ем добавлял и вот через тупо присвоение делаю передает только один параметр и все! и как только не объявлял $Arr_kakih и $Arr_kakih[0] и $Arr_kakih[] и $Arr_kakih[100]

Вот команда в текстовике

Разведчики=0,0,0,Сокровища,Длительный,Простой,Скромный,Настойчивый

        Case "Разведчики"
            Global $count_kakih = 0, $Arr_kakih[0]
            local $for_i

            $parametr = StringSplit($komanda[2], ",")

            $count_kakih = UBound($parametr) - 6

            For $for_i = 0 to $count_kakih - 1 Step + 1
                $Arr_kakih[$for_i] = $parametr[6 + $for_i]
                TrayTip("", "Какой по счету " & $for_i & " и кто " & $Arr_kakih[$for_i], 0)
                Sleep(2000)
            Next
jemxx commented 4 years ago

Используйте для заполнения массива _ArrayAdd,. Если его не используете то сразу нужно объявлять массив с нужным количеством элементов.


        $parametr = StringSplit("0,0,0,Сокровища,Длительный,Простой,Скромный,Настойчивый", ",")

    local $count_kakih = UBound($parametr) - 6
    local $Arr_kakih[$count_kakih]

    For $for_i = 0 to $count_kakih - 1 Step + 1
        $Arr_kakih[$for_i] = $parametr[6 + $for_i]
        ConsoleWrite("Какой по счету " & $for_i & " и кто " & $Arr_kakih[$for_i] & @LF)
    Next

    _ArrayDisplay($Arr_kakih)   

Так массив заполняется   
ghost commented 4 years ago

я че только не пробовал - оно тоже не добавляет, увы(

ghost commented 4 years ago

оба-на, а Ваш текст сработал, щас дальше тогда буду тестить, спасибо

ghost commented 4 years ago

Спасибо за подсказки!!! В первом приближении сделал что-то, но пока кривое. Надо переделывать считывание параметров скаутов из конфига, т.к. у меня получилось долго(

Вот функция runrazved из globalfuncWAR

Func runrazved($adv_srch, $arti, $vidpoiska, $tippoiska, $count_kakih, $Arr_kakih)
    Local $adv_search_yes = 0
    Local $curr_i, $j = 0, $i = 0, $ii = 0, $tx, $ty

    Local $name_razvedov[0], $vidrazvedov[0], $flag_adv_search[0], $slat_yes[0]
    Local $allScoutsJson = getDataGroupSpecialists("scouts")
    Local $count = UBound($allScoutsJson) - 1

    For $j = 0 To $count Step + 1
        _ArrayAdd($name_razvedov, Json_Get($allScoutsJson, '[' & $j & '].name'))
        _ArrayAdd($vidrazvedov, "media\" & Json_Get($allScoutsJson, '[' & $j & '].img_active'))
        _ArrayAdd($flag_adv_search, Json_Get($allScoutsJson, '[' & $j & '].adv_search'))
        _ArrayAdd($slat_yes, 0)
    Next

    WinActivate("The Settlers Онлайн")
    Switch $tippoiska
        Case "Быстрый"
            $kartinkatippoiska = "media\search_treasure_fast.bmp"
            $kartinkatippoiska2 = "media\search_treasure_fast_.bmp"
        Case "Средний"
            $kartinkatippoiska = "media\search_treasure_sredny.bmp"
            $kartinkatippoiska2 = "media\search_treasure_sredny_.bmp"
        Case "Долгий"
            $kartinkatippoiska = "media\search_treasure_long.bmp"
            $kartinkatippoiska2 = "media\search_treasure_long_.bmp"
        Case "ОченьДолгий"
            $kartinkatippoiska = "media\search_treasure_very_long.bmp"
            $kartinkatippoiska2 = "media\search_treasure_very_long_.bmp"
        Case "Длительный"
            $kartinkatippoiska = "media\search_treasure_super_long.bmp"
            $kartinkatippoiska2 = "media\search_treasure_super_long_.bmp"
    EndSwitch
    Switch $vidpoiska
        Case "Сокровища"
            $kartinkavidpoiska = "media\search_treasure_button.bmp"
            $kartinkavidpoiska2 = "media\search_treasure_button_.bmp"
        Case "Приключения"
            $kartinkavidpoiska = "media\poisk_prikla.bmp"
            $kartinkavidpoiska2 = "media\poisk_prikla_.bmp"
    EndSwitch
    chatoff()
    drugioff()
    If openzvezda() = 0 Then Return 0
    If selecttabatzvezda("specialisti", 0) = 0 Then Return 0

    If $count_kakih = 0 Then
        ; шлем всех
        For $j = 0 To $count Step + 1
            $slat_yes[$j] = 1
        Next
    Else
        ; выбираем кого слать
        For $i = 0 To $count ; цикл по всем разведам
            For $j = 0 to $count_kakih - 1 ; цикл по разведам, кого нужно отправить
                If $Arr_kakih[$j] = $name_razvedov[$i] Then
                    $slat_yes[$i] = 1
                    Exitloop
                EndIf
            Next
        Next
    EndIf

    ; Отправка
    While 1
        If openzvezda() = 1 Then
            While 1
                For $j = 0 To $count Step + 1
                    If $slat_yes[$j] = 1 Then
                        If _imagesearcharea($vidrazvedov[$j], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                            If ($adv_srch = 1) and ($flag_adv_search[$j] = 1) Then $adv_search_yes = 1
                            ExitLoop 2
                        EndIf
                    EndIf
                Next
                If haveimagearea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 70, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25) = 1 Then
                    zvezdamovepolzunokdown(1)
                    Sleep(Random(500, 1000, 1) * $tormoza)
                Else
                    zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
                    Return 1
                EndIf
            WEnd

            $ii = 0
            While $ii < 6
                MouseMove($tx, $ty, 10 * $tormoza)
                Sleep(300 * $tormoza)
                MouseClick("left", $tx + Random(-2, 2, 1), $ty + Random(-2, 2, 1), 1)
                removemouse(543, 0, 100)
                sleepwhile("media\search_treasure_menu.bmp", 20, 10)
                If haveimage("media\search_treasure_menu.bmp", 20) = 1 Then ExitLoop
                $ii = $ii + 1
                If $ii = 6 Then Return 0
            WEnd
            If $adv_search_yes = 1 Then
                zmemsmennuyukartinku("media\poisk_prikla.bmp", 30, "media\poisk_prikla_.bmp", 30)
                go5()
                $adv_search_yes = 0
                If $kartinkatippoiska = "media\search_treasure_super_long.bmp" Then
                    zmemsmennuyukartinkuizdem("media\search_treasure_very_long.bmp", 30, "media\search_treasure_very_long_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                    zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
                EndIf
            Else
                zmemsmennuyukartinku($kartinkavidpoiska, 30, $kartinkavidpoiska2, 30)
                go5()
                removemouse(500, 0, 500)
                If ($arti = 1) and (haveimage("media\search_artifact.bmp", 20) = 1) Then
                    zmemsmennuyukartinkuizdem("media\search_artifact.bmp", 30, "media\search_artifact_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                Else
                    zmemsmennuyukartinkuizdem($kartinkatippoiska, 30, $kartinkatippoiska2, 30, "media\search_button_OK_enabled.bmp", 20)
                EndIf
                zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
            EndIf
        EndIf
    WEnd
 EndFunc

а это фрагмент autobot.au3 по обработке команды Разведчики

        Case "Разведчики"
            $parametr = StringSplit($komanda[2], ",")

            local $count_kakih = UBound($parametr) - 6
            local $Arr_kakih[$count_kakih]

            For $for_i = 0 to $count_kakih - 1 Step + 1
                $Arr_kakih[$for_i] = $parametr[6 + $for_i]
;               ConsoleWrite("Какой по счету " & $for_i & " и кто " & $Arr_kakih[$for_i] & @LF)
            Next

            Local $status = runrazved($parametr[2], $parametr[3], $parametr[4], $parametr[5], $count_kakih, $Arr_kakih)

            If $parametr[1] = 0 Then
                Return $status
            ElseIf $parametr[1] = 1 Then
                Return 1
            Else
                MsgBox(0, "!!!", "Неправильный параметр флага")
                Return 0
            EndIf
ghost commented 4 years ago

на тесте потестил, отправляет и всех скопом и по списку, и флаги поиск приклов и артов отрабатывает корректно. из проблем - долго открывает (или совсем не открывает) звезду, я руками открывал. Возможно нужно переделать чтение конфига со скаутами, но в этом я совсем не силен(

jemxx commented 4 years ago

из проблем - долго открывает (или совсем не открывает) звезду, я руками открывал.

Не подтверждаю. На тесте тоже отправил десяток разных разведов. Все отработало по скорости так же как и всегда. С утра на своих по тестирую. Если все хорошо будет, геологов тоже надо будет переделать так же.

ghost commented 4 years ago

Странно, возможно тормоза были из-за того, что два окна было открыто - основный сервер и тестовый. Отправил медленных на основном сервере без тормозов.

В смысле геологов также? Выборочным списком?

А чтение из конфига оставляем мое?

jemxx commented 4 years ago

А чтение из конфига оставляем мое?

Врядли там что то лучше можно придумать. Да и не нужно оно.

В смысле геологов также? Выборочным списком?

Да. С ними проще.

ghost commented 4 years ago

по Геологам не соглашусь, для разведов и геологов разная отправка: разведы скопом и по типу, а геологи количеством.

Разведы Написание: Разведчики=Флаг, Поведение_Бесстрашный_Исследователь, Артефакты, Вид_поиска, Тип_поиска, [Опционально: Какой_Разведчик]

Геологи Написание: Геологи=Флаг, Тип_залежи, Сколько_отправить, [Опционально: Какой_геолог]

Почему я занялся разведами - у них разное время прихода из одного и того же типа поиска, есть Зеленые и Авантюристы - самые быстрые, есть Следопыты и разные тетки, а есть Простые, Скромные и Настойчивые - в ивент мне удобнее каждого слать так, чтобы приходили все в одно время - Зеленых и Авантюристок в Длительный, Медленных в Долгий, остальных в Самый долгий. Поэтому и попробовал сократить число строк в текстовике. А для геологов это не так актуально, поэтому я бы не трогал геологов. Если оставить количество для совместимости со старыми текстами, то как считать? 6 - это два каменных и 4 археолога?

jemxx commented 4 years ago

Все верно. Не надо.

ghost commented 4 years ago

на быстрых скоростях, у меня вот сегодня даже на 0.3 бывает лаг, что описание разведа перекрывает область снизу справа Примерно так, только больше - и тогда эта область перестает быть видимой для бота, и разведы, которые туда попали, пропускаются Screenshot_1

Надо мышь сдвигать куда-то в другое место - выше/левее

ghost commented 4 years ago

я понял, зачем были нужны эти лишние счетчики и иф перед листанием.

В функции отправки разведов runrazved нужно заменить с ; отправка до EndFunc следующим кодом Я комменты расставил, почему я так думаю - их можно прибить

    ; Отправка
    $ii = 0
    While 1
        If openzvezda() = 1 Then
            While 1
                For $j = 0 To $count Step + 1
                    If $slat_yes[$j] = 1 Then
                        If _imagesearcharea($vidrazvedov[$j], 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
                            If ($adv_srch = 1) and ($flag_adv_search[$j] = 1) Then $adv_search_yes = 1
                            ExitLoop 2
                        EndIf
                    EndIf
                Next
                ; прошли цикл по всем разведам, и не нашли кого можно отправить - не вышли по ExitLoop 2

                $ii = $ii + 1
                ; перемещаем мышь в нижний левый угол звезды можно вместо этого написать go5() - это переход в точку (5,5), но это дольше, мне кажется, хотя возможно стабильнее
                MouseMove($zvezda_area[0], $zvezda_area[3], 10* $tormoza)

                ; если 5 раз подергали мышь и не нашли, кого отправить - то листаем звезду 
                If $ii > 5 Then
                    If haveimagearea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 70, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25) = 1 Then
                        zvezdamovepolzunokdown(1)
                        Sleep(Random(500, 1000, 1) * $tormoza)
                    Else
                        zmemsmennuyukartinku("media\close-zv.bmp", 90, "media\close-zv_.bmp", 90)
                        Return 1
                    EndIf
                EndIf   
            WEnd
            $ii = 0
            While $ii < 6
                MouseMove($tx, $ty, 10 * $tormoza)
                Sleep(300 * $tormoza)
                MouseClick("left", $tx + Random(-2, 2, 1), $ty + Random(-2, 2, 1), 1)
                removemouse(543, 0, 100)
                sleepwhile("media\search_treasure_menu.bmp", 20, 10)
                If haveimage("media\search_treasure_menu.bmp", 20) = 1 Then ExitLoop
                $ii = $ii + 1
                If $ii = 6 Then Return 0
            WEnd
            If $adv_search_yes = 1 Then
                zmemsmennuyukartinku("media\poisk_prikla.bmp", 30, "media\poisk_prikla_.bmp", 30)
                go5()
                $adv_search_yes = 0
                If $kartinkatippoiska = "media\search_treasure_super_long.bmp" Then
                    zmemsmennuyukartinkuizdem("media\search_treasure_very_long.bmp", 30, "media\search_treasure_very_long_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                    zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
                EndIf
            Else
                zmemsmennuyukartinku($kartinkavidpoiska, 30, $kartinkavidpoiska2, 30)
                go5()
                removemouse(500, 0, 500)
                If ($arti = 1) and (haveimage("media\search_artifact.bmp", 20) = 1) Then
                    zmemsmennuyukartinkuizdem("media\search_artifact.bmp", 30, "media\search_artifact_.bmp", 30, "media\search_button_OK_enabled.bmp", 20)
                Else
                    zmemsmennuyukartinkuizdem($kartinkatippoiska, 30, $kartinkatippoiska2, 30, "media\search_button_OK_enabled.bmp", 20)
                EndIf
                zmemsmennuyukartinku("media\search_button_OK_enabled.bmp", 20, "media\search_button_OK_enabled_.bmp", 20)
            EndIf
        EndIf
    WEnd
jemxx commented 4 years ago

Сразу не разберешься что для чего. Заменю.

jemxx commented 4 years ago

Гораздо стабильнее стало работать при постоянно открытой звезде. Никого сегодня не пропустил. Осталось, наверное, геологов еще так же подшаманить)

ghost commented 4 years ago

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