Проверка на проходимость

Anything and all.

Moderators: Murderator+, Murderator

ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Не подходит даже к fw, где углы простреливаются
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

Вроде наметился положительный результат.
Проблема связана с
startx = startx - 1
starty = starty - 1

startx = startx + 1
starty = starty + 1

Шахматисты есть? Над алгоритм "коня".
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Надо писать по другому алгоритму. Что-то вроде

Code: Select all

dx = endx - startx
dy = endy - starty
While x <> endx or y <> endy
  If abs(dx) > abs(dy) then
    If x <> startx + int(abs(dx) / abs(dy)) * Sign(dx) then
      If dx > 0 then
        x = x + 1
       else
        x = x - 1
      Endif
     else
      startx = x   ; Прошёл int(abs(dx) / abs(dy)) тайлов вперёд, делает шаг в сторону
      If dy > 0 then
        y = y + 1
       else
        y = y - 1
      Endif
    Endif
   else
    ...
  Endif
  String = String + str(x) + ' ' + str(y) + ' ' ; Записываем тайл в строку
  Value = Value + 1 ; Считаем кол-во тайлов
Wend
Return str(Value) + String

Sign(число) вернёт 1 если число положительное, -1 если отрицательное
Но и тут будут свои недостатки:
- Нужно будет "оттягивать" назад на 1 тайл стартовую позицию, чтобы счёт начался с правильного тайла(иначе сдвинется вперёд на 1 тайл)
- Скрипт буде шикарно работать с целым abs(dx) / abs(dy), но с дробями вечный цикл или парсер. Хотя с (+6;+4) должно получиться что-то вроде этого

Code: Select all

---ХХ
---Х-
--ХХ-
--Х--
-ХХ--
-Х---
ХХ---
Но только в теории и если обновлять dx и dy с каждым новым шагом
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

и как можно утверждать не проверив или не въехав?:)

Code: Select all

var DIR_N = 0
var DIR_NW = 7
var DIR_W = 6
var DIR_SW = 5
var DIR_S = 4
var DIR_SE = 3
var DIR_E   = 2
var DIR_NE = 1

var AXIS_X = 0
var AXIS_Y = 1

sub Point( point, x, y, z )
   
   point[0] = x
   point[1] = y
   point[2] = z

end sub

sub Point.toString( point )
   
   return str( point[0] ) + ' ' + str( point[1] ) + ' ' + str( point[2] )

end sub

sub Point.createFromLastTile( point )
   
   point[0] = UO.lastTile(1)
   point[1] = UO.lastTile(2)
   point[2] = UO.lastTile(3)

end sub

sub Point.createFromChar( point )
   
   point[0] = UO.getX()
   point[1] = UO.getY()
   point[2] = UO.getZ()

end sub
   

sub Point.move( point, dir )
   
   Point.moveN( point, dir, 1 )

end sub

sub Point.moveN( point, dir, dist )
   
   var dx, dy
   
   dx = Axis.getDirSign( AXIS_X, dir )
   dy = Axis.getDirSign( AXIS_Y, dir )

   point[0] = point[0] + dx*dist
   point[1] = point[1] + dy*dist

end sub

sub Point.distance( spoint, dpoint )
   
   var ax = Math.abs( spoint[0] - dpoint[0] )
   var ay = Math.abs( spoint[1] - dpoint[1] )
   
   return Math.max( ax, ay )

end sub
   
   
sub Point.getDir( spoint, dpoint )
   var dx, dy
   var ax, ay
   var slope
   
   dx = dpoint[0] - spoint[0]
   dy = dpoint[1] - spoint[1]
   
   ax = Math.abs( dx )
   ay = Math.abs( dy )

   if ( ay > ax ) then
   
      if ( not ax ) then
         return iif( dy < 0, DIR_N, DIR_S )
      end if
      
      slope = ay / ax
      if ( slope > 2 ) then
            return iif( dy < 0, DIR_N, DIR_S )
      end if
      
      if ( dx < 0 ) then
         return iif( dy < 0, DIR_NW, DIR_SW )
      end if
      
      return iif( dy < 0, DIR_NE, DIR_SE )
   
   else
      
      if ( not ay ) then
         if ( not ax ) then
            return UO.getDir()
         end if
         
         return iif( dx < 0, DIR_W, DIR_E )
      end if
         
      slope = ax / ay
      if ( slope > 2 ) then
         return iif( dx < 0, DIR_W, DIR_E )
      end if
      
      if ( dy < 0 ) then   
         return iif( dx < 0, DIR_NW, DIR_NE )
      end if
      
      return iif( dx < 0, DIR_SW, DIR_SE )
   end if
      
