Fairy = Entity:New(x,y)

 function Fairy:New(x,y)
 	local o = Entity:New(x,y)

  o.type = "fairy"

  -- behaviour
 	o.pos = {x = x, y = y}
  o.speed = 1.4
  o.range = 20
  o.vision_range = 120
  o.target = {x = x, y = y}
  o.hover_distance = 60

  -- animations
  o.body = Animation:New(animation.fairy.flying)
  o:centerOffset(o.body)
  o:getBoundingBox(o.body)

  -- light
  o.light_range = 80
  o.light = CreateLight(o.pos.x,o.pos.y,o.light_range,nil,HEX2RGB("#fed100"))

  -- timer
  o.particle_timer = 0
  o.particle_time = 5

  table.insert(LoadedObjects.Entities,o)
  o.id = #LoadedObjects.Entities

 	setmetatable(o, self)
 	self.__index = self
 	return o
 end

function Fairy:Smart()

  if self:CheckVisionLine(main_Player,self.vision_range) then

    self.target.x = main_Player.pos.x + main_Player.target_offset.x
    self.target.y = main_Player.pos.y + main_Player.target_offset.y

    local below = 1
    while not isThereObjectAt(
      self.target.x,
      self.target.y + below * game.scale,
      LoadedObjects.Collisions
    ) do
      below = below + 1
      if below >= self.hover_distance then break end
    end
    local top = 1
    while not isThereObjectAt(
      self.target.x,
      self.target.y - top * game.scale,
      LoadedObjects.Collisions
    ) do
      top = top + 1
      if top >= self.hover_distance then break end
    end
    self.target.y = self.target.y - top + below
  end

  local distance_x = self.target.x - self.pos.x
  local distance_y = self.target.y - self.pos.y
  local angle = GetAngleFromVector(distance_x,distance_y)
  local distance = math.sqrt(distance_x ^ 2 + distance_y ^ 2)

  if distance < self.range then
    self.vel.x = self.vel.x * 0.9
    self.vel.y = self.vel.y * 0.9
  else
    self.vel.x = math.cos(angle)*self.speed
    self.vel.y = math.sin(angle)*self.speed
  end
  self.particle_timer = self.particle_timer + 1
  if self.particle_timer >= self.particle_time then
    self.particle_timer = 0

    local particle_data = {
      animation = animation.particle.simple,
      sprite_tint = HEX2RGB("#fed100"),
      direction = angle-math.rad(180+math.random(60)-30),
      speed = 0.8*(distance/50),
      speed_increase = -0.01,
    }
    Particle:New(self.pos.x,self.pos.y,particle_data)
  end
end

function Fairy:HandleAnimation()
  self.body:Animate()
  --if self:isCollidingWith(main_Player) then self.sprite_tint = {1,0,0} else self.sprite_tint = {1,1,1} end
  self:Draw(self.body)
end

function Fairy:DoPhysics()
  local random_x = math.random(-4, 4)/10
  local random_y = math.random(-4, 4)/10

  self.vel.x = self.vel.x + random_x
  self.vel.y = self.vel.y + random_y

  self:CollisionMove()
  self.vel.x = 0
  self.vel.y = 0

  self:LightAdjust()
end

function Fairy:Debug()
  Entity.Debug(self)
  self:CheckVisionLineDebug(main_Player,self.vision_range)
end
