Author Topic: Проверка вылета игры  (Read 3529 times)

0 Members and 1 Guest are viewing this topic.

novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Проверка вылета игры
« on: April 19, 2016, 12:31:54 PM »
Здравствуйте!
Прошу помощи. Игра через эмулятор андроид с несколькими аккаунтами, в которые нужно по очереди зайти и выполнить определенные действия. С этим проблем нет. Проблема в том, что эмулятор работает не всегда стабильно и вылетает, при этом выбрасывая сообщение. Я так понимаю, что можно отслеживать вылет с помощью отдельного потока. Задача в том, чтобы снова запустить эмулятор и игру и вернуться в тот момент когда был вылет. В этом вся проблема - как показать отдельному потоку, который перезапустит игру, где начнет работать основной поток.
Примерный код.
Code: (clickermann) [Select]
THREAD(proverka,1)  // Запускаем поток, который будет отлавливать вылет из игры
   $check=0
   WHILE($check=0)
      $h=WINDFIND("error")
      IF($h>0)
         $check=1
         LCLICK($x,$y)   // Закрываем окно с ошибкой
         reboot()   //  Подпрограмма, в которой нужно перезапустить игру и вернуть до момента вылета
      ELSE
         WAIT(5)
      END_IF
   END_CYC
END_THREAD

start_emul()   // Запуск эмулятора

vhod(1)    // Вход в аккаунт 1
igra()        // Игровой процесс
exit()        // Выход из аккаунта

.........

vhod(15)  // Вход в аккаунт 15
igra()        // Игровой процесс
exit()        // Выход из аккаунта

HALT(1)

В общем вопрос в том, как показать кликеру, где вылетела игра.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Проверка вылета игры
« Reply #1 on: April 19, 2016, 01:29:09 PM »
Наоборот, код твоего скрипта нужно заключить в поток, тогда его можно ставить на паузу и продолжать с места остановки.
В версии 4.12 появилась возможность перезапускать потоки в 4.11 можно только ставить на паузу

Code: (clickermann) [Select]
THREAD(osnova,1)  // поток основного кода
   // Подпрограммы нужно описывать в самом потоке! За границы потока вызов не пойдет!
   
   start_emul()   // Запуск эмулятора
   
   vhod(1)    // Вход в аккаунт 1
   igra()        // Игровой процесс
   exit()        // Выход из аккаунта
   
   //   .........
   
   vhod(15)  // Вход в аккаунт 15
   igra()        // Игровой процесс
   exit()        // Выход из аккаунта
END_THREAD

//== Проверка на ошибки ==========================================
IF(WINDFIND("error")>0)
   SETTHREAD (osnova, 0) // ставим поток основной программы на паузу
   WAITMS(500)
   LCLICK($x,$y)   // Закрываем окно с ошибкой
   WAITMS(500)
   
   //  Здесь код перезапуска
   
   SETTHREAD (osnova, 1) // продолжаем выполнение потока
   WAITMS(500)
ELSE
   WAIT(5)
END_IF
//=============================================

novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Проверка вылета игры
« Reply #2 on: April 19, 2016, 01:33:48 PM »
Спасибо за уточнения. А реально как-нибудь узнать, в каком месте в процессе перезапуска остановиться и запустить на исполнение снова основную программу? Просто перезапуска игры мало. Может какую-то метку ставить при вылете и потом на нее ориентироваться?

novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Проверка вылета игры
« Reply #3 on: April 19, 2016, 01:48:03 PM »
Попробую подробнее обьяснить.
Например начинаем процесс входа в аккаунт, но не успеваем зайти и игра вылетает. В этом случае при перезагрузке игра вернется на страницу входа. Это неболбшая проблема.
Второй вариант - в игру зашли, прошли несколько окон, выполняя различные действия, и тут игра вылетает. В этом случае, при перезагрузке, игра окажется в окне начала игрового процесса, минуя страницу входа в аккаунт (т.к. на момент вылета вход уже был выполнен).
Так вот можно ли, как-то зафиксировать точку вылета, чтобы потом при перезагрузке сказать кликеру, в каком месте закончить работу потока ошибки и запустить основной поток.

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Проверка вылета игры
« Reply #4 on: April 19, 2016, 02:01:06 PM »
так поставь задержку между поисками заголовка окна поменьше. тогда и реагировать будет быстрее
Code: (clickermann) [Select]
//== Проверка на ошибки ==========================================
IF(WINDFIND("error")>0)
   SETTHREAD (osnova, 0) // ставим поток основной программы на паузу
   WAITMS(500)
   LCLICK($x,$y)   // Закрываем окно с ошибкой
   WAITMS(500)
 
   //  Здесь код перезапуска
 
   SETTHREAD (osnova, 1) // продолжаем выполнение потока
   WAITMS(500)
ELSE
   WAITMS(30) // каждые 30 мс ищем error
END_IF
//=============================================

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

novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Проверка вылета игры
« Reply #5 on: April 19, 2016, 02:19:14 PM »
Наверное не так обьясняю))) Простите дурака.
Нет проблемы в отлове ошибки. Проблема в коде перезапуска. Например скрипт должен отправить 5 маршей с ресурсами с каждого аккаунта. Для этого запускаем эмулятор (один раз), запускаем игру, входим в аккаунт, переходим в окно с картой, кликаем на точку назначения, выбираем ресурс и его количество, отправляем марш, потом еще марш и т. д. Далее жмем на выход из игры (эмулятор остается запущенным). Запускаем игру и входим в следующий аккаунт и дальше все так же. Так вот, когда эмулятор вылетает, я его перезапускаю, запускаю игру и она загружается до страницы входа (если не успели зайти в аккаунт  до вылета), либо до первой страницы после входа. А например до вылета отправилось 3 марша и кликер ждет отправить еще 2, а ему подсовывают другое окно))
Таким образом, в зависимости от того на каком этапе произошел вылет, мне нужно перезагрузить игру до момента вылета. Сорри, если замучал вас)))
« Last Edit: April 19, 2016, 02:22:56 PM by novhome »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Проверка вылета игры
« Reply #6 on: April 19, 2016, 02:57:15 PM »
Можно заключить каждую стадию в условие. При успешном выполнении увеличиваем переменную и переходим к следующей стадии.
При ошибке потребуется перезапуск потока, нужно использовать 4.12.001b версию
В этом случаи прерванный этап начнется с начала.

