Files
2026-10-13 13:22:39 -04:00

137 lines
4.5 KiB
Lua

FailAnimation = {}
FailAnimation.__index = FailAnimation
-- Lumen action_result/fail: the pair of bachio fade in, slide apart, tumble
-- (rotating 30 deg) to the sides, drop and land lying down with a squash.
-- Bachio textures are 152x160; BOOM_GAP is the distance between the two puffs.
local W, H = 152, 160
local BOOM_GAP = 254
local TEXT_W, TEXT_H = 336, 88
-- resting offset (from the in pose top-left) once the bachio lie down
local LYING_X, LYING_Y = -192, -4
function FailAnimation.new(is_2p)
local self = setmetatable({}, FailAnimation)
self.is_2p = is_2p
self.idx = is_2p and 1 or 0
self.name = "in"
self.frame = 0
local function anim(id) return tex.get_animation(id, "game") end
self.bachio_fade_in = anim(46)
self.pose_in = anim(78)
self.pose_fall = anim(79)
self.slide = anim(80)
self.tumble_x = anim(81)
self.tumble_y = anim(82)
self.drop = anim(83)
self.tilt = anim(84)
self.squash_in = anim(85)
self.squash_out = anim(86)
self.boom_fade_in = anim(87)
self.boom_fade_out = anim(88)
self.boom_scale = anim(89)
self.text_fade_in = anim(90)
self.wobble_tilt = anim(91)
self.wobble_x = anim(92)
self.wobble_y = anim(93)
self.anims = {
self.bachio_fade_in, self.pose_in, self.pose_fall, self.slide, self.tumble_x,
self.tumble_y, self.drop, self.tilt, self.squash_in, self.squash_out,
self.boom_fade_in, self.boom_fade_out, self.boom_scale, self.text_fade_in,
self.wobble_tilt, self.wobble_x, self.wobble_y,
}
for _, a in ipairs(self.anims) do a:start() end
audio.play_sound("fail", "sound")
self.t_fail = tex.get_texture("game/ending_anim/fail")
self.t_bachio_boom = tex.get_texture("game/ending_anim/bachio_boom")
self.t_bachio_l_in = tex.get_texture("game/ending_anim/bachio_l_in")
self.t_bachio_l_fall = tex.get_texture("game/ending_anim/bachio_l_fall")
self.t_bachio_r_in = tex.get_texture("game/ending_anim/bachio_r_in")
self.t_bachio_r_fall = tex.get_texture("game/ending_anim/bachio_r_fall")
return self
end
function FailAnimation:update(current_ms)
for _, a in ipairs(self.anims) do a:update(current_ms) end
if self.pose_in.is_finished then
self.name = "fall"
self.frame = math.floor(self.pose_fall.attribute)
else
self.frame = math.floor(self.pose_in.attribute)
end
end
-- side is -1 (left) or 1 (right); the right bachio mirrors the left one
function FailAnimation:draw_bachio(side)
local falling = self.name == "fall"
local t
if side < 0 then
t = falling and self.t_bachio_l_fall or self.t_bachio_l_in
else
t = falling and self.t_bachio_r_fall or self.t_bachio_r_in
end
local dx, dy, rotation, squash = self.slide.attribute, 0, 0, 0
if falling then
if self.frame == 0 then
dx = self.tumble_x.attribute
dy = self.tumble_y.attribute + self.drop.attribute
rotation = self.tilt.attribute
else
dx, dy = LYING_X, LYING_Y
squash = self.squash_in.attribute - self.squash_out.attribute
end
end
-- the lying pose squashes down onto its bottom edge
local params = {
frame = self.frame,
x = -side * dx,
y = dy + squash,
y2 = -squash,
fade = self.bachio_fade_in.attribute,
index = self.idx,
}
if rotation ~= 0 then
params.rotation = -side * rotation
-- raylib puts the origin point at x, y: add it back to keep the top-left
params.origin = { W / 2, H / 2 }
params.x = params.x + W / 2
params.y = params.y + H / 2
end
tex.draw_texture(t, params)
end
function FailAnimation:draw()
-- after the hold the text tilts 4 deg about its centre and settles 10 px lower
tex.draw_texture(self.t_fail, {
fade = self.text_fade_in.attribute,
index = self.idx,
x = self.wobble_x.attribute + TEXT_W / 2,
y = self.wobble_y.attribute + TEXT_H / 2,
rotation = self.wobble_tilt.attribute,
origin = { TEXT_W / 2, TEXT_H / 2 },
})
self:draw_bachio(-1)
self:draw_bachio(1)
local boom_fade = math.min(self.boom_fade_in.attribute, self.boom_fade_out.attribute)
for i = 0, 1 do
tex.draw_texture(self.t_bachio_boom, {
x = i * BOOM_GAP,
scale = self.boom_scale.attribute,
center = true,
fade = boom_fade,
index = self.idx,
})
end
end