Автокликер Clickermann :: Форум

Основной раздел => Общие вопросы => Topic started by: Луций on September 08, 2014, 09:47:34 PM

Title: помогите мне вылечиться от goto
Post by: Луций on September 08, 2014, 09:47:34 PM
я только недавно обнаружил, что болен, но я еще не силен в скриптописании, и сам себе помочь не могу, вот пример:

Code: (clickermann) [Select]
$n=0
checkmail:
GETSCREEN
if(pxl(201,362)=3355443)
   LCLICK(60,399)  // klik
   move(300,500)
   ldown(300,500)
   WAITMS(RND(100,500))
   move(710,500)
   WAITMS(RND(100,500))
   lup(710,500)
   WAITMS(RND(100,500))
   keydown(#ctrl)
   WAITMS(RND(10,50))
   keypress(#c)
   keyup(#ctrl)
else
   WAIT(1)
   $n=$n+1
   if ($n = 15)
      screenshot
      goto(begin)
   end_if
   goto(checkmail)
end_if

этот скрипт проверяет почтовый ящик, и если проверяется слишком долго (что то пошло не так) - идет в бегин

и еще вопрос - где покурить нормальный мануал по языку? справка кликермана у меня не пашет, на форуме нормального руководства я не нашел

Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 08, 2014, 10:17:36 PM
А где begin: ?? Все пишется проще, с использованием цикла и таймера. Цикл работает 15 секунд и прерывается, но если пиксел найден то время снова добавится, если же нет то цикл через 15 сек прервется, сделается снимок и стоп.

Code: (clickermann) [Select]
$time = $_time_t + 15 // таймер на 15 секунд
WHILE($time > $_time_t)
   GETSCREEN
   if(pxl(201,362)=3355443)
      LCLICK(60,399)  // klik
      move(300,500)
      ldown(300,500)
      WAITMS(RND(100,500))
      move(710,500)
      WAITMS(RND(100,500))
      lup(710,500)
      WAITMS(RND(100,500))
      keydown(#ctrl)
      WAITMS(RND(10,50))
      keypress(#c)
      keyup(#ctrl)
      WAITMS(100)
      $time = $_time_t + 15
   else
      WAITMS(100)
   end_if
END_CYC
GETSCREEN
SCREENSHOTEX(0,0, $_xmax,$_ymax, "Ошибка_", 1) // скриншот в JPG
HALT

Н счет справки СПРАВКА НЕ ОТКРЫВАЕТСЯ (решение проблемы) (http://crapware.aidf.org/forum/index.php?topic=1031.msg4439#msg4439)
Я даже онлайн справку прикрутил и в последней версии в папке присутствует файл "Если не открывается справка.txt"
и вот после этого
справка кликермана у меня не пашет, на форуме нормального руководства я не нашел
ну ну...


Title: Re: помогите мне вылечиться от goto
Post by: Луций on September 08, 2014, 10:41:21 PM
вот эту ссылку бы рядом с "учебными статьями"
Title: Re: помогите мне вылечиться от goto
Post by: Луций on September 09, 2014, 05:22:24 AM
попробовал вставить твой скрипт и долго плевался =)

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

1 если все ок - идем дальше
2 если сайт не загрузился или еще какая фигня - начинаем сначала и сохраняем скрин "фигни"

ваш цикл
1 вечно копирует мыло (1я часть всегда продлевает себя на 15 сек и длится бесконечно)
2 всегда сохраняет скрин с ошибкой

сейчас возьму напильник и доведу до ума
Title: Re: помогите мне вылечиться от goto
Post by: Луций on September 09, 2014, 05:35:56 AM
вот что вышло в итоге:

Code: (clickermann) [Select]
// создаем мыло
$time = $_time_t + 15 // таймер
WHILE($time > $_time_t)
   GETSCREEN
   if(pxl(370,362)=3355443)
      ldown(470,500)
      WAITMS(500)
      lup(861,500)
      WAITMS(50)
      keydown(#ctrl)
      WAITMS(50)
      keypress(#c)
      keyup(#ctrl)
      WAITMS(50)
      $time = $_time_t
   else
    wait(1)
    if($time < $_time_t)
    hintpopup("с мылом облом")
    screenshot
    goto(begin)
   end_if
END_CYC

вместо хальта у меня бегин - другого способа перейти в начало без остановки скрипта я не знаю, научил скрипт общаться со мной и сохранять сообщение на скрине
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 09, 2014, 09:55:21 AM
вот что вышло в итоге:

Code: (clickermann) [Select]
// создаем мыло
$time = $_time_t + 15 // таймер
WHILE($time > $_time_t)
   GETSCREEN
   if(pxl(370,362)=3355443)
      ldown(470,500)
      WAITMS(500)
      lup(861,500)
      WAITMS(50)
      keydown(#ctrl)
      WAITMS(50)
      keypress(#c)
      keyup(#ctrl)
      WAITMS(50)
      $time = $_time_t
   else
    wait(1)
    if($time < $_time_t)
    hintpopup("с мылом облом")
    screenshot
    goto(begin)
   end_if
END_CYC

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

Потерял один END_IF.
И лучше из цикла по GOTO не выпрыгивать.
Code: (clickermann) [Select]
// создаем мыло
$time = $_time_t + 15 // таймер
WHILE($time > $_time_t)
   GETSCREEN
   if(pxl(370,362)=3355443)
      ldown(470,500)
      WAITMS(500)
      lup(861,500)
      WAITMS(50)
      keydown(#ctrl)
      WAITMS(50)
      keypress(#c)
      keyup(#ctrl)
      WAITMS(50)
      $time = 0
   else
      WAITMS(100)
   end_if
END_CYC

IF($time ! 0)
   hintpopup("с мылом облом")
   screenshot
   goto(begin)
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 03:06:25 PM
Я вроде с подпрограммами работать начал, но от гото уйти просто не получается )) Это не возможно наверно )) Иногда надо прервать выполнение подпрограммы и выскочить из нее...
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 10, 2014, 03:25:29 PM
Я вроде с подпрограммами работать начал, но от суба уйти просто не получается )) Это не возможно наверно )) Иногда надо прервать выполнение подпрограммы и выскочить из нее...
а ты думал програмировать это как изложение писать? тут вдохновение нужно как это все красиво закрутить чтобы потом не стыдно было =)
в общем нужно продумать алгоритм работы скрипта, и если нужно сложное взаимодействие выстроить зависимости и использовать флаги состояния.

Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 03:28:48 PM
Ну вдохновения у меня столько, что я сутками у компа сижу "в памперсах"  ;D Но мне понимания вашего языка не хватает )) Вот ты сказал - "флаги состояния", например, и всё - у меня дым пошел от головы...  ;D
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 10, 2014, 03:45:15 PM
Вот тебе пример
у тебя персонаж может перемещаться по локациям и у тебя где то это отображается, и он может забежать в какую нибудь очень неблагоприятную локацию где тебя могут полюбить мобы или другие игроки и ты хочешь чтобы если вдруг это произойдет то перс свалил бы от туда, ты вставляешь проверку текущего положения и если оно не такое какое нужно то перс допустим телепортится или выходит из игры или еще чтото, а в остальных случаях просто игнорит и занимается своими делами, также можно в зависимости от текущего состояния заставлять делать разные вещи, тут одно там другое, гдето еще третье, а в четвертом ничего не делать и ждать.

это как выход из цикла

Code: (clickermann) [Select]
$flag =0
while($flag=0)
lclick(-1,-1) // долбим куда нить

if(pxl(x,y) = $color)
// е мае до кликались чтото совсем хреново стало, больше кликать не будем
$flag=1
end_if
if(pxl(x,y) = $color2)
// оооо чтото накликали, нормуль пошли дальше
$flag=2
end_cyc

switch($flag)

case(1)
//блин вот это не очень хорошо надо бы это поправить
case(2)
//ништяяяк продолжаем в том же духе, только немного перекурим
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 03:58:51 PM
Я глубоко признателен тебе за пример, но из него я смог понять только то, что написано зеленым... )))
Title: Re: помогите мне вылечиться от goto
Post by: Луций on September 10, 2014, 04:03:24 PM
тут челу нужно геймерским языком обьяснить:

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

когда проверка прошла, включается флаг, и он говорит боту - не ищи новых мобов, а сиди и лечись иначе пиздец придет тебе, ну а выглядит это примерно так, как написал аден выше, и само выражение "флаг" в логическом программировании (я ведь правильно термины подбираю) - это вещь не совсем та, о которой думает обычный человек
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 04:25:41 PM
Вот мой пример МОИХ "флагов". Вот это я еще понимаю. Вот если на моем примере вы вставите свои флаги, то возможно я смогу понять эту систему...

Code: (clickermann) [Select]
SUB(dar)
   LOGWRITE ("dar")
   IF($time1 < $_time_t)
      KEYPRESS(189)
      WAITMS(600)
      $time1 = $_time_t + 9
   END_IF
END_SUB


SUB(slepoy boy)
   slepoy boy:
   LOGWRITE ("slepoy boy")
   dar()  // Юзаем тикающюю хилку
   GETSCREEN
   IF_PIXEL_IN(80,64, 80,64, 1930288) // Проверяем минимум ХП перса и если они найдены, то значет перса нужно выводить из слепого боя, в котором он юзает скилы наощупь, так сказать...
      GOTO(1)
   Else // Если ХП перса не проявились, то юзаем минимальные (безоткатные) скилы вслепую.
      BEEP(800,200)
      KEYPRESS(52)
      WAITMS(700)
      KEYPRESS(52)
      WAITMS(700)
      KEYPRESS(52)
      WAITMS(1250)
      GOTO(slepoy boy)
   END_IF
END_SUB

SUB(boy)
   boy:
   LOGWRITE ("boy")
   dar() // Юзаем тикающюю хилку
   GETSCREEN
   IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем моба если он на персе, то юзаем скилы ударов.
      GETSCREEN
      IF_PIXEL_IN(588,847, 588,847, 329753) // Рывок
         KEYPRESS(51)
         WAITMS(850)
      Else
         GETSCREEN
         IF_PIXEL_IN(629,847, 629,847, 738459,6791167)  // Тройной 1
            KEYPRESS(52)
            WAITMS(650)
         Else
            GETSCREEN
            IF_PIXEL_IN(629,847, 629,847, 666529) // Тройной 2
               KEYPRESS(52)
               WAITMS(650)
            Else
               GETSCREEN
               IF_PIXEL_IN(629,847, 629,847, 465195) // Тройной 3
                  KEYPRESS(52)
                  WAITMS(1200)
               END_IF
            END_IF
         END_IF
      END_IF
   Else // Если моба нет, то проверяем минимум ХП у перса. Это нужно для того, что если моб уделает перса настолько, что экран затянет красной пеленой, то кликер ослепнет и не будет видеть не только ХП моба, но и ХП перса и скилы.
      GETSCREEN
      IF_PIXEL_IN(80,64, 80,64, 1930288) // Минимум хп
         GOTO(Time Out) // Если ХП перса найдены, а ХП моба мы до этого не нашли, то значит бой окончен и отправляем перса в Time Out
      Else // Если же и ХП перса не найдено, то это значит, что перс в трудном положении, о чем мы сигнализируем и переводим перса в слепой бой, так сказать...
         BEEP(800,200)
         slepoy boy()
      END_IF
   Else
      GOTO(Time Out)
   END_IF
   GOTO(boy)
END_SUB

1:

GETSCREEN
IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем - не висит ли на персе моб.
   boy()  // Если висит, то отправляем в boy
Else
   WAITMS(100)
END_IF

Time Out:
LOGWRITE ("Time Out")

GETSCREEN
IF_PIXEL_IN(749,645, 749,645, 16449535) // Дроп
   KEYPRESS(70)
   WAITMS(2000)
Else
   GETSCREEN
   COLORMODE(6)
   IF_PICTURE_IN (2,44, 320,96, "хп-мп.bmp", -1, 100)  // Проверяем полное восстановление ХП и МП
      KEYPRESS(69) // Если восстановилось, то берем моба в таргет.
      GETSCREEN
      IF_PIXEL_IN(571,63, 571,63, 4539822) // Если моб в таргете, то отправляем перса в boy
         boy()
      Else
         GOTO(1) // Если моб в таргете не появился, то в Time Out
      END_IF
   Else // Если ХП, или МП не восстановлены (как и сразу после боя), то не теряем время и проверяем наличие бафов.
      GETSCREEN
      COLORMODE(6)
      IF_PICTURE_IN (1,83, 353,163, "второе дыхание.bmp", -1, 100) // Если бафы в норме, то ничего не делаем и ждем дальше восстановления ХП и МП, Предварительно проверив, не сагрился ли на нас какой-нибудь моб (скрипт перейдет на позицию 1)
      Else // Если бафы слетели, то бафаемся.
         KEYDOWN (16)
         WAITMS (50)
         KEYPRESS (189)
         WAITMS (50)
         KEYUP (16)
         WAITMS(1300)
      END_IF
   END_IF
END_IF
WAITMS(100)
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 10, 2014, 05:10:21 PM
Вот мой пример МОИХ "флагов". Вот это я еще понимаю. Вот если на моем примере вы вставите свои флаги, то возможно я смогу понять эту систему...

А я тебе уже показывал на твоём примере http://crapware.aidf.org/forum/index.php?topic=1406.msg6995#msg6995

стр 71, 82, 94-96, 147, 153, 166-169
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 05:20:52 PM
Вот мой пример МОИХ "флагов". Вот это я еще понимаю. Вот если на моем примере вы вставите свои флаги, то возможно я смогу понять эту систему...

А я тебе уже показывал на твоём примере http://crapware.aidf.org/forum/index.php?topic=1406.msg6995#msg6995

стр 71, 82, 94-96, 147, 153, 166-169
Ты прости, но я там вот этих команд - "boy = 1", "slepoy_boy = 1", "WHILE(boy = 1)", "WHILE(slepoy_boy = 1)" - вообще не понял... И к тому же я не понял, какое отношение эти команды относятся к вопросу, который мы обсуждаем СЕЙЧАС...
Вы простите меня, ребят. С одной стороны очень хочется все это понять, но с другой и вас тут раздражать не охота своей деревянностью...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 05:30:39 PM
Вот мой пример МОИХ "флагов". Вот это я еще понимаю. Вот если на моем примере вы вставите свои флаги, то возможно я смогу понять эту систему...

А я тебе уже показывал на твоём примере http://crapware.aidf.org/forum/index.php?topic=1406.msg6995#msg6995

стр 71, 82, 94-96, 147, 153, 166-169
Ты прости, но я там вот этих команд - "boy = 1", "slepoy_boy = 1", "WHILE(boy = 1)", "WHILE(slepoy_boy = 1)" - вообще не понял... И к тому же я не понял, какое отношение эти команды относятся к вопросу, который мы обсуждаем СЕЙЧАС...
Вы простите меня, ребят. С одной стороны очень хочется все это понять, но с другой и вас тут раздражать не охота своей деревянностью...
Мы тут "флаг" обсуждаем и, на сколько я понял, это эта команда - "inc($flag)"? Какое отношение те твои правки к ней имеют отношение? Только пойми меня правильно - это не предъявы. Я просто понять пытаюсь...
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 05:48:29 PM
Ну вот так не будет выпрыгивание из подпрограммы. В самой подпрограмме происходит присваивание значения переменной и прыжок в конец. После подпрограммы идут условия и если они сработают то выполнение прыгнет на одну из меток.
Code: (clickermann) [Select]
SUB(dar)
   LOGWRITE ("dar")
   IF($time1 < $_time_t)
      KEYPRESS(189)
      WAITMS(600)
      $time1 = $_time_t + 9
   END_IF
END_SUB

SUB(boy)
   boy:
   LOGWRITE ("boy")
   dar() // Юзаем тикающюю хилку
   GETSCREEN
   IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем моба если он на персе, то юзаем скилы ударов.
      IF_PIXEL_IN(588,847, 588,847, 329753) // Рывок
         KEYPRESS(51)
         WAITMS(850)
      Else
         IF_PIXEL_IN(629,847, 629,847, 738459,6791167)  // Тройной 1
            KEYPRESS(52)
            WAITMS(650)
         Else
            IF_PIXEL_IN(629,847, 629,847, 666529) // Тройной 2
               KEYPRESS(52)
               WAITMS(650)
            Else
               IF_PIXEL_IN(629,847, 629,847, 465195) // Тройной 3
                  KEYPRESS(52)
                  WAITMS(1200)
               END_IF
            END_IF
         END_IF
      END_IF
   Else // Если моба нет, то проверяем минимум ХП у перса. Это нужно для того, что если моб уделает перса настолько, что экран затянет красной пеленой, то кликер ослепнет и не будет видеть не только ХП моба, но и ХП перса и скилы.
      IF_PIXEL_IN(80,64, 80,64, 1930288) // Минимум хп
         // Если ХП перса найдены, а ХП моба мы до этого не нашли, то значит бой окончен и отправляем перса в Time Out
         $Time_Out = 1
         GOTO(end boy)
      Else // Если же и ХП перса не найдено, то это значит, что перс в трудном положении, о чем мы сигнализируем и переводим перса в слепой бой, так сказать...
         BEEP(800,200)
         slepoy boy:
         LOGWRITE ("slepoy boy")
         dar()  // Юзаем тикающюю хилку
         GETSCREEN
         IF_PIXEL_IN(80,64, 80,64, 1930288) // Проверяем минимум ХП перса и если они найдены, то значет перса нужно выводить из слепого боя, в котором он юзает скилы наощупь, так сказать...
            $begin = 1
            GOTO(end boy)
         Else // Если ХП перса не проявились, то юзаем минимальные (безоткатные) скилы вслепую.
            BEEP(800,200)
            KEYPRESS(#4)
            WAITMS(700)
            KEYPRESS(52)
            WAITMS(700)
            KEYPRESS(#4)
            WAITMS(1250)
            GOTO(slepoy boy)
         END_IF
      END_IF
   Else
      $Time_Out = 1
      GOTO(end boy)
   END_IF
   GOTO(boy)
   end boy:
END_SUB

1:
$begin = 0
$Time_Out = 0

GETSCREEN
IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем - не висит ли на персе моб.
   boy()  // Если висит, то отправляем в boy
   IF($begin = 1)
      $begin = 0
      GOTO(1)
   END_IF
   IF($Time_Out = 1)
      $Time_Out = 0
      GOTO(Time Out)
   END_IF
Else
   WAITMS(100)
END_IF

Time Out:
LOGWRITE ("Time Out")

GETSCREEN
IF_PIXEL_IN(749,645, 749,645, 16449535) // Дроп
   KEYPRESS(#F)
   WAITMS(2000)
Else
   COLORMODE(6)
   IF_PICTURE_IN (2,44, 320,96, "хп-мп.bmp", -1, 100)  // Проверяем полное восстановление ХП и МП
      KEYPRESS(#E) // Если восстановилось, то берем моба в таргет.
      WAITMS(100)
      GETSCREEN
      IF_PIXEL_IN(571,63, 571,63, 4539822) // Если моб в таргете, то отправляем перса в boy
         boy()
         IF($begin = 1)
            $begin = 0
            GOTO(1)
         END_IF
         IF($Time_Out = 1)
            $Time_Out = 0
            GOTO(Time Out)
         END_IF
      Else
         GOTO(1) // Если моб в таргете не появился, то в Time Out
      END_IF
   Else // Если ХП, или МП не восстановлены (как и сразу после боя), то не теряем время и проверяем наличие бафов.
      IF_PICTURE_IN (1,83, 353,163, "второе дыхание.bmp", -1, 100) // Если бафы в норме, то ничего не делаем и ждем дальше восстановления ХП и МП, Предварительно проверив, не сагрился ли на нас какой-нибудь моб (скрипт перейдет на позицию 1)
      Else // Если бафы слетели, то бафаемся.
         KEYDOWN (#SHIFT)
         WAITMS (50)
         KEYPRESS (189)
         WAITMS (50)
         KEYUP (#SHIFT)
         WAITMS(1300)
      END_IF
   END_IF
END_IF
WAITMS(100)

Создавать подпрограмму оправдано если код будет вызываться хотя бы два раза за проход скрипта.
Писать GETSCREEN к каждому анализу конечно не ошибка, но оптимально если нет задержек между анализами то GETSCREEN не пишут, это снижает нагрузку на проц.

Пример:
Code: (clickermann) [Select]
GETSCREEN // снимок делается один раз
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255)
   LCLICK($_return1, $_return2)
   WAITMS(100)
ELSE
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 15423488)
      LCLICK($_return1, $_return2)
      WAITMS(100)
   Else
      IF_PIXEL_IN(0,0, $_xmax,$_ymax, 16777215)
         LCLICK($_return1, $_return2)
         WAITMS(100)
      END_IF
   END_IF
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 05:53:01 PM
Ну вот так не будет выпрыгивание из подпрограммы. В самой подпрограмме происходит присваивание значения переменной и прыжок в конец. После подпрограммы идут условия и если они сработают то выполнение прыгнет на одну из меток.
Code: (clickermann) [Select]
SUB(dar)
   LOGWRITE ("dar")
   IF($time1 < $_time_t)
      KEYPRESS(189)
      WAITMS(600)
      $time1 = $_time_t + 9
   END_IF
END_SUB

SUB(boy)
   boy:
   LOGWRITE ("boy")
   dar() // Юзаем тикающюю хилку
   GETSCREEN
   IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем моба если он на персе, то юзаем скилы ударов.
      IF_PIXEL_IN(588,847, 588,847, 329753) // Рывок
         KEYPRESS(51)
         WAITMS(850)
      Else
         IF_PIXEL_IN(629,847, 629,847, 738459,6791167)  // Тройной 1
            KEYPRESS(52)
            WAITMS(650)
         Else
            IF_PIXEL_IN(629,847, 629,847, 666529) // Тройной 2
               KEYPRESS(52)
               WAITMS(650)
            Else
               IF_PIXEL_IN(629,847, 629,847, 465195) // Тройной 3
                  KEYPRESS(52)
                  WAITMS(1200)
               END_IF
            END_IF
         END_IF
      END_IF
   Else // Если моба нет, то проверяем минимум ХП у перса. Это нужно для того, что если моб уделает перса настолько, что экран затянет красной пеленой, то кликер ослепнет и не будет видеть не только ХП моба, но и ХП перса и скилы.
      IF_PIXEL_IN(80,64, 80,64, 1930288) // Минимум хп
         // Если ХП перса найдены, а ХП моба мы до этого не нашли, то значит бой окончен и отправляем перса в Time Out
         $Time_Out = 1
         GOTO(end boy)
      Else // Если же и ХП перса не найдено, то это значит, что перс в трудном положении, о чем мы сигнализируем и переводим перса в слепой бой, так сказать...
         BEEP(800,200)
         slepoy boy:
         LOGWRITE ("slepoy boy")
         dar()  // Юзаем тикающюю хилку
         GETSCREEN
         IF_PIXEL_IN(80,64, 80,64, 1930288) // Проверяем минимум ХП перса и если они найдены, то значет перса нужно выводить из слепого боя, в котором он юзает скилы наощупь, так сказать...
            $begin = 1
            GOTO(end boy)
         Else // Если ХП перса не проявились, то юзаем минимальные (безоткатные) скилы вслепую.
            BEEP(800,200)
            KEYPRESS(#4)
            WAITMS(700)
            KEYPRESS(52)
            WAITMS(700)
            KEYPRESS(#4)
            WAITMS(1250)
            GOTO(slepoy boy)
         END_IF
      END_IF
   Else
      $Time_Out = 1
      GOTO(end boy)
   END_IF
   GOTO(boy)
   end boy:
END_SUB

1:
$begin = 0
$Time_Out = 0

GETSCREEN
IF_PIXEL_IN(571,63, 571,63, 4539822) // Проверяем - не висит ли на персе моб.
   boy()  // Если висит, то отправляем в boy
   IF($begin = 1)
      $begin = 0
      GOTO(1)
   END_IF
   IF($Time_Out = 1)
      $Time_Out = 0
      GOTO(Time Out)
   END_IF
Else
   WAITMS(100)
END_IF

Time Out:
LOGWRITE ("Time Out")

GETSCREEN
IF_PIXEL_IN(749,645, 749,645, 16449535) // Дроп
   KEYPRESS(#F)
   WAITMS(2000)
Else
   COLORMODE(6)
   IF_PICTURE_IN (2,44, 320,96, "хп-мп.bmp", -1, 100)  // Проверяем полное восстановление ХП и МП
      KEYPRESS(#E) // Если восстановилось, то берем моба в таргет.
      WAITMS(100)
      GETSCREEN
      IF_PIXEL_IN(571,63, 571,63, 4539822) // Если моб в таргете, то отправляем перса в boy
         boy()
         IF($begin = 1)
            $begin = 0
            GOTO(1)
         END_IF
         IF($Time_Out = 1)
            $Time_Out = 0
            GOTO(Time Out)
         END_IF
      Else
         GOTO(1) // Если моб в таргете не появился, то в Time Out
      END_IF
   Else // Если ХП, или МП не восстановлены (как и сразу после боя), то не теряем время и проверяем наличие бафов.
      IF_PICTURE_IN (1,83, 353,163, "второе дыхание.bmp", -1, 100) // Если бафы в норме, то ничего не делаем и ждем дальше восстановления ХП и МП, Предварительно проверив, не сагрился ли на нас какой-нибудь моб (скрипт перейдет на позицию 1)
      Else // Если бафы слетели, то бафаемся.
         KEYDOWN (#SHIFT)
         WAITMS (50)
         KEYPRESS (189)
         WAITMS (50)
         KEYUP (#SHIFT)
         WAITMS(1300)
      END_IF
   END_IF
END_IF
WAITMS(100)
Вот я начал просматривать скрипт и дошел до команды - "$Time_Out = 1" и сразу в голове вопрос - "Эт че такое?..."
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 05:56:54 PM
А вот про GETSCREEN понял - спс. Реально проц аж подпрыгивает, когда я скрипты свои включаю...)))
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 05:57:15 PM
$Time_Out = 1 Переменная переключатель, в подпрограмме $Time_Out присвоится 1 и по гото произойдет переход в конец подпрограммы, далее она завершится и выполнение перейдет на следующую строчку после вызова а там у нас серия условий
Code: (clickermann) [Select]
   boy()  // Если висит, то отправляем в boy
  IF($begin = 1)
     $begin = 0
     GOTO(1)
  END_IF
  IF($Time_Out = 1)
     $Time_Out = 0
     GOTO(Time Out)
  END_IF
И если одно из них сработает выполнение скаканет либо в начало 1: либо к Time Out:
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 05:59:11 PM
Таким образом ты обойдешь "неправильное" выпрыгивание из подпрограммы.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:00:29 PM
Что занчит - "$Time_Out присвоится 1"?
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:05:30 PM
Ппц. У меня голова в дыму... Что значит - "$Time_Out = 0"? Что за команда вообще - "$begin = 0"?... Мне надо остыть чуток. Я на перекур...
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 10, 2014, 06:15:06 PM
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:16:03 PM
$Time_Out = 1 Переменная переключатель, в подпрограмме $Time_Out присвоится 1 и по гото произойдет переход в конец подпрограммы, далее она завершится и выполнение перейдет на следующую строчку после вызова а там у нас серия условий
Code: (clickermann) [Select]
   boy()  // Если висит, то отправляем в boy
  IF($begin = 1)
     $begin = 0
     GOTO(1)
  END_IF
  IF($Time_Out = 1)
     $Time_Out = 0
     GOTO(Time Out)
  END_IF
И если одно из них сработает выполнение скаканет либо в начало 1: либо к Time Out:

Над этими командами я даже задумываться боюсь...)
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 06:17:09 PM
Ой ну ты даешь  :D Это переменная, ячейка памяти хранящая какую то информацию. Я написал две переменные чтобы сообщить условиям после отработки подпрограммы с каким результатом она закончилась, и что надо делать по условию дальше, прыгнуть или пойти дальше по выполнению.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:18:18 PM
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )
У меня слов нет... Откуда столько терпения... Сейчас попробую понять. Но даже если не пойму - БОЛЬШОЕ спс за попытку!...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:20:57 PM
Ой ну ты даешь  :D Это переменная, ячейка памяти хранящая какую то информацию. Я написал две переменные чтобы сообщить условиям после отработки подпрограммы с каким результатом она закончилась, и что надо делать по условию дальше, прыгнуть или пойти дальше по выполнению.
Прости... То ли я перегрелся, то ли я в натуре такой деревянный... Я сейчас даже вот этого сообщения не понял. Просто буквы знакомые увидел. Наверно на сегодня нужно сделать паузу...
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 06:24:34 PM
Да ты на имя то не смотри, переменную можно как хочешь обозвать, главное английскими буквами и без пробелов. Обычно им пишут осмысленные названия чтоб не запутаться и знать что она делает.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:25:04 PM
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )

Открыл картинку... Сразу температура подскочила до предела от слов:

Инициализация:
- установка параметров по умолчанию
- выбор изменяемых парамеиров

На остальных картинках хоть слова знакомые... Изучаю дальше...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:26:17 PM
Да ты на имя то не смотри, переменную можно как хочешь обозвать, главное английскими буквами и без пробелов. Обычно им пишут осмысленные названия чтоб не запутаться и знать что она делает.
Сорри - пока ничего не отвечу...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:29:36 PM
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )

Открыл картинку... Сразу температура подскочила до предела от слов:

Инициализация:
- установка параметров по умолчанию
- выбор изменяемых парамеиров

На остальных картинках хоть слова знакомые... Изучаю дальше...

Далее дошел до - "проверяем флаг маны" и всё... Пошел опять курить... Хотя по состоянию за пузырем бежать давно пора... Что за флаг манны...? Как мы его проверяем...? Можете не отвечать уже наверно - это мысли в слух...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:38:09 PM
вот блин я тебе даже нарисовал если так не поймешь то это трындец хотя может мои художества будут не понятны )

Открыл картинку... Сразу температура подскочила до предела от слов:

Инициализация:
- установка параметров по умолчанию
- выбор изменяемых парамеиров

На остальных картинках хоть слова знакомые... Изучаю дальше...

Далее дошел до - "проверяем флаг маны" и всё... Пошел опять курить... Хотя по состоянию за пузырем бежать давно пора... Что за флаг манны...? Как мы его проверяем...? Можете не отвечать уже наверно - это мысли в слух...

А каим образом мы увеличиваем счетчик убитых мобов и где это отобразится?
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:42:32 PM
И еще вот вопрос, ребят... Почему выпрыгивать из подпрограммы по GOTO плохо, если кликер это умеет?
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 06:48:16 PM
.... Понимаю - устали от меня...) Ладно - пойду в игру, займусь пока скриптами так, как я пока понимаю )) Всем большая благодарность за внимание и терпение ))
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 07:09:58 PM
И еще вот вопрос, ребят... Почему выпрыгивать из подпрограммы по GOTO плохо, если кликер это умеет?

