Author Topic: Потоки подняли восстание (Помогите со скриптом)  (Read 2436 times)

0 Members and 1 Guest are viewing this topic.

Orotund

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Здрасте, писал я себе код и таки написал, и вышел код совершенно кривой и "медленный" но рабочий. И в один ужасный день, решил я переписать его используя "потки" введя тем самым новые функции в мою програмку. И случилась беда, сейчас в програмке имеется 5 потоков:
один анализирует экран и совершает проверки по кругу, если условие выполнено то запускается нужный поток действия, а поток "анализа" выключается. После того как нужный поток "действия" отработал, он выключает себя и вновь запускает поток анализа.
 Беда состоит в том что все потоки работают почему-то одновременно и отказываются выключать друг друга, игнорируя инструкцию SETTHREAD.
Вот эти 5 потоков должны работать по идее поочередно, а следующие потоки будут работать параллельно с этими основными 5тью, но это в будующем.
 Подскажите пожалуйста в чем ошибка и если то что я хочу можно реализовать без потоков, то скажите как. Главное не использовать метки skip: , т.к. они работают прескверно и ломают одновременную работу потоков( поправте если это не так).
 Вот скидываю часть кода в котором случилась беда, здесь без литра не разобраться:
Code: (clickermann) [Select]
Thread(thr_analys,1)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
//==========================Поиск фиол пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)     
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Поиск красн пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Поиск варп пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("найден варп! Значение Warp:",$warp)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка величены dagger
IF($dagger > $dagger_max )
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка типа Start1
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка типа Start2
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка вкл ли long_range
IF ($long_range = 1)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка типа Start3
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
ELSE
//==========================Окончание проверок
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF
//=============================================
End_thread
Thread(thr_looting,0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
MOVE($return1+10, $_return2+20)   
ldown($_return1+10, $_return2+20)
WAITMS(100)     
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
//=============================================
End_thread
Thread(thr_run,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
IF ($foot > $foot_max)
$foot = 0
$dagger = 0
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF

GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
  LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
ELSE
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF
//=============================================
End_thread
Thread(thr_attack,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_analys, 0)
MOVE($_return1+10, $_return2+20)   
ldown($_return1+10, $_return2+20)
WAITMS(100)     
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_attack, 0)
//=============================================
End_thread
Thread(thr_teleport,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_attack, 0)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
      GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "смерть.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж мертв!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF

IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "соединение.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Потеряно соединение с сервером!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF

IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "чс.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж находится в ЧС!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF

$dagger = 0
$foot = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
//=============================================
End_thread
« Last Edit: March 29, 2015, 12:45:39 AM by Orotund »

Orotund

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Re: Потоки подняли восстание
« Reply #1 on: March 28, 2015, 11:24:11 PM »
После каждого объявления потока: Thread
я на всякий случай вписал перечнь потоков которые не должны работать:
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)                  //пример
Я сначала посчитал, что поток не может выключить сам себя. :(

yogukum

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Пока что  увидел только это (103 строка) :

Code: [Select]

SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
ELSE
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF


Если поток остановится перед ELSE, то следующий вызов начнется не с начала, а продолжит за ELSE и понеслась. Я без понятия, как в таком случае интерпретируется тогда ELSE..

Orotund

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Подчистил лишние "Else" от которых я избавился в коде. Все потоки по прежнему работают одновременно. Ждем помощи специалистов.  :(
Code: (clickermann) [Select]
Thread(thr_analys,1)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
//==========================Поиск фиол пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)     
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Поиск красн пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Поиск варп пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("найден варп! Значение Warp:",$warp)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка величены dagger
IF($dagger > $dagger_max )
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка типа Start1
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка типа Start2
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка вкл ли long_range
IF ($long_range = 1)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_IF

//==========================Проверка типа Start3
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
SETTHREAD (thr_attack, 1)
SETTHREAD (thr_analys, 0)
END_IF
//==========================Окончание проверок
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)

//=============================================
End_thread
Thread(thr_looting,0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
MOVE($return1+10, $_return2+20)   
ldown($_return1+10, $_return2+20)
WAITMS(100)     
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
//=============================================
End_thread
Thread(thr_run,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_attack, 0)
IF ($foot > $foot_max)
$foot = 0
$dagger = 0
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)
END_IF

GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
  LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
END_IF
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_run, 0)

