Yoko

All sides of Injection
It is currently 2024-03-29 14:21:49

All times are UTC+02:00




Post new topic  Reply to topic  [ 118 posts ]  Go to page Previous 1 2 3 4 5 6 Next
Author Message
PostPosted: 2011-07-13 14:27:35 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Не подходит даже к fw, где углы простреливаются


Top
   
PostPosted: 2011-07-13 14:48:36 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Вроде наметился положительный результат.
Проблема связана с
startx = startx - 1
starty = starty - 1

startx = startx + 1
starty = starty + 1

Шахматисты есть? Над алгоритм "коня".

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-07-13 17:48:17 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Надо писать по другому алгоритму. Что-то вроде
Code:
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:
---ХХ
---Х-
--ХХ-
--Х--
-ХХ--
-Х---
ХХ---
Но только в теории и если обновлять dx и dy с каждым новым шагом


Top
   
PostPosted: 2011-07-13 19:15:23 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
и как можно утверждать не проверив или не въехав?:)
Code:
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() - визуальный пример


Top
   
PostPosted: 2011-07-14 04:22:53 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Ты вообще читаешь тему?


Top
   
PostPosted: 2011-07-14 05:51:03 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Конечно нет, содержание уже давно ушло от темы:) А империалистические методы поиска алгоритма, так вообще радуют:)
Мое участие изначально было для наставления вас ( тебя в частности ) на путь истинный:) Но это вечная проблема, может когда нибудь просветление к вам придет:)


Top
   
PostPosted: 2011-07-14 06:56:37 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Я ищу алгоритм, кторый выдаст мне траекторию полёта стрелы. Ты предложил 2 варианта: 1-ый ЦДА, 2-ой ты продвигаешь уже второй раз, не смотря на то, что я уже написал, что на сфере (в частности 56) стрела так не летает. При этом ты утверждаешь, что я не понимаю того, что твой 2-ой вариант - идеальное решение всех проблемм и стрела летит так, как ты скажешь.


Top
   
PostPosted: 2011-07-14 15:23:48 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Не пробовал от стрелы бегать?:)

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

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

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

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

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

И еще раз, у сеферы один алгоритм проверки, в 56б добавлен экспериментальный:)


Top
   
PostPosted: 2011-07-14 16:01:05 
Offline
User avatar

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

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

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

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

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

Видимо то что мне нужно и есть этот алгоритм. В каком конфиге? Как примерно строчка называется?


Top
   
PostPosted: 2011-07-14 17:51:30 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Code:
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:
// 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


Top
   
PostPosted: 2011-07-14 20:54:01 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
в эксперементально алгоритме, все тоже самое что и в РаугнУО за исключением округления...

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

Вот тебе и траектория стрелы:) из этого положения стрелять не будет, хотя визуально проблем нет:)


Attachments:
мертвая зона.jpg
мертвая зона.jpg [ 78.88 KiB | Viewed 4440 times ]
Top
   
PostPosted: 2011-07-17 14:11:13 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
Проект умер?:(


Top
   
PostPosted: 2011-07-17 21:07:50 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
Проект живее всех живых. Как Ильич. Я просто пытаюсь пересилить свою лень и все таки разобраться то что вы тут наобсуждали.
Image


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

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-07-19 19:32:41 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Грин, а если перекрыть выделенные черным тайлы и убрать деревяшку снизу, будет стрелять? На скачанной мною сфере не стреляет так. Альтернативный лос выключен.
Image


Top
   
PostPosted: 2011-07-20 09:09:44 
Offline
Expert!
User avatar

Joined: 2005-05-04 14:05:19
Posts: 2580
Location: Москва
проверял на 51а

Опять таки не стоит забывать что, это алгоритм выборки тайлов, после выборки идет индивидуальная проверка каждого тайла на "прозрачность"...


Top
   
PostPosted: 2011-07-20 13:46:59 
Offline
User avatar

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

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

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

ЗЫ Под пивом не объяснить нормально :mrgreen:


Top
   
PostPosted: 2011-08-29 20:10:36 
Offline

Joined: 2010-06-19 22:59:51
Posts: 35
Миссия невыполнима =)


Top
   
PostPosted: 2011-11-11 16:11:32 
Offline

Joined: 2011-10-17 12:43:40
Posts: 6
Разбирался с LoS на разных эмулях, вот результат изысканий - если эта тема еще интересна готов поделится наработками.


Attachments:
spo.jpg
spo.jpg [ 149.15 KiB | Viewed 4235 times ]
spn-ruo.jpg
spn-ruo.jpg [ 149.31 KiB | Viewed 4235 times ]
pol.jpg
pol.jpg [ 149.2 KiB | Viewed 4235 times ]
Top
   
PostPosted: 2011-11-11 23:15:24 
Offline
User avatar

Joined: 2009-05-28 09:58:28
Posts: 2802
Location: Иваново
выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.

а что за прога? Самописная?

_________________
Image
YokoInjection CodeSweeper
Ошибка "Unhandled exception in parser"
Стрелялка для олдов.


Top
   
PostPosted: 2011-11-12 00:02:59 
Offline
User avatar

Joined: 2006-12-08 10:51:50
Posts: 718
Location: Москва
Mirage wrote:
выше было тестовым методом установлено что такой вариант работать не будет - при 1 клетке по диагонали тайл не проходим на сфере.

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

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 118 posts ]  Go to page Previous 1 2 3 4 5 6 Next

All times are UTC+02:00


Who is online

Users browsing this forum: No registered users and 17 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited