jemxx / autobot

Autobot for TSO
3 stars 2 forks source link

Ошибки релиза 0.22 #59

Closed LEKALA closed 3 years ago

LEKALA commented 3 years ago

Для начала подержу за ноздри вот этого мудака:

Ну что с логикой проблемы - это очевидно, и я не знаю зачем Вы повелись на этот бред кодирования с кейсами непонятными условиями!!!!

https://github.com/jemxx/autobot/issues/58#issuecomment-751340233

Как Вы думаете, вот в этот Вайл зайдет бот когда-нить?? И после этого Вы еще планируете включать в релизы логику этого недоучки??

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

jemxx, а к Вам у меня очень серьёзная просьба - категорически прошу Вас, не включать БЕЗ МОЕГО СОГЛАСИЯ в разработанный мною код правки этого выродка?

LEKALA commented 3 years ago

Устранение недостатков функции Func generali($general, $nomergenerala)

У одного из моих друзей, после перехода на релиз 0.22 перестала работать команда Набрать=Интендант,2,Э,0,0,0,0,0,1,0,1 вот для такой конфигурации ген у него в звезде: https://c2n.me/4anlCnj 26a9f-clip-417kb

Проблема решилась очень просто.)) Поскольку в новом файле .ini у него осталось значение по умолчанию total_generals=50, то возникало впечатление, что бот просто перестал видеть интенданта. Когда он изменил этот параметр на total_generals=60, то всё заработало.))

Однако я сам столкнулся с другим нюансом. Если команда Набрать=Интендант,2,Э,0,0,0,0,0,1,0,1 открывает звезду и видит там сразу вот такую конфигурацию:

df190-clip-412kb то вылетает с ошибкой. Причина этого заключалась в том, что бот видит интенданта, поэтому не начинает цикл листания, а сразу отдаёт координаты картинки гены в следующие блоки, которые обрабатывают номера ген в звезде. И блок, который отвечает за сдвиг координат для клика в нужную номерную картинку, просто не знает, куда сдвигать координаты. Чтобы избежать выявленной неприятности, пришлось добавить цикл листания и в условие, когда картинка гены уже находится на экране. Теперь код блока, ответственного за поиск ген выглядит вот так:

While 1
        If (haveimageAREA($general, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3]) = 0) Then
            selecttabatzvezda("specialisti", 0)
            while (_imagesearcharea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 1, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25, $tx, $ty, 45)) <> 0 AND ($ii < $count_list)
                If (haveimageAREA($general, 20, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 165) = 1) Then
                    ExitLoop
                Else
                    zvezdamovepolzunokdown(0)
                    $ii = $ii + 1
                EndIf
            Wend
            If $ii >= $count_list Then 
                ;TrayTip("ОШИБКА", "Не нашли ни одного из выбранных ген!", 5)
                Return 0
            EndIf
        ElseIf _imagesearcharea($general, 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3], $tx, $ty, 30) = 1 Then
            while (_imagesearcharea("media\zvezda_polzunok_ewe_mojno_vniz.bmp", 1, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25, $tx, $ty, 45)) <> 0 AND ($ii < $count_list)
                If _imagesearcharea($general, 1, $zvezda_area[0], $zvezda_area[1], $zvezda_area[2], $zvezda_area[3] - 165, $tx, $ty, 30) = 1 Then
                    ExitLoop
                Else
                    zvezdamovepolzunokdown(0)
                    $ii = $ii + 1
                EndIf
            Wend
            If $ii >= $count_list Then 
                ;TrayTip("ОШИБКА", "Не нашли ни одного из выбранных ген!", 5)
                Return 0
            EndIf
            ExitLoop
        EndIf
    WEnd

Изменения нужно внести в файл globalfuncWAR3.au3 в функцию Func generali($general, $nomergenerala) Правда теперь команда Набрать всегда листает до размещения первой активной картинки гены во второй строке сверху. Даже у вышеупомянутого друга.))

jemxx commented 3 years ago

Ну а теперь смотрите в чем проблема в функции ozidanierasstanovki2. Сразу мы присваиваем count_line = 3, $count_gen_in_line = 9 Далее вычисляем $count_list

int(ReadINI("main", "total_generals", "50")/($count_line * $count_gen_in_line))

*$count_line $count_gen_in_line = 27 Затем мы 50 / 27 = 1.85 и функцией int отсекаем дробную часть. В итоге в $count_list у нас единица**

А далее начинается цикл while в который мы ни как попасть не можем While ($i < $count_list) потому как и в $i и в $count_list у нас единица. Проблема в том что если у нас генералов меньше чем 27*2 то в цикл мы никогда не зайдем. Очевидно и проблема вашего друга связана с этим же.

