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

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 9307 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 9102 times
spn-ruo.jpg
spn-ruo.jpg (149.31 KiB) Viewed 9102 times
pol.jpg
pol.jpg (149.2 KiB) Viewed 9102 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