116 lines
2.6 KiB
Lua
116 lines
2.6 KiB
Lua
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
|