Раньше в справке было написано что выпрыгивание приведет к ошибке.

Запустим вот такой скрипт, после выполнения подпрограммы переменные $par1, $par2 обнуляются, но если выпрыгнуть из подпрограммы этого не произойдет.

Code: (clickermann) [Select]
SUB(имя, $par1, $par2) // подпрограмма с параметрами   
   LOGWRITE ("Переменная 1: ",$par1, " Переменная 2: ",$par2)
   GOTO(skip)   
END_SUB

имя(1,2) // вызов и передача параметров

skip:
LOGWRITE ("Переменная 1: ",$par1, " Переменная 2: ",$par2)

HALT

Что там еще "не так" завершится знает только разработчик кликера
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 10, 2014, 07:14:17 PM
И еще вот вопрос, ребят... Почему выпрыгивать из подпрограммы по GOTO плохо, если кликер это умеет?

Раньше в справке было написано что выпрыгивание приведет к ошибке.

Запустим вот такой скрипт, после выполнения подпрограммы переменные $par1, $par2 обнуляются, но если выпрыгнуть из подпрограммы этого не произойдет.

Code: (clickermann) [Select]
SUB(имя, $par1, $par2) // подпрограмма с параметрами   
   LOGWRITE ("Переменная 1: ",$par1, " Переменная 2: ",$par2)
   GOTO(skip)   
