Mothback/code/entities/fairy.lua
lustlion 6e76607030 bugfix and slide animation
- bugfix for hook swing not taking in consideration the length of rope
- bugfix for player hitbox size
- bugfix for fairy flight control system FCS
- added slide animation for wall slide and wall jump
2022-03-09 15:54:26 +01:00

117 lines
2.6 KiB
Lua

Fairy = Entity:new()
Fairy.type = "Fairy"
function Fairy:new(x,y)
local o = Entity:new(x,y)
-- 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 = 40
-- animations
o.body = Animation:new(animation.fairy.flying)
o:centerOffset(o.body)
o:createBox(o.body)
-- light
o.light_radius = 80
o.light = Light:new(o.pos.x,o.pos.y,o.light_radius,nil,hex2rgb("#fed100"))
-- timer
o.particle_timer = 0
o.particle_time = 5
o:id()
setmetatable(o, self)
self.__index = self
return o
end
function Fairy:doLogic()
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.pos.x,
self.pos.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.pos.x,
self.pos.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,
animation_speed = 1,
sprite_tint = hex2rgb("#fed100"),
sprite_alpha_fade = true,
direction = angle-math.rad(180+math.random(60)-30),
speed = 0.8*(distance/50),
speed_increase = -0.01,
time = 0.75
}
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:moveWithCollision()
self.vel.x = 0
self.vel.y = 0
self:adjustLight()
end
function Fairy:debug()
Entity.debug(self)
self:checkVisionLineDebug(main_player,self.vision_range)
end