Balatro/card_character.lua
2024-02-27 23:47:25 +08:00

165 lines
5.2 KiB
Lua

--class
Card_Character = Moveable:extend()
--class methods
function Card_Character:init(args)
Moveable.init(self,args.x or 1, args.y or 1, args.w or G.CARD_W*1.1, args.h or G.CARD_H*1.1)
self.states.collide.can = false
self.children = {}
self.config = {args = args}
self.children.card = Card(self.T.x, self.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, args.center or G.P_CENTERS.j_joker, {bypass_discovery_center = true})
self.children.card.states.visible = false
self.children.card:start_materialize({G.C.BLUE, G.C.WHITE, G.C.RED})
self.children.card:set_alignment{
major = self, type = 'cm', offset = {x=0, y=0}
}
self.children.card.jimbo = self
self.children.card.states.collide.can = true
self.children.card.states.focus.can = false
self.children.card.states.hover.can = true
self.children.card.states.drag.can = false
self.children.card.hover = Node.hover
self.children.particles = Particles(0, 0, 0,0, {
timer = 0.03,
scale = 0.3,
speed = 1.2,
lifespan = 2,
attach = self,
colours = {G.C.RED, G.C.BLUE, G.C.ORANGE},
fill = true
})
self.children.particles.static_rotation = true
self.children.particles:set_role{
role_type = 'Minor',
xy_bond = 'Weak',
r_bond = 'Strong',
major = self,
}
if getmetatable(self) == Card_Character then
table.insert(G.I.CARD, self)
end
end
function Card_Character:move(dt)
Moveable.move(self, dt)
end
function Card_Character:hard_set_VT()
self:align_to_major()
Moveable.hard_set_VT(self)
self:align()
self.children.card:hard_set_VT()
end
function Card_Character:align()
if self.children.card then
self.children.card.T.x = self.T.x + (self.T.w - self.children.card.T.w)/2
self.children.card.T.y = self.T.y + (self.T.h - self.children.card.T.h)/2
end
end
function Card_Character:add_button(button, func, colour, update_func, snap_to, yoff)
if self.children.button then self.children.button:remove() end
self.config.button_align = {align="bm", offset = {x=0,y=yoff or 0.3},major = self, parent = self}
self.children.button = UIBox{
definition = create_UIBox_character_button({button = button, func = func, colour = colour, update_func = update_func, maxw = 3}),
config = self.config.button_align
}
if snap_to then G.CONTROLLER:snap_to{node = self.children.button} end
end
function Card_Character:add_speech_bubble(text_key, align, loc_vars)
if self.children.speech_bubble then self.children.speech_bubble:remove() end
self.config.speech_bubble_align = {align=align or 'bm', offset = {x=0,y=0},parent = self}
self.children.speech_bubble =
UIBox{
definition = G.UIDEF.speech_bubble(text_key, loc_vars),
config = self.config.speech_bubble_align
}
self.children.speech_bubble:set_role{
role_type = 'Minor',
xy_bond = 'Weak',
r_bond = 'Strong',
major = self,
}
self.children.speech_bubble.states.visible = false
end
function Card_Character:remove_button()
if self.children.button then self.children.button:remove(); self.children.button = nil end
end
function Card_Character:remove_speech_bubble()
if self.children.speech_bubble then self.children.speech_bubble:remove(); self.children.speech_bubble = nil end
end
function Card_Character:say_stuff(n, not_first)
self.talking = true
if not not_first then
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.1,
func = function()
if self.children.speech_bubble then self.children.speech_bubble.states.visible = true end
self:say_stuff(n, true)
return true
end
}))
else
if n <= 0 then self.talking = false; return end
local new_said = math.random(1, 11)
while new_said == self.last_said do
new_said = math.random(1, 11)
end
self.last_said = new_said
play_sound('voice'..math.random(1, 11), G.SPEEDFACTOR*(math.random()*0.2+1), 0.5)
self.children.card:juice_up()
G.E_MANAGER:add_event(Event({
trigger = 'after',
blockable = false, blocking = false,
delay = 0.13,
func = function()
self:say_stuff(n-1, true)
return true
end
}), 'tutorial')
end
end
function Card_Character:draw(dt)
if self.highlight then
self.children.highlight:draw()
self.highlight:draw()
if self.highlight.draw_children then self.highlight:draw_children() end
end
if self.children.particles then
self.children.particles:draw()
end
if self.children.speech_bubble then
self.children.speech_bubble:draw()
end
if self.children.button and not self.talking then
self.children.button:draw()
end
if self.children.card then
self.children.card:draw()
end
add_to_drawhash(self)
self:draw_boundingrect()
end
function Card_Character:remove()
G.jimboed = nil
remove_all(self.children)
for k, v in pairs(G.I.CARD) do
if v == self then
table.remove(G.I.CARD, k)
end
end
Moveable.remove(self)
end