END_SUB

имя(1,2) // вызов и передача параметров

skip:
LOGWRITE ("Переменная 1: ",$par1, " Переменная 2: ",$par2)

HALT

Что там еще "не так" завершится знает только разработчик кликера
ААаа... То есть - если переменных в подпрограмме нет, то можно прыгать? ))
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 10, 2014, 07:47:24 PM
Кароче считай это нарушением но не критическим. Действительно сильно недостает команды перезапуска скрипта.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 01:40:10 PM
$Time_Out = 1 Переменная переключатель, в подпрограмме $Time_Out присвоится 1 и по гото произойдет переход в конец подпрограммы, далее она завершится и выполнение перейдет на следующую строчку после вызова а там у нас серия условий
Code: (clickermann) [Select]
   boy()  // Если висит, то отправляем в boy
  IF($begin = 1)
     $begin = 0
     GOTO(1)
  END_IF
  IF($Time_Out = 1)
     $Time_Out = 0
     GOTO(Time Out)
  END_IF
И если одно из них сработает выполнение скаканет либо в начало 1: либо к Time Out:
Так... Хотел бы сказать - "И тут я... Якобы из последних сил..." Но силы у меня новые и я опять пришел вас мучить ))
То есть команда -  $Time_Out = 0 проверяет, как сработает условие после метки Time Out: ? И если в условии положительный результат, то в этой штуке "$Time_Out = 1" будет цифра 1. А если условие не найдет нужный пиксель по своей первичной команде внутри своего условия, то это "$Time_Out = 0"? Я правильно понял?
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 01:49:22 PM
$Time_Out = 1 Переменная переключатель, в подпрограмме $Time_Out присвоится 1 и по гото произойдет переход в конец подпрограммы, далее она завершится и выполнение перейдет на следующую строчку после вызова а там у нас серия условий
Code: (clickermann) [Select]
   boy()  // Если висит, то отправляем в boy
  IF($begin = 1)
     $begin = 0
     GOTO(1)
  END_IF
  IF($Time_Out = 1)
     $Time_Out = 0
     GOTO(Time Out)
  END_IF
И если одно из них сработает выполнение скаканет либо в начало 1: либо к Time Out:
Так... Хотел бы сказать - "И тут я... Якобы из последних сил..." Но силы у меня новые и я опять пришел вас мучить ))
То есть команда -  $Time_Out = 0 проверяет, как сработает условие после метки Time Out: ? И если в условии положительный результат, то в этой штуке "$Time_Out = 1" будет цифра 1. А если условие не найдет нужный пиксель по своей первичной команде внутри своего условия, то это "$Time_Out = 0"? Я правильно понял?
Если никто не ответит, я не обижусь. Приму это за - $Pravilniy_otvet = 0,  и буду думать дальше...
Title: Re: помогите мне вылечиться от goto
Post by: Oraven on September 11, 2014, 02:07:29 PM
Да это те самые "флаги"  :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 02:11:04 PM
Ё-маё! Вот например:

Code: (clickermann) [Select]
SUB(MYSUB)
   MYSUB:
   GETSCREEN
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Если найдено, то идем на 1:
      $1 = 1
   Else // Если не найдено, то зацикливаем подпрограмму
      GOTO(MYSUB)
   END_IF
END_SUB


1:

GETSCREEN
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 366) // Если найдено, то ничего не делаем
   WAITMS(100)
Else
   MYSUB() // Если не найдено, то идем в (MYSUB)
END_IF

Правильно?
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 11, 2014, 02:52:21 PM

Вот ты заморочился.
Вот тебе пример флагов "на пальцах" в терминах скрипта:
Code: (clickermann) [Select]
SUB(бухаем)
   $падения = 0  // это и есть флаг, пока ставим 0 значит не падали
   
   //празднуем
   WHILE($ВРЕМЯ < ПОЗДНО)  //   <<<<<<<<<---------------------------------------!
      // гуляем                                                                 !
      // пьём                                                                   !
      // жрём                                                                   !
      // танцуем                                                                !
      IF(упали?)                                                                !
         $падения = 1    // включаем флаг, раз упали                            !
         $ВРЕМЯ = 999999 // если упали, плевать на время, валим домой досрочно  !
      END_IF                                                                    !
   END_CYC                 // цикл пьянки, ещё по маленькой >>>>>>--------------!
END_SUB



// начало
//сегодня праздник?
бухаем()  // идём бухать
// пришли, поспали, ничерта не помним

// проверяем падали во время пьянки или вернулись потому что было поздно уже?
IF($падения = 1) 
   // ПАдали
GOTO(идём заклеивать синяки)
ELSE
   // Всё нормуль, завтра опять пойдём
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 03:01:42 PM
Ой зря ты $ВРЕМЯ = 999999 вставил... Я че-то не понял этой команды...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 03:07:19 PM
Ребят, я живу по минимуму (по финансам), но всех, кто мне в этой теме уделил внимание и пытался помочь, я хотел бы отблагодарить (уж как могу...). У меня на следующей неделе будет пятихатка. Вы мне в приват киньте пожалуйста свои реквизиты - я вам по соточке пришлю. Это от души. Всем большая благодарность за терпение. Уф... Не совсем всё понял, но остальное я уже сам догоню  :)
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 11, 2014, 03:11:49 PM
Ой зря ты $ВРЕМЯ = 999999 вставил... Я че-то не понял этой команды...
это как писали:
Алкоголь полностью выводится из организма за 20 дней. То есть никогда  :) :D ;D