end sub               


 
sub Axis.getDirSign( axis, dir )

   dir = dir - 2*axis
   
   if ( dir > 0 ) and ( dir < 4) then
      return 1
   else
      return iif( ( dir == 0 ) or ( dir == 4 ), 0, -1 )
   end if

end sub   

sub Char.getDir( point )

   dim p[3]
   
   Point( p, UO.getX(), UO.getY(), 0 )
   return Point.getDir( p, point )
   
end sub

sub Char.LOSVisualise( dpoint )

   dim spoint[3]
   var dir
   Point.createFromChar( spoint )
   
   UO.mfgi( "add", 1332, spoint[0], spoint[1], 0 ) 
   while Point.distance( spoint, dpoint )
      UO.print( 'in' )
      dir = Point.getDir( spoint, dpoint )
      
      UO.print( 'dir: ' + str( dir ) + ' point: ' + Point.toString( spoint ) )
      Point.move( spoint, dir )
      UO.print( 'move -> ' + Point.toString( spoint ) )
      UO.exec( 'mfgi add 1332 ' + Point.toString( spoint ) )
      UO.print( 'out' )
   wend
   
end sub

sub Math.abs( x )
   
   if x < 0 then
      return -x
   end if
   
   return x

end sub

sub Math.max( x, y )
   
   if x < y then
      return y
   end if
   
   return x

end sub

sub iif( condition, trueValue, elseValue )
   
   if ( condition ) then
      return trueValue
   end if
   
   return elseValue
   
end sub

sub test()
   
   dim dpoint[3]
   var dir
   
   UO.info()
   while UO.targeting()
      wait(100)
   wend
   
   Point.createFromLastTile( dpoint )
   dir = Char.getDir( dpoint )
   UO.print( str( UO.getDir() ) + ' ' + str( dir ) )   
   UO.print( 'x: ' + str( Axis.getDirSign( AXIS_X, dir ) ) + ' y: ' + str( Axis.getDirSign( AXIS_Y, dir ) ) )
   Char.LOSVisualise( dpoint )
   
end sub


test() - визуальный пример
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Ты вообще читаешь тему?
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

Конечно нет, содержание уже давно ушло от темы:) А империалистические методы поиска алгоритма, так вообще радуют:)
Мое участие изначально было для наставления вас ( тебя в частности ) на путь истинный:) Но это вечная проблема, может когда нибудь просветление к вам придет:)
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Я ищу алгоритм, кторый выдаст мне траекторию полёта стрелы. Ты предложил 2 варианта: 1-ый ЦДА, 2-ой ты продвигаешь уже второй раз, не смотря на то, что я уже написал, что на сфере (в частности 56) стрела так не летает. При этом ты утверждаешь, что я не понимаю того, что твой 2-ой вариант - идеальное решение всех проблемм и стрела летит так, как ты скажешь.
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

Не пробовал от стрелы бегать?:)

Начнем с самого простого, понятие "траектория стрелы" - сервером не рассчитывается является только визуальным эффектом на стороне клиента. Сервером же рассчитывает ВОЗМОЖНОСТЬ из данной позиции поразить цель.

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

О понимании...
Достаточно маломальский ознакомится сферой и увидеть... что оказывается конфигом предусмотрен выбор экспериментального алгоритма:) Проведя реверс, вы заметите что он отличается от РанУО не значительно...

