Проверка на проходимость
Moderators: Murderator+, Murderator
Re: Проверка на проходимость
Не подходит даже к fw, где углы простреливаются
Re: Проверка на проходимость
Вроде наметился положительный результат.
Проблема связана с
startx = startx - 1
starty = starty - 1
startx = startx + 1
starty = starty + 1
Шахматисты есть? Над алгоритм "коня".
Проблема связана с
startx = startx - 1
starty = starty - 1
startx = startx + 1
starty = starty + 1
Шахматисты есть? Над алгоритм "коня".
Re: Проверка на проходимость
Надо писать по другому алгоритму. Что-то вродеНо и тут будут свои недостатки:
- Нужно будет "оттягивать" назад на 1 тайл стартовую позицию, чтобы счёт начался с правильного тайла(иначе сдвинется вперёд на 1 тайл)
- Скрипт буде шикарно работать с целым abs(dx) / abs(dy), но с дробями вечный цикл или парсер. Хотя с (+6;+4) должно получиться что-то вроде этого
Но только в теории и если обновлять dx и dy с каждым новым шагом
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
---ХХ
---Х-
--ХХ-
--Х--
-ХХ--
-Х---
ХХ---
Re: Проверка на проходимость
и как можно утверждать не проверив или не въехав?:)
test() - визуальный пример
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() - визуальный пример
Re: Проверка на проходимость
Ты вообще читаешь тему?
Re: Проверка на проходимость
Конечно нет, содержание уже давно ушло от темы:) А империалистические методы поиска алгоритма, так вообще радуют:)
Мое участие изначально было для наставления вас ( тебя в частности ) на путь истинный:) Но это вечная проблема, может когда нибудь просветление к вам придет:)
Мое участие изначально было для наставления вас ( тебя в частности ) на путь истинный:) Но это вечная проблема, может когда нибудь просветление к вам придет:)
Re: Проверка на проходимость
Я ищу алгоритм, кторый выдаст мне траекторию полёта стрелы. Ты предложил 2 варианта: 1-ый ЦДА, 2-ой ты продвигаешь уже второй раз, не смотря на то, что я уже написал, что на сфере (в частности 56) стрела так не летает. При этом ты утверждаешь, что я не понимаю того, что твой 2-ой вариант - идеальное решение всех проблемм и стрела летит так, как ты скажешь.
Re: Проверка на проходимость
Не пробовал от стрелы бегать?:)
Начнем с самого простого, понятие "траектория стрелы" - сервером не рассчитывается является только визуальным эффектом на стороне клиента. Сервером же рассчитывает ВОЗМОЖНОСТЬ из данной позиции поразить цель.
Почему так хорошо думать рационально? потому что это резко упрощает жизнь:)
Вы не явления природы пытаетесь описать, а уже реализованную, рабочую модель... Хреново когда эта модель не описана естественным языком, для этого есть реверс и общее понимание как эта модель работает... Но когда модель описана полностью или хотя бы частично... то что вы сейчас пытаетесь делать кроме как онанизмом не назвать:)
О понимании...
Достаточно маломальский ознакомится сферой и увидеть... что оказывается конфигом предусмотрен выбор экспериментального алгоритма:) Проведя реверс, вы заметите что он отличается от РанУО не значительно...
О заблуждении...
Что за бредовые попытки рассчитывать нечто не принимая во внимание исходные данные?:) Что бы ваши "алгоритмы" проверять нужно абсолютно чистое поле:) Вы даже не берете в расчет о существовании таких фундаментальных вещей как свойства объектов (флаги tiledata)... в некоторых конфигурациях стелы могут пролетать через окна:) не всякий предмет будет блокировать видимость, а еще у предметов есть высота:)
Легко выбрать тайлы которые надо проверить, а вот как проверять то будете?:)
И еще раз, у сеферы один алгоритм проверки, в 56б добавлен экспериментальный:)
Начнем с самого простого, понятие "траектория стрелы" - сервером не рассчитывается является только визуальным эффектом на стороне клиента. Сервером же рассчитывает ВОЗМОЖНОСТЬ из данной позиции поразить цель.
Почему так хорошо думать рационально? потому что это резко упрощает жизнь:)
Вы не явления природы пытаетесь описать, а уже реализованную, рабочую модель... Хреново когда эта модель не описана естественным языком, для этого есть реверс и общее понимание как эта модель работает... Но когда модель описана полностью или хотя бы частично... то что вы сейчас пытаетесь делать кроме как онанизмом не назвать:)
О понимании...
Достаточно маломальский ознакомится сферой и увидеть... что оказывается конфигом предусмотрен выбор экспериментального алгоритма:) Проведя реверс, вы заметите что он отличается от РанУО не значительно...
О заблуждении...
Что за бредовые попытки рассчитывать нечто не принимая во внимание исходные данные?:) Что бы ваши "алгоритмы" проверять нужно абсолютно чистое поле:) Вы даже не берете в расчет о существовании таких фундаментальных вещей как свойства объектов (флаги tiledata)... в некоторых конфигурациях стелы могут пролетать через окна:) не всякий предмет будет блокировать видимость, а еще у предметов есть высота:)
Легко выбрать тайлы которые надо проверить, а вот как проверять то будете?:)
И еще раз, у сеферы один алгоритм проверки, в 56б добавлен экспериментальный:)
Re: Проверка на проходимость
Grin wrote:Начнем с самого простого, понятие "траектория стрелы" - сервером не рассчитывается является только визуальным эффектом на стороне клиента. Сервером же рассчитывает ВОЗМОЖНОСТЬ из данной позиции поразить цель.
В нашем растровом пространстве это можно назвать траекторией полёта стелы. Ведь технически она полетит по тайлам
Grin wrote:Достаточно маломальский ознакомится сферой и увидеть... что оказывается конфигом предусмотрен выбор экспериментального алгоритма:) Проведя реверс, вы заметите что он отличается от РанУО не значительно...
Пошагово:
1)Скачал сферу 56b
2)Завёл
3)Поставил 2-ух чаров с луками и командами атаки друг на друга
4)3-им чаром начал обкладывать сундуками
5)Получил 3 разных комбинации расположения сундуков, при которых чары стреляли друг в друга
6)Накидал 3 картинки и запостил выше
Ни один из предложенных тобой алгоритмов не выдаёт хотя бы 1 похожий результат
Grin wrote:Что за бредовые попытки рассчитывать нечто не принимая во внимание исходные данные?:) Что бы ваши "алгоритмы" проверять нужно абсолютно чистое поле:) Вы даже не берете в расчет о существовании таких фундаментальных вещей как свойства объектов (флаги tiledata)... в некоторых конфигурациях стелы могут пролетать через окна:) не всякий предмет будет блокировать видимость, а еще у предметов есть высота:)
Выше я писал, что дело будет исключительно в лесу, ровном и без рек озёр и полян, на которых можно ставить дома. Да в чём-то ты прав... Вдруг кого-нибудь посетит мысль разбросать в глухом лесу сундуки или ящики.
Grin wrote:Легко выбрать тайлы которые надо проверить, а вот как проверять то будете?:)
Это уже другой разговор, но думаю, что в глухом лесу приватгеттайла и диапазона непроходимых тайлов будет достаточно.
Grin wrote:И еще раз, у сеферы один алгоритм проверки, в 56б добавлен экспериментальный:)
Видимо то что мне нужно и есть этот алгоритм. В каком конфиге? Как примерно строчка называется?
Re: Проверка на проходимость
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
Re: Проверка на проходимость
в эксперементально алгоритме, все тоже самое что и в РаугнУО за исключением округления...
Правило округление 5\6, а не как принято 4\5
Вот тебе и траектория стрелы:) из этого положения стрелять не будет, хотя визуально проблем нет:)
Правило округление 5\6, а не как принято 4\5