$ВРЕМЯ делаем любое заведомо больше текущего, чтобы на следующем круге условие в WHILE не выполнилось и мы свалили оттуда нафиг. Типа как дети перевели свои часы вперёд, что бы раньше в цирк пойти.
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 11, 2014, 04:00:01 PM
скинь разрабу джони лучше
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 04:53:22 PM
скинь разрабу джони лучше
Ок. С твоей долей так и сделаю  :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 04:54:14 PM
Ой зря ты $ВРЕМЯ = 999999 вставил... Я че-то не понял этой команды...
это как писали:
Алкоголь полностью выводится из организма за 20 дней. То есть никогда  :) :D ;D

$ВРЕМЯ делаем любое заведомо больше текущего, чтобы на следующем круге условие в WHILE не выполнилось и мы свалили оттуда нафиг. Типа как дети перевели свои часы вперёд, что бы раньше в цирк пойти.

Не продолжай... Хватит пока с меня флагов. А с этим я к тебе позже пристану  :D
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 09:45:21 PM
И снова здрасте...  :) Даже боюсь начинать, но надо...  Ребят, вот в простой подпрограмме я разобрался, а что за подпрограмма с параметрами?

Code: (clickermann) [Select]
SUB(MYSUB, $par1, $par2)
   
END_SUB

Title: Re: помогите мне вылечиться от goto
Post by: aden on September 11, 2014, 10:02:29 PM
Code: (clickermann) [Select]
SUB(хилка, $slot_na_paneli)
switch($slot_na_paneli)
case(1)
lclick(100,150) //хилимся маленькой банкой
case(2)
lclick(150,150) //хилимся средней банкой
case(3)
lclick(200,150) //хилимся большой банкой
END_SUB

//вызываем хил
хилка(1) // слабый хил
хилка(2) // средний хил
хилка(3) // большой хил

Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 10:06:13 PM
Тааак... А это что за команда?
Code: (clickermann) [Select]
switch($slot_na_paneli)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 10:12:33 PM
Тааак... А это что за команда?
Code: (clickermann) [Select]
switch($slot_na_paneli)
Вот эта команда мне вроде яснА оказалась в справке... Эта команда типа разрешает переключатели внутри подпрограммы?
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 10:18:47 PM
А! Понял! Эта команда определяет - какой командой вызвали подпрограмму!
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 10:22:17 PM
Вы, если прочитаете и окажется, что я правильно догадался, то хоть кивните в ответ  :) А то я ведь дальше думать буду... :-\
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 10:36:07 PM
Code: (clickermann) [Select]
SUB(хилка, $slot_na_paneli)
switch($slot_na_paneli)
case(1)
lclick(100,150) //хилимся маленькой банкой
case(2)
lclick(150,150) //хилимся средней банкой
case(3)
lclick(200,150) //хилимся большой банкой
END_SUB

//вызываем хил
хилка(1) // слабый хил
хилка(2) // средний хил
хилка(3) // большой хил


А в этом скрипте никакой ошибки нет?... А то я скопировал его в кликер:

(http://f5.s.qip.ru/1HDgEPjO.png)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 11, 2014, 10:46:52 PM
Нашел я ошибку. Вот так надо вроде:

Code: (clickermann) [Select]
SUB(хилка, $slot_na_paneli)
   switch($slot_na_paneli)
   case(1)
      lclick(100,150)
   case(2)
      lclick(150,150)
   case(3)
      lclick(200,150)
   end_switch  // Вот это надо было добавить.
END_SUB


хилка(1)
хилка(2)
хилка(3)
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 11, 2014, 11:55:19 PM
Нашел я ошибку. Вот так надо вроде:
[spoiler]
Code: (clickermann) [Select]
SUB(хилка, $slot_na_paneli)
   switch($slot_na_paneli)
   case(1)
      lclick(100,150)
   case(2)
      lclick(150,150)
   case(3)
      lclick(200,150)
   end_switch  // Вот это надо было добавить.
END_SUB


хилка(1)
хилка(2)
хилка(3)
[/spoiler]

я всегда в своих подсказках оставляю пищу для размышлений чтобы человек не паразитировал на других, а включал немного свой мозг и развивался.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 12:05:14 AM
Нашел я ошибку. Вот так надо вроде:
[spoiler]
Code: (clickermann) [Select]
SUB(хилка, $slot_na_paneli)
   switch($slot_na_paneli)
   case(1)
      lclick(100,150)
   case(2)
      lclick(150,150)
   case(3)
      lclick(200,150)
   end_switch  // Вот это надо было добавить.
END_SUB


хилка(1)
хилка(2)
хилка(3)
[/spoiler]

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

"Спасибо" за паразита... От души хотел поблагодарить, но так никто свои реквизиты и не прислал...
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 12, 2014, 01:05:30 AM
кстати ошибка там не нарочно получилась я просто между кликером и JAVA мечусь поэтому синтаксис в кликере забываю если не подглядывать в справку, но прогресс на лицо =)
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 12, 2014, 09:04:06 AM
кстати ошибка там не нарочно получилась я просто между кликером и JAVA мечусь поэтому синтаксис в кликере забываю если не подглядывать в справку, но прогресс на лицо =)
а я между питоном...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 12:29:02 PM
Очень не хочется отрывать вас от JAVA и питона, но у меня продолжение проблемы... Я думал, что я понял с флагами всё, но нет...
Вот пример моего макроса для проверки того, что я понял:

Code: (clickermann) [Select]
SUB(MYSUB)
   MYSUB:
   WAITMS(1000)
   GETSCREEN
   IF_PIXEL_IN(933,115, 933,115, 1255211)  // Несуществующий на самом деле пиксель.
   Else
      $1 = 0  // То, как я всё понял, по идее должен был бы сработать высокий сигнал, но каждый раз срабатывает только низкий...
      WAITMS(1000)
      BEEP(300,200) // Низкий сигнал
   END_IF
   GOTO(MYSUB)
END_SUB

MYSUB()

1:

GETSCREEN
IF_PIXEL_IN(1375,23, 1375,23, 10217469)  // Несуществующий на самом деле пиксель.
Else
BEEP(800,200) // Высокий сигнал
   WAITMS(1000)
END_IF

Что я недопонял, ребят...?
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 12, 2014, 12:39:35 PM
а ты видишь переход к 1: ? я не вижу то что ты флаг поставил ты же его нигде не проверяешь ты просто установил флаг и дальше делаешь свои дела зацикливая подпрограмму.
ты путаешь флаги и метки для goto
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 12:44:26 PM
а ты видишь переход к 1: ? я не вижу то что ты флаг поставил ты же его нигде не проверяешь ты просто установил флаг и дальше делаешь свои дела зацикливая подпрограмму.
ты путаешь флаги и метки для goto
А как его проверить?

Вот подскажи, на примере этого скрипта, плиз:

Code: (clickermann) [Select]
SUB(MYSUB)
   MYSUB:
   WAITMS(1000)
   GETSCREEN
   IF_PIXEL_IN(933,115, 933,115, 1255211)
   Else
      $1 = 0  // То, как я всё понял, по идее должен был бы сработать высокий сигнал каждый раз, но он срабатывает лишь 1 раз...
      WAITMS(1000)
      BEEP(300,200) // Низкий сигнал
   END_IF
   GOTO(MYSUB)
END_SUB

1:

GETSCREEN
IF_PIXEL_IN(1375,23, 1375,23, 10217469)
Else
   BEEP(800,200) // Высокий сигнал
   WAITMS(1000)
   MYSUB()
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 12:54:08 PM
Ребят, я понимаю, что мне наверняка это уже показывали в других примерах, но... Простите пожалуйста мне мою невнимательность.  Вот на этом покажите плиз.
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 12, 2014, 01:32:44 PM
посмотри на мой схематичный рисунок  флаг я устанавливаю в начале а потом дальше уже когда мне надо решить что делать в зависимости от флага я его проверяю ifом.

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

если тебе надо сразуже среагировать на изменения то зачем устанавливать флаг если ты сразу можешь использовать конструкцию if{} else{} end_if
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 01:55:55 PM
посмотри на мой схематичный рисунок  флаг я устанавливаю в начале а потом дальше уже когда мне надо решить что делать в зависимости от флага я его проверяю ifом.

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

если тебе надо сразуже среагировать на изменения то зачем устанавливать флаг если ты сразу можешь использовать конструкцию if{} else{} end_if
Нифига не понял... Ты можешь показать на примере этого скрипта?
Code: (clickermann) [Select]
SUB(MYSUB)
   MYSUB:
   WAITMS(1000)
   GETSCREEN
   IF_PIXEL_IN(933,115, 933,115, 1255211)
   Else
      $1 = 0  // То, как я всё понял, по идее должен был бы сработать высокий сигнал каждый раз, но он срабатывает лишь 1 раз...
      WAITMS(1000)
      BEEP(300,200) // Низкий сигнал
   END_IF
   GOTO(MYSUB)
END_SUB

1:

GETSCREEN
IF_PIXEL_IN(1375,23, 1375,23, 10217469)
Else
   BEEP(800,200) // Высокий сигнал
   WAITMS(1000)
   MYSUB()
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 01:58:59 PM
если тебе надо сразуже среагировать на изменения то зачем устанавливать флаг если ты сразу можешь использовать конструкцию if{} else{} end_if
В моем скрипте нет никаких изменений. Там везде (по моей задумке), при замкнутой подпрограмме, должна происходить реакция на то, что нужных пикселей нет, и в подпрграмме, и после метки "1:"
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 02:13:25 PM
Ну или вот, например... http://crapware.aidf.org/forum/index.php?topic=1404.msg7080#msg7080

Code: (clickermann) [Select]
SUB(бухаем)
   $падения = 0
   WHILE($ВРЕМЯ < ПОЗДНО)
      // гуляем
      // пьём
      // жрём
      // танцуем
      IF(упали?)  // И это что такое? Это типа так должно быть? - IF($падения?)
         $падения = 1
         $ВРЕМЯ = 999999
      END_IF
   END_CYC
END_SUB

бухаем()

IF($падения = 1) // Не понимаю этой команды... Что она проверяет? Нет никакого условия, по которому мы проверили бы - падали мы, или нет. Куда поставить IF_PIXEL_IN для проверки?
   GOTO(идём заклеивать синяки)
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: aden on September 12, 2014, 02:18:45 PM
глаза разуй 8 строка, дословно перевожу если упали то падения=1
16 строка, падения =1 значит значит надо синяки лечить если 8 строка не сработала значит можно калдырить дальше

честно задолбал
ты вкури свой код что он у тебя и как делает тебе уже милиард примеров сделали но толку НОЛЬ.
Code: (clickermann) [Select]
SUB(MYSUB)
   MYSUB:
   WAITMS(1000)
   GETSCREEN
   IF_PIXEL_IN(933,115, 933,115, 1255211) // 5) ищет и ненаходит картинку
   Else
      $1 = 0  // нахрена этот флаг если никто его не проверяет
      WAITMS(1000)
      BEEP(300,200) // 6) пищит
   END_IF
   GOTO(MYSUB) // 7) возврат к началу подпрограммы и повтор с пункта 5 !!!!!!! бесконечный цикл!!!!
END_SUB
 
1:// 1)запускается скрипт
 
GETSCREEN
IF_PIXEL_IN(1375,23, 1375,23, 10217469) // 2)ищет картинку
Else
   BEEP(800,200) // Высокий сигнал // 3) не находит и пищит
   WAITMS(1000)
   MYSUB() // 4) вызывается подпрограмма
END_IF

мой последний пост в этой ветке, пациент хронически болен, лечение: изоляция от общества либо игра в шахматы до включения мозга пациента
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 12, 2014, 02:25:22 PM
Немного не успел с ответом, но всетаки выложу.
[spoiler]

Просто добавил комментарии, не меняя скрипта.
Code: (clickermann) [Select]
SUB(MYSUB) // Начало описания подпрограммы "MYSUB"
   MYSUB:
   WAITMS(1000)
   GETSCREEN
   IF_PIXEL_IN(933,115, 933,115, 1255211) // Поиск на экране пикселя с кодом цвета 1255211
      // Если такой пиксель есть, то ничего не делаем
   Else
      $1 = 0 // Переменной $1 присваивается значение 0, которую нигде не используем (если небыло присвоения ранее, то значение итак равно нулю)
      WAITMS(1000)
      BEEP(300,200) // Если такого пикселя нет, то воспроизводим Низкий сигнал
   END_IF
   GOTO(MYSUB) // Переход на метку "MYSUB:" внутри подпрограммы (это зацикливает скрипт и выхода отсюда нет)
END_SUB // Конец описания подпрограммы "MYSUB"

//--------------------------------
// С этого места начинается выполнение сценария (выше было описание подпрограмм)

1: // Метка для перехода инструкцией GOTO (нигде в скрипте перехода на нее нет)

GETSCREEN
IF_PIXEL_IN(1375,23, 1375,23, 10217469) // Поиск на экране пикселя с кодом цвета 10217469
// Если такой пиксель есть, то ничего не делаем
Else
   BEEP(800,200) // Если такого пикселя нет, то воспроизводим Высокий сигнал
   WAITMS(1000)
   MYSUB() // Вызываем подпрограмму "MYSUB", которая будет выполняться бесконечно
