Author Topic: помогите мне вылечиться от goto  (Read 35607 times)

0 Members and 1 Guest are viewing this topic.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
« Last Edit: September 13, 2014, 05:18:22 PM by Vint »


Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #91 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-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)
« Last Edit: September 14, 2014, 03:19:47 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #92 on: September 14, 2014, 01:16:37 PM »
Вообще (это не к теме), я стал замечать, что мне больше нравится в макросах копаться, чем ботов запускать... :)
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #93 on: September 14, 2014, 09:03:03 PM »
Вот какя штука интересная... Оказывается - понять команды в макросах, это не самое главное. После того, как мы поймем хотя бы необходимые команды, начнется самое интересно. А именно... Вот, например. Отсутствие моба в таргете персонажа может означать два варианта (это в моем случае). 1 - перс слил моба и бой окончен. Пора переходить в ждущий режим, проверять наличие бафов, регениться и все такое. После чего вновь нужно найти нового моба и начать бой. 2 - Дела перса плохи. Это значит, что моб уделал его до такой степени, что экран начал пульсировать, от чего кликер перестал видеть не только моба в таргете, но и ХП перса, как и скилы. Мы должны написать такие команды, которые определят - какой из двух вариантов наступил и отправить макрос на тот, или иной путь. Дальше - больше. Минимальное ХП персонажа - максимальное ХП персонажа - минимальное ХП моба - максимальное ХП моба - бафы - скилы, и все такое. Появляется еще куча вариантов, где кликер должен определить, в каком направлении действовать, но в итоге все эти пути и варианты должны быть грамотно замкнуты в одном скрипте (пусть даже состоящем из нескольких частей - это не важно). Задача в том, чтобы это все грамотно замкнуть и при этом придумать такой алгоритм, который создавал бы наименьшую нагрузку GETSCREEN-ами (это например - наверняка существует еще куча других команд, которые требуют энергии и ресурсов)  и в то же самое время, чтобы он четко вычислял текущее состояние персонажа и определял дальнейшие действия. Меня это затянуло...  :)
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #94 on: September 15, 2014, 07:21:57 AM »
...
Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)

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

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #95 on: September 15, 2014, 08:09:19 AM »
Подпрограмма "SUB(klich)" у тебя выполняет этот самый клич, только в том случае, если пиксель с кодом цвета 3444824 отсутствует. Это плохой ориентир. Он отсутствует, например, когда игра вообще выключена. Желательно использовать явные сигналы для выполнения действий, а не их отсутствие.  ;)
Иногда без этого не обойтись совсем, а иногда просто удобней и проще. Почему ты так боишься отлавливать отсутствие? Если боишься только падения игры, можно всегда в паре первым делом проверять наличие постоянного элемента игры. В любом случае по скрипту приходится расставлять проверки на падения. Я для этого писал даже специальные подпрограммы для IF_PICTURE_IN с зацикливаниями и проверками вместо использования напрямую. Занятная вещь. Не хватает функционала кликера, а именно перезапуска сценария с нуля со сбросом всех переменных (пока можно костылить LOAD, но нужно следить за всеми переменными и не надеяться что при запуске они 0 по умолчанию). А так же прерывания циклов и подпрограмм.


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #96 on: September 15, 2014, 08:23:26 AM »
Вот какя штука интересная... Оказывается - понять команды в макросах, это не самое главное. После того, как мы поймем хотя бы необходимые команды, начнется самое интересно. А именно... Вот, например. Отсутствие моба в таргете персонажа может означать два варианта (это в моем случае). 1 - перс слил моба и бой окончен. Пора переходить в ждущий режим, проверять наличие бафов, регениться и все такое. После чего вновь нужно найти нового моба и начать бой. 2 - Дела перса плохи. Это значит, что моб уделал его до такой степени, что экран начал пульсировать, от чего кликер перестал видеть не только моба в таргете, но и ХП перса, как и скилы. Мы должны написать такие команды, которые определят - какой из двух вариантов наступил и отправить макрос на тот, или иной путь. Дальше - больше. Минимальное ХП персонажа - максимальное ХП персонажа - минимальное ХП моба - максимальное ХП моба - бафы - скилы, и все такое. Появляется еще куча вариантов, где кликер должен определить, в каком направлении действовать, но в итоге все эти пути и варианты должны быть грамотно замкнуты в одном скрипте (пусть даже состоящем из нескольких частей - это не важно). Задача в том, чтобы это все грамотно замкнуть и при этом придумать такой алгоритм, который создавал бы наименьшую нагрузку GETSCREEN-ами (это например - наверняка существует еще куча других команд, которые требуют энергии и ресурсов)  и в то же самое время, чтобы он четко вычислял текущее состояние персонажа и определял дальнейшие действия. Меня это затянуло...  :)


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

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


Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #97 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