О заблуждении...
Что за бредовые попытки рассчитывать нечто не принимая во внимание исходные данные?:) Что бы ваши "алгоритмы" проверять нужно абсолютно чистое поле:) Вы даже не берете в расчет о существовании таких фундаментальных вещей как свойства объектов (флаги tiledata)... в некоторых конфигурациях стелы могут пролетать через окна:) не всякий предмет будет блокировать видимость, а еще у предметов есть высота:)

Легко выбрать тайлы которые надо проверить, а вот как проверять то будете?:)

И еще раз, у сеферы один алгоритм проверки, в 56б добавлен экспериментальный:)
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Grin wrote:Начнем с самого простого, понятие "траектория стрелы" - сервером не рассчитывается является только визуальным эффектом на стороне клиента. Сервером же рассчитывает ВОЗМОЖНОСТЬ из данной позиции поразить цель.

В нашем растровом пространстве это можно назвать траекторией полёта стелы. Ведь технически она полетит по тайлам
Grin wrote:Достаточно маломальский ознакомится сферой и увидеть... что оказывается конфигом предусмотрен выбор экспериментального алгоритма:) Проведя реверс, вы заметите что он отличается от РанУО не значительно...

Пошагово:
1)Скачал сферу 56b
2)Завёл
3)Поставил 2-ух чаров с луками и командами атаки друг на друга
4)3-им чаром начал обкладывать сундуками
5)Получил 3 разных комбинации расположения сундуков, при которых чары стреляли друг в друга
6)Накидал 3 картинки и запостил выше
Ни один из предложенных тобой алгоритмов не выдаёт хотя бы 1 похожий результат
Grin wrote:Что за бредовые попытки рассчитывать нечто не принимая во внимание исходные данные?:) Что бы ваши "алгоритмы" проверять нужно абсолютно чистое поле:) Вы даже не берете в расчет о существовании таких фундаментальных вещей как свойства объектов (флаги tiledata)... в некоторых конфигурациях стелы могут пролетать через окна:) не всякий предмет будет блокировать видимость, а еще у предметов есть высота:)

Выше я писал, что дело будет исключительно в лесу, ровном и без рек озёр и полян, на которых можно ставить дома. Да в чём-то ты прав... Вдруг кого-нибудь посетит мысль разбросать в глухом лесу сундуки или ящики.
Grin wrote:Легко выбрать тайлы которые надо проверить, а вот как проверять то будете?:)

Это уже другой разговор, но думаю, что в глухом лесу приватгеттайла и диапазона непроходимых тайлов будет достаточно.
Grin wrote:И еще раз, у сеферы один алгоритм проверки, в 56б добавлен экспериментальный:)

Видимо то что мне нужно и есть этот алгоритм. В каком конфиге? Как примерно строчка называется?
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

Code: Select all

sub Point.getDir( spoint, dpoint )
   var dx, dy
   var ax, ay
   var slope
   
   dx = spoint[0] - dpoint[0]
   dy = spoint[1] - dpoint[1]
   
   ax = Math.abs( dx )
   ay = Math.abs( dy )

   if ( ay <= ax ) then
      if ( not ay ) then
         if ( not ax ) then
            return UO.getDir()
         end if
         
         return iif( dx > 0, DIR_W, DIR_E )
      end if
         
      slope = int( ax / ay )
      if ( slope > 2 ) then
         return iif( dx > 0, DIR_W, DIR_E )
      end if
     
      if ( dy > 0 ) then   
         return iif( dx > 0, DIR_NW, DIR_NE )
      end if
     
      return iif( dx > 0, DIR_SW, DIR_SE )
   end if
   
   if ( ax ) then
      
      slope = int( ay / ax )
      if ( slope <= 2 ) then
       if ( dx <= 0 ) then
          return iif( dy <= 0, DIR_SE, DIR_NE )
       else
          return iif( dy > 0, DIR_NW, DIR_SW )
       end if
      end if
   end if
   return iif( dy > 0, DIR_N, DIR_S )
   
end sub