END_IF

Получается, что выполнение сценария "болтается" бесконечно между строками скрипта GOTO(MYSUB) и MYSUB: .
Операция присвоения переменной $1 значения 0, это не есть переход на метку 1: . И если это флаг для проверки чего либо, то в этом скрипте проверка нигде увы не происходит.
Я предположил, что это весь скрипт, а не маленький кусок большого скрипта.
[/spoiler]

Думаю надо просто написать правильный скрипт с подробными комментариями.
Всё получится, главное не париться.  :)
P.S. Сегодня же пятница!!! :) :) :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 02:27:37 PM
глаза разуй 8 строка, дословно перевожу если упали то падения=1
16 строка, падения =1 значит значит надо синяки лечить если 8 строка не сработала значит можно калдырить дальше

Code: (clickermann) [Select]
GETSCREEN
IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Упали!
  LCLICK($_return1, $_return2)
  WAITMS(100)
Else //  НЕ упали!
  WAITMS(100)
END_IF

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

Как вычисляется падение на ЭТОМ скрипте???!!!

Code: (clickermann) [Select]
SUB(бухаем)
   $падения = 0
   WHILE($ВРЕМЯ < ПОЗДНО)
      // гуляем
      // пьём
      // жрём
      // танцуем
      IF(упали?)  // И это что такое? Это типа так должно быть? - IF($падения?)
         $падения = 1
         $ВРЕМЯ = 999999
      END_IF
   END_CYC
END_SUB

бухаем()

IF($падения = 1) // Не понимаю этой команды... Что она проверяет? Нет никакого условия, по которому мы проверили бы - падали мы, или нет. Куда поставить IF_PIXEL_IN для проверки?
   GOTO(идём заклеивать синяки)
END_IF

Я не заставляю тебя реагировать на мое непонимание вопроса! Но глаза мои по жизни открыты настолько, что они видели намного больше твоего!
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 02:40:17 PM
Code: (clickermann) [Select]
SUB(бухаем)
   $падения = 0
   WHILE($ВРЕМЯ < ПОЗДНО)
      // гуляем
      // пьём
      // жрём
      // танцуем
      IF(упали?)  // И это что такое? Это типа так должно быть? - IF($падения?)
         $падения = 1
         $ВРЕМЯ = 999999
      END_IF
   END_CYC
END_SUB

бухаем()

IF($падения = 1)
   GETSCREEN
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Падали
      WAITMS(100)
      GOTO(идём заклеивать синяки)
   END_IF
END_IF

Так чтоли...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 03:00:26 PM
 :'(
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 12, 2014, 04:27:28 PM
Не так. Не в последее условие, а на место 8 строки. Это же абстрактный пример.
Можно искать пиксел пола перед носом (как ты хочешь сделать)
Code: (clickermann) [Select]
   GETSCREEN
  IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Падали
...

А можно и у друга спросить
Code: (clickermann) [Select]
IF(упали?)
...

Абстрактные примеры не нужно так подробно пережевывать.

Я кажется понял что ты не понял  :D ;D
вот здесь http://crapware.aidf.org/forum/index.php?topic=1404.msg7031#msg7031
Вот я начал просматривать скрипт и дошел до команды - "$Time_Out = 1" и сразу в голове вопрос - "Эт че такое?..."
$Time_Out = 1 и Time Out:   это разные вещи никак не связанные друг с другом. Перваое - переменная, второе ссылка для GOTO, просто их назвали одинаково чтобы не путаться. Связать логически ты уже должен их сам через условие.

Так же и дальше у тебя http://crapware.aidf.org/forum/index.php?topic=1404.msg7107#msg7107
Code: (clickermann) [Select]
$1 = 0 .....это просто переменная с именем "$1". Никакого отношения к ссылке 1: она не имеет, никуда автоматом не переводит и никак не влияет. И может называться не $1, а хоть $vasya_pupkin

В этом примере    http://crapware.aidf.org/forum/index.php?topic=1404.msg7107#msg7107
показать что такое флаг бессмысленно, флаг нужен там где есть 2 и больше вариантов развития событий, а там у тебя один цикл через GOTO без вариантов.

Ну последний пример
Code: (clickermann) [Select]
SUB(MYSUB)
   IF_PIXEL_IN(933,115, 933,115, 10217469)
      $vasya_pupkin = 1
   Else
      $vasya_pupkin = 0
   END_IF
END_SUB



MYSUB()
IF($vasya_pupkin = 1)
   BEEP(300,200) // Низкий сигнал
Else
   $vasya_pupkin = 0
   BEEP(800,200) // Высокий сигнал
END_IF

если  найдёт цвет 10217469  будет низкий сигнал, иначе - высокий.

Всё, хорошь. Если никак, то забей и жди пока Джонни введёт команды return для саба и break/continue для циклов.

P.S. Если это троллизм, то мне по барабану. Мне не зазорно попасться на троллинг, смущённо чувствовать я себя не буду. В любом случае всегда исхожу из того, что собеседник нормальный.

Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 04:53:33 PM
Не так. Не в последее условие, а на место 8 строки. Это же абстрактный пример.
Можно искать пиксел пола перед носом (как ты хочешь сделать)
Code: (clickermann) [Select]
   GETSCREEN
  IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Падали
...

А можно и у друга спросить
Code: (clickermann) [Select]
IF(упали?)
...

Абстрактные примеры не нужно так подробно пережевывать.

Я кажется понял что ты не понял  :D ;D
вот здесь http://crapware.aidf.org/forum/index.php?topic=1404.msg7031#msg7031
Вот я начал просматривать скрипт и дошел до команды - "$Time_Out = 1" и сразу в голове вопрос - "Эт че такое?..."
$Time_Out = 1 и Time Out:   это разные вещи никак не связанные друг с другом. Перваое - переменная, второе ссылка для GOTO, просто их назвали одинаково чтобы не путаться. Связать логически ты уже должен их сам через условие.

Так же и дальше у тебя http://crapware.aidf.org/forum/index.php?topic=1404.msg7107#msg7107
Code: (clickermann) [Select]
$1 = 0 .....это просто переменная с именем "$1". Никакого отношения к ссылке 1: она не имеет, никуда автоматом не переводит и никак не влияет. И может называться не $1, а хоть $vasya_pupkin

В этом примере    http://crapware.aidf.org/forum/index.php?topic=1404.msg7107#msg7107
показать что такое флаг бессмысленно, флаг нужен там где есть 2 и больше вариантов развития событий, а там у тебя один цикл через GOTO без вариантов.

Ну последний пример
Code: (clickermann) [Select]
SUB(MYSUB)
   IF_PIXEL_IN(933,115, 933,115, 10217469)
      $vasya_pupkin = 1
   Else
      $vasya_pupkin = 0
   END_IF
END_SUB



MYSUB()
IF($vasya_pupkin = 1)
   BEEP(300,200) // Низкий сигнал
Else
   $vasya_pupkin = 0
   BEEP(800,200) // Высокий сигнал
END_IF

если  найдёт цвет 10217469  будет низкий сигнал, иначе - высокий.

Всё, хорошь. Если никак, то забей и жди пока Джонни введёт команды return для саба и break/continue для циклов.

P.S. Если это троллизм, то мне по барабану. Мне не зазорно попасться на троллинг, смущённо чувствовать я себя не буду. В любом случае всегда исхожу из того, что собеседник нормальный.

Брат, вот я вторые сутки не отхожу от компа даже для того, чтобы поесть (не ел двое суток). Все мучился с этим вопросом. В туалет бегал галопом. А ты о каком-то троллизме говоришь... Я не только вас замучил, но и сам за два дня выкурил 6 пачек сигарет. Я не знаю сейчас - какими словами тебя отблагодарить... Спасибо большое!... Вот твой последний пример мне всё показал.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 04:54:54 PM
Пойду поем
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 12, 2014, 05:48:52 PM
Приятного аппетита. :)
Вот еще, на десерт, немного измененный вариант подпрограммы с циклом и флагом.
IF_PIXEL_IN(933,115, 933,115, 1255211) заменил на IF(PXL(933,115) ! 1255211), т.к. там область поиска размером в один пиксель.
Code: (clickermann) [Select]
// Переменная-флаг "$next" (имя произвольное), изначально имеет значение 0, необходимое для запуска цикла "WHILE($next = 0)".
// При условии, что $next = 0 - тело цикла выполнится.
// При условии, что $next ! 0 - тело цикла НЕ выполнится, или прервется уже выполняющийся цикл.

// Подпограмма "MYSUB" определяет цвета двух пикселей в указанных координатах.
// Завершается, если цвета обоих пикселей не равны искомым цветам.

SUB(MYSUB) //  // Начало описания подпрограммы "MYSUB" (обязательно выше её вызова)
   //
   $next = 0 // Ставим переключатель в положение "Вкл. цикл"
   //
   WHILE($next = 0) // Начало цикла
      //
      GETSCREEN
      //
      IF(PXL(933,115) ! 10217469) // Если цвет первого пикселя НЕ равен 10217469
         //
         BEEP(800,200) // Высокий сигнал
         WAITMS(1000)
         //
         IF(PXL(933,115) ! 1255211) // Если цвет второго пикселя НЕ равен 1255211 (проверяется, только если цвет первого не 10217469)
            BEEP(300,200) // Низкий сигнал
            $next = 1 // Чтобы выйти из цикла присваиваем переменной-флагу значение 1 (любое отличное от нуля)
            WAITMS(1000)
         END_IF
         //
      END_IF
      //
      WAITMS(500) // Частота цикла
      //
   END_CYC // Конец цикла
   //
END_SUB // Конец описания подпрограммы "MYSUB"

MYSUB() // Вызываем подпрограмму "MYSUB"

HALT
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 12, 2014, 06:02:25 PM
Приятного аппетита. :)
Вот еще, на десерт, немного измененный вариант подпрограммы с циклом и флагом.
IF_PIXEL_IN(933,115, 933,115, 1255211) заменил на IF(PXL(933,115) ! 1255211), т.к. там область поиска размером в один пиксель.
Code: (clickermann) [Select]
// Переменная-флаг "$next" (имя произвольное), изначально имеет значение 0, необходимое для запуска цикла "WHILE($next = 0)".
// При условии, что $next = 0 - тело цикла выполнится.
// При условии, что $next ! 0 - тело цикла НЕ выполнится, или прервется уже выполняющийся цикл.

// Подпограмма "MYSUB" определяет цвета двух пикселей в указанных координатах.
// Завершается, если цвета обоих пикселей не равны искомым цветам.

SUB(MYSUB) //  // Начало описания подпрограммы "MYSUB" (обязательно выше её вызова)
   //
   $next = 0 // Ставим переключатель в положение "Вкл. цикл"
   //
   WHILE($next = 0) // Начало цикла
      //
      GETSCREEN
      //
      IF(PXL(933,115) ! 10217469) // Если цвет первого пикселя НЕ равен 10217469
         //
         BEEP(800,200) // Высокий сигнал
         WAITMS(1000)
         //
         IF(PXL(933,115) ! 1255211) // Если цвет второго пикселя НЕ равен 1255211 (проверяется, только если цвет первого не 10217469)
            BEEP(300,200) // Низкий сигнал
            $next = 1 // Чтобы выйти из цикла присваиваем переменной-флагу значение 1 (любое отличное от нуля)
            WAITMS(1000)
         END_IF
         //
      END_IF
      //
      WAITMS(500) // Частота цикла
      //
   END_CYC // Конец цикла
   //
END_SUB // Конец описания подпрограммы "MYSUB"

MYSUB() // Вызываем подпрограмму "MYSUB"

HALT

Ребят, спасибо большое - я просмотрю попозже. Мне остыть чуток надо  :) А пока хочу выложить макрос, в котором ответ на вопрос, который я тут искал двое суток, но только моим языком. Это на тот случай, если вдруг еще кто-нибудь, вроде меня, озадачится этим вопросом.

Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF_PIXEL_IN(1387,19, 1387,19, 9099498) // Ищем пиксель
      $vasya_pupkin = 1 // Тут называем результат именем "$vasya_pupkin" и ставим "1", что для нас и для кликера будет значить, что результат положительный. То есть - пиксель найден.
   Else
      $vasya_pupkin = 0 // Аналогично, называем результат именем "$vasya_pupkin" и ставим "0", что означает, что пиксель не был найден.
   END_IF
END_SUB

MYSUB()  // Собственно вызов подпрограммы

IF($vasya_pupkin = 1) // Команда видит, что в подпрограмме был найден пиксель и выполняет действие - BEEP(300,200)
   BEEP(300,200) // Низкий сигнал