Аналогично и в ozidanierasstanovki. То есть у нас никогда не выполнится блок Select EndSelect

jemxx commented 3 years ago

Что бы мы хоть раз зашли в этот блок нужно $i присваивать 0 а не единицу на старте. Но это будет работать пока кто то в не поставит что у него 26 и меньше генералов))

LEKALA commented 3 years ago

Да. Но если понимать, что бот при поиске для ожидания листает 3 строки (чтобы разместить всех ген из Вашего же техзадания и требований к команде в трёх верхних строках экрана), то пользователь Должен указать в файле .ini количество генералов на 27 больше, чем у него есть в наличии.

LEKALA commented 3 years ago

т.е. если у пользователя 26 генералов, то в .ini он должен указать 53 минимум! На мой взгляд, это очевидно вытекает из арифметики

jemxx commented 3 years ago

Должен это не значит что укажет. Это не очевидно и более того нигде в справке это не отражено. Самое оптимальное в коде самостоятельно добавлять 27 к указанному числу генералов.

LEKALA commented 3 years ago

Можно и так. просто в формуле добавить +27 в числителе. Или да, указать в справке. Я надеялся, что этот вопрос возникнет до публикации, ещё в процессе тестирования, и тогда можно было бы обсудить необходимую формулировку для включения в справку.

jemxx commented 3 years ago

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

LEKALA commented 3 years ago

Согласен с Вами.) Это стоит сделать и для команды, предложенной в этом топике. Чтобы магия происходила в коде, а не напрягала пользователя.

jemxx commented 3 years ago
$count_list = int(ReadINI("main", "total_generals", "50")/($count_line * $count_gen_in_line)) - 4

Поясните эту логику в функции generali тут отнимается 4 но сюда еще нужно плюсануть 27

LEKALA commented 3 years ago

отнимается 4 строки. т.е. полный экран. Поскольку функция листает по 1-й строке, то первый экран ей не нужен. Она должна начать работать только, если на первом экране нет нужного гены. Это было сделано для обоснованного нажатия на вкладку "специалисты". +27 к генам в числителе тоже стоит сделать, хотя возможно достаточно будет обойтись +18, поскольку функция не поднимает до верхней строки (т.е. 3 строки после последнего гены), а всего лишь до 2-й строки (т.е. 2 полных строки - 18 ген). Ещё я всё-таки думаю, что следовало бы указать значение по умолчанию, кратное 9 - т.е. total_generals=54 или 45 например. И для пользователей в справке записать, что указывать в .ini число своих ген не реальное, а кратное 9 с округлением в большую сторону. Ну и обязать пользователя, редактировать .ini при покупке новых ген в ивент))

jemxx commented 3 years ago

Так мне и не удалось добиться нормального ожидания генерала на дом острове. Ждет только в первых трех строках и все. Ни плюс 27 ни плюс 127 ничего не помогает. Видимо есть еще в чем то проблема. В целом проблема у всех идентична. Проверял сам и 2 моих согильдийца. Если просто указать количество ген в ini то сразу вываливается с ошибкой, что гены не найдены, но это логично. Если прибавить 27 то ищет только на первых трех строках. Генералы которые ниже не видит, хоть и листает звезду.

jemxx commented 3 years ago

Вот он суда заходит

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, $zvezda_area[0] + 385, $zvezda_area[1] + 200, $zvezda_area[2] + 25, $zvezda_area[3] + 25, $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 раза и ничего не ищет. Затем счетчик увеличивается и понятное дело, что в следующую итерацию больше в while он не заходит т,к $i становится равен $count_list. Вот тут на мой взгляд проблема

LEKALA commented 3 years ago

jemxx, нужно записать $i = 0 Я пока не понимаю условия Вашего эксперимента, поэтому изложу свои. У меня 58 ген. в .ini я должен указать число кратное 9 с округлением в большую сторону, т.е. 63, прибавить к нему 27 и получить 90. Записываю в notepad++ total_generals=90, сохраняю. Никаких исправлений в исходном коде в строке $count_list = int(ReadINI("main", "total_generals", "50")/($count_line * $count_gen_in_line)) не делаю. В коде присутствует $i = 1. Запускаю бота с таким текстом: ЖдемВсехГенералов=Интендант,0 Набрать=Интендант,2,Э,0,0,0,0,0,1,0,1 ЖдемГенерала=Клаус,0 Набрать=Клаус,1,Э,0,174,0,0,0,3000,0,1

https://user-images.githubusercontent.com/70764669/103180731-34efd700-48a1-11eb-8bf1-f6459beff962.mp4