Отреверсил 56б, линия другая, но логика не особо изменилась. Это не экспериментальный, а уточненный из исходников 0.99 сферы, то есть алгоритм по умолчанию.

Алгоритм выбирается в sphere.ini

Code: Select all

// Uses the new LoS algorithm
// ADVANCEDLOS_DISABLED   0x00 // Disabled, use the old method
// ADVANCEDLOS_PLAYER     0x01 // Enabled only for players
// ADVANCEDLOS_NPC        0x02 // Enabled only for NPCs
AdvancedLos=0
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

в эксперементально алгоритме, все тоже самое что и в РаугнУО за исключением округления...

Правило округление 5\6, а не как принято 4\5 :mrgreen:

Вот тебе и траектория стрелы:) из этого положения стрелять не будет, хотя визуально проблем нет:)
Attachments
мертвая зона.jpg
мертвая зона.jpg (78.88 KiB) Viewed 5224 times
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

Проект умер?:(
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

Проект живее всех живых. Как Ильич. Я просто пытаюсь пересилить свою лень и все таки разобраться то что вы тут наобсуждали.
Image


А то я ниче ни понял.
Image
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Грин, а если перекрыть выделенные черным тайлы и убрать деревяшку снизу, будет стрелять? На скачанной мною сфере не стреляет так. Альтернативный лос выключен.
Image
Grin
Expert!
Posts: 2580
Joined: 2005-05-04 14:05:19
Location: Москва

Re: Проверка на проходимость

Post by Grin »

проверял на 51а

Опять таки не стоит забывать что, это алгоритм выборки тайлов, после выборки идет индивидуальная проверка каждого тайла на "прозрачность"...
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Ну вот сейчас задача именно придумать/украсть/найти алгоритм именно к 56-ой. Я тестил и обнаружил, что между двумя точками (0;0) (+2;+6) может быть больше, чем одна, разных "траектории". Уже даже не столько скрипт, как интерес как это реализовано подстегивает :roll:

Где достать сурсы на 56? На оффсайте поискал, но они по ходу дела не выкладывали.

Алгоритм можно составить так. Кол-во преломлений = либо дистанции по Х, либо по У в зависимости от того, какая из них меньше. А длина отрезка до преломления = Большая дистанция, деленая на меньшую. ЧТобы выдавать разные траектории, нужно вводить погрешность, разовую, чтобы 1 раз посчиталась...

ЗЫ Под пивом не объяснить нормально :mrgreen:
Tiger1989
Posts: 35
Joined: 2010-06-19 22:59:51

Re: Проверка на проходимость

Post by Tiger1989 »

Миссия невыполнима =)
CFA81
Posts: 6
Joined: 2011-10-17 12:43:40

Re: Проверка на проходимость

Post by CFA81 »

Разбирался с LoS на разных эмулях, вот результат изысканий - если эта тема еще интересна готов поделится наработками.
Attachments
spo.jpg
spo.jpg (149.15 KiB) Viewed 5019 times
spn-ruo.jpg
spn-ruo.jpg (149.31 KiB) Viewed 5019 times
pol.jpg
pol.jpg (149.2 KiB) Viewed 5019 times
Mirage
Posts: 2802
Joined: 2009-05-28 09:58:28
Location: Иваново
Contact:

Re: Проверка на проходимость

Post by Mirage »

выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.

а что за прога? Самописная?
ZeroDX
Posts: 718
Joined: 2006-12-08 10:51:50
Location: Москва
Contact:

Re: Проверка на проходимость

Post by ZeroDX »

Mirage wrote:выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.

Ссылка на пост с картинками
Поясню, что в этих трех вариантах, чары стоят на одном и том же месте. Стреляет только если на желтых клетках нет препятствий и только при таких раскладах. четвертого не дано.

Попробуй вбить в программку координаты А(2 2 z) B(4 8 z) и сравнить с картинками с этого же поста с картинками.

И хотелось бы поглядень на сам расчёт в виде кода (понимаю только инжект(бэйсик???) и немного С++), если это конечно не государственная тайна :roll:
Post Reply