#==============================================================================
# ** Modules.View Range (5.0) Â Â Â Â Â Â Â By Near Fantastica & SephirothSpawn
#------------------------------------------------------------------------------
# * Description :
#
# Â The View Range Module is used to test objects position in comparision with
# Â another object. It can test if an object is within a defined circular
# Â range of another object or a rectangular defined region. It can also tell
# Â you this distances between objects.
#------------------------------------------------------------------------------
# * Syntax :
#
# Â Test if object is within defined range from another object :
# Â Â - VR.in_range?(object1, object2, range)
# Â Â - VR.in_range?(object1x, object1y, object2x, object2y, range)
#
# Â Test if object is within defined rectanlge :
# Â Â - VR.in_rect_range?(object, <args>)
# Â Â - VR.in_rect_range?(x, y, <args>)
#
# Â Â args can either be : x, y, width, height or Rect.new(x, y, width, height)
#
# Â Test range between objects :
# Â Â - range = VR.range(object1, object2, <integer>)
# Â Â - range = VR.range(object1x, object1y, object2x, object2y, <integer>)
#
# Â Â integer : if true, returns integer ; if false, returns float
#==============================================================================
Â
MACL::Loaded << 'Modules.View Range'
Â
#==============================================================================
# ** View Range
#==============================================================================
Â
module VR
 #----------------------------------------------------------------------------
 # * Within Range Test
 #----------------------------------------------------------------------------
 def VR.in_range?(*args)
  # If 3 Arguments (Element, Object, Range)
  if args.size == 3
   x = (args[0].x - args[1].x) ** 2
   y = (args[0].y - args[1].y) ** 2
   r = args[2]
  # If 5 Arguments (Elementx, Elementy, Objectx, Objecty, Range)
  elsif args.size == 5
   x = (args[0] - args[2]) ** 2
   y = (args[1] - args[3]) ** 2
   r = args[4]
  else
   p 'Wrong Defined Number of Arguments'
   return
  end
  return (x + y) <= (r * r)
 end
 #----------------------------------------------------------------------------
 # * Within Rect Range Test
 #----------------------------------------------------------------------------
 def VR.in_rect_range?(*args)
  # If 2 Arguments (Object, Rect)
  if args.size == 2
   x_, y_ = args[0].x, args[0].y
   x, y, w, h = args[1].x, args[1].y, args[1].width, args[1].height
  # If 3 Arguments (Objectx, Objecty, Rect)
  elsif args.size == 3
   x_, y_ = args[0], args[1]
   x, y, w, h = args[2].x, args[2].y, args[2].width, args[2].height
  # If 5 Arguments (Object, Rectx, Recty, Rectwidth, Rectheight)
  elsif args.size == 5
   x_, y_ = args[0].x, args[0].y
   x, y, w, h = args[1], args[2], args[3], args[4]
  # If 6 Arguments (Objectx, Objecty, Rectx, Recty, Rectwidth, Rectheight)
  elsif args.size == 6
   x_, y_, x, y, w, h = *args
  else
   p 'Wrong Defined Number of Arguments'
   return
  end
  # Return Object Within Rect
  return x_.between?(x, x + w) && y_.between?(y, y + h)
 end
 #----------------------------------------------------------------------------
 # * Range
 #----------------------------------------------------------------------------
 def VR.range(*args)
  # If 2 Arguments (Element, Object)
  if args.size == 2
   x = (args[0].x - args[1].x) * (args[0].x - args[1].x)
   y = (args[0].y - args[1].y) * (args[0].y - args[1].y)
   integer = true
  # If 3 Arguments (Element, Object, Integer
  elsif args.size == 3
   x = (args[0].x - args[1].x) * (args[0].x - args[1].x)
   y = (args[0].y - args[1].y) * (args[0].y - args[1].y)
   integer = args[2]
  # If 4 Arguments (Elementx, Elementy, Objectx, Objecty)
  elsif args.size == 4
   x = (args[0] - args[2]) * (args[0] - args[2])
   y = (args[1] - args[3]) * (args[1] - args[3])
   integer = true
  # If 5 Arguments (Elementx, Elementy, Objectx, Objecty, integer)
  elsif args.size == 5
   x = (args[0] - args[2]) * (args[0] - args[2])
   y = (args[1] - args[3]) * (args[1] - args[3])
   integer = args[4]
  else
   p 'Wrong Defined Number of Arguments'
   return
  end
  r = Math.sqrt(x + y)
  return integer ? r.to_i : r
 end
end