Else
   $vasya_pupkin = 0 // Тут команда видит, что в подпрограмме не был найден пиксель и и выполняет действие - BEEP(800,200)
   BEEP(800,200) // Высокий сигнал
END_IF

// В данном скрипте будет срабатывать низкий сигнал, если в бодпрограмме пиксель будет найден. Высокий, если пиксель не будет найден. Если переключить наоборот:

IF($vasya_pupkin = 0) // Тут поставить 0
   BEEP(300,200)
Else
   $vasya_pupkin = 1 // А тут 1
   BEEP(800,200)
END_IF

// То будет срабатывать высокий сигнал, если в бодпрограмме пиксель будет найден и низкий, если пиксель не будет найден.

Всё. На сегодня я бухать пошел  :)
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 12, 2014, 06:46:43 PM
Тогда еще вариации на тему "Поиск Васи Пупкина".  :)  Может еще как то можно это записать?
Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF(PXL(1387,19) = 9099498)
      BEEP(300,200) // Низкий сигнал
   ELSE
      BEEP(800,200) // Высокий сигнал
   END_IF
END_SUB

//-------------------------------- Или так...

SUB(MYSUB)
   GETSCREEN
   SWITCH(PXL(1387,19))
   CASE(9099498)
      BEEP(300,200)
   DEFAULT
      BEEP(800,200)
   END_SWITCH
END_SUB

Да, можно, про PXLCRC() и PXLXOR() чуть не забыл.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 03:56:23 AM
Тогда еще вариации на тему "Поиск Васи Пупкина".  :)  Может еще как то можно это записать?
Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF(PXL(1387,19) = 9099498)
      BEEP(300,200) // Низкий сигнал
   ELSE
      BEEP(800,200) // Высокий сигнал
   END_IF
END_SUB

//-------------------------------- Или так...

SUB(MYSUB)
   GETSCREEN
   SWITCH(PXL(1387,19))
   CASE(9099498)
      BEEP(300,200)
   DEFAULT
      BEEP(800,200)
   END_SWITCH
END_SUB

Да, можно, про PXLCRC() и PXLXOR() чуть не забыл.

Ты меня убить хочешь?  ;D Опять незнакомые команды...

Ребят, бухнул я сегодня с соседом и посмотрели мы приключения Шурика, а сам никак не могу удержать мысли от дальнейшего развития событий в этой теме... А могу я поставить не два, а три флага? И потом определять по ним состояние перса и решать - в какой из трех подпрограм его направить. Вот так:

Code: (clickermann) [Select]
SUB(MYSUB)
   GETSCREEN
   IF_PIXEL_IN(0,0, $_xmax,$_ymax, 255) // Хп перса
      IF_PIXEL_IN(0,0, $_xmax,$_ymax, 366) // Хп моба
         $sostoyanie = 2 // И перс, и моб живы.
      Else
         $sostoyanie = 1 //  Перс жив - моб слился.
      END_IF
   Else
      $sostoyanie = 0 // ХП перса не видно.
   END_IF
END_SUB

SUB(slepoy boy)
   // Тело
END_SUB

SUB(boy)
   // Тело
END_SUB

SUB(Time Out)
   // Тело
END_SUB

IF($sostoyanie = 1)
   Time Out()
END_IF

IF($sostoyanie = 2)
   boy()
END_IF

IF($sostoyanie = 0)
   slepoy boy()
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 04:31:17 AM
Уже попробовал - так нельзя...
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 04:33:37 AM
Ё-маё! Вот же!... http://crapware.aidf.org/forum/index.php?topic=1404.msg7093#msg7093 (http://crapware.aidf.org/forum/index.php?topic=1404.msg7093#msg7093)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 05:05:13 AM
Ё-маё! Вот же!... http://crapware.aidf.org/forum/index.php?topic=1404.msg7093#msg7093 (http://crapware.aidf.org/forum/index.php?topic=1404.msg7093#msg7093)
Не - это не подходит вроде...
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 13, 2014, 12:05:22 PM
Уже попробовал - так нельзя...
Можно однако. Просто ошибки есть в твоем коде.
Подпрограмму SUB(MYSUB) надо вызывать однако, в строке 25, перед проверкой условий IF($sostoyanie = 1). И имена подпрограмм писать слитно надо, одним словом. Например, SUB(Time_Out) и вызов подпрограммы естественно тоже Time_Out(). В остальном всё OK вроде. Должно работать.  :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 01:21:34 PM
Оооо!... Сейчас попробуем... Спс ))
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 01:25:31 PM
Атас, ты, кстати, не переживай  :) Я до твоих "десертов" и вариаций позже дойду... Не обрадуешься  ;D
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 01:52:44 PM
Ес!!!! Получилось!!!  :D Вот теперь - прощай прыжки из подпрограмм по GOTO!
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 13, 2014, 03:50:48 PM
А вот избавиться от GOTO, без ущерба для сценария (скорость, размер), не удавалось еще никому. Если конечно применение GOTO оправдано в каком-то месте скрипта.
GOTO очень хороший и нужный инструмент, которого многие боятся, только потому, что какой-то там типа "гуру", что то там ляпнул в интернете, что GOTO - зло, "авторитетно" заявляя, что якобы, выпрыгивая из подпрограмм и циклов мы оставляем в памяти "тонны мусора", и что якобы скрипт становится "не читаемым", и прочий бред. Все увещевания программистов (которые даже boot.ini для Windows XP написать не могут) про "хороший тон написания кода" - бред сивой кобылы (просто НЕ "сношайтесь на Красной Площади" и ваш код будет ИДЕАЛЬНЫМ). Какой мусор? Сколько этого мусора? Приведите цифры. Этого не знает НИКТО(!), боюсь, что даже Создатель. Однако, предостережения, касающиеся применения GOTO, из Справки Clickermann'а потихоньку исчезли. Приведите пример скрипта который докажет, что выпрыгивание по GOTO пагубно влияет на что либо. Но даже если это и так, то,  за сколько лет GOTO сожрет мои 16GB оперативки и затормозит работу Core i7, если я запускаю свои скрипты не более чем на 5 часов в сутки, и на ночь комп выключаю?! Всё очень ситуативно.
Другое дело, что не надо пихать GOTO куда ни попадя, это так же относится к сабам, массивам, инклюдам, ... и другим полезным вещам. И трёп, типа - "Вот когда научитесь писать скрипты, тогда сможете обходиться без GOTO..." - это просто тупые понты. Не нравится (не умеете) не пользуйтесь.
НИКТО ПОКА НЕ СМОГ ПОЛНОСТЬЮ ОТКАЗАТЬСЯ ОТ ПРИМЕНЕНИЯ GOTO. Можете опровергнуть?
Название темы "помогите мне вылечиться от goto", звучит как "Помогите мне кастрировать Clickermann !!!". Лучше бы просили избавиться от STRCONCAT, явный же костыль (для языка столь высокого уровня).
Вот такое мое мнение. Я хозяин_своих_сценариев(!) - как_хочу_так_и_пишу. И если это работает, то почему бы и нет? Это не значит, что я отказываюсь учиться и слушать советы тех кто знает лучше, не надо путать. Но экспериментировать то "с тем что нельзя" тоже надо. :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 04:33:22 PM
Вот такое мое мнение. Я хозяин_своих_сценариев(!) - как_хочу_так_и_пишу. И если это работает, то почему бы и нет? Это не значит, что я отказываюсь учиться и слушать советы тех кто знает лучше, не надо путать. Но экспериментировать то "с тем что нельзя" тоже надо. :)

Я примерно так и думаю  :) Я тут уже как-то говорил (на этом форуме - не помню, где) - "Не я же прыгаю, а кликер... Дак почему не заставить его прыгать, если у него это получается?" Я согласен с тобой. Но в моем случае... Я не мало узнал, пытаясь избавиться от GOTO  :) Правда вас напряг - сорри...
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 13, 2014, 05:16:10 PM
https://lurkmore.to/GOTO#35_.D0.9D.D0.B0_.D1.81.D0.B0.D0.BC.D0.BE.D0.BC_.D0.B4.D0.B5.D0.BB.D0.B5
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 13, 2014, 11:38:48 PM
Че-то я тут вас напрягал-напрягал с этими флагами, а скрипт в итоге сделал без единого флага и выхода из SUB-а по GOTO.

Code: (clickermann) [Select]
SUB(udar)
   WAITMS(50)
   GETSCREEN
   IF_PIXEL_IN(670,847, 670,847, 263185,6791167)  // Решающий
      KEYPRESS(53)
      WAITMS(1150)
   Else
      IF_PIXEL_IN(711,847, 711,847, 1775447,6791167)  // Вихрь ударов
         KEYPRESS(54)
         WAITMS(1300)
      Else
         IF_PIXEL_IN(506,847, 506,847, 986163)  // Адреналин
            KEYPRESS(49)
            WAITMS(650)
         Else
            IF_PIXEL_IN(629,847, 629,847, 738459,6791167)  // Тройной 1
               KEYPRESS(52)
               WAITMS(700)
            Else
               IF_PIXEL_IN(629,847, 629,847, 666529,6791167) // Тройной 2
                  KEYPRESS(52)
                  WAITMS(700)
               Else
                  IF_PIXEL_IN(629,847, 629,847, 465195,6791167) // Тройной 3
                     KEYPRESS(52)
                     WAITMS(1200)
                  END_IF
               END_IF
            END_IF
         END_IF
      END_IF
   END_IF
END_SUB

SUB(baf)
   IF($baf1 < $_time_t)
      LOGWRITE ("Time Out - baf")
      KEYDOWN (16)
      WAITMS (50)
      KEYPRESS (189)
      WAITMS (50)
      KEYUP (16)
      WAITMS(1150)
      KEYDOWN (16)
      WAITMS (50)
      KEYPRESS (187)
      WAITMS (50)
      KEYUP (16)
      WAITMS(1150)
      $baf1 = $_time_t + 1620
   END_IF
END_SUB

SUB(klich)
   IF($klich1 < $_time_t)
      WAITMS(50)
      GETSCREEN
      IF_PIXEL_IN(245,64, 245,64, 3444824) // ХП под клич
         WAITMS(50)
      Else
         LOGWRITE ("klich")
         KEYPRESS(189) // Клич
         WAITMS(1200)
      END_IF
      $klich1 = $_time_t + 45
   END_IF
END_SUB

SUB(mikstura)
   IF($mikstura1 < $_time_t)
      LOGWRITE ("mikstura")
      KEYPRESS(187)  // Микстура
      WAITMS(100)
      $mikstura1 = $_time_t + 10
   END_IF
END_SUB

SUB(meditaciya)
   IF($meditaciya1 < $_time_t)
      WAITMS(50)
      GETSCREEN
      IF_PIXEL_IN(250,86, 250,86, 15111792) // МП под восстановление
         WAITMS(50)
      Else
         KEYDOWN (16)
         WAITMS (50)
         KEYPRESS (48)
         WAITMS (50)
         KEYUP (16)
         WAITMS (9100)
      END_IF
      $meditaciya1 = $_time_t + 121
   END_IF
END_SUB

SUB(slepoy boy)
   slepoy boy:
   BEEP(800,200)
   LOGWRITE ("slepoy boy")
   mikstura()
   klich()
   KEYPRESS(56)
   KEYPRESS(53)
   KEYPRESS(54)
   KEYPRESS(49)
   KEYPRESS(52)
   GETSCREEN
   IF_PIXEL_IN(15,64, 15,64, 1930288) // Минимум ХП перса
      LOGWRITE ("slepoy boy - у перса есть хп")
      WAITMS(100)
   Else
      LOGWRITE ("slepoy boy - у перса нет хп")
      GOTO(slepoy boy)
   END_IF
END_SUB

SUB(boy)
   boy:
   LOGWRITE ("boy")
   klich()
   udar()
   WAITMS(50)
   GETSCREEN
   IF_PIXEL_IN(15,64, 15,64, 1930288) // Минимум ХП перса
   Else
      slepoy boy()
   END_IF
   IF_PIXEL_IN(506,64, 506,64, 4539822) // Эллитный моб - минимум
      GOTO(boy)
   END_IF
END_SUB

SUB(poisk moba)
   WAITMS(50)
   GETSCREEN
   IF_PIXEL_IN(844,847, 844,847, 5533536)  // Лассо
      GOTO(agr:)
   END_IF
   LOGWRITE ("poisk moba - target")
   target:
   KEYPRESS(69) // Таргет
   WAITMS(100)
   GETSCREEN
   IF_PIXEL_IN(934,64, 934,64, 4804017) // Эллитный моб - максимум
      LOGWRITE ("Time Out = моб")
      IF_PIXEL_IN(844,847, 844,847, 5533536)  // Лассо
         ("Time Out = лассо")
         agr:
         KEYPRESS(57)
         WAITMS(1900)
         boy()
      Else
         LOGWRITE ("Time Out - лассо нет")
         KEYDOWN(68)
         WAITMS(300)
         KEYUP(68)
         GOTO(target)
      END_IF
   Else
      LOGWRITE ("Time Out - моба нет")
      KEYDOWN(68)
      WAITMS(300)
      KEYUP(68)
      GOTO(target)
   END_IF