//=============================================
End_thread
Thread(thr_attack,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_teleport, 0)
SETTHREAD (thr_analys, 0)
MOVE($_return1+10, $_return2+20)   
ldown($_return1+10, $_return2+20)
WAITMS(100)     
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_attack, 0)
//=============================================
End_thread
Thread(thr_teleport,0)
SETTHREAD (thr_looting, 0)
SETTHREAD (thr_run, 0)
SETTHREAD (thr_analys, 0)
SETTHREAD (thr_attack, 0)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
      GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "смерть.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж мертв!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF

IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "соединение.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Потеряно соединение с сервером!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF

IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "чс.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Персонаж находится в ЧС!")
LOGWRITE ("Стоп.")
WAITMS(100)
HALT
END_IF

$dagger = 0
$foot = 0
WAITMS(300)
SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
//=============================================
End_thread
« Last Edit: March 29, 2015, 10:37:47 AM by Orotund »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
В твоем случае потоки не нужны, используй подпрограммы.
Чему равняется $ch_x или это не весь скрипт?

Code: (clickermann) [Select]
SUB(teleport)
   KEYDOWN(#F5)
   WAITMS(100)
   KEYUP(#F5)
   WAITMS(150)
   KEYDOWN(#Enter)
   WAITMS(100)
   KEYUP(#Enter)
   GETSCREEN ($ch_x,25,$_xmax,625)
   IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "смерть.bmp")
      LOGWRITE ("-----------------------")
      LOGWRITE ("Персонаж мертв!")
      LOGWRITE ("Стоп.")
      WAITMS(100)
      HALT
   END_IF
   
   IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "соединение.bmp")
      LOGWRITE ("-----------------------")
      LOGWRITE ("Потеряно соединение с сервером!")
      LOGWRITE ("Стоп.")
      WAITMS(100)
      HALT
   END_IF
   
   IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "чс.bmp")
      LOGWRITE ("-----------------------")
      LOGWRITE ("Персонаж находится в ЧС!")
      LOGWRITE ("Стоп.")
      WAITMS(100)
      HALT
   END_IF
   
   $dagger = 0
   $foot = 0
   WAITMS(300)
END_SUB

SUB(looting)
   MOVE($return1+10, $_return2+20)
   ldown($_return1+10, $_return2+20)
   WAITMS(100)
   lup($_return1+10, $_return2+20)
   $foot = 0
   $dagger = 0
   WAITMS(300)
END_SUB

SUB(run)
   IF($foot > $foot_max)
      $foot = 0
      $dagger = 0
      teleport()
   END_IF
   
   GETSCREEN ($ch_x,25,$_xmax,625)
   $count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
   IF ($count > 9000)
      LCLICK($ch_x+400,560)
      INC($foot,1)
      MOVE($ch_x+730,100)
      $dagger = 0
      WAITMS(300)
   ELSE
      teleport()
   END_IF
END_SUB

SUB(attack)
   MOVE($_return1+10, $_return2+20)
   ldown($_return1+10, $_return2+20)
   WAITMS(100)
   lup($_return1+10, $_return2+25)
   WAITMS(300)
   INC($dagger,1)
   $foot = 0
END_SUB




//==========================Поиск фиол пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)
   looting()
END_IF

//==========================Поиск красн пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
   teleport()
END_IF

//==========================Поиск варп пикселя
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
   LOGWRITE ("найден варп! Значение Warp:",$warp)
   teleport()
END_IF

//==========================Проверка величены dagger
IF($dagger > $dagger_max )
   run()
END_IF

//==========================Проверка типа Start1
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
   attack()
END_IF

//==========================Проверка типа Start2
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
   attack()
END_IF

//==========================Проверка вкл ли long_range
IF ($long_range = 1)
   run()
END_IF

//==========================Проверка типа Start3
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
   attack()
ELSE
   //==========================Окончание проверок
   run()
END_IF
//=============================================



Orotund

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
В твоем случае потоки не нужны, используй подпрограммы.
Чему равняется $ch_x или это не весь скрипт?

Ок , попробую заменить потоки подпрограммами. Насчет $ch_x - да, это не весь скрипт, на переменные не обращайте внимания, все работает как часы.
 Код все равно работает не так как нужно :(
 Я понял в чем дело:
1)Есть ли команда которая прерывает и пропускает выполнение текущей подпрограммы?
2)Можно ли управлять потоком с помощью инструкции SETTHREAD из подпрограммы?
 Дело в том что, нужно выполнить несколько условий:
-Если подпрограмма запускает подпрограмму, то текущая подпрограмма должна прекратить работу.
-Если поток "анализа" запустил подпрограмму, то он должен начать свою работу заново, начиная с первой инструкции.
 
