Author Topic: v4.10 Бесконечное выполнение подпрограммы без видимых причин; настройки выставил  (Read 2873 times)

0 Members and 1 Guest are viewing this topic.

Soluum

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
В общем, такая история.

Захотел я сделать простенький кликер для прохождения данжа и написал:
Code: [Select]
$battle = 0

while ($battle<19) // проходим все 19-ть волн
inc($battle,1)
Начать()
Сражение()
Награда()
end_cyc

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

Посмотрел я на это дело - ну думаю, хорошо, работает исправно, битву за битвой проходит только так.

Захотелось мне немножко расширить функционал - сделать так, чтобы каждые 19-ть волн скрипт сбрасывал данж и лечил мою группу.
И то и другое - по одному простому клику в определённое место на экране.
Вот, добавил:

Code: [Select]
sub (Сброс)
   
   waitms(rnd(2000,2500)) // собсно, лечимся
   lclick(rnd(765,840), rnd(300,312))
   waitms(rnd(2000,2500))
   
   Награда() // иногда при лечении могут дать какие-то говно-плюшки, их можно обработать этой же функцией
   
   lclick(rnd(765,840), rnd(430,444)) // сбрасываем данж
   waitms(rnd(2000,2500))
   
end_sub

//глобальный алгоритм:

logwrite("one more")
$battle = 0

while ($battle<19)
inc($battle,1)
Начать()
Сражение()
Награда()
end_cyc
Сброс()

И тут началось самое интересное.
Когда я запускаю скрипт хоть на бесконечное выполнение, хоть на единичный проход, у меня один раз спамит в лог-лист сообщением "one more", один раз проходится 19-ть волн данжа, а затем бесконечно выполняется подпрограмма Сброс().

Прошу помочь мне разобраться, в чём тут дело о_0
Архив в приложении, версия 4.10.
« Last Edit: October 06, 2014, 12:04:56 AM by Soluum »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Версия кликера последняя? 4.10.003

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

Code: (clickermann) [Select]
// New Script
// Author: Anonymous
// Version: 1.0 (05.10.2014)

#name "New Script"
// Автоклики при пошаговом сражении.
// Враги не двигаются, расположены всегда на неизменных трёх местах, необходимо только находить живых (и самых опасных) на экране, а затем рядом кликов фокусировать на них "огонь" своих подопечных.
// Картинки живых и мёртвых противников различны.
// Есть внутриигровая кнопка "атаковать всеми силами первого попавшегося", что полезно когда сильных противников на экране больше нет.

$start = 0
$win = 0
$reward = 0

// в первую очередь на поле боя нужно валить джокеров, для этого и данная функция
// находим джокера по картинке и несколькими кликами приказываем всем своим атаковать его
// всего у нас три бойца, поэтому и блока команд три
sub (Джокер_фокус)
   LOGWRITE ("Джокер_фокус")
   
end_sub

// когда приходит пора сражаться с боссами (10-я волна), необходимо жахнуть самыми мощными заклинаниями
// напоминаю, что наших бойцов трое
sub (Босс)
   LOGWRITE ("Босс")
   
end_sub

// в начале 9-ой волны (как раз перед боссами) стоит подлечиться, это сильно повышает вероятность выживания команды.
sub (Лечение)
   LOGWRITE ("Лечение")
   
end_sub

// перед очередным сражением мы находимся в данже, нужно нажать на кнопку "следующая битва"
// во-первых, я смотрю на вкладку фаерфокса, дабы убедиться что страница полностью загрузилась и нажимаю на кнопку "следующая битва"
// во-вторых, по одному характерному пикселю я начинаю проверять, вошли ли мы в битву
// если да, то меняем флажок и выходим из цикла
sub(Начать)
   while ($start = 0)
      LOGWRITE ("Начать start")
      $start = 1
     
   end_cyc
end_sub

// у-у-у-у
// сначала мы смотрим, какая это волна
// если 9-я, перед боссами, то один ход тратим на лечение
// если это 10-я волна, то дважды ультуем
sub(Сражение)
   LOGWRITE ("Сражение")
   if ($battle=9)
      Лечение()
      LOGWRITE ("battle=9")
   end_if
   
   if ($battle=10)
      LOGWRITE ("battle=10")
      Босс()
     
     
      Босс()
     
     
   end_if
   
   // а вот и наш код по "обычному" закликиванию простых врагов (или ослабленных боссов)
   // у нас может быть какая угодно волна (9-я и 10-я тоже) - после лечения/магии мы продолжаем лупить до победного
   
   // вы видите два условия с Execute1.bmp и Execute2.bmp, так?
   // кнопка "ударить" может иметь два разных вида, отсюда вложенный условный оператор, чтобы учесть оба значения
   
   // сначала мы убеждаемся, что кнопка "ударить" имеет один из двух нужных видов (а это значит, что предыдущий удар дошёл до сервера и можно делать новый)
   // затем вызываем функцию поиска/выставления атак на джокера
   // затем просто жмём "исполнить"
   // если мы ранее выставляли атаки, то ударим по джокеру
   // если нет - игра сама найдёт цели для атаки
   // люблю её за это!
   
   while ($win = 0)
      LOGWRITE ("win=0")
      Джокер_фокус()
     
     
      $win = 1
     
   end_cyc
end_sub

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

sub(Награда)
   LOGWRITE ("Награда")
   while ($reward = 0)
      LOGWRITE ("reward=0")
      $reward = 1 // прерываем цикл сбора награды
      $start = 0 // разрешаем начать работу циклов по заходу в сражения
      $win = 0 // и по самим сражениям
     
   end_cyc
   
   $reward = 0 // снова тут же разрешаем работу цикла наград, всё равно мы сейчас выйдем из функции
end_sub

// --------------------------------------------------------
// ---------- вот это место почему-то глючит --------------
// --------------------------------------------------------
// когда мы проходим 9-ть волн мобов, одну волну боссов и ещё 9-ть волн усиленных мобов, нам нужно просто нажать с интервалом на две кнопки - подлечиться и резетнуть данж, чтобы начать новый забег

sub (Сброс)
   LOGWRITE ("Сброс")
   
   Награда() // иногда при лечении могут дать какие-то говно-плюшки, их можно обработать этой же функцией
   
   
end_sub

//глобальный алгоритм:

logwrite("one more")
$battle = 0

while ($battle<19) // так мы проходим все 19-ть волн, да
   inc($battle,1)
   Начать()
   Сражение()
   Награда()
end_cyc
Сброс()
LOGWRITE ("Конец")
// короче фишка вот в чём
// посмотрите на "глобальный алгоритм"
// именно он проходится раз за разом парсером, именно отсюда вызываются все подпрограммы, вся херня
// я предполагаю, что при зацикленном повторении скрипта он раз за разом должен спамить в лог "one more"
// он раз за разом должен проходить все стадии зачистки данжа и лечения/резета после полного прохождения

// он не хочет

// он один раз пишет в лог "one more"
// один раз чистит данж
// и затем бесконечно повторяет лечение/резет, лечение/резет (т.е. функцию Сброс())
// в сбросе нет никаких циклов, там несколько простых команд
// эти команды должны выполниться один раз и всё, мы уходим из функции
// ЧОМУ ВСЁ НЕ ТАК, ГДЕ Я ЗАЛАЖАЛ??
HALT
« Last Edit: October 06, 2014, 01:22:15 AM by Oraven »

Soluum

  • Зашел в гости
  • *
  • Posts: 4
    • View Profile
Вы ещё halt в конце добавили, да?
Спасибо, повтыкаю.

Да, версия .003, вчера утром скачал с сайта  :)