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 = Light:New(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