« Last Edit: March 29, 2015, 03:20:52 PM by Orotund »

Oraven

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3685
  • Котэ
    • View Profile
Нет функций прерывания, можно написать прыжок ГОТО отправляющий выполнение к метке в конце подпрограммы.

Orotund

  • Зашел в гости
  • *
  • Posts: 13
    • View Profile
Нет функций прерывания, можно написать прыжок ГОТО отправляющий выполнение к метке в конце подпрограммы.
ГОТО нарушит работу потоков?
Мне нужно к основной конструкции программки приделать 2 потока с периодическими действиями с незвисимыми счетчиками... я так понял, что если использовать "прыжки" то будет работать только основная конструкция. :(
 Вот так выглядела программка до того как я ее решил переписать, все работает на прыжках и код сам по себе достаточно кривой:
Code: (clickermann) [Select]
Looting:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,12993189)
MOVE($return1+10, $_return2+20)   
ldown($_return1+10, $_return2+20)
WAITMS(100)     
lup($_return1+10, $_return2+20)
$foot = 0
$dagger = 0
WAITMS(300)
GOTO(Looting)
//=====================
else
GOTO(Danger)
END_IF
//=============================================
Danger:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,4334055)
GOTO(Teleport)
ELSE
GOTO(Danger2)
END_IF
Danger2:
GETSCREEN ($ch_x,25,$_xmax,625)
$warp = PXLCOUNT($ch_x,25,$ch_x+800,600,5918286)
IF($warp > $warp_max )
LOGWRITE ("íàéäåí âàðï! Çíà÷åíèå Warp:",$warp)
GOTO (Teleport)
//=====================
else
GOTO(Start)
END_IF
//=============================================
Start:
IF($dagger < $dagger_max )
GOTO (Start1)
ELSE
GOTO (Teleport)
END_IF
//=============================================
Start1:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+270,180,$ch_x+530,410,16711680)
MOVE($_return1+10, $_return2+25)   
ldown($_return1+10, $_return2+25)
WAITMS(100)     
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
GOTO(Looting)
//=====================
else
GOTO(Start2)
END_IF
//=============================================
Start2:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+180,120,$ch_x+625,490,16711680 )
MOVE($_return1+10, $_return2+25)   
ldown($_return1+10, $_return2+25)
WAITMS(100)     
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
GOTO(Looting)
//=====================
else
GOTO(Start3)
END_IF
//=============================================
Start3:
IF ($long_range = 1)
GOTO(Start4)
ELSE
GOTO(Looting)
END_IF
Start4:
GETSCREEN ($ch_x,25,$_xmax,625)
IF_PIXEL_IN($ch_x+35,30,$ch_x+780,580,16711680 )
MOVE($_return1+10, $_return2+20)   
ldown($_return1+10, $_return2+20)
WAITMS(100)     
lup($_return1+10, $_return2+25)
WAITMS(300)
INC($dagger,1)
$foot = 0
GOTO(Looting)
//=====================
else
GOTO(Run)
END_IF
//=============================
Run:
IF ($foot > $foot_max)
$foot = 0
$dagger = 0
GOTO(Teleport)
END_IF
GETSCREEN ($ch_x,25,$_xmax,625)
$count = PXLCOUNT($ch_x+340,390,$ch_x+450,480, 9665660)
IF ($count > 9000)
  LCLICK($ch_x+400,560)