Может быть призвать на помощь цветокоррекцию, % совпадения, или в настройках игры попробовать отключить прозрачность, если уж совсем без отлова отсутствия не обойтись?
« Last Edit: September 15, 2014, 09:20:26 AM by Atas »

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #98 on: September 15, 2014, 11:49:27 AM »
...
Только почему-то klich() на 62-ой строчке срабатывает с горем пополам... Если кто-то укажет на ошибку, буду счастлив  :)

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

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

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #99 on: September 15, 2014, 11:54:38 AM »
Вот какя штука интересная... Оказывается - понять команды в макросах, это не самое главное. После того, как мы поймем хотя бы необходимые команды, начнется самое интересно. А именно... Вот, например. Отсутствие моба в таргете персонажа может означать два варианта (это в моем случае). 1 - перс слил моба и бой окончен. Пора переходить в ждущий режим, проверять наличие бафов, регениться и все такое. После чего вновь нужно найти нового моба и начать бой. 2 - Дела перса плохи. Это значит, что моб уделал его до такой степени, что экран начал пульсировать, от чего кликер перестал видеть не только моба в таргете, но и ХП перса, как и скилы. Мы должны написать такие команды, которые определят - какой из двух вариантов наступил и отправить макрос на тот, или иной путь. Дальше - больше. Минимальное ХП персонажа - максимальное ХП персонажа - минимальное ХП моба - максимальное ХП моба - бафы - скилы, и все такое. Появляется еще куча вариантов, где кликер должен определить, в каком направлении действовать, но в итоге все эти пути и варианты должны быть грамотно замкнуты в одном скрипте (пусть даже состоящем из нескольких частей - это не важно). Задача в том, чтобы это все грамотно замкнуть и при этом придумать такой алгоритм, который создавал бы наименьшую нагрузку GETSCREEN-ами (это например - наверняка существует еще куча других команд, которые требуют энергии и ресурсов)  и в то же самое время, чтобы он четко вычислял текущее состояние персонажа и определял дальнейшие действия. Меня это затянуло...  :)


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

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

Понимаю...  :) Но, пока я не ушёл далеко от начинающего (4 года начинаю...  ;D), так же могу понять и того же начинающего. Он этого всего пока не понимает и в своих вопросах камней не видит  :) Вам же просто огромное спасибо за то, что терпеливо иной раз просто промолчите, если вдруг захочется послать "пинать комаров". Ну а уж если еще и отвечаете терпеливо в таких случаях, то вообще - большой поклон.
« Last Edit: September 15, 2014, 11:58:33 AM by Hito »
Я не ду... Потому и не бу...

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #100 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", вместо "/////////////// в бой".  Потом просто жмем "Расставить отступы". Вуаля! Мы соединили два направления без всякого гемороя! Так же поступаем с третьим макросом. Вот и всё - мы избавлены от головоломок  и в нашем скрипте нет путанници и лишних команд, чем ещё и улучшили читаемость скрипта  :) В подпрограмму я вынес только "клич", так как он вызывается в двух направлениях - в бою и в тайм ауте, а у него есть откат.
« Last Edit: September 15, 2014, 02:04:23 PM by Hito »
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #101 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

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #102 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

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



И я понял, почему клич срабатывал с горем пополам. Из-за того, что где-то он вызывался после того, как перс наносил удар какой-то (а после этого удара было выставлено недостаточное время ожидания для выполнения самого удара) и запрос в подпрограмму с кличем посылался, но он не срабатывал, так как перс в это время еще не закончил удар  :)
« Last Edit: September 15, 2014, 01:14:12 PM by Hito »
Я не ду... Потому и не бу...

Atas

  • Активный участник
  • ***
  • Posts: 147
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #103 on: September 15, 2014, 01:32:26 PM »
Проверять нужно не как часто он появляется, а как часто он пропадает ))) Вот - может так тебе будет понятней  :):

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

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

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

Hito

  • Герой форума
  • *****
  • Posts: 1212
    • View Profile
Re: помогите мне вылечиться от goto
« Reply #104 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 - проверено.

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

Как я уже сказал, я уже сделал макрос, в котором ВСЁ работает, как швейцарские часики  :) Вопрос с кличем можно считать закрытым  :)
« Last Edit: September 15, 2014, 02:13:50 PM by Hito »
Я не ду... Потому и не бу...