Вот тебе и траектория стрелы:) из этого положения стрелять не будет, хотя визуально проблем нет:)
- Attachments
-
- мертвая зона.jpg (78.88 KiB) Viewed 5223 times
Re: Проверка на проходимость
Проект умер?:(
Re: Проверка на проходимость
Проект живее всех живых. Как Ильич. Я просто пытаюсь пересилить свою лень и все таки разобраться то что вы тут наобсуждали.

А то я ниче ни понял.


А то я ниче ни понял.

Re: Проверка на проходимость
проверял на 51а
Опять таки не стоит забывать что, это алгоритм выборки тайлов, после выборки идет индивидуальная проверка каждого тайла на "прозрачность"...
Опять таки не стоит забывать что, это алгоритм выборки тайлов, после выборки идет индивидуальная проверка каждого тайла на "прозрачность"...
Re: Проверка на проходимость
Ну вот сейчас задача именно придумать/украсть/найти алгоритм именно к 56-ой. Я тестил и обнаружил, что между двумя точками (0;0) (+2;+6) может быть больше, чем одна, разных "траектории". Уже даже не столько скрипт, как интерес как это реализовано подстегивает
Где достать сурсы на 56? На оффсайте поискал, но они по ходу дела не выкладывали.
Алгоритм можно составить так. Кол-во преломлений = либо дистанции по Х, либо по У в зависимости от того, какая из них меньше. А длина отрезка до преломления = Большая дистанция, деленая на меньшую. ЧТобы выдавать разные траектории, нужно вводить погрешность, разовую, чтобы 1 раз посчиталась...
ЗЫ Под пивом не объяснить нормально

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

Re: Проверка на проходимость
Миссия невыполнима =)
Re: Проверка на проходимость
Разбирался с LoS на разных эмулях, вот результат изысканий - если эта тема еще интересна готов поделится наработками.
- Attachments
-
- spo.jpg (149.15 KiB) Viewed 5018 times
-
- spn-ruo.jpg (149.31 KiB) Viewed 5018 times
-
- pol.jpg (149.2 KiB) Viewed 5018 times
Re: Проверка на проходимость
выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.
а что за прога? Самописная?
а что за прога? Самописная?
Re: Проверка на проходимость
Mirage wrote:выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.
Ссылка на пост с картинками
Поясню, что в этих трех вариантах, чары стоят на одном и том же месте. Стреляет только если на желтых клетках нет препятствий и только при таких раскладах. четвертого не дано.
Попробуй вбить в программку координаты А(2 2 z) B(4 8 z) и сравнить с картинками с этого же поста с картинками.
И хотелось бы поглядень на сам расчёт в виде кода (понимаю только инжект(бэйсик???) и немного С++), если это конечно не государственная тайна