Code: (clickermann) [Select]
THREAD(osnova,1)  // поток основного кода
   // Подпрограммы нужно описывать в самом потоке! За границы потока вызов не пойдет!
   IF($stage = 0)
      start_emul()   // Запуск эмулятора
      INC($stage,1)
   END_IF
   
   IF($stage = 1)
      vhod(1)    // Вход в аккаунт 1
      INC($stage,1)
   END_IF
   
   IF($stage = 2)
      igra()        // Игровой процесс
      INC($stage,1)
   END_IF
   
   IF($stage = 3)
      exit()        // Выход из аккаунта
      INC($stage,1)
   END_IF
   //   .........
   
   IF($stage = 4)
      vhod(15)  // Вход в аккаунт 15
      INC($stage,1)
   END_IF
   
   IF($stage = 5)
      igra()        // Игровой процесс
      INC($stage,1)
   END_IF
   
   IF($stage = 6)
      exit()        // Выход из аккаунта
      $stage = 0
   END_IF
END_THREAD

//== Проверка на ошибки ==========================================
IF(WINDFIND("error")>0)
   SETTHREAD (osnova, 2) // останавливаем поток основной программы
   WAITMS(500)
   LCLICK($x,$y)   // Закрываем окно с ошибкой
   WAITMS(500)
   
   //  Здесь код перезапуска
   
   SETTHREAD (osnova, 1) // запускаем  выполнение потока
   WAITMS(500)
ELSE
   WAIT(5)
END_IF
//=============================================

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Проверка вылета игры
« Reply #7 on: April 19, 2016, 02:58:26 PM »
Тут два варианта вижу.
1. Это перед тем что что-то делать, проверить выполнилось это или нет. В примере с авторизацией: перед частью авторизации проверяем авторизованы или нет. Такой подход желательно применять во всех скриптах.
Но это пройдёт не со всеми действиями. Если нельзя определить отправили мы марши или нет, то такой вариант не подойдёт.
2. Ввести подсчёт стадий выполнения всем действиям. Вводим переменную, например $step.
Если она 0 никаких действий с аккаунтом не происходило.
1 - авторизовались
2 - отправили первый марш
3 -  отправили второй марш
....
N - разлогинились
В конце действия, если всё прошло успешно, устанавливать текущее состояния. (можно даже ловить падение не потоком, а просто подпрограммой).


novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Проверка вылета игры
« Reply #8 on: April 19, 2016, 03:05:30 PM »
Спасибо за ответы. Попробую реализовать вводом переменной и подпрограммой.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Проверка вылета игры
« Reply #9 on: April 19, 2016, 03:13:32 PM »
Только это... Циклы мы не проходили? Зачем каждый аккаунт расписан отдельно?
Code: (clickermann) [Select]
THREAD(osnova,1)  // поток основного кода
   DEFINE($max_akk, 15)
   DEFINE($akk, 1)
   IF($akk > $max_akk)
      HALT  // всех прошли
   END_IF
   
   WHILE($stage < 4)
      SWITCH($stage)
      CASE(0)
         start_emul()  // Запуск эмулятора
         INC($stage)
      CASE(1)
         vhod($akk)    // Вход в аккаунт 1
         INC($stage)
      CASE(2)
         igra()        // Игровой процесс
         INC($stage)
      CASE(3)
         exit()        // Выход из аккаунта
         INC($stage)
         INC($akk)     // следующий аккаунт
      END_SWITCH 
   END_CYC
END_THREAD

Запуск эмулятора лучше сделать отдельным условием, со своим флагом. Если упал сбрасывать.
Или проверять запущен ли эмулятор.
« Last Edit: April 19, 2016, 03:16:52 PM by Vint »


novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Проверка вылета игры
« Reply #10 on: April 19, 2016, 03:25:16 PM »
В зависимости от аккаунта различается вид ресурса и количество маршей. Также на некоторых аккаунтах вместо маршей другие действия. Вообще у меня все в подпрограммы запихано. в конечном скрипте записи вида:
Code: (clickermann) [Select]
start_emul() // Запуск эмулятора

// acc01
resource(1,1,5,silver) // Отправляем ресурсы - Логин 1, пароль 1 (берутся из файлов), маршей 5, вид ресурса -silver

//acc02
resource(2,1,3,food) // Отправляем ресурсы - Логин 2, пароль 1 (берутся из файлов), маршей 3, вид ресурса -food
.....

//acc22
sunduk(22,4) // Собираем сундуки - Логин 22, пароль 4 (берутся из файлов)


Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Re: Проверка вылета игры
« Reply #11 on: April 19, 2016, 03:30:12 PM »
Строки нужно заключать в кавычки иначе возможны проблемы
Code: (clickermann) [Select]
resource(1,1,5,"silver")

novhome

  • Освоившийся
  • **
  • Posts: 31
    • View Profile
Re: Проверка вылета игры
« Reply #12 on: April 19, 2016, 03:43:11 PM »
Спасибо за подсказку. В принципе с этим проблем не было, но все равно заменю у себя.