INC($foot,1)
MOVE($ch_x+730,100)
$dagger = 0
WAITMS(300)
GOTO(Looting)
ELSE
GOTO(Teleport)
END_IF
//=============================================
Teleport:
WAITMS(100)
KEYDOWN(#F5)
WAITMS(100)
KEYUP(#F5)
WAITMS(150)
KEYDOWN(#Enter)
WAITMS(100)
KEYUP(#Enter)
Start_analys:
      GETSCREEN ($ch_x,25,$_xmax,625)
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "ñìåðòü.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Ïåðñîíàæ ìåðòâ!")
LOGWRITE ("Ñòîï.")
WAITMS(100)
HALT
ELSE
GOTO(Analys2)
END_IF
Analys2:
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "ñîåäèíåíèå.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Ïîòåðÿíî ñîåäèíåíèå ñ ñåðâåðîì!")
LOGWRITE ("Ñòîï.")
WAITMS(100)
HALT
HALT
ELSE
GOTO(Analys3)
END_IF
Analys3:
IF_PICTURE_IN ($ch_x,400,$ch_x+800,600, "֖.bmp")
LOGWRITE ("-----------------------")
LOGWRITE ("Ïåðñîíàæ íàõîäèòñÿ â ×Ñ!")
LOGWRITE ("Ñòîï.")
WAITMS(100)
HALT
HALT
ELSE
GOTO(End_analys)
END_IF
End_analys:
$dagger = 0
$foot = 0
WAITMS(300)
GOTO(Looting)
END_IF
//=====================
« Last Edit: March 29, 2015, 03:57:47 PM by Orotund »

yogukum

  • Зашел в гости
  • *
  • Posts: 6
    • View Profile
Мои пять копеек :) Вот упрощенный вариант вашего скрипта
Code: (clickermann) [Select]

Thread(thr_analys,1)

//wait(1)
waitms(100)

print("Начали")

$rand = RND(1,4)

SWITCH($rand)
case(1)
SETTHREAD (thr_looting, 1)
SETTHREAD (thr_analys, 0)

case(2)
SETTHREAD (thr_teleport, 1)
SETTHREAD (thr_analys, 0)

case(3)
SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)
END_SWITCH

SETTHREAD (thr_run, 1)
SETTHREAD (thr_analys, 0)


//wait(2)
end_thread

//===================== thr_looting

Thread(thr_looting,0)

waitms(100)

//wait(1)
for($a=1, $a<6)

print("Делай - ", $a)

end_cyc

SETTHREAD (thr_analys, 1)
SETTHREAD (thr_looting, 0)
end_thread

//===================== thr_teleport

Thread(thr_teleport,0)

waitms(100)

//wait(1)
for($a=1, $a<6)

print("Ляляля - ", $a)

end_cyc


SETTHREAD (thr_analys, 1)
SETTHREAD (thr_teleport, 0)
end_thread

//===================== thr_run

Thread(thr_run,0)

waitms(100)

//wait(1)
for($a=1, $a<6)

print("Бубубу  - ", $a)

end_cyc

SETTHREAD (thr_analys, 1)
SETTHREAD (thr_run, 0)
end_thread


После "Начали" в логе, теоретически, должен быть один набор хрени типа Ляляля - х, но не тут то было, думаю разберетесь: в главном потоке  в любом случае выполнится последний thr_run, даже если перед этим он уже выполнился. Но фишка еще в том, что потоки очень быстро отрабатывают и кажется, что они фигачат подряд без остановки. Попробуйте поставить задержку повыше в главном и посмотри, что происходит

Насчет сабов - они хороши, если существует 100% определенная последовательность действий. Т.е. сто пудов будет так, например: иду, собрал, атаковал, сел - и этот набор никогда не меняется. Но в вашем случае, я думаю, это не 100% :) Так же, как и у меня было :) По-любому выскочит какое-нибудь окно, проскочит левый цвет, или последовательность изменится. Поэтому пришлось делать что-то вроде этого:

Code: (clickermann) [Select]

SUB($trh, $name, $is_start)

$array[0] = "thr_looting"
$array[1] = "thr_teleport"
$array[2] = "thr_run"

for ($i = 0, $i < arrsize($array))
IF($array[$i] ! $name)
SETTHREAD ($array[$i], $is_start)
END_IF
end_cyc

END_SUB

Thread(thr_analys,1)

//wait(5)
waitms(100)

print("Проверяю, что делать")

$rand = RND(1,3)


SETTHREAD (thr_analys, 0)


//wait(2)
end_thread

//===================== thr_looting

Thread(thr_looting,1)

waitms(300)

//wait(1)
if ($rand = 1)

thr(thr_looting,0)

for($a=1, $a<6)
print("Лутаю - ", $a)
end_cyc

thr(thr_looting,1)

SETTHREAD (thr_analys, 1)

end_If

end_thread

//===================== thr_teleport

Thread(thr_teleport,1)

waitms(300)

//wait(1)

if ($rand = 2)

thr(thr_teleport,0)

for($a=1, $a<6)
print("Телепорт - ", $a)
end_cyc

thr(thr_teleport,1)

SETTHREAD (thr_analys, 1)

end_If


end_thread

//===================== thr_run

Thread(thr_run,1)

waitms(300)

//wait(1)
if ($rand = 3)

thr(thr_run,0)

for($a=1, $a<6)
print("Бегу - ", $a)
end_cyc

thr(thr_run,1)

SETTHREAD (thr_analys, 1)

end_If

end_thread
.