Page 1 of 2

Тест! Новая ходилка.

Posted: 2005-02-17 08:41:20
by Savage
Вообщем вчера заморочился на новую ходилку, чтоб бродила по городу без проблем. Получилось пока не очень. Препядствия типа открытых магазинов почти не обходит :) Но думаю на коротких дистанциях будет обходить столы и прочую мебель. Соответственно в лесу вообще проблем с застреванием быть не должно.

Ну собственно кому не влом погоняйте ее.

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

Также хотел выслушать соображения по поводу логики обхода препядствий.

Code: Select all

sub test()
   SuperWalk(1175,1631,"")
end sub

#==============================================================
#  SuperWalk(X,Y,Serial) - char is walking by dX and dY step
#                sub using Home, End, PgUp, PgDown keys
#                d'not rebind this key from default action!
#     walkwait - delay after keypress
#--------------------------------------------------------------
sub SuperWalk(x,y,Target)
   VAR i
   VAR dir,ldir,rdir,key,olddir
   VAR dx,dy,Exit=0
   VAR CacheLimit=9,CacheIndex="Text"
   DIM CacheX[10], CacheY[10]
   
   CacheX[0]="Test"
   While Exit<>1   
      If Target<>"" Then
         dx=UO.GetX(Target)-UO.GetX()
         dy=UO.GetY(Target)-UO.GetY()
;         UO.Print("Target locked!")
         If UO.GetDistance(Target)<2 Then
            Exit=1
         Endif
      Else
         dx=x-UO.GetX()
         dy=y-UO.GetY()
         If dx==0 AND dy==0 Then
            Exit=1
         Endif

      Endif
   
      If dx<>0 AND dy<>0 Then
         If dx>0 AND dy>0 Then ; GoSE
            dir=3
            ldir=2
            rdir=4
            key=40 ; DownArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==2 Then ; GoNE
                  dir=1
                  ldir=0
                  rdir=1
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=5
                  rdir=6
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif

         If dx>0 AND dy<0 Then ; GoNE
            dir=1
            ldir=0
            rdir=2
            key=39 ; RightArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==0 Then ; GoWN
                  dir=7
                  ldir=6
                  rdir=7
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSE
                  dir=3
                  ldir=3
                  rdir=4
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif

         If dx<0 AND dy>0 Then ; GoSW
            dir=5
            ldir=4
            rdir=6
            key=37 ; LeftArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==6 Then ; GoWN
                  dir=7
                  ldir=7
                  rdir=0
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSE
                  dir=3
                  ldir=2
                  rdir=3
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif

         If dx<0 AND dy<0 Then ; GoWN
            dir=7
            ldir=6
            rdir=0
            key=38 ; UpArrow
            olddir=UO.GetDir()
            If StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key) Then
               If olddir==0 Then ; GoNE
                  dir=1
                  ldir=1
                  rdir=2
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=4
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
   
      If dx<>0 AND dy==0 Then
         If dx>0 Then ; GoE
            dir=2
            key=34 ; PgDown
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoSE
                  dir=3
                  ldir=3
                  rdir=4
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoNE
                  dir=1
                  ldir=1
                  rdir=0
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         
         If dx<0 Then ; GoW
            dir=6
            key=36 ; Home key
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==0 Then ; GoWN
                  dir=7
                  ldir=7
                  rdir=0
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=4
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif

      If dx==0 AND dy<>0 Then
         If dy>0 Then ; GoS
            dir=4
            key=35 ; End
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoSE
                  dir=3
                  ldir=2
                  rdir=3
                  key=40 ; DownArrow
                  While UO.GetDir()<>3
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoSW
                  dir=5
                  ldir=6
                  rdir=5
                  key=37 ; LeftArrow
                  While UO.GetDir()<>5
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
         
         If dy<0 Then ;GoN
            dir=0
            key=33 ; PgUp
            olddir=UO.GetDir()
            If StepEdit(UO.GetX(),UO.GetY(),dir,key) Then
               If olddir==2 Then ; GoNE
                  dir=1
                  ldir=1
                  rdir=2
                  key=39 ; RightArrow
                  While UO.GetDir()<>1
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Else ; GoWN
                  dir=7
                  ldir=7
                  rdir=6
                  key=38 ; UpArrow
                  While UO.GetDir()<>7
                     StepArrow(UO.GetX(),UO.GetY(),dir,ldir,rdir,key)
                  Wend
               Endif
            Endif
         Endif
      Endif
   Wend
end sub


sub StepEdit(x,y,dir,key)
   VAR walkwait=300
   VAR ErrLevel=0
   If UO.GetDir()<>dir Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()<>dir Then
         CheckLag()
      Endif
   Endif
   UO.Press(key)
   wait(walkwait)
   If x==UO.GetX() AND y==UO.GetY() Then
      CheckLag()
      If x==UO.GetX() AND y==UO.GetY() Then
;zatik
         ErrLevel=1
      Endif
   Endif
   Return ErrLevel
end sub


sub StepArrow(x,y,dir,ldir,rdir,key)
   VAR walkwait=300
   VAR ErrLevel=0
   If UO.GetDir()<>dir Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()<>dir AND UO.GetDir()<>ldir AND UO.GetDir()<>rdir Then
         CheckLag()
      Endif
   Endif

   If UO.GetX()==x AND UO.GetY()==y Then
      UO.Press(key)
      wait(walkwait)
      If UO.GetDir()==dir AND UO.GetX()==x AND UO.GetY()==y Then
         CheckLag()
         If UO.GetDir()==dir AND UO.GetX()==x AND UO.GetY()==y Then
