и как можно утверждать не проверив или не въехав?:)
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() - визуальный пример