Что мы видим? То, что второй интендант в одной строке с клаусами. Что команда нашла клаусов, но не смогла снова зайти в цикл. Почему я так думаю? А потому, что вышеприведённый Вами кейс отработал! У этого блока пропала истинность условия "не видим никого". По идее блок д.б. выйти из цикла и на следующем цикле запустить проверку, что гена присутствует в звезде. Но счётчик экранов ему этого не позволил. Это меня простимулировало увеличивать количество ген в .ini и мне пришлось провести серию тестов. С цифрой 99, 108, 107. Бот увидел и набрал клауса только на цифре 108. Отсюда я сделал вывод, что коду не хватает одного полного экрана этой функции - 3 строки (27 ген). Начал искать эту единицу. Эта единица нашлась в $i = 1. Откуда она там появилась? От моего неправильного решения - чтобы бот, если не нашёл гену, то не листал бы три лишних строки. Короче, вернул я в код функции $i = 0. Проверил работу того же самого текста:

https://user-images.githubusercontent.com/70764669/103181726-f829dd00-48ac-11eb-9064-f297a4b5b82c.mp4

Проверьте у себя с $i = 0. Теперь, если мне например придётся запустить текст с командой ждать "ЗолотойИнтендант", которого у меня нет, то команда пролистает три лишних строки...

LEKALA commented 3 years ago

jemxx, Вам удалось провести Ваш эксперимент с $i = 0 ? Бот увидел по обеим командам Ждем.. Ваших клаусов? Смог набрать их? Если Вам не трудно, то ответьте, пожалуйста. И еще. Вы проводили эксперимент с командой Ждем на гене, которого у Вас нет? Бот листает три лишних строки?

jemxx commented 3 years ago

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

LEKALA commented 3 years ago

Может это грехи васюты? он скринил ген на домашнем острове, т.е. без полосок... Мне кстати пришлось перескринить чуть ли не половину неактивных ген... Это не злоба и не счёты... Просто реально, васюта к этому процессу отнёсся спустя рукава(( Т.е. типа того - пипл и так схавает...((

jemxx commented 3 years ago

Да не, я перескринил и то же самое в приключение. Именно с этим автобусом.

LEKALA commented 3 years ago

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

Провести эксперимент с золотым интендантом смог только на тестовом, а там нельзя использовать команду Набрать, поэтому бот отрабатывал только вот такой текст: ЖдемВсехГенералов=ЗолотойИнтендант,1 ЖдемГенерала=ЗолотойИнтендант,1

https://user-images.githubusercontent.com/70764669/103363167-241eab80-4ac3-11eb-8c93-90f5bd8d41c9.mp4

Как видите всё работает. Если у Вас не увидел картинку с полоской ожидания внизу, то это однозначно дефект скрина.

jemxx commented 3 years ago

Выяснил почему с ним проблема. Походу поймал аналогичную проблему с майором. При долгом ожидании на любом генерале ошибка. Слишком мало ждет примерно не более 2-3 минуты, а это очень мало. Майор не успел с лагеря вернуться и вывалилась ошибка ожидания. Автобуса тоже не дожидается. Проверяется очень просто. Отправляете в прикл (у меня идут 15 минут) и запускаете

Ждем=600
ЖдемГенерала=ЗолотойИнтендант,0

100% не дождется потому как автобусу идти еще минут 5

LEKALA commented 3 years ago

Ждёт команда вот этой строкой:

sleepwhile($image, 30, 900/$count_list)

Сколько у Вас получился $count_list ? в Вашем эксперименте? Допустим, если $count_list=5, то время ожидания будет 900/5=180, после этого ожидание закончится, команда прибавит 1 к счётчику $i и пойдёт на следующий цикл ожидания 180 секунд. Когда исчерпаются все $count_list, команда выйдет с ошибкой. В команде ЖдемВсехГенералов в аналогичной строке использовано абсолютное значение 300, после истечения которого команда добавит счётчик $i и, для случая $count_list=5, будет 5 раз повторять ожидание по 300 секунд (25 мин). Вариант 900/$count_list был применён экспериментально, и у меня работает полностью адекватно, Обе команды работают адекватно. васютину картинку неактивного майора я у себя менял, помню это точно. в стоковой картинке размер по вертикали однозначно захватывает область полоски ожидания.

jemxx commented 3 years ago

Выяснилась новая проблема. Если генерал один, то получаем ошибку.

LEKALA commented 3 years ago

С какой командой проблема? Я надеюсь, что с ЖдемГенерала, ведь он же один. Проблема с одним генералом на острове или в прикле? Попробую вечером посмотреть на тестовом... Не знаю, стоит ли серьёзно рассматривать такой случай - отладки бота для игрока с единственным наличным генералом.