; zatik         
            ErrLevel=1
         Endif
      Endif
   Endif
   Return ErrLevel
end sub


#==============================================================
#  CheckLag() - click on backpack and awaiting "backpack"
#               message in journal.
#
#  Journal has been deleted!!!
#--------------------------------------------------------------
sub CheckLag()
   UO.DeleteJournal()
   UO.Click('backpack')
   repeat
      wait(500)
   until UO.InJournal('backpack')
end sub


Posted: 2005-02-17 09:05:14
by Goggy
Попробуй запусти от банка В брите или из замка Лорда Бритиша....
Никогда недойдёт :roll:

Posted: 2005-02-17 09:10:19
by Goggy
Вобщем попробовал, ходилка норм тока если приходится от координаты отходить то он этого неделает(в случае если возвращатся надо когда заёл нетуды :) ), а так норм в лесу впринципе должен любое препятствие обойти...
молодец :wink:

Posted: 2005-02-17 09:42:45
by Askaneli
Goggy wrote:Попробуй запусти от банка В брите или из замка Лорда Бритиша....
Никогда недойдёт :roll:

Дойдёт. По точкам.

Posted: 2005-02-17 09:45:19
by Askaneli
2Savage . Гляну вечерком. Даже интересно стало.

Posted: 2005-02-17 09:47:43
by Goggy
Askaneli wrote:
Goggy wrote:Попробуй запусти от банка В брите или из замка Лорда Бритиша....
Никогда недойдёт :roll:

Дойдёт. По точкам.


по точкам любой дойдёт!
а ты зделай так чтоб точку в тринсике вставить и он валил с Минока :mrgreen: :wink:

Posted: 2005-02-17 09:49:32
by Sfagnum
Goggy wrote:а ты зделай так чтоб точку в тринсике вставить и он валил с Минока :mrgreen: :wink:
а теперь скажи мне практический смысл данного действия.

Posted: 2005-02-17 09:58:47
by Askaneli
Goggy wrote:
Askaneli wrote:
Goggy wrote:Попробуй запусти от банка В брите или из замка Лорда Бритиша....
Никогда недойдёт :roll:

Дойдёт. По точкам.


по точкам любой дойдёт!
а ты зделай так чтоб точку в тринсике вставить и он валил с Минока :mrgreen: :wink:

В Тринсике идёшь до телестоуна. Летишь в Минок и идёшь до точки в Миноке. Элементарно блин.
А ещё проще по рунбуке.

Смысл в ходилке есть толька на небольшие расстояния.

Posted: 2005-02-17 10:55:20
by BETEPAH
Операция на глаз, через задний проход, с летальным исходом.

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

Posted: 2005-02-17 11:25:49
by Sfagnum
BETEPAH wrote:Я так покумекал ..... думаю что ходилка ( любая) будет работать Лучше если проверять обьекты на пути ....тобишь есть найден обьект на пути прохода то выбор маршрута обхода. Это конешно муторно и сложно ....но если при каждом шаге будет коректировка маршрутизации.....то того и глядишь будет все оки ))
и как ты себе представляешь реализацию поиска объекта?

флудер ;)

Posted: 2005-02-17 12:18:00
by Askaneli
BETEPAH wrote:Операция на глаз, через задний проход, с летальным исходом.

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

Это что по твоему надо массив хранить в файле обьектов мира ???
Ты представляешь скока это места будет жрать и как отразится на скорости работы ???
Флудер!!!

Posted: 2005-02-17 14:45:13
by BETEPAH
Сами болтуны ..... я про то что надо коректировку проверять при каждом шаге.

Posted: 2005-02-17 14:46:38
by Edred
Все вы флудеры и совершенно не следите за АСМом. В нем давно есть работа с картами и вердатой. Статики, правда, пока нету. Но, насколько мне известно, будет. Когда АГРСу надоест линейка.

Posted: 2005-02-17 14:57:15
by Sfagnum
Edred wrote:Все вы флудеры и совершенно не следите за АСМом. В нем давно есть работа с картами и вердатой. Статики, правда, пока нету. Но, насколько мне известно, будет. Когда АГРСу надоест линейка.
но нету же ;) так чта.... не надо на нас гнать ;)

Просто Ветеран немного ахинию прогнал...

Posted: 2005-02-17 15:15:17
by BETEPAH
нА ОХИНЕЮ отвечу.
А что мешает какким нибуть чудесным образом проверять путь по линии к точке и если на пути стоит обьект не входящий в масив тайлов "проходимых" то тогда обход его на -1 или +1....что тут бредового то ?.Замечу что масив тайлов не так уж и велик.

Posted: 2005-02-17 15:56:49
by Askaneli
Не кипятись. В процессе уже.
Вот хернёй перестану маятся и допишу.

Posted: 2005-02-17 16:03:30
by Savage
Столько ответов и ни одного дельного совета :) С вами каши не сваришь :(

Posted: 2005-02-17 16:04:49
by Savage
Перейти на АСМ, значит замкнуться на себе и кучке избранных. У меня несколько другая политика.

Posted: 2005-02-17 20:14:16
by AlexeyVorotnikov
Попробовал я присобачить эту ходилку к лумберу. Заметил одну странность: она подходит к дереву строго с северо-запада. Даже если она уже подошла к дереву с другой стороны, она обходит дерево так, чтобы оказаться на северо-запад от него и только тогда считает, что пришла на место.

Posted: 2005-02-17 20:14:58
by AlexeyVorotnikov
Savage wrote:Перейти на АСМ, значит замкнуться на себе и кучке избранных. У меня несколько другая политика.

Почему "замкнуться на себе и кучке избранных"?