END_SUB

SUB(Time Out)
   WAITMS(50)
   GETSCREEN
   IF_PIXEL_IN(749,645, 749,645, 16449535) // Дроп
      LOGWRITE ("Time Out - дроп")
      KEYPRESS(70)
      WAITMS(100)
   Else
      LOGWRITE ("Time Out - дропа нет")
      IF_PIXEL_IN(308,64, 308,64, 6274697) // Максимум ХП перса
         IF_PIXEL_IN(308,80, 308,80, 14455656) // Максимум МП перса
            LOGWRITE ("Time Out - перс готов к бою")
            poisk moba()
         END_IF
      END_IF
      LOGWRITE ("Time Out - перс к бою не готов")
      klich()
      meditaciya()
      baf()
      WAITMS(50)
      GETSCREEN
      COLORMODE(6)
      IF_PICTURE_IN (0,0, $_xmax,$_ymax, "закладка.bmp", -1, 100)
         LOGWRITE ("Time Out - закладка на месте")
         WAITMS(50)
         GETSCREEN
         IF_PIXEL_IN(4,530, 83,857, 13461469) // Чат
            chat:
            BEEP(800,200)
            WAITMS(1000)
            GOTO(chat)
         END_IF
      Else
         LOGWRITE ("Time Out - закладка закончилась")
         KEYPRESS(48)
      END_IF
   END_IF
END_SUB
WAITMS(50)


// Начало скрипта

1:
LOGWRITE ("1")

WAITMS(50)
GETSCREEN
IF_PIXEL_IN(15,64, 15,64, 1930288) // Минимум ХП перса
   LOGWRITE ("1 - минимум ХП перса есть")
Else
   LOGWRITE ("1 - минимум ХП перса нет")
   slepoy boy()
END_IF

IF_PIXEL_IN(308,64, 308,64, 6274697) // Максимум ХП перса
   IF_PIXEL_IN(308,80, 308,80, 14455656) // Максимум МП перса
      IF_PIXEL_IN(844,847, 844,847, 5533536)  // Лассо
         LOGWRITE ("1 - лассо есть")
         poisk moba()
      Else
         LOGWRITE ("1 - перс готов к бою - поиск моба")
         poisk moba()
      END_IF
   END_IF
END_IF

IF_PIXEL_IN(15,64, 15,64, 1930288) // Минимум ХП перса
   IF_PIXEL_IN(308,64, 308,64, 6274697) // Максимум ХП перса
      IF_PIXEL_IN(308,80, 308,80, 14455656) // Максимум МП перса
         LOGWRITE ("1 - в бой")
         boy()
      END_IF
   END_IF
Else
   slepoy boy()
END_IF

Time Out()

Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 14, 2014, 01:16:37 PM
Вообще (это не к теме), я стал замечать, что мне больше нравится в макросах копаться, чем ботов запускать... :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 14, 2014, 09:03:03 PM
Вот какя штука интересная... Оказывается - понять команды в макросах, это не самое главное. После того, как мы поймем хотя бы необходимые команды, начнется самое интересно. А именно... Вот, например. Отсутствие моба в таргете персонажа может означать два варианта (это в моем случае). 1 - перс слил моба и бой окончен. Пора переходить в ждущий режим, проверять наличие бафов, регениться и все такое. После чего вновь нужно найти нового моба и начать бой. 2 - Дела перса плохи. Это значит, что моб уделал его до такой степени, что экран начал пульсировать, от чего кликер перестал видеть не только моба в таргете, но и ХП перса, как и скилы. Мы должны написать такие команды, которые определят - какой из двух вариантов наступил и отправить макрос на тот, или иной путь. Дальше - больше. Минимальное ХП персонажа - максимальное ХП персонажа - минимальное ХП моба - максимальное ХП моба - бафы - скилы, и все такое. Появляется еще куча вариантов, где кликер должен определить, в каком направлении действовать, но в итоге все эти пути и варианты должны быть грамотно замкнуты в одном скрипте (пусть даже состоящем из нескольких частей - это не важно). Задача в том, чтобы это все грамотно замкнуть и при этом придумать такой алгоритм, который создавал бы наименьшую нагрузку GETSCREEN-ами (это например - наверняка существует еще куча других команд, которые требуют энергии и ресурсов)  и в то же самое время, чтобы он четко вычислял текущее состояние персонажа и определял дальнейшие действия. Меня это затянуло...  :)
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 15, 2014, 07:21:57 AM
...
Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)

Подпрограмма "SUB(klich)" у тебя выполняет этот самый клич, только в том случае, если пиксель с кодом цвета 3444824 отсутствует. Это плохой ориентир. Он отсутствует, например, когда игра вообще выключена. Желательно использовать явные сигналы для выполнения действий, а не их отсутствие.  ;)
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 15, 2014, 08:09:19 AM
Подпрограмма "SUB(klich)" у тебя выполняет этот самый клич, только в том случае, если пиксель с кодом цвета 3444824 отсутствует. Это плохой ориентир. Он отсутствует, например, когда игра вообще выключена. Желательно использовать явные сигналы для выполнения действий, а не их отсутствие.  ;)
Иногда без этого не обойтись совсем, а иногда просто удобней и проще. Почему ты так боишься отлавливать отсутствие? Если боишься только падения игры, можно всегда в паре первым делом проверять наличие постоянного элемента игры. В любом случае по скрипту приходится расставлять проверки на падения. Я для этого писал даже специальные подпрограммы для IF_PICTURE_IN с зацикливаниями и проверками вместо использования напрямую. Занятная вещь. Не хватает функционала кликера, а именно перезапуска сценария с нуля со сбросом всех переменных (пока можно костылить LOAD, но нужно следить за всеми переменными и не надеяться что при запуске они 0 по умолчанию). А так же прерывания циклов и подпрограмм.
Title: Re: помогите мне вылечиться от goto
Post by: Vint on September 15, 2014, 08:23:26 AM
Вот какя штука интересная... Оказывается - понять команды в макросах, это не самое главное. После того, как мы поймем хотя бы необходимые команды, начнется самое интересно. А именно... Вот, например. Отсутствие моба в таргете персонажа может означать два варианта (это в моем случае). 1 - перс слил моба и бой окончен. Пора переходить в ждущий режим, проверять наличие бафов, регениться и все такое. После чего вновь нужно найти нового моба и начать бой. 2 - Дела перса плохи. Это значит, что моб уделал его до такой степени, что экран начал пульсировать, от чего кликер перестал видеть не только моба в таргете, но и ХП перса, как и скилы. Мы должны написать такие команды, которые определят - какой из двух вариантов наступил и отправить макрос на тот, или иной путь. Дальше - больше. Минимальное ХП персонажа - максимальное ХП персонажа - минимальное ХП моба - максимальное ХП моба - бафы - скилы, и все такое. Появляется еще куча вариантов, где кликер должен определить, в каком направлении действовать, но в итоге все эти пути и варианты должны быть грамотно замкнуты в одном скрипте (пусть даже состоящем из нескольких частей - это не важно). Задача в том, чтобы это все грамотно замкнуть и при этом придумать такой алгоритм, который создавал бы наименьшую нагрузку GETSCREEN-ами (это например - наверняка существует еще куча других команд, которые требуют энергии и ресурсов)  и в то же самое время, чтобы он четко вычислял текущее состояние персонажа и определял дальнейшие действия. Меня это затянуло...  :)


Есть такое дело. Я некоторыми своими большими скриптами почти и не пользовался. Отладил и поддерживал попутно улучшая. Интересней было решать новые задачи и искать пути решения.

Навеяло...
Вот теперь думаю ты тоже поймёшь (как втянувшийся), как это, когда новый участник просит написать "маленький" скрипт на незнакомую для тебя игру толком не объяснив всех нюансов поведения этой игры.
Типа "а здесь бьём гнома и идём в город..."  Как бьём... чем бьём, где город как туда идти... одни вопросы и маты.
Бить можно кликнув на него, кликнув на кнопку, нажимая кнопку на клавиатуре, долбя кнопку на клаве, выполнив несколько действий... И когда остановиться, на что при этом ориентироваться... Каждый ответ приходится из просящего вытягивать калёными клещами. Вот поэтому я всё реже откликаюсь на неконкретные вопросы. Иначе несколько дней можешь потерять с лёту на вопрос который можно решить за час.
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 15, 2014, 09:03:21 AM
Иногда без этого не обойтись совсем, а иногда просто удобней и проще. Почему ты так боишься отлавливать отсутствие? Если боишься только падения игры, можно всегда в паре первым делом проверять наличие постоянного элемента игры. В любом случае по скрипту приходится расставлять проверки на падения. Я для этого писал даже специальные подпрограммы для IF_PICTURE_IN с зацикливаниями и проверками вместо использования напрямую. Занятная вещь. Не хватает функционала кликера, а именно перезапуска сценария с нуля со сбросом всех переменных (пока можно костылить LOAD, но нужно следить за всеми переменными и не надеяться что при запуске они 0 по умолчанию). А так же прерывания циклов и подпрограмм.

Абсолютно согласен, что отлавливать отсутствие можно, если есть проверка еще какого то постоянного элемента или есть возможность подсунуть под проверяемые текстуры какой то постоянный фон. Но не в чистом же виде, как в примере Hito. Работать оно конечно будет, но  нестабильно, уверенности в такой работе нет. Кстати проверка постоянного элемента должна быть по умолчанию.

Когда нет времени на переделку скрипта, а чаще просто лень, я тоже прописываю в скриптах проверку отсутствия, так проще. Если скрипт дурит, я знаю что "Всё норм, просто это у меня там кое где, кое что... но я исправлю". Но рано или поздно, когда появляется настроение, всетаки переделываю. Не далее как вчера, переписал большой скрипт, где у меня отслеживался фон с цветом 0. Постоянно об этом помнил, страдал от этого можно сказать. :)  Заменил его серым фоном, многое пришлось переписать , зато теперь могу спать спокойно. Я как бы продолжил отлавливать отсутствие пикселя, заменив его появлением фона, с конкретным уникальным кодом 4210752.

Вот например, если бы подпрограмма "SUB(klich)" выглядела так, то никаких доп проверок не потребовалось бы, и была бы уверенность в работе скрипта.
Code: (clickermann) [Select]
SUB(klich)
   IF($klich1 < $_time_t)
      WAITMS(50)
      GETSCREEN
      IF_PIXEL_IN(245,64, 245,64, 3444824) // ХП под клич
         LOGWRITE ("klich")
         KEYPRESS(189) // Клич
         WAITMS(1200)
      Else
         WAITMS(50)
      END_IF
      $klich1 = $_time_t + 45
   END_IF
END_SUB

Может быть призвать на помощь цветокоррекцию, % совпадения, или в настройках игры попробовать отключить прозрачность, если уж совсем без отлова отсутствия не обойтись?
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 15, 2014, 11:49:27 AM
...
Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)

Подпрограмма "SUB(klich)" у тебя выполняет этот самый клич, только в том случае, если пиксель с кодом цвета 3444824 отсутствует. Это плохой ориентир. Он отсутствует, например, когда игра вообще выключена. Желательно использовать явные сигналы для выполнения действий, а не их отсутствие.  ;)

Дело в том, что если ХП перса не упадет до определенной точки, я, либо почти зря, либо просто - зря потрачу klich, а у него откат = 45 секунд... Долго ждать зря потраченный скил...  :)
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 15, 2014, 11:54:38 AM
Вот какя штука интересная... Оказывается - понять команды в макросах, это не самое главное. После того, как мы поймем хотя бы необходимые команды, начнется самое интересно. А именно... Вот, например. Отсутствие моба в таргете персонажа может означать два варианта (это в моем случае). 1 - перс слил моба и бой окончен. Пора переходить в ждущий режим, проверять наличие бафов, регениться и все такое. После чего вновь нужно найти нового моба и начать бой. 2 - Дела перса плохи. Это значит, что моб уделал его до такой степени, что экран начал пульсировать, от чего кликер перестал видеть не только моба в таргете, но и ХП перса, как и скилы. Мы должны написать такие команды, которые определят - какой из двух вариантов наступил и отправить макрос на тот, или иной путь. Дальше - больше. Минимальное ХП персонажа - максимальное ХП персонажа - минимальное ХП моба - максимальное ХП моба - бафы - скилы, и все такое. Появляется еще куча вариантов, где кликер должен определить, в каком направлении действовать, но в итоге все эти пути и варианты должны быть грамотно замкнуты в одном скрипте (пусть даже состоящем из нескольких частей - это не важно). Задача в том, чтобы это все грамотно замкнуть и при этом придумать такой алгоритм, который создавал бы наименьшую нагрузку GETSCREEN-ами (это например - наверняка существует еще куча других команд, которые требуют энергии и ресурсов)  и в то же самое время, чтобы он четко вычислял текущее состояние персонажа и определял дальнейшие действия. Меня это затянуло...  :)


Есть такое дело. Я некоторыми своими большими скриптами почти и не пользовался. Отладил и поддерживал попутно улучшая. Интересней было решать новые задачи и искать пути решения.

Навеяло...
Вот теперь думаю ты тоже поймёшь (как втянувшийся), как это, когда новый участник просит написать "маленький" скрипт на незнакомую для тебя игру толком не объяснив всех нюансов поведения этой игры.
Типа "а здесь бьём гнома и идём в город..."  Как бьём... чем бьём, где город как туда идти... одни вопросы и маты.
Бить можно кликнув на него, кликнув на кнопку, нажимая кнопку на клавиатуре, долбя кнопку на клаве, выполнив несколько действий... И когда остановиться, на что при этом ориентироваться... Каждый ответ приходится из просящего вытягивать калёными клещами. Вот поэтому я всё реже откликаюсь на неконкретные вопросы. Иначе несколько дней можешь потерять с лёту на вопрос который можно решить за час.

Понимаю...  :) Но, пока я не ушёл далеко от начинающего (4 года начинаю...  ;D), так же могу понять и того же начинающего. Он этого всего пока не понимает и в своих вопросах камней не видит  :) Вам же просто огромное спасибо за то, что терпеливо иной раз просто промолчите, если вдруг захочется послать "пинать комаров". Ну а уж если еще и отвечаете терпеливо в таких случаях, то вообще - большой поклон.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 15, 2014, 12:41:44 PM
В общем я всё же сделал этот скрипт работающим, как часики и при этом оставил в нем всего одну подпрограмму.  :) Сейчас объясню, что мне помогло. Возможно это поможет тем, кто пытается как-то соединить меж собой разные направления в боле-менее больших макросах, в которых глаза разбегаются и в итоге мы начинаем в них громоздить докера разных подпрограмм, а потом еще и искать из них выпрыгивания не по GOTO. Дак вот, что я сделал. У меня в макросе три основных направления. Это - "time Out", "boy" и "slepoy boy". "time Out" - это состояние перса, в котором он отдыхает, проверяет свои бафы, отхиливается "klich"-ем и регенит ману "meditaciya"-ей. Логически из этого состояния выход только в одну сторону - в "boy". В бою перс следит за своими ХП, хилится "klich"-ем, если они упали до определенной отметки, ну и собственно юзает скилы ударов по откату. Из боя выход у нас в двух направлениях - вернуться в "time Out", если мы слили моба, или уйти в "slepoy boy", если дела совсем плохи. Это происходит тогда, когда ХП перса падают на столько, что еще несколько секунд и моб может слить перса. В таком случае экран потихоньку заволакивает пульсирующей красной дымкой и кликер перестаёт видеть ХП и МП перса и его скилы, равно как и моба. В "slepoy boy" перс просто бешенно жмет на все кнопки - авось что откатилось. Из "slepoy boy" у нас тоже два направления. Это - в "boy", в случае если перс хильнулся и этим поправил свое здоровье настолько, что экран вновь пришел в норму и кликер вновь видит его ХП и контролирует скилы, или в "time Out", если перс слил таки моба и моб перестал его бить, благодаря чему, ХП перса отрегенились настолько, что экран опять же пришел в норму. Делим наш макрос на три части и пишем в трех разных файлах. Где выходы в какое-либо направление, мы просто ставим ////////////// и подписываем - куда мы выходим. "////////////////" я делаю для того, чтобы это место потом бросалось в глаза, чтоб не забыть про него.


Code: (clickermann) [Select]
slepoy boy:
WAITMS(50)
BEEP(800,200)
IF($time < $_time_t)
   KEYPRESS(187)  // Микстура
   WAITMS(100)
   $time = $_time_t + 10
END_IF
GETSCREEN
IF_PIXEL_IN(80,64, 80,64, 1930288) // Минимум хп
   IF_PIXEL_IN(506,64, 506,64, 4539822) // Минимум ХП моба
      ///////////////// В бой.
   Else
      //////////////// в тайм аут
   END_IF
Else
   klich() // Клич
   KEYPRESS(49)  // Адреналин
   KEYPRESS(56)  // Молот
   KEYPRESS(54)  // Вихрь ударов
   KEYPRESS(53)  // Решающий
   KEYPRESS(52)  // Тройной
END_IF
GOTO(slepoy boy)

Так же пишем остальные два направления. Когда работу окончим, мы выбираем, с какого направления будет начинаться скрипт. В моем случае это "time Out", из которого выход только в "boy". Копируем весь код из макроса "boy" и тупо вставляем в "time Out", вместо "/////////////// в бой".  Потом просто жмем (http://f6.s.qip.ru/1HDgEPmD.png) "Расставить отступы". Вуаля! Мы соединили два направления без всякого гемороя! Так же поступаем с третьим макросом. Вот и всё - мы избавлены от головоломок  и в нашем скрипте нет путанници и лишних команд, чем ещё и улучшили читаемость скрипта  :) В подпрограмму я вынес только "клич", так как он вызывается в двух направлениях - в бою и в тайм ауте, а у него есть откат.
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 15, 2014, 12:44:04 PM
...
Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)

Подпрограмма "SUB(klich)" у тебя выполняет этот самый клич, только в том случае, если пиксель с кодом цвета 3444824 отсутствует. Это плохой ориентир. Он отсутствует, например, когда игра вообще выключена. Желательно использовать явные сигналы для выполнения действий, а не их отсутствие.  ;)

Дело в том, что если ХП перса не упадет до определенной точки, я, либо почти зря, либо просто - зря потрачу klich, а у него откат = 45 секунд... Долго ждать зря потраченный скил...  :)

Ок. Логика однако понятна, но не в ней дело, а в том как это преподносится Кликерману. Твой скрипт делает клич всегда, кроме тех случаев, когда пиксель в координатах 245,64 окрашен в цвет 3444824.
Не логично правда, если предположить, что такой цвет, в данных координатах появляется крайне редко? Вот и проверим, как часто появляется нужный нам пиксель.

Вот часть твоей подпрограммы "klich", только вместо клича BEEP. Надо запустить этот скрипт в игре и послушать (каждый писк = нажатие на кнопку "клич").
Проверять, естественно, надо в момент, когда уровень xp недостаточно низкий для клича.
Code: (clickermann) [Select]
WAITMS(300)

GETSCREEN
IF_PIXEL_IN(245,64, 245,64, 3444824) // ХП под клич
   WAITMS(50)
Else
   BEEP(1000,100)
   //   LOGWRITE ("klich")
   //   KEYPRESS(189) // Клич
   //   WAITMS(1200)
END_IF
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 15, 2014, 12:56:28 PM
...
Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)

Подпрограмма "SUB(klich)" у тебя выполняет этот самый клич, только в том случае, если пиксель с кодом цвета 3444824 отсутствует. Это плохой ориентир. Он отсутствует, например, когда игра вообще выключена. Желательно использовать явные сигналы для выполнения действий, а не их отсутствие.  ;)

Дело в том, что если ХП перса не упадет до определенной точки, я, либо почти зря, либо просто - зря потрачу klich, а у него откат = 45 секунд... Долго ждать зря потраченный скил...  :)

Ок. Логика однако понятна, но не в ней дело, а в том как это преподносится Кликерману. Твой скрипт делает клич всегда, кроме тех случаев, когда пиксель в координатах 245,64 окрашен в цвет 3444824.
Не логично правда, если предположить, что такой цвет, в данных координатах появляется крайне редко? Вот и проверим, как часто появляется нужный нам пиксель.

Вот часть твоей подпрограммы "klich", только вместо клича BEEP. Надо запустить этот скрипт в игре и послушать (каждый писк = нажатие на кнопку "клич").
Проверять, естественно, надо в момент, когда уровень xp недостаточно низкий для клича.
Code: (clickermann) [Select]
WAITMS(300)

GETSCREEN
IF_PIXEL_IN(245,64, 245,64, 3444824) // ХП под клич
   WAITMS(50)
Else
   BEEP(1000,100)
   //   LOGWRITE ("klich")
   //   KEYPRESS(189) // Клич
   //   WAITMS(1200)
END_IF

Проверять нужно не как часто он появляется, а как часто он пропадает ))) Вот - может так тебе будет понятней  :):

(http://f6.s.qip.ru/1HDgEPmL.png)

И я понял, почему клич срабатывал с горем пополам. Из-за того, что где-то он вызывался после того, как перс наносил удар какой-то (а после этого удара было выставлено недостаточное время ожидания для выполнения самого удара) и запрос в подпрограмму с кличем посылался, но он не срабатывал, так как перс в это время еще не закончил удар  :)
Title: Re: помогите мне вылечиться от goto
Post by: Atas on September 15, 2014, 01:32:26 PM
Проверять нужно не как часто он появляется, а как часто он пропадает ))) Вот - может так тебе будет понятней  :):

Мне то понятно, теперь это надо объяснить Кликерману. Он оперирует точными данными, такие понятия как "появится" и "исчезнет" ему не знакомы. Для
него цвет "зелёный" и 3444824, две большие разницы.
Этот пиксель всегда там находится, он никуда не исчезает и не появляется, он только может менять свой цвет, даже при полном xp. На скриншоте этого
не увидеть.
И если подпрограмма "klich" срабатывает "с горем пополам..." значит надо проверить, как меняется цвет пикселя при полном и почти полном xp.
Проверить в  тот момент, когда клич делать не надо. Я просто подозреваю, что он спамится по кд, при первой возможности.

И я понял, почему клич срабатывал с горем пополам. Из-за того, что где-то он вызывался после того, как перс наносил удар какой-то (а после этого удара было выставлено недостаточное время ожидания для выполнения самого удара) и запрос в подпрограмму с кличем посылался, но он не срабатывал, так как перс в это время еще не закончил удар  :)

Возможно. Тогда нужна проверка, что клич выполнен и если не выполнен, то повторить.
Title: Re: помогите мне вылечиться от goto
Post by: Hito on September 15, 2014, 01:54:07 PM
Проверять нужно не как часто он появляется, а как часто он пропадает ))) Вот - может так тебе будет понятней  :):

Мне то понятно, теперь это надо объяснить Кликерману. Он оперирует точными данными, такие понятия как "появится" и "исчезнет" ему не знакомы. Для
него цвет "зелёный" и 3444824, две большие разницы.
Этот пиксель всегда там находится, он никуда не исчезает и не появляется, он только может менять свой цвет, даже при полном xp. На скриншоте этого
не увидеть.
И если подпрограмма "klich" срабатывает "с горем пополам..." значит надо проверить, как меняется цвет пикселя при полном и почти полном xp.
Проверить в  тот момент, когда клич делать не надо. Я просто подозреваю, что он спамится по кд, при первой возможности.

И я понял, почему клич срабатывал с горем пополам. Из-за того, что где-то он вызывался после того, как перс наносил удар какой-то (а после этого удара было выставлено недостаточное время ожидания для выполнения самого удара) и запрос в подпрограмму с кличем посылался, но он не срабатывал, так как перс в это время еще не закончил удар  :)

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

"Мне то понятно, теперь это надо объяснить Кликерману. Он оперирует точными данными, такие понятия как "появится" и "исчезнет" ему не знакомы." - Я что-то понять тебя не могу... Естественно я не пишу в макросе - "Если в левом верхнем углу - вооооон там, пропадет зелененькое, то спроси у клича - не откатился ли он и не соизволит ли активироваться?" Я же прописываю:

Code: (clickermann) [Select]
IF_PIXEL_IN(245,64, 245,64, 3444824)  // Поищи в тех координатах вот этот цвет.
Else  // И если не найдёшь
   klich()  // То отправь запрос в подпрограмму с кличем.
END_IF

"Этот пиксель всегда там находится, он никуда не исчезает и не появляется, он только может менять свой цвет, даже при полном xp." - Он меняет цвет с 3444824 ТОЛЬКО в том случае, если ХП перса упали за пределы координат 245,64, 245,64 - проверено.

"Возможно. Тогда нужна проверка, что клич выполнен и если не выполнен, то повторить." - Не проще ли, и не лучше ли проверить время каста скилов и выставит нужное в ожидании, после каждого?  :)

Как я уже сказал, я уже сделал макрос, в котором ВСЁ работает, как швейцарские часики  :) Вопрос с кличем можно считать закрытым  :)