Files
Balatro/functions/UI_definitions.lua
2025-03-04 18:04:04 +08:00

6437 lines
342 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

--Create a global UIDEF that contains all UI definition functions\
--As a rule, these contain functions that return a table T representing the definition for a UIBox
G.UIDEF = {}
function create_UIBox_debug_tools()
G.debug_tool_config = G.debug_tool_config or {}
G.FUNCS.DT_add_money = function() if G.STAGE == G.STAGES.RUN then ease_dollars(10) end end
G.FUNCS.DT_add_round = function() if G.STAGE == G.STAGES.RUN then ease_round(1) end end
G.FUNCS.DT_add_ante = function() if G.STAGE == G.STAGES.RUN then ease_ante(1) end end
G.FUNCS.DT_add_hand = function() if G.STAGE == G.STAGES.RUN then ease_hands_played(1) end end
G.FUNCS.DT_add_discard = function() if G.STAGE == G.STAGES.RUN then ease_discard(1) end end
G.FUNCS.DT_reroll_boss = function() if G.STAGE == G.STAGES.RUN and G.blind_select_opts then G.from_boss_tag = true; G.FUNCS.reroll_boss(); G.from_boss_tag = nil end end
G.FUNCS.DT_toggle_background = function() G.debug_background_toggle = not G.debug_background_toggle end
G.FUNCS.DT_add_chips = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {chips = 10 + G.GAME.current_round.current_hand.chips}); play_sound('chips1') end end
G.FUNCS.DT_add_mult = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 10 + G.GAME.current_round.current_hand.mult}); play_sound('multhit1') end end
G.FUNCS.DT_x_chips = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {chips = 2*G.GAME.current_round.current_hand.chips}); play_sound('chips1') end end
G.FUNCS.DT_x_mult = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 10*G.GAME.current_round.current_hand.mult}); play_sound('multhit2') end end
G.FUNCS.DT_chip_mult_reset = function() if G.STAGE == G.STAGES.RUN then update_hand_text({delay = 0}, {mult = 0, chips = 0}) end end
G.FUNCS.DT_win_game = function() if G.STAGE == G.STAGES.RUN then win_game() end end
G.FUNCS.DT_lose_game = function() if G.STAGE == G.STAGES.RUN then G.STATE = G.STATES.GAME_OVER; G.STATE_COMPLETE = false end end
G.FUNCS.DT_jimbo_toggle = function()
if G.DT_jimbo then
if G.DT_jimbo.children.particles.states.visible then
if G.DT_jimbo.children.card.states.visible then
G.DT_jimbo.children.card.states.visible = false
else
G.DT_jimbo.children.card.states.visible = true
G.DT_jimbo.children.particles.states.visible = false
end
else
G.DT_jimbo:remove()
G.DT_jimbo = nil
if G.SPLASH_LOGO then
G.SPLASH_LOGO.states.visible = true
if G.title_top and G.title_top.cards[1] then G.title_top.cards[1].states.visible = true end
end
end
else
if G.SPLASH_LOGO then
G.SPLASH_LOGO.states.visible = false
if G.title_top and G.title_top.cards[1] then G.title_top.cards[1].states.visible = false end
end
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.4,
blockable = false,
func = function()
G.DT_jimbo = Card_Character({x = G.ROOM.T.w/2,y = G.ROOM.T.h/2})
G.DT_jimbo:set_alignment{
major = G.ROOM_ATTACH,
type = 'cm'
}
return true
end
}))
end end
G.FUNCS.DT_jimbo_talk = function()
if G.DT_jimbo then
G.DT_jimbo:add_speech_bubble({
" ",
" ",
" ",
}, 'cr')
G.DT_jimbo:say_stuff(4) end
end
local t = {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1}, nodes={
UIBox_dyn_container({
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "While in collection, hover over a card", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "and press the following keys:", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.T, config={text = "[1] Unlock", scale = 0.25, colour = G.C.WHITE}}
}},
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.T, config={text = "[2] Discover", scale = 0.25, colour = G.C.WHITE}}
}},
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLUE, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.T, config={text = "[3] Spawn", scale = 0.25, colour = G.C.WHITE}}
}}
}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "Hover over any Joker/Playing card", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "and press [Q] to cycle Edition", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "Press [H] to isolate background", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "Press [J] to play splash animation", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "Press [8] to toggle cursor", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = "Press [9] to toggle all tooltips", scale = 0.25, colour = G.C.WHITE, shadow = true}}
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={
UIBox_button{ label = {"$10"}, button = "DT_add_money", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"+1 Round"}, button = "DT_add_round", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"+1 Ante"}, button = "DT_add_ante", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"+1 Hand"}, button = "DT_add_hand", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"+1 Discard"}, button = "DT_add_discard", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Boss Reroll"}, button = "DT_reroll_boss", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Background"}, button = "DT_toggle_background", minw = 1.7, minh = 0.4, scale = 0.35},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={
UIBox_button{ label = {"+10 chips"}, button = "DT_add_chips", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"+10 mult"}, button = "DT_add_mult", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"X2 chips"}, button = "DT_x_chips", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"X10 mult"}, button = "DT_x_mult", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Win this Run"}, button = "DT_win_game", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Lose this Run"}, button = "DT_lose_game", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Reset"}, button = "DT_chip_mult_reset", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Jimbo"}, button = "DT_jimbo_toggle", minw = 1.7, minh = 0.4, scale = 0.35},
UIBox_button{ label = {"Jimbo talk"}, button = "DT_jimbo_talk", minw = 1.7, minh = 0.4, scale = 0.35},
}}
}}
}, true)
}}
return t
end
function create_UIBox_notify_alert(_achievement, _type)
local _c, _atlas = G.P_CENTERS[_achievement],
_type == 'Joker' and G.ASSET_ATLAS["Joker"] or
_type == 'Voucher' and G.ASSET_ATLAS["Voucher"] or
_type == 'Back' and G.ASSET_ATLAS["centers"] or
G.ASSET_ATLAS["icons"]
local t_s = Sprite(0,0,1.5*(_atlas.px/_atlas.py),1.5,_atlas, _c and _c.pos or {x=3, y=0})
t_s.states.drag.can = false
t_s.states.hover.can = false
t_s.states.collide.can = false
local subtext = _type == 'achievement' and localize(G.F_TROPHIES and 'k_trophy' or 'k_achievement') or
_type == 'Joker' and localize('k_joker') or
_type == 'Voucher' and localize('k_voucher') or
_type == 'Back' and localize('k_deck') or 'ERROR'
if _achievement == 'b_challenge' then subtext = localize('k_challenges') end
local name = _type == 'achievement' and localize(_achievement, 'achievement_names') or 'ERROR'
local t = {n=G.UIT.ROOT, config = {align = 'cl', r = 0.1, padding = 0.06, colour = G.C.UI.TRANSPARENT_DARK}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0.2, minw = 20, r = 0.1, colour = G.C.BLACK, outline = 1.5, outline_colour = G.C.GREY}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1}, nodes={
{n=G.UIT.O, config={object = t_s}},
}},
_type ~= 'achievement' and {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={
{n=G.UIT.T, config={text = subtext, scale = 0.5, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={
{n=G.UIT.T, config={text = localize('k_unlocked_ex'), scale = 0.35, colour = G.C.FILTER, shadow = true}},
}}
}}
or {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 3.4, padding = 0.1}, nodes={
{n=G.UIT.T, config={text = name, scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={
{n=G.UIT.T, config={text = subtext, scale = 0.3, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", maxw = 3.4}, nodes={
{n=G.UIT.T, config={text = localize('k_unlocked_ex'), scale = 0.35, colour = G.C.FILTER, shadow = true}},
}}
}}
}}
}}
}}
return t
end
function create_UIBox_online_high_scores()
G.HTTP_MANAGER.out_channel:push({get_score = true})
local padding, col, minw = 0.05, G.C.UI.TRANSPARENT_DARK, 0
local t = {n=G.UIT.ROOT, config = {align = 'cm', minw=minw, r = 0.1, colour = col, padding = padding}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK}, nodes={
}}
}}
return t
end
function create_UIBox_high_scores_filling(_resp)
local scores = {}
_resp = assert(loadstring(_resp))()
if not _resp then
return {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1, colour = G.C.L_BLACK, padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 1.3}, nodes={
{n=G.UIT.T, config={text = 'ERROR', scale = 0.9, colour = G.C.RED, shadow = true}},
}}
}}
end
for i = 1, 6 do
local v = _resp[i] or {username = '-'}
v.score = v.score and math.floor(v.score) or nil
local name_col = v.username == (G.SETTINGS.COMP and G.SETTINGS.COMP.name or nil) and G.C.FILTER or G.C.WHITE
scores[#scores+1] = {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cl", padding = 0, minw = 0.3}, nodes={
{n=G.UIT.T, config={text = i..'.', scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.C, config={align = "cl", padding = 0, minw = 1.7, maxw = 1.6}, nodes={
{n=G.UIT.T, config={text = (v.username), scale = math.min(0.6, 8*0.56/v.username:len()), colour = v.score and name_col or G.C.UI.TRANSPARENT_LIGHT, shadow = true}}
}},
{n=G.UIT.C, config={align = "cl", minh = 0.8, r = 0.1, minw = 2.5, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 2.6}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {type(v.score) == 'number' and number_format(v.score) or ''}, colours = {G.C.RED},shadow = true, float = true,maxw = 2.5, scale = math.min(0.75, score_number_scale(1.5, v.score))})}},
}},
}},
}},
}}
end
return {n=G.UIT.ROOT, config = {align = 'cm', r = 0.1, colour = G.C.L_BLACK, padding = 0.05}, nodes=scores}
end
function G.UIDEF.use_and_sell_buttons(card)
local sell = nil
local use = nil
if card.area and card.area.config.type == 'joker' then
sell = {n=G.UIT.C, config={align = "cr"}, nodes={
{n=G.UIT.C, config={ref_table = card, align = "cr",padding = 0.1, r=0.08, minw = 1.25, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'sell_card', func = 'can_sell_card'}, nodes={
{n=G.UIT.B, config = {w=0.1,h=0.6}},
{n=G.UIT.C, config={align = "tm"}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 1.25}, nodes={
{n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}},
{n=G.UIT.T, config={ref_table = card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}}
}}
}}
}},
}}
end
if card.ability.consumeable then
if (card.area == G.pack_cards and G.pack_cards) then
return {
n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={mid = true}, nodes={
}},
{n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, minh = 0.8*card.T.h, maxw = 0.7*card.T.w - 0.15, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_use_consumeable'}, nodes={
{n=G.UIT.T, config={text = localize('b_use'),colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}}
}},
}}
end
use =
{n=G.UIT.C, config={align = "cr"}, nodes={
{n=G.UIT.C, config={ref_table = card, align = "cr",maxw = 1.25, padding = 0.1, r=0.08, minw = 1.25, minh = (card.area and card.area.config.type == 'joker') and 0 or 1, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_use_consumeable'}, nodes={
{n=G.UIT.B, config = {w=0.1,h=0.6}},
{n=G.UIT.T, config={text = localize('b_use'),colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}}
}}
}}
elseif card.area and card.area == G.pack_cards then
return {
n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={ref_table = card, r = 0.08, padding = 0.1, align = "bm", minw = 0.5*card.T.w - 0.15, maxw = 0.9*card.T.w - 0.15, minh = 0.3*card.T.h, hover = true, shadow = true, colour = G.C.UI.BACKGROUND_INACTIVE, one_press = true, button = 'use_card', func = 'can_select_card'}, nodes={
{n=G.UIT.T, config={text = localize('b_select'),colour = G.C.UI.TEXT_LIGHT, scale = 0.45, shadow = true}}
}},
}}
end
local t = {
n=G.UIT.ROOT, config = {padding = 0, colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={padding = 0.15, align = 'cl'}, nodes={
{n=G.UIT.R, config={align = 'cl'}, nodes={
sell
}},
{n=G.UIT.R, config={align = 'cl'}, nodes={
use
}},
}},
}}
return t
end
function G.UIDEF.card_focus_ui(card)
local card_width = card.T.w + (card.ability.consumeable and -0.1 or card.ability.set == 'Voucher' and -0.16 or 0)
local playing_card_colour = copy_table(G.C.WHITE)
playing_card_colour[4] = 1.5
if G.hand and card.area == G.hand then ease_value(playing_card_colour, 4, -1.5, nil, 'REAL',nil, 0.2, 'quad') end
local tcnx, tcny = card.T.x + card.T.w/2 - G.ROOM.T.w/2, card.T.y + card.T.h/2 - G.ROOM.T.h/2
local base_background = UIBox{
T = {card.VT.x,card.VT.y,0,0},
definition =
(not G.hand or card.area ~= G.hand) and {n=G.UIT.ROOT, config = {align = 'cm', minw = card_width + 0.3, minh = card.T.h + 0.3, r = 0.1, colour = adjust_alpha(G.C.BLACK, 0.7), outline_colour = lighten(G.C.JOKER_GREY, 0.5), outline = 1.5, line_emboss = 0.8}, nodes={
{n=G.UIT.R, config={id = 'ATTACH_TO_ME'}, nodes={}}
}} or
{n=G.UIT.ROOT, config = {align = 'cm', minw = card_width, minh = card.T.h, r = 0.1, colour = playing_card_colour}, nodes={
{n=G.UIT.R, config={id = 'ATTACH_TO_ME'}, nodes={}}
}},
config = {
align = 'cm',
offset = {x= 0.007*tcnx*card.T.w, y = 0.007*tcny*card.T.h},
parent = card,
r_bond = (not G.hand or card.area ~= G.hand) and 'Weak' or 'Strong'
}
}
base_background.set_alignment = function()
local cnx, cny = card.T.x + card.T.w/2 - G.ROOM.T.w/2, card.T.y + card.T.h/2 - G.ROOM.T.h/2
Moveable.set_alignment(card.children.focused_ui, {offset = {x= 0.007*cnx*card.T.w, y = 0.007*cny*card.T.h}})
end
local base_attach = base_background:get_UIE_by_ID('ATTACH_TO_ME')
--The card UI can have BUY, REDEEM, USE, and SELL buttons depending on the context of the card
if card.area == G.shop_jokers and G.shop_jokers then --Add a buy button
local buy_and_use = nil
if card.ability.consumeable then
base_attach.children.buy_and_use = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'buy_and_use',
func = 'can_buy_and_use', button = 'buy_from_shop', card_width = card_width
}
buy_and_use = true
end
base_attach.children.buy = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'buy',
func = 'can_buy', button = 'buy_from_shop', card_width = card_width, buy_and_use = buy_and_use
}
end
if card.area == G.shop_vouchers and G.shop_vouchers then --Add a redeem button
base_attach.children.redeem = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'buy',
func = 'can_redeem', button = 'redeem_from_shop', card_width = card_width
}
end
if card.area == G.shop_booster and G.shop_booster then --Add a redeem button
base_attach.children.redeem = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'buy',
func = 'can_open', button = 'open_booster', card_width = card_width*0.85
}
end
if ((card.area == G.consumeables and G.consumeables) or (card.area == G.pack_cards and G.pack_cards)) and
card.ability.consumeable then --Add a use button
base_attach.children.use = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'use',
func = 'can_use_consumeable', button = 'use_card', card_width = card_width
}
end
if (card.area == G.pack_cards and G.pack_cards) and not card.ability.consumeable then --Add a use button
base_attach.children.use = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'select',
func = 'can_select_card', button = 'use_card', card_width = card_width
}
end
if (card.area == G.jokers and G.jokers or card.area == G.consumeables and G.consumeables) and G.STATE ~= G.STATES.TUTORIAL then --Add a sell button
base_attach.children.sell = G.UIDEF.card_focus_button{
card = card, parent = base_attach, type = 'sell',
func = 'can_sell_card', button = 'sell_card', card_width = card_width
}
end
return base_background
end
function G.UIDEF.card_focus_button(args)
if not args then return end
local button_contents = {}
if args.type == 'sell' then
button_contents =
{n=G.UIT.C, config={align = "cl"}, nodes={
{n=G.UIT.R, config={align = "cl", maxw = 1}, nodes={
{n=G.UIT.T, config={text = localize('b_sell'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}}
}},
{n=G.UIT.R, config={align = "cl"}, nodes={
{n=G.UIT.T, config={text = localize('$'),colour = G.C.WHITE, scale = 0.4, shadow = true}},
{n=G.UIT.T, config={ref_table = args.card, ref_value = 'sell_cost_label',colour = G.C.WHITE, scale = 0.55, shadow = true}}
}}
}}
elseif args.type == 'buy' then
button_contents = {n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}}
elseif args.type == 'select' then
button_contents = {n=G.UIT.T, config={text = localize('b_select'),colour = G.C.WHITE, scale = 0.3}}
elseif args.type == 'redeem' then
button_contents = {n=G.UIT.T, config={text = localize('b_redeem'),colour = G.C.WHITE, scale = 0.5}}
elseif args.type == 'use' then
button_contents = {n=G.UIT.T, config={text = localize('b_use'),colour = G.C.WHITE, scale = 0.5}}
elseif args.type == 'buy_and_use' then
button_contents =
{n=G.UIT.C, config={align = "cr"}, nodes={
{n=G.UIT.R, config={align = "cr", maxw = 1}, nodes={
{n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.UI.TEXT_LIGHT, scale = 0.4, shadow = true}}
}},
{n=G.UIT.R, config={align = "cr", maxw = 1}, nodes={
{n=G.UIT.T, config={text = localize('b_and_use'),colour = G.C.WHITE, scale = 0.3, shadow = true}},
}}
}}
end
return UIBox{
T = {args.card.VT.x,args.card.VT.y,0,0},
definition =
{n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={id = args.type == 'buy_and_use' and 'buy_and_use' or nil, ref_table = args.card, ref_parent = args.parent, align = args.type == 'sell' and 'cl' or 'cr', colour = G.C.BLACK, shadow = true, r = 0.08, func = args.func, one_press = true, button = args.button, focus_args = {type = 'none'}, hover = true}, nodes={
{n=G.UIT.R, config={align = args.type == 'sell' and 'cl' or 'cr', minw = 1 + (args.type == 'select' and 0.1 or 0), minh = args.type == 'sell' and 1.5 or 1, padding = 0.08,
focus_args = {button = args.type == 'sell' and 'leftshoulder' or args.type == 'buy_and_use' and 'leftshoulder' or 'rightshoulder', scale = 0.55, orientation = args.type == 'sell' and 'tli' or 'tri', offset = {x = args.type == 'sell' and 0.1 or -0.1, y = 0}, type = 'none'},
func = 'set_button_pip'}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}},
{n=G.UIT.R, config={align = "cm"}, nodes={
args.type ~= 'sell' and {n=G.UIT.C, config={align = "cm",minw = 0.2, minh = 0.6}, nodes={}} or nil,
{n=G.UIT.C, config={align = "cm", maxw = 1}, nodes={
button_contents
}},
args.type == 'sell' and {n=G.UIT.C, config={align = "cm",minw = 0.2, minh = 0.6}, nodes={}} or nil,
}}
}}
}}
}},
config = {
align = args.type == 'sell' and 'cl' or 'cr',
offset = {x=(args.type == 'sell' and -1 or 1)*((args.card_width or 0) - 0.17 - args.card.T.w/2),y=args.type == 'buy_and_use' and 0.6 or (args.buy_and_use) and -0.6 or 0},
parent = args.parent,
}
}
end
function G.UIDEF.speech_bubble(text_key, loc_vars)
local text = {}
if loc_vars and loc_vars.quip then
localize{type = 'quips', key = text_key or 'lq_1', vars = loc_vars or {}, nodes = text}
else
localize{type = 'tutorial', key = text_key or 'sb_1', vars = loc_vars or {}, nodes = text}
end
local row = {}
for k, v in ipairs(text) do
row[#row+1] = {n=G.UIT.R, config={align = "cl"}, nodes=v}
end
local t = {n=G.UIT.ROOT, config = {align = "cm", minh = 1,r = 0.3, padding = 0.07, minw = 1, colour = G.C.JOKER_GREY, shadow = true}, nodes={
{n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.1, minw = 1, colour = G.C.WHITE}, nodes={
{n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.03, minw = 1, colour = G.C.WHITE}, nodes=row}}
}
}}
return t
end
function create_UIBox_highlight(rect)
local t = {n=G.UIT.ROOT, config = {align = "cm", minh = rect.T.h+0.1, minw = rect.T.w+0.15, r = 0.15, colour = G.C.DARK_EDITION}, nodes={
}}
return t
end
function G.UIDEF.deck_preview(args)
local _minh, _minw = 0.35, 0.5
local suit_labels = {}
local suit_counts = {
Spades = 0,
Hearts = 0,
Clubs = 0,
Diamonds = 0
}
local mod_suit_counts = {
Spades = 0,
Hearts = 0,
Clubs = 0,
Diamonds = 0
}
local mod_suit_diff = false
local wheel_flipped, wheel_flipped_text = 0, nil
local flip_col = G.C.WHITE
local rank_counts = {}
local deck_tables = {}
remove_nils(G.playing_cards)
table.sort(G.playing_cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end )
local SUITS = {
Spades = {},
Hearts = {},
Clubs = {},
Diamonds = {},
}
for k, v in pairs(SUITS) do
for i = 1, 14 do
SUITS[k][#SUITS[k]+1] = {}
end
end
local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}
local stones = nil
local rank_name_mapping = {'A','K','Q','J','10',9,8,7,6,5,4,3,2}
for k, v in ipairs(G.playing_cards) do
if v.ability.effect == 'Stone Card' then
stones = stones or 0
end
if (v.area and v.area == G.deck) or v.ability.wheel_flipped then
if v.ability.wheel_flipped then wheel_flipped = wheel_flipped + 1 end
if v.ability.effect == 'Stone Card' then
stones = stones + 1
else
for kk, vv in pairs(suit_counts) do
if v.base.suit == kk then suit_counts[kk] = suit_counts[kk] + 1 end
if v:is_suit(kk) then mod_suit_counts[kk] = mod_suit_counts[kk] + 1 end
end
if SUITS[v.base.suit][v.base.id] then
table.insert(SUITS[v.base.suit][v.base.id], v)
end
rank_counts[v.base.id] = (rank_counts[v.base.id] or 0) + 1
end
end
end
wheel_flipped_text = (wheel_flipped > 0) and {n=G.UIT.T, config={text = '?',colour = G.C.FILTER, scale =0.25, shadow = true}} or nil
flip_col = wheel_flipped_text and mix_colours(G.C.FILTER, G.C.WHITE,0.7) or G.C.WHITE
suit_labels[#suit_labels+1] = {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, minw = _minw, minh = 2*_minh+0.25}, nodes={
stones and {n=G.UIT.T, config={text = localize('ph_deck_preview_stones')..': ',colour = G.C.WHITE, scale =0.25, shadow = true}}
or nil,
stones and {n=G.UIT.T, config={text = ''..stones,colour = (stones > 0 and G.C.WHITE or G.C.UI.TRANSPARENT_LIGHT), scale =0.4, shadow = true}}
or nil,
}}
local _row = {}
local _bg_col = G.C.JOKER_GREY
for k, v in ipairs(rank_name_mapping) do
local _tscale = 0.3
local _colour = G.C.BLACK
local rank_col = v == 'A' and _bg_col or (v == 'K' or v == 'Q' or v == 'J') and G.C.WHITE or _bg_col
rank_col = mix_colours(rank_col, _bg_col, 0.8)
local _col = {n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", r = 0.1, minw = _minw, minh = _minh, colour = rank_col, emboss = 0.04, padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = ''..v,colour = _colour, scale =1.6*_tscale}},
}},
{n=G.UIT.R, config={align = "cm", minw = _minw+0.04, minh = _minh, colour = G.C.L_BLACK, r = 0.1}, nodes={
{n=G.UIT.T, config={text = ''..(rank_counts[15 - k] or 0),colour = flip_col, scale =_tscale, shadow = true}}
}}
}}
}}
table.insert(_row, _col)
end
table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes=_row})
for j = 1, 4 do
_row = {}
_bg_col = mix_colours(G.C.SUITS[suit_map[j]], G.C.L_BLACK, 0.7)
for i = 14, 2, -1 do
local _tscale = #SUITS[suit_map[j]][i] > 0 and 0.3 or 0.25
local _colour = #SUITS[suit_map[j]][i] > 0 and flip_col or G.C.UI.TRANSPARENT_LIGHT
local _col = {n=G.UIT.C, config={align = "cm",padding = 0.05, minw = _minw+0.098, minh = _minh}, nodes={
{n=G.UIT.T, config={text = ''..#SUITS[suit_map[j]][i],colour = _colour, scale =_tscale, shadow = true, lang = G.LANGUAGES['en-us']}},
}}
table.insert(_row, _col)
end
table.insert(deck_tables, {n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, minh = 0.4, colour = _bg_col}, nodes=_row})
end
for k, v in ipairs(suit_map) do
local _x = (v == 'Spades' and 3) or (v == 'Hearts' and 0) or (v == 'Clubs' and 2) or (v == 'Diamonds' and 1)
local t_s = Sprite(0,0,0.3,0.3,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=_x, y=1})
t_s.states.drag.can = false
t_s.states.hover.can = false
t_s.states.collide.can = false
if mod_suit_counts[v] ~= suit_counts[v] then mod_suit_diff = true end
suit_labels[#suit_labels+1] =
{n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.03, colour = G.C.JOKER_GREY}, nodes={
{n=G.UIT.C, config={align = "cm", minw = _minw, minh = _minh}, nodes={
{n=G.UIT.O, config={can_collide = false, object = t_s}}
}},
{n=G.UIT.C, config={align = "cm", minw = _minw*2.4, minh = _minh, colour = G.C.L_BLACK, r = 0.1}, nodes={
{n=G.UIT.T, config={text = ''..suit_counts[v],colour = flip_col, scale =0.3, shadow = true, lang = G.LANGUAGES['en-us']}},
mod_suit_counts[v] ~= suit_counts[v] and {n=G.UIT.T, config={text = ' ('..mod_suit_counts[v]..')',colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7), scale =0.28, shadow = true, lang = G.LANGUAGES['en-us']}} or nil,
}}
}}
end
local t =
{n=G.UIT.ROOT, config={align = "cm", colour = G.C.JOKER_GREY, r = 0.1, emboss = 0.05, padding = 0.07}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, emboss = 0.05, colour = G.C.BLACK, padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.04}, nodes=suit_labels},
{n=G.UIT.C, config={align = "cm", padding = 0.02}, nodes=deck_tables}
}},
mod_suit_diff and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}},
{n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}},
}} or nil,
wheel_flipped_text and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = flip_col}, nodes = {}},
{n=G.UIT.T, config={text =' '..(wheel_flipped > 1 and
localize{type = 'variable', key = 'deck_preview_wheel_plural', vars = {wheel_flipped}} or
localize{type = 'variable', key = 'deck_preview_wheel_singular', vars = {wheel_flipped}}),colour = G.C.WHITE, scale =0.3}},
}} or nil,
}}
}}
return t
end
function create_UIBox_character_button(args)
local button = args.button or "NONE"
local func = args.func or nil
local colour = args.colour or G.C.RED
local update_func = args.update_func or nil
local t = {n=G.UIT.ROOT, config = {align = "cm", padding = 0.1, colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={align = "tm", minw = 1.9, padding = 0.2, minh = 1.2, r = 0.1, hover = true, colour = colour, button = func, func = update_func, shadow = true, maxw = args.maxw}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = button, scale = 0.55, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'x', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}},
}}
return t
end
function G.UIDEF.shop()
G.shop_jokers = CardArea(
G.hand.T.x+0,
G.hand.T.y+G.ROOM.T.y + 9,
G.GAME.shop.joker_max*1.02*G.CARD_W,
1.05*G.CARD_H,
{card_limit = G.GAME.shop.joker_max, type = 'shop', highlight_limit = 1})
G.shop_vouchers = CardArea(
G.hand.T.x+0,
G.hand.T.y+G.ROOM.T.y + 9,
2.1*G.CARD_W,
1.05*G.CARD_H,
{card_limit = 1, type = 'shop', highlight_limit = 1})
G.shop_booster = CardArea(
G.hand.T.x+0,
G.hand.T.y+G.ROOM.T.y + 9,
2.4*G.CARD_W,
1.15*G.CARD_H,
{card_limit = 2, type = 'shop', highlight_limit = 1, card_w = 1.27*G.CARD_W})
local shop_sign = AnimatedSprite(0,0, 4.4, 2.2, G.ANIMATION_ATLAS['shop_sign'])
shop_sign:define_draw_steps({
{shader = 'dissolve', shadow_height = 0.05},
{shader = 'dissolve'}
})
G.SHOP_SIGN = UIBox{
definition =
{n=G.UIT.ROOT, config = {colour = G.C.DYN_UI.MAIN, emboss = 0.05, align = 'cm', r = 0.1, padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, minw = 4.72, minh = 3.1, colour = G.C.DYN_UI.DARK, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = shop_sign}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_improve_run')}, colours = {lighten(G.C.GOLD, 0.3)},shadow = true, rotate = true, float = true, bump = true, scale = 0.5, spacing = 1, pop_in = 1.5, maxw = 4.3})}}
}},
}},
}},
config = {
align="cm",
offset = {x=0,y=-15},
major = G.HUD:get_UIE_by_ID('row_blind'),
bond = 'Weak'
}
}
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = (function()
G.SHOP_SIGN.alignment.offset.y = 0
return true
end)
}))
local t = {n=G.UIT.ROOT, config = {align = 'cl', colour = G.C.CLEAR}, nodes={
UIBox_dyn_container({
{n=G.UIT.C, config={align = "cm", padding = 0.1, emboss = 0.05, r = 0.1, colour = G.C.DYN_UI.BOSS_MAIN}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.R,config={id = 'next_round_button', align = "cm", minw = 2.8, minh = 1.5, r=0.15,colour = G.C.RED, one_press = true, button = 'toggle_shop', hover = true,shadow = true}, nodes = {
{n=G.UIT.R, config={align = "cm", padding = 0.07, focus_args = {button = 'y', orientation = 'cr'}, func = 'set_button_pip'}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={
{n=G.UIT.T, config={text = localize('b_next_round_1'), scale = 0.4, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={
{n=G.UIT.T, config={text = localize('b_next_round_2'), scale = 0.4, colour = G.C.WHITE, shadow = true}}
}}
}},
}},
{n=G.UIT.R, config={align = "cm", minw = 2.8, minh = 1.6, r=0.15,colour = G.C.GREEN, button = 'reroll_shop', func = 'can_reroll', hover = true,shadow = true}, nodes = {
{n=G.UIT.R, config={align = "cm", padding = 0.07, focus_args = {button = 'x', orientation = 'cr'}, func = 'set_button_pip'}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 1.3}, nodes={
{n=G.UIT.T, config={text = localize('k_reroll'), scale = 0.4, colour = G.C.WHITE, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", maxw = 1.3, minw = 1}, nodes={
{n=G.UIT.T, config={text = localize('$'), scale = 0.7, colour = G.C.WHITE, shadow = true}},
{n=G.UIT.T, config={ref_table = G.GAME.current_round, ref_value = 'reroll_cost', scale = 0.75, colour = G.C.WHITE, shadow = true}},
}}
}}
}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.2, r=0.2, colour = G.C.L_BLACK, emboss = 0.05, minw = 8.2}, nodes={
{n=G.UIT.O, config={object = G.shop_jokers}},
}},
}},
{n=G.UIT.R, config={align = "cm", minh = 0.2}, nodes={}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.15, r=0.2, colour = G.C.L_BLACK, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.2, r=0.2, colour = G.C.BLACK, maxh = G.shop_vouchers.T.h+0.4}, nodes={
{n=G.UIT.T, config={text = localize{type = 'variable', key = 'ante_x_voucher', vars = {G.GAME.round_resets.ante}}, scale = 0.45, colour = G.C.L_BLACK, vert = true}},
{n=G.UIT.O, config={object = G.shop_vouchers}},
}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.15, r=0.2, colour = G.C.L_BLACK, emboss = 0.05}, nodes={
{n=G.UIT.O, config={object = G.shop_booster}},
}},
}}
}
},
}, false)
}}
return t
end
function create_card_for_shop(area)
if area == G.shop_jokers and G.SETTINGS.tutorial_progress and G.SETTINGS.tutorial_progress.forced_shop and G.SETTINGS.tutorial_progress.forced_shop[#G.SETTINGS.tutorial_progress.forced_shop] then
local t = G.SETTINGS.tutorial_progress.forced_shop
local _center = G.P_CENTERS[t[#t]] or G.P_CENTERS.c_empress
local card = Card(area.T.x + area.T.w/2, area.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, _center, {bypass_discovery_center = true, bypass_discovery_ui = true})
t[#t] = nil
if not t[1] then G.SETTINGS.tutorial_progress.forced_shop = nil end
create_shop_card_ui(card)
return card
else
local forced_tag = nil
for k, v in ipairs(G.GAME.tags) do
if not forced_tag then
forced_tag = v:apply_to_run({type = 'store_joker_create', area = area})
if forced_tag then
for kk, vv in ipairs(G.GAME.tags) do
if vv:apply_to_run({type = 'store_joker_modify', card = forced_tag}) then break end
end
return forced_tag end
end
end
G.GAME.spectral_rate = G.GAME.spectral_rate or 0
local total_rate = G.GAME.joker_rate + G.GAME.tarot_rate + G.GAME.planet_rate + G.GAME.playing_card_rate + G.GAME.spectral_rate
local polled_rate = pseudorandom(pseudoseed('cdt'..G.GAME.round_resets.ante))*total_rate
local check_rate = 0
for _, v in ipairs({
{type = 'Joker', val = G.GAME.joker_rate},
{type = 'Tarot', val = G.GAME.tarot_rate},
{type = 'Planet', val = G.GAME.planet_rate},
{type = (G.GAME.used_vouchers["v_illusion"] and pseudorandom(pseudoseed('illusion')) > 0.6) and 'Enhanced' or 'Base', val = G.GAME.playing_card_rate},
{type = 'Spectral', val = G.GAME.spectral_rate},
}) do
if polled_rate > check_rate and polled_rate <= check_rate + v.val then
local card = create_card(v.type, area, nil, nil, nil, nil, nil, 'sho')
create_shop_card_ui(card, v.type, area)
G.E_MANAGER:add_event(Event({
func = (function()
for k, v in ipairs(G.GAME.tags) do
if v:apply_to_run({type = 'store_joker_modify', card = card}) then break end
end
return true
end)
}))
if (v.type == 'Base' or v.type == 'Enhanced') and G.GAME.used_vouchers["v_illusion"] and pseudorandom(pseudoseed('illusion')) > 0.8 then
local edition_poll = pseudorandom(pseudoseed('illusion'))
local edition = {}
if edition_poll > 1 - 0.15 then edition.polychrome = true
elseif edition_poll > 0.5 then edition.holo = true
else edition.foil = true
end
card:set_edition(edition)
end
return card
end
check_rate = check_rate + v.val
end
end
end
function create_shop_card_ui(card, type, area)
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0.43,
blocking = false,
blockable = false,
func = (function()
if card.opening then return true end
local t1 = {
n=G.UIT.ROOT, config = {minw = 0.6, align = 'tm', colour = darken(G.C.BLACK, 0.2), shadow = true, r = 0.05, padding = 0.05, minh = 1}, nodes={
{n=G.UIT.R, config={align = "cm", colour = lighten(G.C.BLACK, 0.1), r = 0.1, minw = 1, minh = 0.55, emboss = 0.05, padding = 0.03}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{prefix = localize('$'), ref_table = card, ref_value = 'cost'}}, colours = {G.C.MONEY},shadow = true, silent = true, bump = true, pop_in = 0, scale = 0.5})}},
}}
}}
local t2 = card.ability.set == 'Voucher' and {
n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GREEN, shadow = true, r = 0.08, minh = 0.94, func = 'can_redeem', one_press = true, button = 'redeem_from_shop', hover = true}, nodes={
{n=G.UIT.T, config={text = localize('b_redeem'),colour = G.C.WHITE, scale = 0.4}}
}} or card.ability.set == 'Booster' and {
n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GREEN, shadow = true, r = 0.08, minh = 0.94, func = 'can_open', one_press = true, button = 'open_booster', hover = true}, nodes={
{n=G.UIT.T, config={text = localize('b_open'),colour = G.C.WHITE, scale = 0.5}}
}} or {
n=G.UIT.ROOT, config = {ref_table = card, minw = 1.1, maxw = 1.3, padding = 0.1, align = 'bm', colour = G.C.GOLD, shadow = true, r = 0.08, minh = 0.94, func = 'can_buy', one_press = true, button = 'buy_from_shop', hover = true}, nodes={
{n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}}
}}
local t3 = {
n=G.UIT.ROOT, config = {id = 'buy_and_use', ref_table = card, minh = 1.1, padding = 0.1, align = 'cr', colour = G.C.RED, shadow = true, r = 0.08, minw = 1.1, func = 'can_buy_and_use', one_press = true, button = 'buy_from_shop', hover = true, focus_args = {type = 'none'}}, nodes={
{n=G.UIT.B, config = {w=0.1,h=0.6}},
{n=G.UIT.C, config = {align = 'cm'}, nodes={
{n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={
{n=G.UIT.T, config={text = localize('b_buy'),colour = G.C.WHITE, scale = 0.5}}
}},
{n=G.UIT.R, config = {align = 'cm', maxw = 1}, nodes={
{n=G.UIT.T, config={text = localize('b_and_use'),colour = G.C.WHITE, scale = 0.3}}
}},
}}
}}
card.children.price = UIBox{
definition = t1,
config = {
align="tm",
offset = {x=0,y=1.5},
major = card,
bond = 'Weak',
parent = card
}
}
card.children.buy_button = UIBox{
definition = t2,
config = {
align="bm",
offset = {x=0,y=-0.3},
major = card,
bond = 'Weak',
parent = card
}
}
if card.ability.consumeable then --and card:can_use_consumeable(true, true)
card.children.buy_and_use_button = UIBox{
definition = t3,
config = {
align="cr",
offset = {x=-0.3,y=0},
major = card,
bond = 'Weak',
parent = card
}
}
end
card.children.price.alignment.offset.y = card.ability.set == 'Booster' and 0.5 or 0.38
return true
end)
}))
end
function attention_text(args)
args = args or {}
args.text = args.text or 'test'
args.scale = args.scale or 1
args.colour = copy_table(args.colour or G.C.WHITE)
args.hold = (args.hold or 0) + 0.1*(G.SPEEDFACTOR)
args.pos = args.pos or {x = 0, y = 0}
args.align = args.align or 'cm'
args.emboss = args.emboss or nil
args.fade = 1
if args.cover then
args.cover_colour = copy_table(args.cover_colour or G.C.RED)
args.cover_colour_l = copy_table(lighten(args.cover_colour, 0.2))
args.cover_colour_d = copy_table(darken(args.cover_colour, 0.2))
else
args.cover_colour = copy_table(G.C.CLEAR)
end
args.uibox_config = {
align = args.align or 'cm',
offset = args.offset or {x=0,y=0},
major = args.cover or args.major or nil,
}
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 0,
blockable = false,
blocking = false,
func = function()
args.AT = UIBox{
T = {args.pos.x,args.pos.y,0,0},
definition =
{n=G.UIT.ROOT, config = {align = args.cover_align or 'cm', minw = (args.cover and args.cover.T.w or 0.001) + (args.cover_padding or 0), minh = (args.cover and args.cover.T.h or 0.001) + (args.cover_padding or 0), padding = 0.03, r = 0.1, emboss = args.emboss, colour = args.cover_colour}, nodes={
{n=G.UIT.O, config={draw_layer = 1, object = DynaText({scale = args.scale, string = args.text, maxw = args.maxw, colours = {args.colour},float = true, shadow = true, silent = not args.noisy, args.scale, pop_in = 0, pop_in_rate = 6, rotate = args.rotate or nil})}},
}},
config = args.uibox_config
}
args.AT.attention_text = true
args.text = args.AT.UIRoot.children[1].config.object
args.text:pulse(0.5)
if args.cover then
Particles(args.pos.x,args.pos.y, 0,0, {
timer_type = 'TOTAL',
timer = 0.01,
pulse_max = 15,
max = 0,
scale = 0.3,
vel_variation = 0.2,
padding = 0.1,
fill=true,
lifespan = 0.5,
speed = 2.5,
attach = args.AT.UIRoot,
colours = {args.cover_colour, args.cover_colour_l, args.cover_colour_d},
})
end
if args.backdrop_colour then
args.backdrop_colour = copy_table(args.backdrop_colour)
Particles(args.pos.x,args.pos.y,0,0,{
timer_type = 'TOTAL',
timer = 5,
scale = 2.4*(args.backdrop_scale or 1),
lifespan = 5,
speed = 0,
attach = args.AT,
colours = {args.backdrop_colour}
})
end
return true
end
}))
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = args.hold,
blockable = false,
blocking = false,
func = function()
if not args.start_time then
args.start_time = G.TIMERS.TOTAL
args.text:pop_out(3)
else
--args.AT:align_to_attach()
args.fade = math.max(0, 1 - 3*(G.TIMERS.TOTAL - args.start_time))
if args.cover_colour then args.cover_colour[4] = math.min(args.cover_colour[4], 2*args.fade) end
if args.cover_colour_l then args.cover_colour_l[4] = math.min(args.cover_colour_l[4], args.fade) end
if args.cover_colour_d then args.cover_colour_d[4] = math.min(args.cover_colour_d[4], args.fade) end
if args.backdrop_colour then args.backdrop_colour[4] = math.min(args.backdrop_colour[4], args.fade) end
args.colour[4] = math.min(args.colour[4], args.fade)
if args.fade <= 0 then
args.AT:remove()
return true
end
end
end
}))
end
function create_UIBox_buttons()
local text_scale = 0.45
local button_height = 1.3
local play_button = {n=G.UIT.C, config={id = 'play_button', align = "tm", minw = 2.5, padding = 0.3, r = 0.1, hover = true, colour = G.C.BLUE, button = "play_cards_from_highlighted", one_press = true, shadow = true, func = 'can_play'}, nodes={
{n=G.UIT.R, config={align = "bcm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize('b_play_hand'), scale = text_scale, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'x', orientation = 'bm'}, func = 'set_button_pip'}}
}},
}}
local discard_button = {n=G.UIT.C, config={id = 'discard_button',align = "tm", padding = 0.3, r = 0.1, minw = 2.5, minh = button_height, hover = true, colour = G.C.RED, button = "discard_cards_from_highlighted", one_press = true, shadow = true, func = 'can_discard'}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize('b_discard'), scale = text_scale, colour = G.C.UI.TEXT_LIGHT, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}}
local t = {
n=G.UIT.ROOT, config = {align = "cm", minw = 1, minh = 0.3,padding = 0.15, r = 0.1, colour = G.C.CLEAR}, nodes={
G.SETTINGS.play_button_pos == 1 and discard_button or play_button,
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour =G.C.UI.TRANSPARENT_DARK, outline = 1.5, outline_colour = mix_colours(G.C.WHITE,G.C.JOKER_GREY, 0.7), line_emboss = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize('b_sort_hand'), scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", minh = 0.7, minw = 0.9, padding = 0.1, r = 0.1, hover = true, colour =G.C.ORANGE, button = "sort_hand_value", shadow = true}, nodes={
{n=G.UIT.T, config={text = localize('k_rank'), scale = text_scale*0.7, colour = G.C.UI.TEXT_LIGHT}}
}},
{n=G.UIT.C, config={align = "cm", minh = 0.7, minw = 0.9, padding = 0.1, r = 0.1, hover = true, colour =G.C.ORANGE, button = "sort_hand_suit", shadow = true}, nodes={
{n=G.UIT.T, config={text = localize('k_suit'), scale = text_scale*0.7, colour = G.C.UI.TEXT_LIGHT}}
}}
}}
}}
}},
G.SETTINGS.play_button_pos == 1 and play_button or discard_button,
}
}
return t
end
function desc_from_rows(desc_nodes, empty, maxw)
local t = {}
for k, v in ipairs(desc_nodes) do
t[#t+1] = {n=G.UIT.R, config={align = "cm", maxw = maxw}, nodes=v}
end
return {n=G.UIT.R, config={align = "cm", colour = empty and G.C.CLEAR or G.C.UI.BACKGROUND_WHITE, r = 0.1, padding = 0.04, minw = 2, minh = 0.8, emboss = not empty and 0.05 or nil, filler = true}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t}
}}
end
function transparent_multiline_text(desc_nodes)
local t = {}
for k, v in ipairs(desc_nodes) do
t[#t+1] = {n=G.UIT.R, config={align = "cm", maxw = maxw}, nodes=v}
end
return {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t}
end
function info_tip_from_rows(desc_nodes, name)
local t = {}
for k, v in ipairs(desc_nodes) do
t[#t+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v}
end
return {n=G.UIT.R, config={align = "cm", colour = lighten(G.C.GREY, 0.15), r = 0.1}, nodes={
{n=G.UIT.R, config={align = "tm", minh = 0.36, padding = 0.03}, nodes={{n=G.UIT.T, config={text = name, scale = 0.32, colour = G.C.UI.TEXT_LIGHT}}}},
{n=G.UIT.R, config={align = "cm", minw = 1.5, minh = 0.4, r = 0.1, padding = 0.05, colour = G.C.WHITE}, nodes={{n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=t}}}
}}
end
function overlay_infotip(text_rows)
local t = {}
if type(text_rows) ~= 'table' then text_rows = {"ERROR"} end
for k, v in ipairs(text_rows) do
t[#t+1] = {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = v,colour = G.C.UI.TEXT_LIGHT, scale = 0.45, juice = true, shadow = true, lang = text_rows.lang}}
}}
end
return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, padding = 0.1}, nodes=t}
end
function name_from_rows(name_nodes, background_colour)
if not name_nodes or (type(name_nodes) ~= 'table') or not next(name_nodes) then return end
return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = background_colour, emboss = background_colour and 0.05 or nil}, nodes=name_nodes}
end
function G.UIDEF.card_h_popup(card)
if card.ability_UIBox_table then
local AUT = card.ability_UIBox_table
local debuffed = card.debuff
local card_type_colour = get_type_colour(card.config.center or card.config, card)
local card_type_background =
(AUT.card_type == 'Locked' and G.C.BLACK) or
((AUT.card_type == 'Undiscovered') and darken(G.C.JOKER_GREY, 0.3)) or
(AUT.card_type == 'Enhanced' or AUT.card_type == 'Default') and darken(G.C.BLACK, 0.1) or
(debuffed and darken(G.C.BLACK, 0.1)) or
(card_type_colour and darken(G.C.BLACK, 0.1)) or
G.C.SET[AUT.card_type] or
{0, 1, 1, 1}
local outer_padding = 0.05
local card_type = localize('k_'..string.lower(AUT.card_type))
if AUT.card_type == 'Joker' or (AUT.badges and AUT.badges.force_rarity) then card_type = ({localize('k_common'), localize('k_uncommon'), localize('k_rare'), localize('k_legendary')})[card.config.center.rarity] end
if AUT.card_type == 'Enhanced' then card_type = localize{type = 'name_text', key = card.config.center.key, set = 'Enhanced'} end
card_type = (debuffed and AUT.card_type ~= 'Enhanced') and localize('k_debuffed') or card_type
local disp_type, is_playing_card =
(AUT.card_type ~= 'Locked' and AUT.card_type ~= 'Undiscovered' and AUT.card_type ~= 'Default') or debuffed,
AUT.card_type == 'Enhanced' or AUT.card_type == 'Default'
local info_boxes = {}
local badges = {}
if AUT.badges.card_type or AUT.badges.force_rarity then
badges[#badges + 1] = create_badge(((card.ability.name == 'Pluto' or card.ability.name == 'Ceres' or card.ability.name == 'Eris') and localize('k_dwarf_planet')) or (card.ability.name == 'Planet X' and localize('k_planet_q') or card_type),card_type_colour, nil, 1.2)
end
if AUT.badges then
for k, v in ipairs(AUT.badges) do
if v == 'negative_consumable' then v = 'negative' end
badges[#badges + 1] = create_badge(localize(v, "labels"), get_badge_colour(v))
end
end
if AUT.info then
for k, v in ipairs(AUT.info) do
info_boxes[#info_boxes+1] =
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, padding = 0.05, emboss = 0.05}, nodes={
info_tip_from_rows(v, v.name),
}}
}}
end
end
return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={align = "cm", func = 'show_infotip',object = Moveable(),ref_table = next(info_boxes) and info_boxes or nil}, nodes={
{n=G.UIT.R, config={padding = outer_padding, r = 0.12, colour = lighten(G.C.JOKER_GREY, 0.5), emboss = 0.07}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, colour = adjust_alpha(card_type_background, 0.8)}, nodes={
name_from_rows(AUT.name, is_playing_card and G.C.WHITE or nil),
desc_from_rows(AUT.main),
badges[1] and {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes=badges} or nil,
}}
}}
}},
}}
end
end
function get_badge_colour(key)
G.BADGE_COL = G.BADGE_COL or {
eternal = G.C.ETERNAL,
perishable = G.C.PERISHABLE,
rental = G.C.RENTAL,
foil = G.C.DARK_EDITION,
holographic = G.C.DARK_EDITION,
polychrome = G.C.DARK_EDITION,
negative = G.C.DARK_EDITION,
gold_seal = G.C.GOLD,
red_seal = G.C.RED,
blue_seal = G.C.BLUE,
purple_seal = G.C.PURPLE,
pinned_left = G.C.ORANGE,
}
return G.BADGE_COL[key] or {1, 0, 0, 1}
end
function create_badge(_string, _badge_col, _text_col, scaling)
scaling = scaling or 1
return {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", colour = _badge_col or G.C.GREEN, r = 0.1, minw = 2, minh = 0.4*scaling, emboss = 0.05, padding = 0.03*scaling}, nodes={
{n=G.UIT.B, config={h=0.1,w=0.03}},
{n=G.UIT.O, config={object = DynaText({string = _string or 'ERROR', colours = {_text_col or G.C.WHITE},float = true, shadow = true, offset_y = -0.05, silent = true, spacing = 1, scale = 0.33*scaling})}},
{n=G.UIT.B, config={h=0.1,w=0.03}},
}}
}}
end
function create_UIBox_detailed_tooltip(_center)
local full_UI_table = {
main = {},
info = {},
type = {},
name = 'done',
badges = badges or {}
}
local desc = generate_card_ui(_center, full_UI_table, nil, _center.set, nil)
return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, padding = 0.05, emboss = 0.05}, nodes={
info_tip_from_rows(desc.info[1], desc.info[1].name),
}}
}}
end
function create_popup_UIBox_tooltip(tooltip)
local title = tooltip.title or nil
local text = tooltip.text or {}
local rows = {}
if title then
local r = {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = title,colour = G.C.UI.TEXT_DARK, scale = 0.4}}}}}}
table.insert(rows, r)
end
for i = 1, #text do
if type(text[i]) == 'table' then
local r = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={
{n=G.UIT.T, config={ref_table = text[i].ref_table, ref_value = text[i].ref_value,colour = G.C.UI.TEXT_DARK, scale = 0.4}}}}
table.insert(rows, r)
else
local r = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={
{n=G.UIT.T, config={text = text[i],colour = G.C.UI.TEXT_DARK, scale = 0.4}}}}
table.insert(rows, r)
end
end
if tooltip.filler then
table.insert(rows, tooltip.filler.func(tooltip.filler.args))
end
local t = {
n=G.UIT.ROOT, config = {align = "cm", padding = 0.05, r=0.1, colour = G.C.RED, emboss = 0.05}, nodes=
{{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.WHITE, emboss = 0.05}, nodes=rows}}}
return t
end
function create_UIBox_HUD_blind()
local scale = 0.4
local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5)
G.GAME.blind:change_dim(1.5,1.5)
return {n=G.UIT.ROOT, config={align = "cm", minw = 4.5, r = 0.1, colour = G.C.BLACK, emboss = 0.05, padding = 0.05, func = 'HUD_blind_visible', id = 'HUD_blind'}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.7, r = 0.1, emboss = 0.05, colour = G.C.DYN_UI.MAIN}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 3}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.blind, ref_value = 'loc_name'}}, colours = {G.C.UI.TEXT_LIGHT},shadow = true, rotate = true, silent = true, float = true, scale = 1.6*scale, y_offset = -4}),id = 'HUD_blind_name'}},
}},
}},
{n=G.UIT.R, config={align = "cm", minh = 2.74, r = 0.1,colour = G.C.DYN_UI.DARK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.3, maxw = 4.2}, nodes={
{n=G.UIT.T, config={ref_table = {val = ''}, ref_value = 'val', scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, func = 'HUD_blind_debuff_prefix'}},
{n=G.UIT.T, config={ref_table = G.GAME.blind.loc_debuff_lines, ref_value = 1, scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, id = 'HUD_blind_debuff_1', func = 'HUD_blind_debuff'}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.3, maxw = 4.2}, nodes={
{n=G.UIT.T, config={ref_table = G.GAME.blind.loc_debuff_lines, ref_value = 2, scale = scale*0.9, colour = G.C.UI.TEXT_LIGHT, id = 'HUD_blind_debuff_2', func = 'HUD_blind_debuff'}}
}},
}},
{n=G.UIT.R, config={align = "cm",padding = 0.15}, nodes={
{n=G.UIT.O, config={object = G.GAME.blind, draw_layer = 1}},
{n=G.UIT.C, config={align = "cm",r = 0.1, padding = 0.05, emboss = 0.05, minw = 2.9, colour = G.C.BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={
{n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.3, colour = G.C.WHITE, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={
{n=G.UIT.O, config={w=0.5,h=0.5, colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}},
{n=G.UIT.B, config={h=0.1,w=0.1}},
{n=G.UIT.T, config={ref_table = G.GAME.blind, ref_value = 'chip_text', scale = 0.001, colour = G.C.RED, shadow = true, id = 'HUD_blind_count', func = 'blind_chip_UI_scale'}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.45, maxw = 2.8, func = 'HUD_blind_reward'}, nodes={
{n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.3, colour = G.C.WHITE}},
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'dollars_to_be_earned'}}, colours = {G.C.MONEY},shadow = true, rotate = true, bump = true, silent = true, scale = 0.45}),id = 'dollars_to_be_earned'}},
}},
}},
}},
}},
}}
end
function add_tag(_tag)
G.HUD_tags = G.HUD_tags or {}
local tag_sprite_ui = _tag:generate_UI()
G.HUD_tags[#G.HUD_tags+1] = UIBox{
definition = {n=G.UIT.ROOT, config={align = "cm",padding = 0.05, colour = G.C.CLEAR}, nodes={
tag_sprite_ui
}},
config = {
align = G.HUD_tags[1] and 'tm' or 'bri',
offset = G.HUD_tags[1] and {x=0,y=0} or {x=0.7,y=0},
major = G.HUD_tags[1] and G.HUD_tags[#G.HUD_tags] or G.ROOM_ATTACH}
}
discover_card(G.P_TAGS[_tag.key])
for i = 1, #G.GAME.tags do
G.GAME.tags[i]:apply_to_run({type = 'tag_add', tag = _tag})
end
G.GAME.tags[#G.GAME.tags+1] = _tag
_tag.HUD_tag = G.HUD_tags[#G.HUD_tags]
end
function create_UIBox_HUD()
local scale = 0.4
local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5)
local contents = {}
local spacing = 0.13
local temp_col = G.C.DYN_UI.BOSS_MAIN
local temp_col2 = G.C.DYN_UI.BOSS_DARK
contents.round = {
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={id = 'hud_hands',align = "cm", padding = 0.05, minw = 1.45, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={
{n=G.UIT.T, config={text = localize('k_hud_hands'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'hands_left'}}, font = G.LANGUAGES['en-us'].font, colours = {G.C.BLUE},shadow = true, rotate = true, scale = 2*scale}),id = 'hand_UI_count'}},
}}
}},
{n=G.UIT.C, config={minw = spacing},nodes={}},
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={
{n=G.UIT.T, config={text = localize('k_hud_discards'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.current_round, ref_value = 'discards_left'}}, font = G.LANGUAGES['en-us'].font, colours = {G.C.RED},shadow = true, rotate = true, scale = 2*scale}),id = 'discard_UI_count'}},
}}
}},
}},
}},
{n=G.UIT.R, config={minh = spacing},nodes={}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45*2 + spacing, minh = 1.15, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", r = 0.1, minw = 1.28*2+spacing, minh = 1, colour = temp_col2}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'dollars', prefix = localize('$')}}, maxw = 1.35, colours = {G.C.MONEY}, font = G.LANGUAGES['en-us'].font, shadow = true,spacing = 2, bump = true, scale = 2.2*scale}), id = 'dollar_text_UI'}}
}},
}},
}},
}},
{n=G.UIT.R, config={minh = spacing},nodes={}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={id = 'hud_ante',align = "cm", padding = 0.05, minw = 1.45, minh = 1, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.33, maxw = 1.35}, nodes={
{n=G.UIT.T, config={text = localize('k_ante'), scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME.round_resets, ref_value = 'ante'}}, colours = {G.C.IMPORTANT},shadow = true, font = G.LANGUAGES['en-us'].font, scale = 2*scale}),id = 'ante_UI_count'}},
{n=G.UIT.T, config={text = " ", scale = 0.3*scale}},
{n=G.UIT.T, config={text = "/ ", scale = 0.7*scale, colour = G.C.WHITE, shadow = true}},
{n=G.UIT.T, config={ref_table = G.GAME, ref_value='win_ante', scale = scale, colour = G.C.WHITE, shadow = true}}
}},
}},
{n=G.UIT.C, config={minw = spacing},nodes={}},
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 1.45, minh = 1, colour = temp_col, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 1.35}, nodes={
{n=G.UIT.T, config={text = localize('k_round'), minh = 0.33, scale = 0.85*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", r = 0.1, minw = 1.2, colour = temp_col2, id = 'row_round_text'}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'round'}}, colours = {G.C.IMPORTANT},shadow = true, scale = 2*scale}),id = 'round_UI_count'}},
}},
}},
}},
}
contents.hand =
{n=G.UIT.R, config={align = "cm", id = 'hand_text_area', colour = darken(G.C.BLACK, 0.1), r = 0.1, emboss = 0.05, padding = 0.03}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 1.1}, nodes={
{n=G.UIT.O, config={id = 'hand_name', func = 'hand_text_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "handname_text"}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, float = true, scale = scale*1.4})}},
{n=G.UIT.O, config={id = 'hand_chip_total', func = 'hand_chip_total_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "chip_total_text"}}, colours = {G.C.UI.TEXT_LIGHT}, shadow = true, float = true, scale = scale*1.4})}},
{n=G.UIT.T, config={ref_table = G.GAME.current_round.current_hand, ref_value='hand_level', scale = scale, colour = G.C.UI.TEXT_LIGHT, id = 'hand_level', shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", minh = 1, padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cr", minw = 2, minh =1, r = 0.1,colour = G.C.UI_CHIPS, id = 'hand_chip_area', emboss = 0.05}, nodes={
{n=G.UIT.O, config={func = 'flame_handler',no_role = true, id = 'flame_chips', object = Moveable(0,0,0,0), w = 0, h = 0}},
{n=G.UIT.O, config={id = 'hand_chips', func = 'hand_chip_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "chip_text"}}, colours = {G.C.UI.TEXT_LIGHT}, font = G.LANGUAGES['en-us'].font, shadow = true, float = true, scale = scale*2.3})}},
{n=G.UIT.B, config={w=0.1,h=0.1}},
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = "X", lang = G.LANGUAGES['en-us'], scale = scale*2, colour = G.C.UI_MULT, shadow = true}},
}},
{n=G.UIT.C, config={align = "cl", minw = 2, minh=1, r = 0.1,colour = G.C.UI_MULT, id = 'hand_mult_area', emboss = 0.05}, nodes={
{n=G.UIT.O, config={func = 'flame_handler',no_role = true, id = 'flame_mult', object = Moveable(0,0,0,0), w = 0, h = 0}},
{n=G.UIT.B, config={w=0.1,h=0.1}},
{n=G.UIT.O, config={id = 'hand_mult', func = 'hand_mult_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "mult_text"}}, colours = {G.C.UI.TEXT_LIGHT}, font = G.LANGUAGES['en-us'].font, shadow = true, float = true, scale = scale*2.3})}},
}}
}}
}}
}}
contents.dollars_chips = {n=G.UIT.R, config={align = "cm",r=0.1, padding = 0,colour = G.C.DYN_UI.BOSS_MAIN, emboss = 0.05, id = 'row_dollars_chips'}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 1.3}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.3}, nodes={
{n=G.UIT.T, config={text = localize('k_round'), scale = 0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.3}, nodes={
{n=G.UIT.T, config={text =localize('k_lower_score'), scale = 0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}},
{n=G.UIT.C, config={align = "cm", minw = 3.3, minh = 0.7, r = 0.1, colour = G.C.DYN_UI.BOSS_DARK}, nodes={
{n=G.UIT.O, config={w=0.5,h=0.5 , object = stake_sprite, hover = true, can_collide = false}},
{n=G.UIT.B, config={w=0.1,h=0.1}},
{n=G.UIT.T, config={ref_table = G.GAME, ref_value = 'chips_text', lang = G.LANGUAGES['en-us'], scale = 0.85, colour = G.C.WHITE, id = 'chip_UI_count', func = 'chip_UI_set', shadow = true}}
}}
}}
}}
contents.buttons = {
{n=G.UIT.C, config={align = "cm", r=0.1, colour = G.C.CLEAR, shadow = true, id = 'button_area', padding = 0.2}, nodes={
{n=G.UIT.R, config={id = 'run_info_button', align = "cm", minh = 1.75, minw = 1.5,padding = 0.05, r = 0.1, hover = true, colour = G.C.RED, button = "run_info", shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.4}, nodes={
{n=G.UIT.T, config={text = localize('b_run_info_1'), scale = 1.2*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0, maxw = 1.4}, nodes={
{n=G.UIT.T, config={text = localize('b_run_info_2'), scale = 1*scale, colour = G.C.UI.TEXT_LIGHT, shadow = true, focus_args = {button = G.F_GUIDE and 'guide' or 'back', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}},
{n=G.UIT.R, config={align = "cm", minh = 1.75, minw = 1.5,padding = 0.05, r = 0.1, hover = true, colour = G.C.ORANGE, button = "options", shadow = true}, nodes={
{n=G.UIT.C, config={align = "cm", maxw = 1.4, focus_args = {button = 'start', orientation = 'bm'}, func = 'set_button_pip'}, nodes={
{n=G.UIT.T, config={text = localize('b_options'), scale = scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
}}
}}
}
return {n=G.UIT.ROOT, config = {align = "cm", padding = 0.03, colour = G.C.UI.TRANSPARENT_DARK}, nodes={
{n=G.UIT.R, config = {align = "cm", padding= 0.05, colour = G.C.DYN_UI.MAIN, r=0.1}, nodes={
{n=G.UIT.R, config={align = "cm", colour = G.C.DYN_UI.BOSS_DARK, r=0.1, minh = 30, padding = 0.08}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.3}, nodes={}},
{n=G.UIT.R, config={align = "cm", id = 'row_blind', minw = 1, minh = 3.75}, nodes={}},
contents.dollars_chips,
contents.hand,
{n=G.UIT.R, config={align = "cm", id = 'row_round'}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes=contents.buttons},
{n=G.UIT.C, config={align = "cm"}, nodes=contents.round}
}},
}}
}}
}}
end
function create_UIBox_blind_select()
G.blind_prompt_box = UIBox{
definition =
{n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, padding = 0.2}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('ph_choose_blind_1'), colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.6, pop_in = 0.5, maxw = 5}), id = 'prompt_dynatext1'}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('ph_choose_blind_2'), colours = {G.C.WHITE}, shadow = true, bump = true, scale = 0.7, pop_in = 0.5, maxw = 5, silent = true}), id = 'prompt_dynatext2'}}
}},
(G.GAME.used_vouchers["v_retcon"] or G.GAME.used_vouchers["v_directors_cut"]) and
UIBox_button({label = {localize('b_reroll_boss'), localize('$')..'10'}, button = "reroll_boss", func = 'reroll_boss_button'}) or nil
}},
config = {align="cm", offset = {x=0,y=-15},major = G.HUD:get_UIE_by_ID('row_blind'), bond = 'Weak'}
}
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = (function()
G.blind_prompt_box.alignment.offset.y = 0
return true
end)
}))
local width = G.hand.T.w
G.GAME.blind_on_deck =
not (G.GAME.round_resets.blind_states.Small == 'Defeated' or G.GAME.round_resets.blind_states.Small == 'Skipped' or G.GAME.round_resets.blind_states.Small == 'Hide') and 'Small' or
not (G.GAME.round_resets.blind_states.Big == 'Defeated' or G.GAME.round_resets.blind_states.Big == 'Skipped'or G.GAME.round_resets.blind_states.Big == 'Hide') and 'Big' or
'Boss'
G.blind_select_opts = {}
G.blind_select_opts.small = G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Small')},false,get_blind_main_colour('Small'))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil
G.blind_select_opts.big = G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Big')},false,get_blind_main_colour('Big'))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil
G.blind_select_opts.boss = G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and UIBox{definition = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={UIBox_dyn_container({create_UIBox_blind_choice('Boss')},false,get_blind_main_colour('Boss'), mix_colours(G.C.BLACK, get_blind_main_colour('Boss'), 0.8))}}, config = {align="bmi", offset = {x=0,y=0}}} or nil
local t = {n=G.UIT.ROOT, config = {align = 'tm',minw = width, r = 0.15, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.5}, nodes={
G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.small}} or nil,
G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.big}} or nil,
G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and {n=G.UIT.O, config={align = "cm", object = G.blind_select_opts.boss}} or nil,
}}
}}
return t
end
function create_UIBox_blind_tag(blind_choice, run_info)
G.GAME.round_resets.blind_tags = G.GAME.round_resets.blind_tags or {}
if not G.GAME.round_resets.blind_tags[blind_choice] then return nil end
local _tag = Tag(G.GAME.round_resets.blind_tags[blind_choice], nil, blind_choice)
local _tag_ui, _tag_sprite = _tag:generate_UI()
_tag_sprite.states.collide.can = not not run_info
return
{n=G.UIT.R, config={id = 'tag_container', ref_table = _tag, align = "cm"}, nodes={
{n=G.UIT.R, config={align = 'tm', minh = 0.65}, nodes={
{n=G.UIT.T, config={text = localize('k_or'), scale = 0.55, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}},
}},
{n=G.UIT.R, config={id = 'tag_'..blind_choice, align = "cm", r = 0.1, padding = 0.1, minw = 1, can_collide = true, ref_table = _tag_sprite}, nodes={
{n=G.UIT.C, config={id = 'tag_desc', align = "cm", minh = 1}, nodes={
_tag_ui
}},
not run_info and {n=G.UIT.C, config={align = "cm", colour = G.C.UI.BACKGROUND_INACTIVE, minh = 0.6, minw = 2, maxw = 2, padding = 0.07, r = 0.1, shadow = true, hover = true, one_press = true, button = 'skip_blind', func = 'hover_tag_proxy', ref_table = _tag}, nodes={
{n=G.UIT.T, config={text = localize('b_skip_blind'), scale = 0.4, colour = G.C.UI.TEXT_INACTIVE}}
}} or {n=G.UIT.C, config={align = "cm", padding = 0.1, emboss = 0.05, colour = mix_colours(G.C.BLUE, G.C.BLACK, 0.4), r = 0.1, maxw = 2}, nodes={
{n=G.UIT.T, config={text = localize('b_skip_reward'), scale = 0.35, colour = G.C.WHITE}},
}},
}}
}}
end
function create_UIBox_blind_choice(type, run_info)
if not G.GAME.blind_on_deck then
G.GAME.blind_on_deck = 'Small'
end
if not run_info then G.GAME.round_resets.blind_states[G.GAME.blind_on_deck] = 'Select' end
local disabled = false
type = type or 'Small'
local blind_choice = {
config = G.P_BLINDS[G.GAME.round_resets.blind_choices[type]],
}
blind_choice.animation = AnimatedSprite(0,0, 1.4, 1.4, G.ANIMATION_ATLAS['blind_chips'], blind_choice.config.pos)
blind_choice.animation:define_draw_steps({
{shader = 'dissolve', shadow_height = 0.05},
{shader = 'dissolve'}
})
local extras = nil
local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.5)
G.GAME.orbital_choices = G.GAME.orbital_choices or {}
G.GAME.orbital_choices[G.GAME.round_resets.ante] = G.GAME.orbital_choices[G.GAME.round_resets.ante] or {}
if not G.GAME.orbital_choices[G.GAME.round_resets.ante][type] then
local _poker_hands = {}
for k, v in pairs(G.GAME.hands) do
if v.visible then _poker_hands[#_poker_hands+1] = k end
end
G.GAME.orbital_choices[G.GAME.round_resets.ante][type] = pseudorandom_element(_poker_hands, pseudoseed('orbital'))
end
if type == 'Small' then
extras = create_UIBox_blind_tag(type, run_info)
elseif type == 'Big' then
extras = create_UIBox_blind_tag(type, run_info)
elseif not run_info then
local dt1 = DynaText({string = {{string = localize('ph_up_ante_1'), colour = G.C.FILTER}}, colours = {G.C.BLACK}, scale = 0.55, silent = true, pop_delay = 4.5, shadow = true, bump = true, maxw = 3})
local dt2 = DynaText({string = {{string = localize('ph_up_ante_2'), colour = G.C.WHITE}},colours = {G.C.CHANCE}, scale = 0.35, silent = true, pop_delay = 4.5, shadow = true, maxw = 3})
local dt3 = DynaText({string = {{string = localize('ph_up_ante_3'), colour = G.C.WHITE}},colours = {G.C.CHANCE}, scale = 0.35, silent = true, pop_delay = 4.5, shadow = true, maxw = 3})
extras =
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, colour = {0,0,0,0.12}, minw = 2.9}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = dt1}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = dt2}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = dt3}},
}},
}},
}}
end
G.GAME.round_resets.blind_ante = G.GAME.round_resets.blind_ante or G.GAME.round_resets.ante
local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')}}
local loc_name = localize{type = 'name_text', key = blind_choice.config.key, set = 'Blind'}
local text_table = loc_target
local blind_col = get_blind_main_colour(type)
local blind_amt = get_blind_amount(G.GAME.round_resets.blind_ante)*blind_choice.config.mult*G.GAME.starting_params.ante_scaling
local blind_state = G.GAME.round_resets.blind_states[type]
local _reward = true
if G.GAME.modifiers.no_blind_reward and G.GAME.modifiers.no_blind_reward[type] then _reward = nil end
if blind_state == 'Select' then blind_state = 'Current' end
local run_info_colour = run_info and (blind_state == 'Defeated' and G.C.GREY or blind_state == 'Skipped' and G.C.BLUE or blind_state == 'Upcoming' and G.C.ORANGE or blind_state == 'Current' and G.C.RED or G.C.GOLD)
local t =
{n=G.UIT.R, config={id = type, align = "tm", func = 'blind_choice_handler', minh = not run_info and 10 or nil, ref_table = {deck = nil, run_info = run_info}, r = 0.1, padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", colour = mix_colours(G.C.BLACK, G.C.L_BLACK, 0.5), r = 0.1, outline = 1, outline_colour = G.C.L_BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={
not run_info and {n=G.UIT.R, config={id = 'select_blind_button', align = "cm", ref_table = blind_choice.config, colour = disabled and G.C.UI.BACKGROUND_INACTIVE or G.C.ORANGE, minh = 0.6, minw = 2.7, padding = 0.07, r = 0.1, shadow = true, hover = true, one_press = true, button = 'select_blind'}, nodes={
{n=G.UIT.T, config={ref_table = G.GAME.round_resets.loc_blind_states, ref_value = type, scale = 0.45, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.UI.TEXT_LIGHT, shadow = not disabled}}
}} or
{n=G.UIT.R, config={id = 'select_blind_button', align = "cm", ref_table = blind_choice.config, colour = run_info_colour, minh = 0.6, minw = 2.7, padding = 0.07, r = 0.1, emboss = 0.08}, nodes={
{n=G.UIT.T, config={text = localize(blind_state, 'blind_states'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}},
{n=G.UIT.R, config={id = 'blind_name',align = "cm", padding = 0.07}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, outline = 1, outline_colour = blind_col, colour = darken(blind_col, 0.3), minw = 2.9, emboss = 0.1, padding = 0.07, line_emboss = 1}, nodes={
{n=G.UIT.O, config={object = DynaText({string = loc_name, colours = {disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE}, shadow = not disabled, float = not disabled, y_offset = -4, scale = 0.45, maxw =2.8})}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={id = 'blind_desc', align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 1.5}, nodes={
{n=G.UIT.O, config={object = blind_choice.animation}},
}},
text_table[1] and {n=G.UIT.R, config={align = "cm", minh = 0.7, padding = 0.05, minw = 2.9}, nodes={
text_table[1] and {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={
{n=G.UIT.T, config={id = blind_choice.config.key, ref_table = {val = ''}, ref_value = 'val', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled, func = 'HUD_blind_debuff_prefix'}},
{n=G.UIT.T, config={text = text_table[1] or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}
}} or nil,
text_table[2] and {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={
{n=G.UIT.T, config={text = text_table[2] or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}
}} or nil,
}} or nil,
}},
{n=G.UIT.R, config={align = "cm",r = 0.1, padding = 0.05, minw = 3.1, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 3}, nodes={
{n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.3, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={
{n=G.UIT.O, config={w=0.5,h=0.5, colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}},
{n=G.UIT.B, config={h=0.1,w=0.1}},
{n=G.UIT.T, config={text = number_format(blind_amt), scale = score_number_scale(0.9, blind_amt), colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.RED, shadow = not disabled}}
}},
_reward and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.35, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}},
{n=G.UIT.T, config={text = string.rep(localize("$"), blind_choice.config.dollars)..'+', scale = 0.35, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.MONEY, shadow = not disabled}}
}} or nil,
}},
}},
}},
}},
{n=G.UIT.R, config={id = 'blind_extras', align = "cm"}, nodes={
extras,
}}
}}
return t
end
function create_UIBox_round_evaluation()
local width = G.hand.T.w-2
local t = {n=G.UIT.ROOT, config = {align = 'tm',colour = G.C.CLEAR}, nodes={
UIBox_dyn_container(
{
{n=G.UIT.R, config={align = "tm", minw = width, minh = 3, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", minw = width, minh = 1.4}, nodes={}},
{n=G.UIT.R, config={align = "cm", minw = width, id = 'base_round_eval'}, nodes={}},
{n=G.UIT.R, config={align = "cm", minw = width, id = 'bonus_round_eval'}, nodes={}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={}},
{n=G.UIT.R, config={align = "cm", minw = width, id = 'eval_bottom'}, nodes={}}
},false)
}}
return t
end
function create_UIBox_arcana_pack()
local _size = G.GAME.pack_size
G.pack_cards = CardArea(
G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y,
_size*G.CARD_W,
1.05*G.CARD_H,
{card_limit = _size, type = 'consumeable', highlight_limit = 1})
local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={
{n=G.UIT.O, config={object = G.pack_cards}},
}}
}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
}},
{n=G.UIT.R, config={align = "tm"}, nodes={
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}},
{n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={
UIBox_dyn_container({
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('k_arcana_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}}
}},
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}},
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}
}},
}}
}),
}},
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={
{n=G.UIT.R,config={minh =0.2}, nodes={}},
{n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = {
{n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}}
}}
}}
}}
return t
end
function create_UIBox_spectral_pack()
local _size = G.GAME.pack_size
G.pack_cards = CardArea(
G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y,
_size*G.CARD_W,
1.05*G.CARD_H,
{card_limit = _size, type = 'consumeable', highlight_limit = 1})
local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={
{n=G.UIT.O, config={object = G.pack_cards}},
}}
}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
}},
{n=G.UIT.R, config={align = "tm"}, nodes={
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}},
{n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={
UIBox_dyn_container({
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('k_spectral_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}}
}},
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}},
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}
}},
}}
}),
}},
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={
{n=G.UIT.R,config={minh =0.2}, nodes={}},
{n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = {
{n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}}
}}
}}
}}
return t
end
function create_UIBox_standard_pack()
local _size = G.GAME.pack_size
G.pack_cards = CardArea(
G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y,
_size*G.CARD_W*1.1,
1.05*G.CARD_H,
{card_limit = _size, type = 'consumeable', highlight_limit = 1})
local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={
{n=G.UIT.O, config={object = G.pack_cards}},
}}
}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
}},
{n=G.UIT.R, config={align = "tm"}, nodes={
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}},
{n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={
UIBox_dyn_container({
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('k_standard_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}}
}},
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}},
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}
}},
}}
}),
}},
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={
{n=G.UIT.R,config={minh =0.2}, nodes={}},
{n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = {
{n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}}
}}
}}
}}
return t
end
function create_UIBox_buffoon_pack()
local _size = G.GAME.pack_size
G.pack_cards = CardArea(
G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y,
_size*G.CARD_W*1.1,
1.05*G.CARD_H,
{card_limit = _size, type = 'consumeable', highlight_limit = 1})
local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={
{n=G.UIT.O, config={object = G.pack_cards}},
}}
}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
}},
{n=G.UIT.R, config={align = "tm"}, nodes={
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}},
{n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={
UIBox_dyn_container({
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('k_buffoon_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}}
}},
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}},
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}
}},
}}
}),
}},
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={
{n=G.UIT.R,config={minh =0.2}, nodes={}},
{n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = {
{n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}}
}}
}}
}}
return t
end
function create_UIBox_celestial_pack()
local _size = G.GAME.pack_size
G.pack_cards = CardArea(
G.ROOM.T.x + 9 + G.hand.T.x, G.hand.T.y,
_size*G.CARD_W*1.1 + 0.5,
1.05*G.CARD_H,
{card_limit = _size, type = 'consumeable', highlight_limit = 1})
local t = {n=G.UIT.ROOT, config = {align = 'tm', r = 0.15, colour = G.C.CLEAR, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cl", colour = G.C.CLEAR,r=0.15, padding = 0.1, minh = 2, shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", r=0.2, colour = G.C.CLEAR, shadow = true}, nodes={
{n=G.UIT.O, config={object = G.pack_cards}},
}}
}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
}},
{n=G.UIT.R, config={align = "tm"}, nodes={
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={}},
{n=G.UIT.C,config={align = "tm", padding = 0.05}, nodes={
UIBox_dyn_container({
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 4}, nodes={
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize('k_celestial_pack'), colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.7, maxw = 4, pop_in = 0.5})}}
}},
{n=G.UIT.R,config={align = "bm", padding = 0.05}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('k_choose')..' '}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}},
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = G.GAME, ref_value = 'pack_choices'}}, colours = {G.C.WHITE},shadow = true, rotate = true, bump = true, spacing =2, scale = 0.5, pop_in = 0.7})}}
}},
}}
}),
}},
{n=G.UIT.C,config={align = "tm", padding = 0.05, minw = 2.4}, nodes={
{n=G.UIT.R,config={minh =0.2}, nodes={}},
{n=G.UIT.R,config={align = "tm",padding = 0.2, minh = 1.2, minw = 1.8, r=0.15,colour = G.C.GREY, one_press = true, button = 'skip_booster', hover = true,shadow = true, func = 'can_skip_booster'}, nodes = {
{n=G.UIT.T, config={text = localize('b_skip'), scale = 0.5, colour = G.C.WHITE, shadow = true, focus_args = {button = 'y', orientation = 'bm'}, func = 'set_button_pip'}}
}}
}}
}}
}}
}}
return t
end
function create_UIBox_card_alert(args)
args = args or {}
return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR, refresh_movement = true}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.15, minw = 0.42, minh = 0.42, colour = args.no_bg and G.C.CLEAR or args.bg_col or (args.red_bad and darken(G.C.RED, 0.1) or G.C.RED), draw_layer = 1, emboss = 0.05, refresh_movement = true}, nodes={
{n=G.UIT.O, config={object = DynaText({string = args.text or '!', colours = {G.C.WHITE},shadow = true, rotate = true,H_offset = args.y_offset or 0,bump_rate = args.text and 3 or 7, bump_amount = args.bump_amount or 3, bump = true,maxw = args.maxw, text_rot = args.text_rot or 0.2, spacing = 3*(args.scale or 1), scale = args.scale or 0.48})}}
}},
}}
end
function create_slider(args)
args = args or {}
args.colour = args.colour or G.C.RED
args.w = args.w or 1
args.h = args.h or 0.5
args.label_scale = args.label_scale or 0.5
args.text_scale = args.text_scale or 0.3
args.min = args.min or 0
args.max = args.max or 1
args.decimal_places = args.decimal_places or 0
args.text = string.format("%."..tostring(args.decimal_places).."f", args.ref_table[args.ref_value])
local startval = args.w * (args.ref_table[args.ref_value] - args.min)/(args.max - args.min)
local t =
{n=G.UIT.C, config={align = "cm", minw = args.w, min_h = args.h, padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {type = 'slider'}}, nodes={
{n=G.UIT.C, config={align = "cl", minw = args.w, r = 0.1,min_h = args.h,collideable = true, hover = true, colour = G.C.BLACK,emboss = 0.05,func = 'slider', refresh_movement = true}, nodes={
{n=G.UIT.B, config={w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}},
}},
{n=G.UIT.C, config={align = "cm", minh = args.h,r = 0.1, minw = 0.8, colour = args.colour,shadow = true}, nodes={
{n=G.UIT.T, config={ref_table = args, ref_value = 'text', scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, decimal_places = args.decimal_places}}
}},
}}
if args.label then
t = {n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.1*args.label_scale, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = args.label, scale = args.label_scale, colour = G.C.UI.TEXT_LIGHT}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
t
}}
}}
end
return t
end
function create_toggle(args)
args = args or {}
args.active_colour = args.active_colour or G.C.RED
args.inactive_colour = args.inactive_colour or G.C.BLACK
args.w = args.w or 3
args.h = args.h or 0.5
args.scale = args.scale or 1
args.label = args.label or 'TEST?'
args.label_scale = args.label_scale or 0.4
args.ref_table = args.ref_table or {}
args.ref_value = args.ref_value or 'test'
local check = Sprite(0,0,0.5*args.scale,0.5*args.scale,G.ASSET_ATLAS["icons"], {x=1, y=0})
check.states.drag.can = false
check.states.visible = false
local info = nil
if args.info then
info = {}
for k, v in ipairs(args.info) do
table.insert(info, {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={
{n=G.UIT.T, config={text = v, scale = 0.25, colour = G.C.UI.TEXT_LIGHT}}
}})
end
info = {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes=info}
end
local t =
{n=args.col and G.UIT.C or G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR, focus_args = {funnel_from = true}}, nodes={
{n=G.UIT.C, config={align = "cr", minw = args.w}, nodes={
{n=G.UIT.T, config={text = args.label, scale = args.label_scale, colour = G.C.UI.TEXT_LIGHT}},
{n=G.UIT.B, config={w = 0.1, h = 0.1}},
}},
{n=G.UIT.C, config={align = "cl", minw = 0.3*args.w}, nodes={
{n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK}, nodes={
{n=G.UIT.C, config={align = "cm", r = 0.1, padding = 0.03, minw = 0.4*args.scale, minh = 0.4*args.scale, outline_colour = G.C.WHITE, outline = 1.2*args.scale, line_emboss = 0.5*args.scale, ref_table = args,
colour = args.inactive_colour,
button = 'toggle_button', button_dist = 0.2, hover = true, toggle_callback = args.callback, func = 'toggle', focus_args = {funnel_to = true}}, nodes={
{n=G.UIT.O, config={object = check}},
}},
}}
}},
}}
if args.info then
t = {n=args.col and G.UIT.C or G.UIT.R, config={align = "cm"}, nodes={
t,
info,
}}
end
return t
end
function create_option_cycle(args)
args = args or {}
args.colour = args.colour or G.C.RED
args.options = args.options or {
'Option 1',
'Option 2'
}
args.current_option = args.current_option or 1
args.current_option_val = args.options[args.current_option]
args.opt_callback = args.opt_callback or nil
args.scale = args.scale or 1
args.ref_table = args.ref_table or nil
args.ref_value = args.ref_value or nil
args.w = (args.w or 2.5)*args.scale
args.h = (args.h or 0.8)*args.scale
args.text_scale = (args.text_scale or 0.5)*args.scale
args.l = '<'
args.r = '>'
args.focus_args = args.focus_args or {}
args.focus_args.type = 'cycle'
local info = nil
if args.info then
info = {}
for k, v in ipairs(args.info) do
table.insert(info, {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={
{n=G.UIT.T, config={text = v, scale = 0.3*args.scale, colour = G.C.UI.TEXT_LIGHT}}
}})
end
info = {n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes=info}
end
local disabled = #args.options < 2
local pips = {}
for i = 1, #args.options do
pips[#pips+1] = {n=G.UIT.B, config={w = 0.1*args.scale, h = 0.1*args.scale, r = 0.05, id = 'pip_'..i, colour = args.current_option == i and G.C.WHITE or G.C.BLACK}}
end
local choice_pips = not args.no_pips and {n=G.UIT.R, config={align = "cm", padding = (0.05 - (#args.options > 15 and 0.03 or 0))*args.scale}, nodes=pips} or nil
local t =
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR, id = args.id and (not args.label and args.id or nil) or nil, focus_args = args.focus_args}, nodes={
{n=G.UIT.C, config={align = "cm",r = 0.1, minw = 0.6*args.scale, hover = not disabled, colour = not disabled and args.colour or G.C.BLACK,shadow = not disabled, button = not disabled and 'option_cycle' or nil, ref_table = args, ref_value = 'l', focus_args = {type = 'none'}}, nodes={
{n=G.UIT.T, config={ref_table = args, ref_value = 'l', scale = args.text_scale, colour = not disabled and G.C.UI.TEXT_LIGHT or G.C.UI.TEXT_INACTIVE}}
}},
args.mid and
{n=G.UIT.C, config={id = 'cycle_main'}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={
args.mid
}},
not disabled and choice_pips or nil
}}
or {n=G.UIT.C, config={id = 'cycle_main', align = "cm", minw = args.w, minh = args.h, r = 0.1, padding = 0.05, colour = args.colour,emboss = 0.1, hover = true, can_collide = true, on_demand_tooltip = args.on_demand_tooltip}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{ref_table = args, ref_value = "current_option_val"}}, colours = {G.C.UI.TEXT_LIGHT},pop_in = 0, pop_in_rate = 8, reset_pop_in = true,shadow = true, float = true, silent = true, bump = true, scale = args.text_scale, non_recalc = true})}},
}},
{n=G.UIT.R, config={align = "cm", minh = 0.05}, nodes={
}},
not disabled and choice_pips or nil
}}
}},
{n=G.UIT.C, config={align = "cm",r = 0.1, minw = 0.6*args.scale, hover = not disabled, colour = not disabled and args.colour or G.C.BLACK,shadow = not disabled, button = not disabled and 'option_cycle' or nil, ref_table = args, ref_value = 'r', focus_args = {type = 'none'}}, nodes={
{n=G.UIT.T, config={ref_table = args, ref_value = 'r', scale = args.text_scale, colour = not disabled and G.C.UI.TEXT_LIGHT or G.C.UI.TEXT_INACTIVE}}
}},
}}
if args.cycle_shoulders then
t =
{n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR}, nodes = {
{n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'leftshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = -0.1, y = 0}}}, nodes = {}},
{n=G.UIT.C, config={id = 'cycle_shoulders', padding = 0.1}, nodes={t}},
{n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'rightshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = 0.1, y = 0}}}, nodes = {}},
}}
else
t =
{n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR, padding = 0.0}, nodes = {
t
}}
end
if args.label or args.info then
t = {n=G.UIT.R, config={align = "cm", padding = 0.05, id = args.id or nil}, nodes={
args.label and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = args.label, scale = 0.5*args.scale, colour = G.C.UI.TEXT_LIGHT}}
}} or nil,
t,
info,
}}
end
return t
end
function create_tabs(args)
args = args or {}
args.colour = args.colour or G.C.RED
args.tab_alignment = args.tab_alignment or 'cm'
args.opt_callback = args.opt_callback or nil
args.scale = args.scale or 1
args.tab_w = args.tab_w or 0
args.tab_h = args.tab_h or 0
args.text_scale = (args.text_scale or 0.5)
args.tabs = args.tabs or {
{
label = 'tab 1',
chosen = true,
func = nil,
tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = 'A', scale = 1, colour = G.C.UI.TEXT_LIGHT}}
}} end
},
{
label = 'tab 2',
chosen = false,
tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = 'B', scale = 1, colour = G.C.UI.TEXT_LIGHT}}
}} end
},
{
label = 'tab 3',
chosen = false,
tab_definition_function = function() return {n=G.UIT.ROOT, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = 'C', scale = 1, colour = G.C.UI.TEXT_LIGHT}}
}} end
}
}
local tab_buttons = {}
for k, v in ipairs(args.tabs) do
if v.chosen then args.current = {k = k, v = v} end
tab_buttons[#tab_buttons+1] = UIBox_button({id = 'tab_but_'..(v.label or ''), ref_table = v, button = 'change_tab', label = {v.label}, minh = 0.8*args.scale, minw = 2.5*args.scale, col = true, choice = true, scale = args.text_scale, chosen = v.chosen, func = v.func, focus_args = {type = 'none'}})
end
local t =
{n=G.UIT.R, config={padding = 0.0, align = "cm", colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", colour = G.C.CLEAR}, nodes = {
(#args.tabs > 1 and not args.no_shoulders) and {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'leftshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = -0.1, y = 0}}}, nodes = {}} or nil,
{n=G.UIT.C, config={id = args.no_shoulders and 'no_shoulders' or 'tab_shoulders', ref_table = args, align = "cm", padding = 0.15, group = 1, collideable = true, focus_args = #args.tabs > 1 and {type = 'tab', nav = 'wide',snap_to = args.snap_to_nav, no_loop = args.no_loop} or nil}, nodes=tab_buttons},
(#args.tabs > 1 and not args.no_shoulders) and {n=G.UIT.C, config={minw = 0.7,align = "cm", colour = G.C.CLEAR,func = 'set_button_pip', focus_args = {button = 'rightshoulder', type = 'none', orientation = 'cm', scale = 0.7, offset = {x = 0.1, y = 0}}}, nodes = {}} or nil,
}},
{n=G.UIT.R, config={align = args.tab_alignment, padding = args.padding or 0.1, no_fill = true, minh = args.tab_h, minw = args.tab_w}, nodes={
{n=G.UIT.O, config={id = 'tab_contents', object = UIBox{definition = args.current.v.tab_definition_function(args.current.v.tab_definition_function_args), config = {offset = {x=0,y=0}}}}}
}},
}}
return t
end
function create_text_input(args)
args = args or {}
args.colour = copy_table(args.colour) or copy_table(G.C.BLUE)
args.hooked_colour = copy_table(args.hooked_colour) or darken(copy_table(G.C.BLUE), 0.3)
args.w = args.w or 2.5
args.h = args.h or 0.7
args.text_scale = args.text_scale or 0.4
args.max_length = args.max_length or 16
args.all_caps = args.all_caps or false
args.prompt_text = args.prompt_text or localize('k_enter_text')
args.current_prompt_text = ''
local text = {ref_table = args.ref_table, ref_value = args.ref_value, letters = {}, current_position = string.len(args.ref_table[args.ref_value])}
local ui_letters = {}
for i = 1, args.max_length do
text.letters[i] = (args.ref_table[args.ref_value] and (string.sub(args.ref_table[args.ref_value], i, i) or '')) or ''
ui_letters[i] = {n=G.UIT.T, config={ref_table = text.letters, ref_value = i, scale = args.text_scale, colour = G.C.UI.TEXT_LIGHT, id = 'letter_'..i}}
end
args.text = text
local position_text_colour = lighten(copy_table(G.C.BLUE), 0.4)
ui_letters[#ui_letters+1] = {n=G.UIT.T, config={ref_table = args, ref_value = 'current_prompt_text', scale = args.text_scale, colour = lighten(copy_table(args.colour), 0.4), id = 'prompt'}}
ui_letters[#ui_letters+1] = {n=G.UIT.B, config={r = 0.03,w=0.1, h=0.4, colour = position_text_colour, id = 'position', func = 'flash'}}
local t =
{n=G.UIT.C, config={align = "cm", draw_layer = 1, colour = G.C.CLEAR}, nodes = {
{n=G.UIT.C, config={id = 'text_input', align = "cm", padding = 0.05, r = 0.1, draw_layer = 2, hover = true, colour = args.colour,minw = args.w, min_h = args.h, button = 'select_text_input', shadow = true}, nodes={
{n=G.UIT.R, config={ref_table = args, padding = 0.05, align = "cm", r = 0.1, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={ref_table = args, align = "cm", r = 0.1, colour = G.C.CLEAR, func = 'text_input'}, nodes=
ui_letters
}
}}
}}
}}
return t
end
function create_keyboard_input(args)
local keyboard_rows = {
'1234567890',
'QWERTYUIOP',
'ASDFGHJKL',
'ZXCVBNM',
args.space_key and ' ' or nil
}
local keyboard_button_rows = {
{},{},{},{},{}
}
for k, v in ipairs(keyboard_rows) do
for i = 1, #v do
local c = v:sub(i,i)
keyboard_button_rows[k][#keyboard_button_rows[k] +1] = create_keyboard_button(c, c == ' ' and 'y' or nil)
end
end
return {n=G.UIT.ROOT, config={align = "cm", padding = 15, r = 0.1, colour = {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = {
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLACK, emboss = 0.05, r = 0.1, mid = true}, nodes = {
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes = {
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = {
{n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[1]},
{n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[2]},
{n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[3]},
{n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[4]},
{n=G.UIT.R, config={align = "cm", padding = 0.07, colour = G.C.CLEAR}, nodes=keyboard_button_rows[5]}
}},
(args.backspace_key or args.return_key) and {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes = {
args.backspace_key and {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('backspace', 'x')}} or nil,
args.return_key and {n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('return', 'start')}} or nil,
{n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={create_keyboard_button('back', 'b')}}
}} or nil
}},
}}
}},
}}
end
function create_keyboard_button(key, binding)
local key_label = (key == 'backspace' and 'Backspace') or (key == ' ' and 'Space') or (key == 'back' and 'Back') or (key == 'return' and 'Enter') or key
return UIBox_button{ label = {key_label}, button = "key_button", ref_table = {key = key == 'back' and 'return' or key},
minw = key == ' ' and 6 or key == 'return' and 2.5 or key == 'backspace' and 2.5 or key == 'back' and 2.5 or 0.8,
minh = key == 'return' and 1.5 or key == 'backspace' and 1.5 or key == 'back' and 0.8 or 0.7,
col = true, colour = G.C.GREY, focus_args = binding and {button = binding, orientation = (key == ' ' or key == 'back') and 'cr' or 'bm', set_button_pip= true} or nil}
end
function create_dynatext_pips(args)
args = args or {}
args.active_colour = copy_table(args.colour) or G.C.RED
args.inactive_colour = copy_table(args.inactive_colour) or {0,0,0,0.08}
args.w = args.w or 0.07
args.h = args.h or 0.07
if not (args.dynatext) or not (#args.dynatext.strings > 1) then return end
local pips = {}
for i = 1, #args.dynatext.strings do
pips[i] = {n=G.UIT.C, config={ref_table = args.dynatext, minw = args.w, minh = args.h, colour = G.C.UI.TEXT_INACTIVE, r = 0.1, id = 'pip_'..i, pipcol1 = args.active_colour, pipcol2 = args.inactive_colour, func = 'pip_dynatext'}}
end
return {n=G.UIT.R, config={padding = 0.05, align = "cm"}, nodes=pips}
end
function create_UIBox_options()
local current_seed = nil
local restart = nil
local main_menu = nil
local your_collection = nil
local credits = nil
local customize = nil
G.E_MANAGER:add_event(Event({
blockable = false,
func = function()
G.REFRESH_ALERTS = true
return true
end
}))
if G.STAGE == G.STAGES.RUN then
restart = UIBox_button{id = 'restart_button', label = {localize('b_start_new_run')}, button = "setup_run", minw = 5}
main_menu = UIBox_button{ label = {localize('b_main_menu')}, button = "go_to_menu", minw = 5}
your_collection = UIBox_button{ label = {localize('b_collection')}, button = "your_collection", minw = 5, id = 'your_collection'}
current_seed = {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize('b_seed')..": ", scale = 0.4, colour = G.C.WHITE}}
}},
{n=G.UIT.C, config={align = "cm", padding = 0, minh = 0.8}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0, minh = 0.8}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.GAME.seeded and G.C.RED or G.C.BLACK, minw = 1.8, minh = 0.5, padding = 0.1, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.T, config={ text = tostring(G.GAME.pseudorandom.seed), scale = 0.43, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}}
}}
}},
UIBox_button({col = true, button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 1.3, minh = 0.5,}),
}}
end
if G.STAGE == G.STAGES.MAIN_MENU then
credits = UIBox_button{ label = {localize('b_credits')}, button = "show_credits", minw = 5}
end
local settings = UIBox_button({button = 'settings', label = {localize('b_settings')}, minw = 5, focus_args = {snap_to = true}})
local high_scores = UIBox_button{ label = {localize('b_stats')}, button = "high_scores", minw = 5}
local customize = UIBox_button{ label = {localize('b_customize_deck')}, button = "customize_deck", minw = 5}
local t = create_UIBox_generic_options({ contents = {
settings,
G.GAME.seeded and current_seed or nil,
restart,
main_menu,
high_scores,
your_collection,
customize,
credits
}})
return t
end
function create_UIBox_settings()
local tabs = {}
tabs[#tabs+1] = {
label = localize('b_set_game'),
chosen = true,
tab_definition_function = G.UIDEF.settings_tab,
tab_definition_function_args = 'Game'
}
if G.F_VIDEO_SETTINGS then tabs[#tabs+1] = {
label = localize('b_set_video'),
tab_definition_function = G.UIDEF.settings_tab,
tab_definition_function_args = 'Video'
}
end
tabs[#tabs+1] = {
label = localize('b_set_graphics'),
tab_definition_function = G.UIDEF.settings_tab,
tab_definition_function_args = 'Graphics'
}
tabs[#tabs+1] = {
label = localize('b_set_audio'),
tab_definition_function = G.UIDEF.settings_tab,
tab_definition_function_args = 'Audio'
}
local t = create_UIBox_generic_options({back_func = 'options',contents = {create_tabs(
{tabs = tabs,
tab_h = 7.05,
tab_alignment = 'tm',
snap_to_nav = true}
)}})
return t
end
function G.UIDEF.settings_tab(tab)
if tab == 'Game' then
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={
create_option_cycle({label = localize('b_set_gamespeed'),scale = 0.8, options = {0.5, 1, 2, 4}, opt_callback = 'change_gamespeed', current_option = (G.SETTINGS.GAMESPEED == 0.5 and 1 or G.SETTINGS.GAMESPEED == 4 and 4 or G.SETTINGS.GAMESPEED + 1)}),
create_option_cycle({w = 5, label = localize('b_set_play_discard_pos'),scale = 0.8, options = localize('ml_play_discard_pos_opt'), opt_callback = 'change_play_discard_position', current_option = (G.SETTINGS.play_button_pos)}),
G.F_RUMBLE and create_toggle({label = localize('b_set_rumble'), ref_table = G.SETTINGS, ref_value = 'rumble'}) or nil,
create_slider({label = localize('b_set_screenshake'),w = 4, h = 0.4, ref_table = G.SETTINGS, ref_value = 'screenshake', min = 0, max = 100}),
create_toggle({label = localize('ph_display_stickers'), ref_table = G.SETTINGS, ref_value = 'run_stake_stickers'}),
create_toggle({label = localize('b_high_contrast_cards'), ref_table = G.SETTINGS, ref_value = 'colourblind_option', callback = G.FUNCS.refresh_contrast_mode}),
create_toggle({label = localize('b_reduced_motion'), ref_table = G.SETTINGS, ref_value = 'reduced_motion'}),
G.F_CRASH_REPORTS and create_toggle({label = localize('b_set_crash_reports'), ref_table = G.SETTINGS, ref_value = 'crashreports', info = localize('ml_crash_report_info')}) or nil,
}}
elseif tab == 'Video' then
--Reset the queue so there are no pending changes
G.SETTINGS.QUEUED_CHANGE = {}
--Refresh the display information for all displays based on the screenmode selected
local res_option = GET_DISPLAYINFO(G.SETTINGS.WINDOW.screenmode, G.SETTINGS.WINDOW.selected_display)
return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={
create_option_cycle({w = 4,scale = 0.8, label = localize('b_set_monitor'), options = G.SETTINGS.WINDOW.display_names, opt_callback = 'change_display', current_option = (G.SETTINGS.WINDOW.selected_display)}),
create_option_cycle({w = 4,scale = 0.8, label = localize('b_set_windowmode'), options = localize('ml_windowmode_opt'), opt_callback = 'change_screenmode', current_option = (({Windowed = 1, Fullscreen = 2, Borderless = 3})[G.SETTINGS.WINDOW.screenmode] or 1)}),
{n=G.UIT.R, config={align = "cm", id = 'resolution_cycle'}, nodes={create_option_cycle({w = 4,scale = 0.8, options = G.SETTINGS.WINDOW.DISPLAYS[G.SETTINGS.WINDOW.selected_display].screen_resolutions.strings, opt_callback = 'change_screen_resolution',current_option = res_option or 1})}},
{n=G.UIT.R, config={align = "cm"}, nodes={create_option_cycle({w = 4,scale = 0.8, options = localize('ml_vsync_opt'), opt_callback = 'change_vsync',current_option = G.SETTINGS.WINDOW.vsync == 0 and 2 or 1})}},
UIBox_button({button = 'apply_window_changes', label = {localize('b_set_apply')}, minw = 3, func = 'can_apply_window_changes'}),
}}
elseif tab == 'Audio' then
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={
create_slider({label = localize('b_set_master_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'volume', min = 0, max = 100}),
create_slider({label = localize('b_set_music_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'music_volume', min = 0, max = 100}),
create_slider({label = localize('b_set_game_vol'), w = 5, h = 0.4, ref_table = G.SETTINGS.SOUND, ref_value = 'game_sounds_volume', min = 0, max = 100}),
}}
elseif tab == 'Graphics' then
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={
create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_shadows"),options = localize('ml_shadow_opt'), opt_callback = 'change_shadows', current_option = (G.SETTINGS.GRAPHICS.shadows == 'On' and 1 or 2)}),
create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_pixel_smoothing"),options = localize('ml_smoothing_opt'), opt_callback = 'change_pixel_smoothing', current_option = G.SETTINGS.GRAPHICS.texture_scaling}),
create_slider({label = localize('b_set_CRT'),w = 4, h = 0.4, ref_table = G.SETTINGS.GRAPHICS, ref_value = 'crt', min = 0, max = 100}),
create_option_cycle({w = 4,scale = 0.8, label = localize("b_set_CRT_bloom"),options = localize('ml_bloom_opt'), opt_callback = 'change_crt_bloom', current_option = G.SETTINGS.GRAPHICS.bloom}),
}}
end
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR, minh = 5, minw = 5}, nodes={}}
end
function create_UIBox_test_framework(variables)
variables = variables or {};
local nodes = {}
for k, v in pairs(variables) do
if v.type == 'cycle' then
table.insert(nodes,
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = v.label or '', scale = 0.5, colour = G.C.UI.TEXT_DARK}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
create_option_cycle({options = v.options, opt_callback = 'test_framework_cycle_callback', ref_table = v.ref_table, ref_value = v.ref_value})
}},
}})
elseif v.type == 'slider' then
table.insert(nodes,
{n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.05, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = v.label, scale = 0.5, colour = G.C.UI.TEXT_DARK}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
create_slider({w = 5, h = 0.4, ref_table = v.ref_table, ref_value = v.ref_value, min = v.min or 0, max = v.max or 1}),
}},
}})
elseif v.type == 'text_input' then
table.insert(nodes,
{n=G.UIT.R, config={align = "cm", minh = 1, minw = 1, padding = 0.05, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = v.label, scale = 0.5, colour = G.C.UI.TEXT_DARK}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
create_text_input(v.options),
}},
}})
end
end
local t = {n=G.UIT.ROOT, config = {align = "cm", minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5,padding = 0.15, r = 0.1, colour = {G.C.BLACK[1], G.C.BLACK[2], G.C.BLACK[3],0.6}}, nodes={
{n=G.UIT.C, config={align = "cm", minh = 1,r = 0.3, padding = 0.1, minw = 1, colour = G.C.WHITE, shadow = true}, nodes={
{n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.2, minw = 1, colour = G.C.CLEAR, outline = 1, outline_colour = G.C.BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes=
nodes
},
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, hover = true, colour = G.C.ORANGE, button = "exit_overlay_menu", shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.T, config={text = "Back", scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}
}}
}},
}}
}}
}}
return t
end
function G.UIDEF.usage_tabs()
return create_UIBox_generic_options({back_func = 'high_scores', contents ={create_tabs(
{tabs = {
{
label = localize('b_stat_jokers'),
chosen = true,
tab_definition_function = create_UIBox_usage,
tab_definition_function_args = {'joker_usage'},
},
{
label = localize('b_stat_consumables'),
tab_definition_function = create_UIBox_usage,
tab_definition_function_args = {'consumeable_usage'},
},
{
label = localize('b_stat_tarots'),
tab_definition_function = create_UIBox_usage,
tab_definition_function_args = {'consumeable_usage', 'Tarot'},
},
{
label = localize('b_stat_planets'),
tab_definition_function = create_UIBox_usage,
tab_definition_function_args = {'consumeable_usage', 'Planet'},
},
{
label = localize('b_stat_spectrals'),
tab_definition_function = create_UIBox_usage,
tab_definition_function_args = {'consumeable_usage', 'Spectral'},
},
{
label = localize('b_stat_vouchers'),
tab_definition_function = create_UIBox_usage,
tab_definition_function_args = {'voucher_usage', 'Voucher'},
},
},
tab_h = 8,
snap_to_nav = true})}})
end
function create_UIBox_usage(args)
args = args or {}
_type, _set = args[1], args[2]
local used_cards = {}
local max_amt = 0
for k, v in pairs(G.PROFILES[G.SETTINGS.profile][_type]) do
if G.P_CENTERS[k] and (not _set or G.P_CENTERS[k].set == _set) and G.P_CENTERS[k].discovered then
used_cards[#used_cards + 1] = {count = v.count, key = k}
if v.count > max_amt then max_amt = v.count end
end
end
local _col = G.C.SECONDARY_SET[_set] or G.C.RED
table.sort(used_cards, function (a, b) return a.count > b.count end )
local histograms = {}
for i = 1, 10 do
local v = used_cards[i]
if v then
local card = Card(0,0, 0.7*G.CARD_W, 0.7*G.CARD_H, nil, G.P_CENTERS[v.key])
card.ambient_tilt = 0.8
local cardarea = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
G.CARD_W*0.7,
G.CARD_H*0.7,
{card_limit = 2, type = 'title', highlight_limit = 0})
cardarea:emplace(card)
histograms[#histograms +1] =
{n=G.UIT.C, config={align = "bm",minh = 6.2, colour = G.C.UI.TRANSPARENT_DARK, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "bm"}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.7*G.CARD_H+0.1} , nodes={
{n=G.UIT.O, config={object = cardarea}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.T, config={text = v.count, scale = 0.35, colour = mix_colours(G.C.FILTER, G.C.WHITE, 0.8), shadow = true}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", minh = v.count/max_amt*3.6, minw = 0.8, colour = G.C.SECONDARY_SET[G.P_CENTERS[v.key].set] or G.C.RED, res = 0.15, r = 0.001}, nodes={}},
}},
}},
}}
else
histograms[#histograms +1] =
{n=G.UIT.C, config={align = "bm",minh = 6.2, colour = G.C.UI.TRANSPARENT_DARK, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "bm"}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.7*G.CARD_H+0.1, minw = 0.7*G.CARD_W} , nodes={
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.T, config={text = '-', scale = 0.35, colour = mix_colours(G.C.FILTER, G.C.WHITE, 0.8), shadow = true}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.8, colour = G.C.UI.TRANSPARENT_LIGHT, res = 0.15, r = 0.001}, nodes={}},
}},
}},
}}
end
end
local t = {n=G.UIT.ROOT, config={align = "cm", minw = 3, padding = 0.1, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.B, config={w=0.2,h=0.2,r =0.1,colour = G.C.FILTER}},
{n=G.UIT.T, config={text =
_type == 'joker_usage' and localize('ph_stat_joker') or
_type == 'consumeable_usage' and localize('ph_stat_consumable') or
_type == 'voucher_usage' and localize('ph_stat_voucher'),
scale = 0.35, colour = G.C.WHITE}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=histograms},
}}
return t
end
function create_UIBox_customize_deck()
local t = create_UIBox_generic_options({ back_func = 'options', snap_back = nil, contents = {
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
create_tabs(
{tabs = {
{
label = localize('Spades', 'suits_plural'),
chosen = true,
tab_definition_function = G.UIDEF.custom_deck_tab,
tab_definition_function_args = 'Spades'
},
{
label = localize('Hearts', 'suits_plural'),
tab_definition_function = G.UIDEF.custom_deck_tab,
tab_definition_function_args = 'Hearts'
},
{
label = localize('Clubs', 'suits_plural'),
tab_definition_function = G.UIDEF.custom_deck_tab,
tab_definition_function_args = 'Clubs'
},
{
label = localize('Diamonds', 'suits_plural'),
tab_definition_function = G.UIDEF.custom_deck_tab,
tab_definition_function_args = 'Diamonds'
}
},snap_to_nav = true, no_shoulders = true}
)}}}
})
return t
end
function G.UIDEF.custom_deck_tab(_suit)
local t = {}
local face_cards = CardArea(
0,0,
4*G.CARD_W,
1.4*G.CARD_H,
{card_limit = 3, type = 'title', highlight_limit = 0})
table.insert(t,
{n=G.UIT.R, config={align = "cm", colour = G.C.BLACK, r = 0.1, padding = 0.07, no_fill = true}, nodes={
{n=G.UIT.O, config={object = face_cards}}
}}
)
local loc_options = localize(_suit, 'collabs')
local conv_loc_options = {}
for k, v in pairs(loc_options) do
conv_loc_options[tonumber(k)] = v
end
loc_options = conv_loc_options
local current_option = 1
for k, v in pairs(G.COLLABS.options[_suit]) do
if G.SETTINGS.CUSTOM_DECK.Collabs[_suit] == v then current_option = k end
end
table.insert(t,
{n=G.UIT.R, config={align = "cm"}, nodes={
create_option_cycle({options = loc_options, w = 5.5, cycle_shoulders = true, curr_suit = _suit, opt_callback = 'change_collab', current_option = current_option, colour = G.C.RED, focus_args = {snap_to = true, nav = 'wide'}}),
}}
)
table.insert(t, create_toggle({label = localize('b_high_contrast_cards'), ref_table = G.SETTINGS, ref_value = 'colourblind_option', callback = G.FUNCS.refresh_contrast_mode}))
local faces = {'K','Q','J'}
for i = 1, 3 do
local card_code = (string.sub(_suit, 1, 1))..'_'..faces[i]
local card = Card(0,0, G.CARD_W*1.2, G.CARD_H*1.2, G.P_CARDS[card_code], G.P_CENTERS.c_base)
card.no_ui = true
face_cards:emplace(card)
end
return {n=G.UIT.ROOT, config={align = "cm", padding = 0, colour = G.C.CLEAR, r = 0.1, minw = 7, minh = 4.2}, nodes=t}
end
function create_UIBox_high_scores()
fetch_achievements()
set_profile_progress()
set_discover_tallies()
local scores = {
create_UIBox_high_scores_row("hand"),
create_UIBox_high_scores_row("furthest_round"),
create_UIBox_high_scores_row("furthest_ante"),
create_UIBox_high_scores_row("poker_hand"),
create_UIBox_high_scores_row("most_money"),
create_UIBox_high_scores_row("win_streak"),
}
G.focused_profile = G.SETTINGS.profile
local cheevs = {}
local t = create_UIBox_generic_options({ back_func = 'options', snap_back = true, contents = {
{n=G.UIT.C, config={align = "cm", minw = 3, padding = 0.2, r = 0.1, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=
scores
},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.CLEAR}, nodes={
create_progress_box(),
UIBox_button({button = 'usage', label = {localize('k_card_stats')}, minw = 7.5, minh =1, focus_args = {nav = 'wide'}}),
}},
not G.F_NO_ACHIEVEMENTS and {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.CLEAR}, nodes=cheevs} or nil
}})
return t
end
function create_progress_box(_profile_progress, smaller)
local rows, protos = {}, {'collection', 'challenges', 'joker_stickers', 'deck_stake_wins'}
_profile_progress = _profile_progress or G.PROFILES[G.SETTINGS.profile].progress
_profile_progress.overall_tally, _profile_progress.overall_of =
_profile_progress.discovered.tally/_profile_progress.discovered.of +
_profile_progress.deck_stakes.tally/_profile_progress.deck_stakes.of +
_profile_progress.joker_stickers.tally/_profile_progress.joker_stickers.of +
_profile_progress.challenges.tally/_profile_progress.challenges.of,
4
local text_scale = smaller and 0.7 or 1
local bar_colour = G.PROFILES[G.focused_profile].all_unlocked and G.C.RED or G.C.BLUE
for _, v in ipairs(protos) do
local tab, val, max = nil,nil,nil
if v == 'collection' then
tab, val, max = _profile_progress.discovered, 'tally', _profile_progress.discovered.of
elseif v == 'deck_stake_wins' then
tab, val, max = _profile_progress.deck_stakes, 'tally', _profile_progress.deck_stakes.of
elseif v == 'joker_stickers' then
tab, val, max = _profile_progress.joker_stickers, 'tally', _profile_progress.joker_stickers.of
elseif v == 'challenges' then
tab, val, max = _profile_progress.challenges, 'tally', _profile_progress.challenges.of
end
local filling = v == 'collection' and {
{n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.discovered.tally/_profile_progress.discovered.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}},
{n=G.UIT.T, config={text = " (".._profile_progress.discovered.tally..'/'.._profile_progress.discovered.of..")", scale = 0.35, colour = G.C.JOKER_GREY}}
} or v == 'deck_stake_wins' and {
{n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.deck_stakes.tally/_profile_progress.deck_stakes.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}},
{n=G.UIT.T, config={text = " (".._profile_progress.deck_stakes.tally..'/'.._profile_progress.deck_stakes.of..")", scale = 0.35, colour = G.C.JOKER_GREY}}
} or v == 'joker_stickers' and {
{n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.joker_stickers.tally/_profile_progress.joker_stickers.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}},
{n=G.UIT.T, config={text = " (".._profile_progress.joker_stickers.tally..'/'.._profile_progress.joker_stickers.of..")", scale = 0.35, colour = G.C.JOKER_GREY}}
} or v == 'challenges' and {
{n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.challenges.tally/_profile_progress.challenges.of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55*text_scale})}},
{n=G.UIT.T, config={text = " (".._profile_progress.challenges.tally..'/'.._profile_progress.challenges.of..")", scale = 0.35, colour = G.C.JOKER_GREY}}
}
rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 3.5*text_scale, maxw = 3.5*text_scale}, nodes={
{n=G.UIT.T, config={text = localize('k_'..v), scale = 0.5*text_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.C, config={align = "cl", minh =smaller and 0.5 or 0.8, r = 0.1, minw = 3.5*text_scale, colour = G.C.BLACK, emboss = 0.05,
progress_bar = {
max = max, ref_table = tab, ref_value = val, empty_col = G.C.BLACK, filled_col = adjust_alpha(bar_colour, 0.5)
}}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 3.5*text_scale}, nodes=filling},
}},
}}
end
return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = 3.5*text_scale, maxw = 3.5*text_scale}, nodes={
{n=G.UIT.T, config={text = localize('k_progress'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.C, config={align = "cl", minh = 0.6, r = 0.1, minw = 3.5*text_scale, colour = G.C.BLACK, emboss = 0.05,
progress_bar = {
max = _profile_progress.overall_of, ref_table = _profile_progress, ref_value = 'overall_tally', empty_col = G.C.BLACK, filled_col = adjust_alpha(bar_colour, 0.5)
}}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 3.5*text_scale}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {math.floor(0.01+100*_profile_progress.overall_tally/_profile_progress.overall_of)..'%'}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55})}},
}},
}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes=rows},
}}
end
function create_UIBox_high_scores_row(score)
if not G.PROFILES[G.SETTINGS.profile].high_scores[score] then return nil end
local label_scale = 0.65 - 0.025*math.max(string.len(G.PROFILES[G.SETTINGS.profile].high_scores[score].label)-8, 0)
local label_w, score_w, h = 3.5, 4, 0.8
local score_tab = {}
if score == 'poker_hand' then
local handname, amount = localize('k_none'), 0
for k, v in pairs(G.PROFILES[G.SETTINGS.profile].hand_usage) do if v.count > amount then handname = v.order; amount = v.count end end
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {amount < 1 and handname or localize(handname,'poker_hands')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.55})}},
{n=G.UIT.T, config={text = " ("..amount..")", scale = 0.45, colour = G.C.JOKER_GREY}}
}
elseif score == 'most_money' then
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {localize('$')..number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.MONEY},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}},
}
elseif score == 'win_streak' then
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.WHITE},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}},
{n=G.UIT.T, config={text = " ("..G.PROFILES[G.SETTINGS.profile].high_scores["current_streak"].amt..")", scale = 0.45, colour = G.C.JOKER_GREY}}
}
elseif score == 'hand' then
local chip_sprite = Sprite(0,0,0.4,0.4,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0})
chip_sprite.states.drag.can = false
score_tab = {
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={w=0.4,h=0.4 , object = chip_sprite}}
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.RED},shadow = true, float = true, scale = math.min(0.75, score_number_scale(1.5, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt))})}},
}},
}
elseif score == 'collection' then
score_tab = {
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {'%'..math.floor(0.01+100*G.PROFILES[G.SETTINGS.profile].high_scores[score].amt/G.PROFILES[G.SETTINGS.profile].high_scores[score].tot)}, colours = {G.C.WHITE},shadow = true, float = true, scale = math.min(0.75, score_number_scale(1.5, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt))})}},
{n=G.UIT.T, config={text = " ("..G.PROFILES[G.SETTINGS.profile].high_scores[score].amt..'/'..G.PROFILES[G.SETTINGS.profile].high_scores[score].tot..")", scale = 0.45, colour = G.C.JOKER_GREY}}
}},
}
else
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)}, colours = {G.C.FILTER},shadow = true, float = true, scale = score_number_scale(0.85, G.PROFILES[G.SETTINGS.profile].high_scores[score].amt)})}},
}
end
return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, minw = label_w, maxw = label_w}, nodes={
{n=G.UIT.T, config={text = localize(score, 'high_scores'), scale = label_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.C, config={align = "cl", minh = h, r = 0.1, minw = score_w, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = score_w, maxw = score_w}, nodes=score_tab},
}},
}}
end
function create_UIBox_win()
local show_lose_cta = false
local eased_green = copy_table(G.C.GREEN)
eased_green[4] = 0
ease_value(eased_green, 4, 0.5, nil, nil, true)
local t = create_UIBox_generic_options({ padding = 0, bg_colour = eased_green , colour = G.C.BLACK, outline_colour = G.C.EDITION, no_back = true, no_esc = true, contents = {
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_you_win')}, colours = {G.C.EDITION},shadow = true, float = true, spacing = 10, rotate = true, scale = 1.5, pop_in = 0.4, maxw = 6.5})}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={
create_UIBox_round_scores_row('hand'),
create_UIBox_round_scores_row('poker_hand'),
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.08}, nodes={
create_UIBox_round_scores_row('cards_played', G.C.BLUE),
create_UIBox_round_scores_row('cards_discarded', G.C.RED),
create_UIBox_round_scores_row('cards_purchased', G.C.MONEY),
create_UIBox_round_scores_row('times_rerolled', G.C.GREEN),
create_UIBox_round_scores_row('new_collection', G.C.WHITE),
create_UIBox_round_scores_row('seed', G.C.WHITE),
UIBox_button({button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 2.3, minh = 0.4,}),
}},
{n=G.UIT.C, config={align = "tr", padding = 0.08}, nodes={
create_UIBox_round_scores_row('furthest_ante', G.C.FILTER),
create_UIBox_round_scores_row('furthest_round', G.C.FILTER),
{n=G.UIT.R, config={align = "cm", minh = 0.4, minw = 0.1}, nodes={}},
show_win_cta and UIBox_button({id = 'win_cta', button = 'show_main_cta', label = {localize('b_next')}, colour = G.C.GREEN, scale = 0.8, minw = 2.5, minh = 2.5, focus_args = {nav = 'wide', snap_to = true}}) or nil,
not show_win_cta and UIBox_button({id = 'from_game_won', button = 'notify_then_setup_run', label = {localize('b_start_new_run')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide', snap_to = true}}) or nil,
not show_win_cta and {n=G.UIT.R, config={align = "cm", minh = 0.2, minw = 0.1}, nodes={}} or nil,
not show_win_cta and UIBox_button({button = 'go_to_menu', label = {localize('b_main_menu')}, minw = 2.5, maxw = 2.5, minh = 1, focus_args = {nav = 'wide'}}) or nil,
}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={
UIBox_button({button = 'exit_overlay_menu', label = {localize('b_endless')}, minw = 6.5, maxw = 5, minh = 1.2, scale = 0.7, shadow = true, colour = G.C.BLUE, focus_args = {nav = 'wide', button = 'x',set_button_pip = true}}),
}},
}}
}}
}})
t.nodes[1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 2}, nodes={
{n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={t.nodes[1]}
}}
}
--t.nodes[1].config.mid = true
t.config.id = 'you_win_UI'
return t
end
function create_UIBox_exit_CTA()
local t = create_UIBox_generic_options({ back_label = 'Quit Game', back_func = 'quit' , colour = G.C.BLACK, back_colour = G.C.RED, padding = 0, contents = {
{n=G.UIT.C, config={align = "tm", padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_1')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.9})}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_2')}, colours = {G.C.WHITE},shadow = true, bump = true, rotate = true, pop_in = 0.2, scale = 1.4})}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0.12, emboss = 0.1, colour = G.C.L_BLACK, r = 0.1}, nodes={
simple_text_container('ml_demo_thanks_message',{colour = G.C.UI.TEXT_LIGHT, scale = 0.55, shadow = true}),
{n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={
UIBox_button({button = 'wishlist_steam', label = {localize('b_wishlist')}, minw = 5.9, minh = 1.1, scale = 0.5, shadow = true, colour = G.C.GREEN, focus_args = {nav = 'wide', button = 'x',set_button_pip = true, snap_to = true}}),
UIBox_button({button = 'go_to_playbalatro', label = {localize('b_playbalatro')}, minw = 4.9, minh = 0.8, scale = 0.4, shadow = true, colour = G.C.BLUE, focus_args = {nav = 'wide', button = 'y',set_button_pip = true}}),
}},
}},
}}
}})
t.nodes[2] = t.nodes[1]
t.nodes[1] = {n=G.UIT.C, config={align = "cm", padding = 2}, nodes={
{n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}},
}}
--t.nodes[1].config.mid = true
return t
end
function create_UIBox_small_cta()
return {n=G.UIT.ROOT, config={align = "cm", minw = 4, minh = 3}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_demo_thanks_1')}, colours = {G.C.WHITE},shadow = true, float = true, scale = 0.3})}},
}}
end
function create_UIBox_demo_video_CTA()
G.E_MANAGER:add_event(Event({
trigger = 'after',
delay = 21.7,
blockable = false,
blocking = false,
func = (function()
G.exception_queue = 'other'
G.FUNCS.go_to_demo_cta()
G.exception_queue = nil
return true
end)}), 'other')
RESTART_MUSIC()
local video_file = love.graphics.newVideo('resources/democta.ogv')
local vid_sprite = Sprite(0,0,11*16/9,11,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0})
video_file:getSource():setVolume(G.SETTINGS.SOUND.volume*G.SETTINGS.SOUND.game_sounds_volume/(100*100))
vid_sprite.video = video_file
video_file:play()
local t = create_UIBox_generic_options({ back_delay = 7, back_label = localize('b_skip'), back_func = 'go_to_demo_cta' , colour = G.C.BLACK, padding = 0, contents = {
{n=G.UIT.O, config={object = vid_sprite}},
}})
return t
end
function create_UIBox_game_over()
local show_lose_cta = false
local eased_red = copy_table(G.GAME.round_resets.ante <= G.GAME.win_ante and G.C.RED or G.C.BLUE)
eased_red[4] = 0
ease_value(eased_red, 4, 0.8, nil, nil, true)
local t = create_UIBox_generic_options({ bg_colour = eased_red ,no_back = true, padding = 0, contents = {
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_game_over')}, colours = {G.C.RED},shadow = true, float = true, scale = 1.5, pop_in = 0.4, maxw = 6.5})}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.15}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.BLACK, emboss = 0.05, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08}, nodes={
create_UIBox_round_scores_row('hand'),
create_UIBox_round_scores_row('poker_hand'),
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.08}, nodes={
create_UIBox_round_scores_row('cards_played', G.C.BLUE),
create_UIBox_round_scores_row('cards_discarded', G.C.RED),
create_UIBox_round_scores_row('cards_purchased', G.C.MONEY),
create_UIBox_round_scores_row('times_rerolled', G.C.GREEN),
create_UIBox_round_scores_row('new_collection', G.C.WHITE),
create_UIBox_round_scores_row('seed', G.C.WHITE),
UIBox_button({button = 'copy_seed', label = {localize('b_copy')}, colour = G.C.BLUE, scale = 0.3, minw = 2.3, minh = 0.4, focus_args = {nav = 'wide'}}),
}},
{n=G.UIT.C, config={align = "tr", padding = 0.08}, nodes={
create_UIBox_round_scores_row('furthest_ante', G.C.FILTER),
create_UIBox_round_scores_row('furthest_round', G.C.FILTER),
create_UIBox_round_scores_row('defeated_by'),
}}
}}
}},
show_lose_cta and
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={id = 'lose_cta', align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.GREEN, button = "show_main_cta", shadow = true}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.T, config={text = localize('b_next'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, focus_args = {nav = 'wide', snap_to = true}}}
}}
}}
}} or
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.R, config={id = 'from_game_over', align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.RED, button = "notify_then_setup_run", shadow = true, focus_args = {nav = 'wide', snap_to = true}}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true, maxw = 4.8}, nodes={
{n=G.UIT.T, config={text = localize('b_start_new_run'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}
}}
}},
{n=G.UIT.R, config={align = "cm", minw = 5, padding = 0.1, r = 0.1, hover = true, colour = G.C.RED, button = "go_to_menu", shadow = true, focus_args = {nav = 'wide'}}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true, maxw = 4.8}, nodes={
{n=G.UIT.T, config={text = localize('b_main_menu'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}
}}
}}
}}
}},
}}
}})
t.nodes[1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 2}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={padding = 0, id = 'jimbo_spot', object = Moveable(0,0,G.CARD_W*1.1, G.CARD_H*1.1)}},
}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={t.nodes[1]}}}
}
--t.nodes[1].config.mid = true
return t
end
function create_UIBox_round_scores_row(score, text_colour)
local label = G.GAME.round_scores[score] and localize('ph_score_'..score) or ''
local check_high_score = false
local score_tab = {}
local label_w, score_w, h = ({hand=true,poker_hand=true})[score] and 3.5 or 2.9, ({hand=true,poker_hand=true})[score] and 3.5 or 1, 0.5
if score == 'furthest_ante' then
label_w = 1.9
check_high_score = true
label = localize('k_ante')
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_resets.ante)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = 0.45})}},
}
end
if score == 'furthest_round' then
label_w = 1.9
check_high_score = true
label = localize('k_round')
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = 0.45})}},
}
end
if score == 'seed' then
label_w = 1.9
score_w = 1.9
label = localize('k_seed')
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {G.GAME.pseudorandom.seed}, colours = {text_colour or G.C.WHITE},shadow = true, float = true, scale = 0.45})}},
}
end
if score == 'defeated_by' then
label = localize('k_defeated_by')
local blind_choice = {config = G.GAME.blind.config.blind or G.P_BLINDS.bl_small}
blind_choice.animation = AnimatedSprite(0,0, 1.4, 1.4, G.ANIMATION_ATLAS['blind_chips'], blind_choice.config.pos)
blind_choice.animation:define_draw_steps({
{shader = 'dissolve', shadow_height = 0.05},
{shader = 'dissolve'}
})
score_tab = {
{n=G.UIT.R, config={align = "cm", minh = 0.6}, nodes={
{n=G.UIT.O, config={object = DynaText({string = localize{type ='name_text', key = blind_choice.config.key, set = 'Blind'}, colours = {G.C.WHITE},shadow = true, float = true,maxw = 2.2, scale = 0.45})}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.O, config={object = blind_choice.animation}}
}},
}
end
local label_scale = 0.5
if score == 'poker_hand' then
local handname, amount = localize('k_none'), 0
for k, v in pairs(G.GAME.hand_usage) do if v.count > amount then handname = v.order; amount = v.count end end
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {amount <1 and handname or localize(handname,'poker_hands')}, colours = {text_colour or G.C.WHITE},shadow = true, float = true, scale = 0.45, maxw = 2.5})}},
{n=G.UIT.T, config={text = " ("..amount..")", scale = 0.35, colour = G.C.JOKER_GREY}}
}
elseif score == 'hand' then
check_high_score = true
local chip_sprite = Sprite(0,0,0.3,0.3,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0})
chip_sprite.states.drag.can = false
score_tab = {
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={w=0.3,h=0.3 , object = chip_sprite}}
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_scores[score].amt)}, colours = {text_colour or G.C.RED},shadow = true, float = true, scale = math.min(0.6, score_number_scale(1.2, G.GAME.round_scores[score].amt))})}},
}},
}
elseif G.GAME.round_scores[score] and not score_tab[1] then
score_tab = {
{n=G.UIT.O, config={object = DynaText({string = {number_format(G.GAME.round_scores[score].amt)}, colours = {text_colour or G.C.FILTER},shadow = true, float = true, scale = score_number_scale(0.6, G.GAME.round_scores[score].amt)})}},
}
end
return {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, func = check_high_score and 'high_score_alert' or nil, id = score}, nodes={
{n=score=='defeated_by' and G.UIT.R or G.UIT.C, config={align = "cm", padding = 0.02, minw = label_w, maxw = label_w}, nodes={
{n=G.UIT.T, config={text = label, scale = label_scale, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=score=='defeated_by' and G.UIT.R or G.UIT.C, config={align = "cr"}, nodes={
{n=G.UIT.C, config={align = "cm", minh = h, r = 0.1, minw = score=='defeated_by' and label_w or score_w, colour = (score == 'seed' and G.GAME.seeded) and G.C.RED or G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = score_w}, nodes=score_tab},
}}
}},
}}
end
function create_UIBox_hand_tip(handname)
if not G.GAME.hands[handname].example then return {n=G.UIT.R, config={align = "cm"},nodes = {}} end
local cardarea = CardArea(
2,2,
3.5*G.CARD_W,
0.75*G.CARD_H,
{card_limit = 5, type = 'title', highlight_limit = 0})
for k, v in ipairs(G.GAME.hands[handname].example) do
local card = Card(0,0, 0.5*G.CARD_W, 0.5*G.CARD_H, G.P_CARDS[v[1]], G.P_CENTERS.c_base)
if v[2] then card:juice_up(0.3, 0.2) end
if k == 1 then play_sound('paper1',0.95 + math.random()*0.1, 0.3) end
ease_value(card.T, 'scale',v[2] and 0.25 or -0.15,nil,'REAL',true,0.2)
cardarea:emplace(card)
end
return {n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, r = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = cardarea}}
}}
}}
end
function create_UIBox_current_hand_row(handname, simple)
return (G.GAME.hands[handname].visible) and
(not simple and
{n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), emboss = 0.05, hover = true, force_focus = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}}, nodes={
{n=G.UIT.C, config={align = "cl", padding = 0, minw = 5}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.01, r = 0.1, colour = G.C.HAND_LEVELS[math.min(7, G.GAME.hands[handname].level)], minw = 1.5, outline = 0.8, outline_colour = G.C.WHITE}, nodes={
{n=G.UIT.T, config={text = localize('k_level_prefix')..G.GAME.hands[handname].level, scale = 0.5, colour = G.C.UI.TEXT_DARK}}
}},
{n=G.UIT.C, config={align = "cm", minw = 4.5, maxw = 4.5}, nodes={
{n=G.UIT.T, config={text = ' '..localize(handname,'poker_hands'), scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}},
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.BLACK,r = 0.1}, nodes={
{n=G.UIT.C, config={align = "cr", padding = 0.01, r = 0.1, colour = G.C.CHIPS, minw = 1.1}, nodes={
{n=G.UIT.T, config={text = G.GAME.hands[handname].chips, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}},
{n=G.UIT.B, config={w = 0.08, h = 0.01}}
}},
{n=G.UIT.T, config={text = "X", scale = 0.45, colour = G.C.MULT}},
{n=G.UIT.C, config={align = "cl", padding = 0.01, r = 0.1, colour = G.C.MULT, minw = 1.1}, nodes={
{n=G.UIT.B, config={w = 0.08,h = 0.01}},
{n=G.UIT.T, config={text = G.GAME.hands[handname].mult, scale = 0.45, colour = G.C.UI.TEXT_LIGHT}}
}}
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = ' #', scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
{n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK,r = 0.1, minw = 0.9}, nodes={
{n=G.UIT.T, config={text = G.GAME.hands[handname].played, scale = 0.45, colour = G.C.FILTER, shadow = true}},
}}
}}
or {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = darken(G.C.JOKER_GREY, 0.1), force_focus = true, emboss = 0.05, hover = true, on_demand_tooltip = {text = localize(handname, 'poker_hand_descriptions'), filler = {func = create_UIBox_hand_tip, args = handname}}, focus_args = {snap_to = (simple and handname == 'Straight Flush')}}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0, minw = 5}, nodes={
{n=G.UIT.T, config={text = localize(handname,'poker_hands'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}})
or nil
end
function create_UIBox_current_hands(simple)
local hands = {
create_UIBox_current_hand_row("Flush Five", simple),
create_UIBox_current_hand_row("Flush House", simple),
create_UIBox_current_hand_row("Five of a Kind", simple),
create_UIBox_current_hand_row("Straight Flush", simple),
create_UIBox_current_hand_row("Four of a Kind", simple),
create_UIBox_current_hand_row("Full House", simple),
create_UIBox_current_hand_row("Flush", simple),
create_UIBox_current_hand_row("Straight", simple),
create_UIBox_current_hand_row("Three of a Kind", simple),
create_UIBox_current_hand_row("Two Pair", simple),
create_UIBox_current_hand_row("Pair", simple),
create_UIBox_current_hand_row("High Card", simple)
}
local t = {n=G.UIT.ROOT, config={align = "cm", minw = 3, padding = 0.1, r = 0.1, colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.04}, nodes=
hands
},
}}
return t
end
function G.UIDEF.deck_info(_show_remaining)
return create_UIBox_generic_options({contents ={create_tabs(
{tabs = _show_remaining and {
{
label = localize('b_remaining'),
chosen = true,
tab_definition_function = G.UIDEF.view_deck,
tab_definition_function_args = true,
},
{
label = localize('b_full_deck'),
tab_definition_function = G.UIDEF.view_deck
},
} or {
{
label = localize('b_full_deck'),
chosen = true,
tab_definition_function = G.UIDEF.view_deck
},
},
tab_h = 8,
snap_to_nav = true})}})
end
function G.UIDEF.run_info()
return create_UIBox_generic_options({contents ={create_tabs(
{tabs = {
{
label = localize('b_poker_hands'),
chosen = true,
tab_definition_function = create_UIBox_current_hands,
},
{
label = localize('b_blinds'),
tab_definition_function = G.UIDEF.current_blinds,
},
{
label = localize('b_vouchers'),
tab_definition_function = G.UIDEF.used_vouchers,
},
G.GAME.stake > 1 and {
label = localize('b_stake'),
tab_definition_function = G.UIDEF.current_stake,
} or nil,
},
tab_h = 8,
snap_to_nav = true})}})
end
function G.UIDEF.current_blinds()
return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, padding = 0.2}, nodes={
G.GAME.round_resets.blind_states['Small'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={
create_UIBox_blind_choice('Small', true)
}} or nil,
G.GAME.round_resets.blind_states['Big'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={
create_UIBox_blind_choice('Big', true)
}} or nil,
G.GAME.round_resets.blind_states['Boss'] ~= 'Hide' and {n=G.UIT.C, config={align = "tm", padding = 0.1, outline = 2, r = 0.1, line_emboss = 0.2, outline_colour = G.C.BLACK}, nodes={
create_UIBox_blind_choice('Boss', true)
}} or nil
}}
end
function G.UIDEF.deck_stake_column(_deck_key)
local deck_usage = G.PROFILES[G.SETTINGS.profile].deck_usage[_deck_key]
local stake_col = {}
local valid_option = nil
for i = #G.P_CENTER_POOLS['Stake'], 1, -1 do
local _wins = deck_usage and deck_usage.wins[i] or 0
if (deck_usage and deck_usage.wins[i-1]) or i == 1 or G.PROFILES[G.SETTINGS.profile].all_unlocked then valid_option = true end
stake_col[#stake_col+1] = {n=G.UIT.R, config={id = i, align = "cm", colour = _wins > 0 and G.C.GREY or G.C.CLEAR, outline = 0, outline_colour = G.C.WHITE, r = 0.1, minh = 0.25, minw = valid_option and 0.45 or 0.25, func = 'RUN_SETUP_check_back_stake_highlight'}, nodes={
{n=G.UIT.R, config={align = "cm", minh = valid_option and 0.17 or 0.13, minw = valid_option and 0.37 or 0.13, colour = _wins > 0 and get_stake_col(i) or G.C.UI.TRANSPARENT_LIGHT, r = 0.1},nodes={}}
}}
if i > 1 then stake_col[#stake_col+1] = {n=G.UIT.R, config={align = "cm", minh = 0.1, minw = 0.04},nodes={}} end
end
return {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes =stake_col}
end
function G.UIDEF.current_stake()
local other_col = nil
if G.GAME.stake > 2 then
local stake_desc_rows = {{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.T, config={text = localize('k_also_applied'), scale = 0.4, colour = G.C.WHITE}}
}}
}
for i = G.GAME.stake-1, 2, -1 do
local _stake_desc = {}
local _stake_center = G.P_CENTER_POOLS.Stake[i]
localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = _stake_desc}
local _full_desc = {}
for k, v in ipairs(_stake_desc) do
_full_desc[#_full_desc+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v}
end
_full_desc[#_full_desc] = nil
stake_desc_rows[#stake_desc_rows+1] = {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = 'cm'}, nodes ={{n=G.UIT.C, config={align = "cm", colour = get_stake_col(i), r = 0.1, minh = 0.35, minw = 0.35, emboss = 0.05}, nodes={}}, {n=G.UIT.B, config={w=0.1,h=0.1}}}},
{n=G.UIT.C, config={align = "cm", padding = 0.03, colour = G.C.WHITE, r = 0.1, minh = 0.7, minw = 4.8}, nodes=_full_desc},
}}
end
other_col = {n=G.UIT.R, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes=stake_desc_rows}
end
local stake_sprite = get_stake_sprite(G.GAME.stake, 0.8)
local _stake_desc = {}
local _stake_center = G.P_CENTER_POOLS.Stake[G.GAME.stake]
localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = _stake_desc}
local _full_desc = {}
for k, v in ipairs(_stake_desc) do
_full_desc[#_full_desc+1] = {n=G.UIT.R, config={align = "cm"}, nodes=v}
end
_full_desc[#_full_desc] = nil
local current_col = {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, minw = 4}, nodes={
{n=G.UIT.O, config={colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}},
{n=G.UIT.T, config={text = localize{type = 'name_text', key = G.P_CENTER_POOLS.Stake[G.GAME.stake].key, set = 'Stake'}, scale = 0.45, colour = G.C.WHITE}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05, colour = get_stake_col(G.GAME.stake), r = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05, colour = G.C.WHITE, r = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.03, minh = 0.7, minw = 3.8}, nodes=_full_desc}
}}
}}
}}
return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1, padding = 0.1}, nodes={
current_col,other_col
}}
end
function G.UIDEF.view_deck(unplayed_only)
local deck_tables = {}
remove_nils(G.playing_cards)
G.VIEWING_DECK = true
table.sort(G.playing_cards, function (a, b) return a:get_nominal('suit') > b:get_nominal('suit') end )
local SUITS = {
Spades = {},
Hearts = {},
Clubs = {},
Diamonds = {},
}
local suit_map = {'Spades', 'Hearts', 'Clubs', 'Diamonds'}
for k, v in ipairs(G.playing_cards) do
table.insert(SUITS[v.base.suit], v)
end
for j = 1, 4 do
if SUITS[suit_map[j]][1] then
local view_deck = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
6.5*G.CARD_W,
0.6*G.CARD_H,
{card_limit = #SUITS[suit_map[j]], type = 'title', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.7, draw_layers = {'card'}})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = view_deck}}
}}
)
for i = 1, #SUITS[suit_map[j]] do
if SUITS[suit_map[j]][i] then
local greyed, _scale = nil, 0.7
if unplayed_only and not ((SUITS[suit_map[j]][i].area and SUITS[suit_map[j]][i].area == G.deck) or SUITS[suit_map[j]][i].ability.wheel_flipped) then
greyed = true
end
local copy = copy_card(SUITS[suit_map[j]][i],nil, _scale)
copy.greyed = greyed
copy.T.x = view_deck.T.x + view_deck.T.w/2
copy.T.y = view_deck.T.y
copy:hard_set_T()
view_deck:emplace(copy)
end
end
end
end
local flip_col = G.C.WHITE
local suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0}
local mod_suit_tallies = {['Spades'] = 0, ['Hearts'] = 0, ['Clubs'] = 0, ['Diamonds'] = 0}
local rank_tallies = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
local mod_rank_tallies = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
local rank_name_mapping = {2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K', 'A'}
local face_tally = 0
local mod_face_tally = 0
local num_tally = 0
local mod_num_tally = 0
local ace_tally = 0
local mod_ace_tally = 0
local wheel_flipped = 0
for k, v in ipairs(G.playing_cards) do
if v.ability.name ~= 'Stone Card' and (not unplayed_only or ((v.area and v.area == G.deck) or v.ability.wheel_flipped)) then
if v.ability.wheel_flipped and unplayed_only then wheel_flipped = wheel_flipped + 1 end
--For the suits
suit_tallies[v.base.suit] = (suit_tallies[v.base.suit] or 0) + 1
mod_suit_tallies['Spades'] = (mod_suit_tallies['Spades'] or 0) + (v:is_suit('Spades') and 1 or 0)
mod_suit_tallies['Hearts'] = (mod_suit_tallies['Hearts'] or 0) + (v:is_suit('Hearts') and 1 or 0)
mod_suit_tallies['Clubs'] = (mod_suit_tallies['Clubs'] or 0) + (v:is_suit('Clubs') and 1 or 0)
mod_suit_tallies['Diamonds'] = (mod_suit_tallies['Diamonds'] or 0) + (v:is_suit('Diamonds') and 1 or 0)
--for face cards/numbered cards/aces
local card_id = v:get_id()
face_tally = face_tally + ((card_id ==11 or card_id ==12 or card_id ==13) and 1 or 0)
mod_face_tally = mod_face_tally + (v:is_face() and 1 or 0)
if card_id > 1 and card_id < 11 then
num_tally = num_tally + 1
if not v.debuff then mod_num_tally = mod_num_tally + 1 end
end
if card_id == 14 then
ace_tally = ace_tally + 1
if not v.debuff then mod_ace_tally = mod_ace_tally + 1 end
end
--ranks
rank_tallies[card_id - 1] = rank_tallies[card_id - 1] + 1
if not v.debuff then mod_rank_tallies[card_id - 1] = mod_rank_tallies[card_id - 1] + 1 end
end
end
local modded = (face_tally ~= mod_face_tally) or
(mod_suit_tallies['Spades'] ~= suit_tallies['Spades']) or
(mod_suit_tallies['Hearts'] ~= suit_tallies['Hearts']) or
(mod_suit_tallies['Clubs'] ~= suit_tallies['Clubs']) or
(mod_suit_tallies['Diamonds'] ~= suit_tallies['Diamonds'])
if wheel_flipped > 0 then flip_col = mix_colours(G.C.FILTER, G.C.WHITE,0.7) end
local rank_cols = {}
for i = 13, 1, -1 do
local mod_delta = mod_rank_tallies[i] ~= rank_tallies[i]
rank_cols[#rank_cols+1] = {n=G.UIT.R, config={align = "cm", padding = 0.07}, nodes={
{n=G.UIT.C, config={align = "cm", r = 0.1, padding = 0.04, emboss = 0.04, minw = 0.5, colour = G.C.L_BLACK}, nodes={
{n=G.UIT.T, config={text = rank_name_mapping[i],colour = G.C.JOKER_GREY, scale = 0.35, shadow = true}},
}},
{n=G.UIT.C, config={align = "cr", minw = 0.4}, nodes={
mod_delta and {n=G.UIT.O, config={object = DynaText({string = {{string = ''..rank_tallies[i], colour = flip_col},{string =''..mod_rank_tallies[i], colour = G.C.BLUE}}, colours = {G.C.RED}, scale = 0.4, y_offset = -2, silent = true, shadow = true, pop_in_rate = 10, pop_delay = 4})}} or
{n=G.UIT.T, config={text = rank_tallies[i] or 'NIL',colour = flip_col, scale = 0.45, shadow = true}},
}}
}}
end
local t =
{n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 1.5, minh = 2, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, emboss = 0.05, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = G.GAME.selected_back.loc_name, colours = {G.C.WHITE}, bump = true, rotate = true, shadow = true, scale = 0.6 - string.len(G.GAME.selected_back.loc_name)*0.01})}},
}},
{n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.1, minw = 2.5, minh = 1.3, colour = G.C.WHITE, emboss = 0.05}, nodes={
{n=G.UIT.O, config={object = UIBox{
definition = G.GAME.selected_back:generate_UI(nil,0.7, 0.5, G.GAME.challenge),
config = {offset = {x=0,y=0}}
}}}
}}
}},
{n=G.UIT.R, config={align = "cm", r = 0.1, outline_colour = G.C.L_BLACK, line_emboss = 0.05, outline = 1.5}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.07}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{string = localize('k_base_cards'), colour = G.C.RED}, modded and {string = localize('k_effective'), colour = G.C.BLUE} or nil}, colours = {G.C.RED}, silent = true,scale = 0.4,pop_in_rate = 10, pop_delay = 4})}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={
tally_sprite({x=1,y=0},{{string = ''..ace_tally, colour = flip_col},{string =''..mod_ace_tally, colour = G.C.BLUE}}, {localize('k_aces')}),--Aces
tally_sprite({x=2,y=0},{{string = ''..face_tally, colour = flip_col},{string =''..mod_face_tally, colour = G.C.BLUE}}, {localize('k_face_cards')}),--Face
tally_sprite({x=3,y=0},{{string = ''..num_tally, colour = flip_col},{string =''..mod_num_tally, colour = G.C.BLUE}}, {localize('k_numbered_cards')}),--Numbers
}},
{n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={
tally_sprite({x=3,y=1}, {{string = ''..suit_tallies['Spades'], colour = flip_col},{string =''..mod_suit_tallies['Spades'], colour = G.C.BLUE}}, {localize('Spades', 'suits_plural')}),
tally_sprite({x=0,y=1}, {{string = ''..suit_tallies['Hearts'], colour = flip_col},{string =''..mod_suit_tallies['Hearts'], colour = G.C.BLUE}}, {localize('Hearts', 'suits_plural')}),
}},
{n=G.UIT.R, config={align = "cm", minh = 0.05, padding = 0.1}, nodes={
tally_sprite({x=2,y=1}, {{string = ''..suit_tallies['Clubs'], colour = flip_col},{string =''..mod_suit_tallies['Clubs'], colour = G.C.BLUE}}, {localize('Clubs', 'suits_plural')}),
tally_sprite({x=1,y=1}, {{string = ''..suit_tallies['Diamonds'], colour = flip_col},{string =''..mod_suit_tallies['Diamonds'], colour = G.C.BLUE}}, {localize('Diamonds', 'suits_plural')}),
}},
}}
}},
{n=G.UIT.C, config={align = "cm"}, nodes=rank_cols},
{n=G.UIT.B, config={w = 0.1, h = 0.1}},
}},
{n=G.UIT.B, config={w = 0.2, h = 0.1}},
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.8, padding = 0.05}, nodes={
modded and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = mix_colours(G.C.BLUE, G.C.WHITE,0.7)}, nodes = {}},
{n=G.UIT.T, config={text =' '..localize('ph_deck_preview_effective'),colour = G.C.WHITE, scale =0.3}},
}} or nil,
wheel_flipped > 0 and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={padding = 0.3, r = 0.1, colour = flip_col}, nodes = {}},
{n=G.UIT.T, config={text =' '..(wheel_flipped > 1 and
localize{type = 'variable', key = 'deck_preview_wheel_plural', vars = {wheel_flipped}} or
localize{type = 'variable', key = 'deck_preview_wheel_singular', vars = {wheel_flipped}}),colour = G.C.WHITE, scale =0.3}},
}} or nil,
}}
}}
return t
end
function tally_sprite(pos, value, tooltip)
local text_colour = G.C.BLACK
if type(value) == "table" and value[1].string==value[2].string then
text_colour = value[1].colour or G.C.WHITE
value = value[1].string
end
local t_s = Sprite(0,0,0.5,0.5,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=pos.x or 0, y=pos.y or 0})
t_s.states.drag.can = false
t_s.states.hover.can = false
t_s.states.collide.can = false
return
{n=G.UIT.C, config={align = "cm", padding = 0.07,force_focus = true, focus_args = {type = 'tally_sprite'}, tooltip = {text = tooltip}}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, padding = 0.04, emboss = 0.05, colour = G.C.JOKER_GREY}, nodes={
{n=G.UIT.O, config={w=0.5,h=0.5 ,can_collide = false, object = t_s, tooltip = {text = tooltip}}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
type(value) == "table" and {n=G.UIT.O, config={object = DynaText({string = value, colours = {G.C.RED}, scale = 0.4, silent = true, shadow = true, pop_in_rate = 10, pop_delay = 4})}} or
{n=G.UIT.T, config={text = value or 'NIL',colour = text_colour, scale = 0.4, shadow = true}},
}},
}}
end
function G.UIDEF.used_vouchers()
local silent = false
local keys_used = {}
local area_count = 0
local voucher_areas = {}
local voucher_tables = {}
local voucher_table_rows = {}
for k, v in ipairs(G.P_CENTER_POOLS["Voucher"]) do
local key = 1 + math.floor((k-0.1)/2)
keys_used[key] = keys_used[key] or {}
if G.GAME.used_vouchers[v.key] then
keys_used[key][#keys_used[key]+1] = v
end
end
for k, v in ipairs(keys_used) do
if next(v) then
area_count = area_count + 1
end
end
for k, v in ipairs(keys_used) do
if next(v) then
if #voucher_areas == 5 or #voucher_areas == 10 then
table.insert(voucher_table_rows,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes=voucher_tables}
)
voucher_tables = {}
end
voucher_areas[#voucher_areas + 1] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
(#v == 1 and 1 or 1.33)*G.CARD_W,
(area_count >=10 and 0.75 or 1.07)*G.CARD_H,
{card_limit = 2, type = 'voucher', highlight_limit = 0})
for kk, vv in ipairs(v) do
local center = G.P_CENTERS[vv.key]
local card = Card(voucher_areas[#voucher_areas].T.x + voucher_areas[#voucher_areas].T.w/2, voucher_areas[#voucher_areas].T.y, G.CARD_W, G.CARD_H, nil, center, {bypass_discovery_center=true,bypass_discovery_ui=true,bypass_lock=true})
card.ability.order = vv.order
card:start_materialize(nil, silent)
silent = true
voucher_areas[#voucher_areas]:emplace(card)
end
table.insert(voucher_tables,
{n=G.UIT.C, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = voucher_areas[#voucher_areas]}}
}}
)
end
end
table.insert(voucher_table_rows,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes=voucher_tables}
)
local t = silent and {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_vouchers_redeemed')}, colours = {G.C.UI.TEXT_LIGHT}, bump = true, scale = 0.6})}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.5}, nodes={
}},
{n=G.UIT.R, config={align = "cm", colour = G.C.BLACK, r = 1, padding = 0.15, emboss = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes=voucher_table_rows},
}}
}} or
{n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('ph_no_vouchers')}, colours = {G.C.UI.TEXT_LIGHT}, bump = true, scale = 0.6})}}
}}
return t
end
function create_UIBox_your_collection()
set_discover_tallies()
G.E_MANAGER:add_event(Event({
blockable = false,
func = function()
G.REFRESH_ALERTS = true
return true
end
}))
local t = create_UIBox_generic_options({ back_func = G.STAGE == G.STAGES.RUN and 'options' or 'exit_overlay_menu', contents = {
{n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={
UIBox_button({button = 'your_collection_jokers', label = {localize('b_jokers')}, count = G.DISCOVER_TALLIES.jokers, minw = 5, minh = 1.7, scale = 0.6, id = 'your_collection_jokers'}),
UIBox_button({button = 'your_collection_decks', label = {localize('b_decks')}, count = G.DISCOVER_TALLIES.backs, minw = 5}),
UIBox_button({button = 'your_collection_vouchers', label = {localize('b_vouchers')}, count = G.DISCOVER_TALLIES.vouchers, minw = 5, id = 'your_collection_vouchers'}),
{n=G.UIT.R, config={align = "cm", padding = 0.1, r=0.2, colour = G.C.BLACK}, nodes={
{n=G.UIT.C, config={align = "cm", maxh=2.9}, nodes={
{n=G.UIT.T, config={text = localize('k_cap_consumables'), scale = 0.45, colour = G.C.L_BLACK, vert = true, maxh=2.2}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={
UIBox_button({button = 'your_collection_tarots', label = {localize('b_tarot_cards')}, count = G.DISCOVER_TALLIES.tarots, minw = 4, id = 'your_collection_tarots', colour = G.C.SECONDARY_SET.Tarot}),
UIBox_button({button = 'your_collection_planets', label = {localize('b_planet_cards')}, count = G.DISCOVER_TALLIES.planets, minw = 4, id = 'your_collection_planets', colour = G.C.SECONDARY_SET.Planet}),
UIBox_button({button = 'your_collection_spectrals', label = {localize('b_spectral_cards')}, count = G.DISCOVER_TALLIES.spectrals, minw = 4, id = 'your_collection_spectrals', colour = G.C.SECONDARY_SET.Spectral}),
}}
}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.15}, nodes={
UIBox_button({button = 'your_collection_enhancements', label = {localize('b_enhanced_cards')}, minw = 5}),
UIBox_button({button = 'your_collection_seals', label = {localize('b_seals')}, minw = 5, id = 'your_collection_seals'}),
UIBox_button({button = 'your_collection_editions', label = {localize('b_editions')}, count = G.DISCOVER_TALLIES.editions, minw = 5, id = 'your_collection_editions'}),
UIBox_button({button = 'your_collection_boosters', label = {localize('b_booster_packs')}, count = G.DISCOVER_TALLIES.boosters, minw = 5, id = 'your_collection_boosters'}),
UIBox_button({button = 'your_collection_tags', label = {localize('b_tags')}, count = G.DISCOVER_TALLIES.tags, minw = 5, id = 'your_collection_tags'}),
UIBox_button({button = 'your_collection_blinds', label = {localize('b_blinds')}, count = G.DISCOVER_TALLIES.blinds, minw = 5, minh = 2.0, id = 'your_collection_blinds', focus_args = {snap_to = true}}),
}},
}})
return t
end
function create_UIBox_your_collection_jokers()
local deck_tables = {}
G.your_collection = {}
for j = 1, 3 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
5*G.CARD_W,
0.95*G.CARD_H,
{card_limit = 5, type = 'title', highlight_limit = 0, collection = true})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0.07, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
local joker_options = {}
for i = 1, math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection)) do
table.insert(joker_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Joker/(5*#G.your_collection))))
end
for i = 1, 5 do
for j = 1, #G.your_collection do
local center = G.P_CENTER_POOLS["Joker"][i+(j-1)*5]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center)
card.sticker = get_joker_win_sticker(center)
G.your_collection[j]:emplace(card)
end
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
{n=G.UIT.R, config={align = "cm", r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
{n=G.UIT.R, config={align = "cm"}, nodes={
create_option_cycle({options = joker_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_joker_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true, nav = 'wide'}})
}}
}})
return t
end
function create_UIBox_your_collection_tarots()
local deck_tables = {}
G.your_collection = {}
for j = 1, 2 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
(4.25+j)*G.CARD_W,
1*G.CARD_H,
{card_limit = 4 + j, type = 'title', highlight_limit = 0, collection = true})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
local tarot_options = {}
for i = 1, math.floor(#G.P_CENTER_POOLS.Tarot/11) do
table.insert(tarot_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.floor(#G.P_CENTER_POOLS.Tarot/11)))
end
for j = 1, #G.your_collection do
for i = 1, 4+j do
local center = G.P_CENTER_POOLS["Tarot"][i+(j-1)*(5)]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center)
card:start_materialize(nil, i>1 or j>1)
G.your_collection[j]:emplace(card)
end
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
{n=G.UIT.R, config={align = "cm"}, nodes={
create_option_cycle({options = tarot_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_tarot_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true})
}}
}})
return t
end
function create_UIBox_your_collection_boosters()
local deck_tables = {}
G.your_collection = {}
for j = 1, 2 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
(5.25)*G.CARD_W,
1.3*G.CARD_H,
{card_limit = 4, type = 'title', highlight_limit = 0, collection = true})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
local booster_options = {}
for i = 1, math.ceil(#G.P_CENTER_POOLS.Booster/8) do
table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Booster/8)))
end
for j = 1, #G.your_collection do
for i = 1, 4 do
local center = G.P_CENTER_POOLS["Booster"][i+(j-1)*4]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W*1.27, G.CARD_H*1.27, nil, center)
card:start_materialize(nil, i>1 or j>1)
G.your_collection[j]:emplace(card)
end
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
{n=G.UIT.R, config={align = "cm"}, nodes={
create_option_cycle({options = booster_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_booster_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true})
}}
}})
return t
end
function create_UIBox_your_collection_planets()
local deck_tables = {}
G.your_collection = {}
for j = 1, 2 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
(6.25)*G.CARD_W,
1*G.CARD_H,
{card_limit = 6, type = 'title', highlight_limit = 0, collection = true})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
for j = 1, #G.your_collection do
for i = 1, 6 do
local center = G.P_CENTER_POOLS["Planet"][i+(j-1)*(6)]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center)
card:start_materialize(nil, i>1 or j>1)
G.your_collection[j]:emplace(card)
end
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
{n=G.UIT.R, config={align = "cm", padding = 0.7}, nodes={}},
}})
return t
end
function create_UIBox_your_collection_spectrals()
local deck_tables = {}
G.your_collection = {}
for j = 1, 2 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
(3.25+j)*G.CARD_W,
1*G.CARD_H,
{card_limit = 3+j, type = 'title', highlight_limit = 0, collection = true})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
for j = 1, #G.your_collection do
for i = 1, 3+j do
local center = G.P_CENTER_POOLS["Spectral"][i+(j-1)*3 + j - 1]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center)
card:start_materialize(nil, i>1 or j>1)
G.your_collection[j]:emplace(card)
end
end
local spectral_options = {}
for i = 1, math.floor(#G.P_CENTER_POOLS.Tarot/9) do
table.insert(spectral_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.floor(#G.P_CENTER_POOLS.Spectral/9)))
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
create_option_cycle({options = spectral_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_spectral_page', focus_args = {snap_to = true, nav = 'wide'},current_option = 1, colour = G.C.RED, no_pips = true})
}},
}})
return t
end
function create_UIBox_your_collection_vouchers(exit)
local deck_tables = {}
G.your_collection = {}
for j = 1, 2 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
4.25*G.CARD_W,
1*G.CARD_H,
{card_limit = 4, type = 'voucher', highlight_limit = 0, collection = true})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
local voucher_options = {}
for i = 1, math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection)) do
table.insert(voucher_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.P_CENTER_POOLS.Voucher/(4*#G.your_collection))))
end
for i = 1, 4 do
for j = 1, #G.your_collection do
local center = G.P_CENTER_POOLS["Voucher"][i+(j-1)*4]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, nil, center)
card.ability.order = i+(j-1)*4
card:start_materialize(nil, i>1 or j>1)
G.your_collection[j]:emplace(card)
end
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
{n=G.UIT.R, config={align = "cm"}, nodes={
create_option_cycle({options = voucher_options, w = 4.5, cycle_shoulders = true, opt_callback = 'your_collection_voucher_page', focus_args = {snap_to = true, nav = 'wide'}, current_option = 1, colour = G.C.RED, no_pips = true})
}}
}})
return t
end
function create_UIBox_your_collection_seals(exit)
local deck_tables = {}
G.your_collection = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
4.25*G.CARD_W,
1.03*G.CARD_H,
{card_limit = 4, type = 'title', highlight_limit = 0})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection}}
}}
)
for k, v in ipairs(G.P_CENTER_POOLS['Seal']) do
local center = G.P_CENTERS.c_base
local card = Card(G.your_collection.T.x + G.your_collection.T.w/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center)
card:set_seal(v.key, true)
G.your_collection:emplace(card)
end
local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = exit or 'your_collection', snap_back = true, contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
}})
return t
end
function create_UIBox_your_collection_enhancements(exit)
local deck_tables = {}
G.your_collection = {}
for j = 1, 2 do
G.your_collection[j] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
4.25*G.CARD_W,
1.03*G.CARD_H,
{card_limit = 4, type = 'title', highlight_limit = 0})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[j]}}
}}
)
end
for i = 1, 4 do
for j = 1, #G.your_collection do
local center = G.P_CENTER_POOLS["Enhanced"][i+(j-1)*4]
local card = Card(G.your_collection[j].T.x + G.your_collection[j].T.w/2, G.your_collection[j].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, center)
G.your_collection[j]:emplace(card)
end
end
local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = exit or 'your_collection', snap_back = true, contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes=deck_tables},
}})
return t
end
function create_UIBox_your_collection_editions()
G.your_collection = {}
G.your_collection[1] = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
5.3*G.CARD_W,
1.03*G.CARD_H,
{card_limit = 5, type = 'title', highlight_limit = 0, collection = true})
local deck_tables =
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.O, config={object = G.your_collection[1]}}
}}
local editions = {'base', 'foil','holo','polychrome','negative'}
for i = 1, 5 do
local card = Card(G.your_collection[1].T.x + G.your_collection[1].T.w/2, G.your_collection[1].T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, G.P_CENTERS['e_'..editions[i]])
card:start_materialize()
if G.P_CENTERS['e_'..editions[i]].discovered then card:set_edition({[editions[i]] = true}, true, true) end
G.your_collection[1]:emplace(card)
end
INIT_COLLECTION_CARD_ALERTS()
local t = create_UIBox_generic_options({ infotip = localize('ml_edition_seal_enhancement_explanation'), back_func = 'your_collection', snap_back = true, contents = {
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={deck_tables}},
}})
return t
end
function create_UIBox_your_collection_decks()
G.GAME.viewed_back = Back(G.P_CENTERS.b_red)
local area = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
1.2*G.CARD_W,
1.2*G.CARD_H,
{card_limit = 52, type = 'deck', highlight_limit = 0})
for i = 1, 52 do
local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W*1.2, G.CARD_H*1.2, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {playing_card = i, viewed_back = true})
card.sprite_facing = 'back'
card.facing = 'back'
area:emplace(card)
if i == 52 then G.sticker_card = card; card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end
end
local ordered_names = {}
for k, v in ipairs(G.P_CENTER_POOLS.Back) do
ordered_names[#ordered_names+1] = v.name
end
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
create_option_cycle({options = ordered_names, opt_callback = 'change_viewed_back', current_option = 1, colour = G.C.RED, w = 4.5, focus_args = {snap_to = true}, mid =
{n=G.UIT.R, config={align = "cm", minw = 2.5, padding = 0.1, r = 0.1, colour = G.C.BLACK, emboss = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.2}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = area}}
}},
{n=G.UIT.C, config={align = "tm", minw = 3.7, minh = 2.1, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", emboss = 0.1, r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={
{n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}},
}},
{n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, emboss = 0.1, minh = 2.2, r = 0.1}, nodes={
{n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back', object = UIBox{definition = G.GAME.viewed_back:generate_UI(), config = {offset = {x=0,y=0}}}}}
}}
}},
}},
}}}),
}})
return t
end
function create_UIBox_your_collection_tags()
local tag_matrix = {
{},{},{},{},
}
local tag_tab = {}
for k, v in pairs(G.P_TAGS) do
tag_tab[#tag_tab+1] = v
end
table.sort(tag_tab, function (a, b) return a.order < b.order end)
local tags_to_be_alerted = {}
for k, v in ipairs(tag_tab) do
local discovered = v.discovered
local temp_tag = Tag(v.key, true)
if not v.discovered then temp_tag.hide_ability = true end
local temp_tag_ui, temp_tag_sprite = temp_tag:generate_UI()
tag_matrix[math.ceil((k-1)/6+0.001)][1+((k-1)%6)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
temp_tag_ui,
}}
if discovered and not v.alerted then
tags_to_be_alerted[#tags_to_be_alerted+1] = temp_tag_sprite
end
end
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = (function()
for _, v in ipairs(tags_to_be_alerted) do
v.children.alert = UIBox{
definition = create_UIBox_card_alert(),
config = { align="tri", offset = {x = 0.1, y = 0.1}, parent = v}
}
v.children.alert.states.collide.can = false
end
return true
end)
}))
local t = create_UIBox_generic_options({ back_func = 'your_collection', contents = {
{n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[1]},
{n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[2]},
{n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[3]},
{n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[4]},
}}
}}
}}
}})
return t
end
function create_UIBox_your_collection_blinds(exit)
local blind_matrix = {
{},{},{}, {}, {}, {}
}
local blind_tab = {}
for k, v in pairs(G.P_BLINDS) do
blind_tab[#blind_tab+1] = v
end
table.sort(blind_tab, function (a, b) return a.order < b.order end)
local blinds_to_be_alerted = {}
for k, v in ipairs(blind_tab) do
local discovered = v.discovered
local temp_blind = AnimatedSprite(0,0,1.3,1.3, G.ANIMATION_ATLAS['blind_chips'], discovered and v.pos or G.b_undiscovered.pos)
temp_blind:define_draw_steps({
{shader = 'dissolve', shadow_height = 0.05},
{shader = 'dissolve'}
})
if k == 1 then
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = (function()
G.CONTROLLER:snap_to{node = temp_blind}
return true
end)
}))
end
temp_blind.float = true
temp_blind.states.hover.can = true
temp_blind.states.drag.can = false
temp_blind.states.collide.can = true
temp_blind.config = {blind = v, force_focus = true}
if discovered and not v.alerted then
blinds_to_be_alerted[#blinds_to_be_alerted+1] = temp_blind
end
temp_blind.hover = function()
if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then
if not temp_blind.hovering and temp_blind.states.visible then
temp_blind.hovering = true
temp_blind.hover_tilt = 3
temp_blind:juice_up(0.05, 0.02)
play_sound('chips1', math.random()*0.1 + 0.55, 0.12)
temp_blind.config.h_popup = create_UIBox_blind_popup(v, discovered)
temp_blind.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = temp_blind}
Node.hover(temp_blind)
if temp_blind.children.alert then
temp_blind.children.alert:remove()
temp_blind.children.alert = nil
temp_blind.config.blind.alerted = true
G:save_progress()
end
end
end
temp_blind.stop_hover = function() temp_blind.hovering = false; Node.stop_hover(temp_blind); temp_blind.hover_tilt = 0 end
end
blind_matrix[math.ceil((k-1)/5+0.001)][1+((k-1)%5)] = {n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
(k==6 or k ==16 or k == 26) and {n=G.UIT.B, config={h=0.2,w=0.5}} or nil,
{n=G.UIT.O, config={object = temp_blind, focus_with_object = true}},
(k==5 or k ==15 or k == 25) and {n=G.UIT.B, config={h=0.2,w=0.5}} or nil,
}}
end
G.E_MANAGER:add_event(Event({
trigger = 'immediate',
func = (function()
for _, v in ipairs(blinds_to_be_alerted) do
v.children.alert = UIBox{
definition = create_UIBox_card_alert(),
config = { align="tri", offset = {x = 0.1, y = 0.1}, parent = v}
}
v.children.alert.states.collide.can = false
end
return true
end)
}))
local ante_amounts = {}
for i = 1, math.min(16, math.max(16, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt)) do
local spacing = 1 - math.min(20, math.max(15, G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt))*0.06
if spacing > 0 and i > 1 then
ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={minh = spacing}, nodes={}}
end
local blind_chip = Sprite(0,0,0.2,0.2,G.ASSET_ATLAS["ui_"..(G.SETTINGS.colourblind_option and 2 or 1)], {x=0, y=0})
blind_chip.states.drag.can = false
ante_amounts[#ante_amounts+1] = {n=G.UIT.R, config={align = "cm", padding = 0.03}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 0.7}, nodes={
{n=G.UIT.T, config={text = i, scale = 0.4, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.C, config={align = "cr", minw = 2.8}, nodes={
{n=G.UIT.O, config={object = blind_chip}},
{n=G.UIT.C, config={align = "cm", minw = 0.03, minh = 0.01}, nodes={}},
{n=G.UIT.T, config={text =number_format(get_blind_amount(i)), scale = 0.4, colour = i <= G.PROFILES[G.SETTINGS.profile].high_scores.furthest_ante.amt and G.C.RED or G.C.JOKER_GREY, shadow = true}},
}}
}}
end
local extras = nil
local t = create_UIBox_generic_options({ back_func = exit or 'your_collection', contents = {
{n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.BLACK, padding = 0.1, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.L_BLACK, padding = 0.1, force_focus = true, focus_args = {nav = 'tall'}}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 0.7}, nodes={
{n=G.UIT.T, config={text = localize('k_ante_cap'), scale = 0.4, colour = lighten(G.C.FILTER, 0.2), shadow = true}},
}},
{n=G.UIT.C, config={align = "cr", minw = 2.8}, nodes={
{n=G.UIT.T, config={text = localize('k_base_cap'), scale = 0.4, colour = lighten(G.C.RED, 0.2), shadow = true}},
}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes=ante_amounts}
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[1]},
{n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[2]},
{n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[3]},
{n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[4]},
{n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[5]},
{n=G.UIT.R, config={align = "cm"}, nodes=blind_matrix[6]},
}}
}}
}}
}})
return t
end
function create_UIBox_blind_popup(blind, discovered, vars)
local blind_text = {}
local _dollars = blind.dollars
local loc_target = localize{type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = vars or blind.vars}
local loc_name = localize{type = 'name_text', key = blind.key, set = 'Blind'}
if discovered then
local ability_text = {}
if loc_target then
for k, v in ipairs(loc_target) do
ability_text[#ability_text + 1] = {n=G.UIT.R, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = (k ==1 and blind.name == 'The Wheel' and '1' or '')..v, scale = 0.35, shadow = true, colour = G.C.WHITE}}}}
end
end
local stake_sprite = get_stake_sprite(G.GAME.stake or 1, 0.4)
blind_text[#blind_text + 1] =
{n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.07, colour = G.C.WHITE}, nodes={
{n=G.UIT.R, config={align = "cm", maxw = 2.4}, nodes={
{n=G.UIT.T, config={text = localize('ph_blind_score_at_least'), scale = 0.35, colour = G.C.UI.TEXT_DARK}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={object = stake_sprite}},
{n=G.UIT.T, config={text = blind.mult..localize('k_x_base'), scale = 0.4, colour = G.C.RED}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('ph_blind_reward'), scale = 0.35, colour = G.C.UI.TEXT_DARK}},
{n=G.UIT.O, config={object = DynaText({string = {_dollars and string.rep(localize('$'),_dollars) or '-'}, colours = {G.C.MONEY}, rotate = true, bump = true, silent = true, scale = 0.45})}},
}},
ability_text[1] and {n=G.UIT.R, config={align = "cm", padding = 0.08, colour = mix_colours(blind.boss_colour, G.C.GREY, 0.4), r = 0.1, emboss = 0.05, minw = 2.5, minh = 0.9}, nodes=ability_text} or nil
}}
else
blind_text[#blind_text + 1] =
{n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.1, colour = G.C.WHITE}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('ph_defeat_this_blind_1'), scale = 0.4, colour = G.C.UI.TEXT_DARK}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('ph_defeat_this_blind_2'), scale = 0.4, colour = G.C.UI.TEXT_DARK}},
}},
}}
end
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = lighten(G.C.JOKER_GREY, 0.5), r = 0.1, emboss = 0.05}, nodes={
{n=G.UIT.R, config={align = "cm", emboss = 0.05, r = 0.1, minw = 2.5, padding = 0.1, colour = not discovered and G.C.JOKER_GREY or blind.boss_colour or G.C.GREY}, nodes={
{n=G.UIT.O, config={object = DynaText({string = discovered and loc_name or localize('k_not_discovered'), colours = {G.C.UI.TEXT_LIGHT}, shadow = true, rotate = not discovered, spacing = discovered and 2 or 0, bump = true, scale = 0.4})}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes=blind_text},
}}
end
function create_UIBox_card_unlock(card_center)
G.your_collection = CardArea(
G.ROOM.T.x + G.ROOM.T.w/2,G.ROOM.T.h,
1*G.CARD_W,
1*G.CARD_H,
{card_limit = 2, type = 'consumeable', highlight_limit = 0})
local card = Card(G.your_collection.T.x + G.your_collection.T.w/2 - G.CARD_W/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, card_center, {bypass_discovery_center = true, bypass_discovery_ui = true})
local locked_card = Card(G.your_collection.T.x + G.your_collection.T.w/2 - G.CARD_W/2, G.your_collection.T.y, G.CARD_W, G.CARD_H, G.P_CARDS.empty, card_center.set == 'Voucher' and G.v_locked or G.j_locked)
locked_card:remove_UI()
locked_card.ID = card.ID
card.states.click.can = false
locked_card.states.click.can = false
card.states.visible = false
card.no_ui = true
G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false,
func = (function() G.OVERLAY_MENU.joker_unlock_table = card.ID return true end) }))
G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 0.6,
func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.3, 0.2); play_sound('cancel', 0.8) end; return true end) }))
G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 1.15,
func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.45, 0.3); play_sound('cancel', 0.92) end; return true end) }))
G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 1.8,
func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:juice_up(0.6, 0.4); play_sound('cancel', 1.03) end; return true end) }))
G.E_MANAGER:add_event(Event({
timer = 'REAL',
blockable = false,
blocking = false,
trigger = 'after',
delay = 2.3,
func = (function()
if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then locked_card:start_dissolve({G.C.BLACK}) end
return true end)
}))
G.E_MANAGER:add_event(Event({
timer = 'REAL',
blockable = false,
blocking = false,
trigger = 'after',
delay = 2.7,
func = (function()
if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then
card:start_materialize({G.C.BLUE}, true)
play_sound('crumple1', 0.8, 1);
end
return true end)
}))
G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 2.78,
func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then card.no_ui = nil; play_sound('timpani', 0.8, 1.8) end return true end) }))
G.E_MANAGER:add_event(Event({timer = 'REAL',blockable = false,blocking = false, trigger = 'after', delay = 2.95,
func = (function() if G.OVERLAY_MENU and G.OVERLAY_MENU.joker_unlock_table == card.ID then play_sound('timpani', 1, 1.8) end return true end) }))
G.your_collection:emplace(card)
G.your_collection:emplace(locked_card)
local t = create_UIBox_generic_options({padding = 0,back_label = localize('b_continue'), no_pip = true, snap_back = true, back_func = 'continue_unlock', minw = 4.5, contents = {
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {card_center.set == 'Voucher' and localize('k_voucher') or localize('k_joker')}, colours = {G.C.BLUE},shadow = true, rotate = true, bump = true, pop_in = 0.3, pop_in_rate = 2, scale = 1.2})}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {localize('k_unlocked_ex')}, colours = {G.C.RED},shadow = true, rotate = true, bump = true, pop_in = 0.6, pop_in_rate = 2, scale = 0.8})}}
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1}, nodes={
{n=G.UIT.O, config={object = G.your_collection}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.05, emboss = 0.05, colour = G.C.WHITE, r = 0.1}, nodes={
desc_from_rows(card:generate_UIBox_unlock_table(true).main)
}}
}}
}}
}}
}})
return t
end
function create_UIBox_deck_unlock(deck_center)
G.GAME.viewed_back = Back(deck_center)
local area = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
1.2*G.CARD_W,
1.2*G.CARD_H,
{card_limit = 52, type = 'deck', highlight_limit = 0})
for i = 1, 52 do
local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W*1.2, G.CARD_H*1.2, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {bypass_back = deck_center.pos, playing_card = i, viewed_back = true})
area:emplace(card)
card[deck_center.key] = true
card.sprite_facing = 'back'
card.facing = 'back'
end
local deck_criteria = {}
if deck_center.unlock_condition.type == 'win_deck' then
local other_name = localize{type = 'name_text', set = 'Back', key = deck_center.unlock_condition.deck}
localize{type = 'descriptions', key = 'deck_locked_win', set = "Other", nodes = deck_criteria, vars = {other_name}, default_col = G.C.WHITE, shadow = true}
elseif deck_center.unlock_condition.type == 'win_stake' then
local other_name = localize{type = 'name_text', set = 'Stake', key = G.P_CENTER_POOLS.Stake[deck_center.unlock_condition.stake].key}
localize{type = 'descriptions', key = 'deck_locked_stake', set = "Other", nodes = deck_criteria, vars = {other_name, colours = {get_stake_col(deck_center.unlock_condition.stake)}}, default_col = G.C.WHITE, shadow = true}
elseif deck_center.unlock_condition.type == 'discover_amount' then
localize{type = 'descriptions', key = 'deck_locked_discover', set = "Other", nodes = deck_criteria, vars = {deck_center.unlock_condition.amount}, default_col = G.C.WHITE, shadow = true}
end
local deck_criteria_cols = {}
for k, v in ipairs(deck_criteria) do
if k > 1 then deck_criteria_cols[#deck_criteria_cols+1] = {n=G.UIT.C, config={align = "cm", padding = 0, minw = 0.1}, nodes={}} end
deck_criteria_cols[#deck_criteria_cols+1] = {n=G.UIT.C, config={align = "cm", padding = 0}, nodes=v}
end
local t = create_UIBox_generic_options({ back_label = localize('b_continue'), no_pip = true, snap_back = true, back_func = 'continue_unlock', minw = 7, contents = {
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = DynaText({string = {{string = localize{type = 'name_text', set = 'Back', key = deck_center.key}, suffix = ' '..localize('k_unlocked_ex'), outer_colour = G.C.UI.TEXT_LIGHT}}, colours = {G.C.BLUE},shadow = true, rotate = true, float = true, scale = 0.7, pop_in = 0.1})}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes=deck_criteria_cols},
{n=G.UIT.R, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.2}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = area}}
}},
{n=G.UIT.C, config={align = "cm", r = 0.2, colour = G.C.WHITE, emboss = 0.05, padding = 0.2, minw = 4}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes=G.GAME.viewed_back:generate_UI(deck_center).nodes}
}}
}}
}})
return t
end
function G.UIDEF.multiline_credit_text(_lines)
local t = {}
for k, v in ipairs(_lines) do
t[#t+1] = {n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = v, scale = 0.28, colour = G.C.WHITE}},
}}
end
return t
end
function G.UIDEF.viewed_collab_option(_new_option)
G.viewed_collab = G.viewed_collab or 'The Binding of Isaac'
local curr_collab = G.collab_credits[G.viewed_collab] or G.collab_credits['The Binding of Isaac']
local collab_sprite = Sprite(0,0,0.8*G.CARD_W,0.8*G.CARD_H,G.ASSET_ATLAS[curr_collab.art..'_1'], {x=2,y=0})
return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.T, config={text = G.viewed_collab, scale = 0.5, colour = G.C.WHITE}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 9, minh = 4.2}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes=G.UIDEF.multiline_credit_text({
'All rights reserved. No part of this work may be',
'reproduced in any form or by any means— graphic,',
'electronic, or mechanical, including recording,',
'online distribution, or information storage and retrieval',
'systems—without the written permission of the publisher',
'or the designated rightsholder, as applicable.'
})},
curr_collab.ml_text and {n=G.UIT.R, config={align = "cl", padding = 0}, nodes=G.UIDEF.multiline_credit_text(curr_collab.ml_text)} or nil,
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 3, minh = 4.2}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.0}, nodes={
{n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, r = 0.3}, nodes={
{n=G.UIT.O, config={colour = G.C.BLUE, object = collab_sprite, hover = true, can_collide = false}},
}},
}},
curr_collab.artist and {n=G.UIT.R, config={align = "cm", padding = 0.07, r = 0.1, outline = 0.7, outline_colour = G.C.WHITE}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Art created by:", scale = 0.3, colour = G.C.WHITE}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = curr_collab.artist, scale = 0.3, colour = G.C.GOLD}}
}},
curr_collab.artist_link and {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = curr_collab.artist_link, scale = 0.3, colour = G.C.BLUE}}
}} or nil
}} or nil
}}
}}
}}
end
function G.UIDEF.credits()
local text_scale = 0.75
local t = create_UIBox_generic_options({contents ={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
create_tabs(
{tabs = {
{
label = "Production",
chosen = true,
tab_definition_function = function() return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.2,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Original Soundtrack", scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "composed by ", scale = text_scale*0.8, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "LouisF", scale = text_scale*0.8, colour = G.C.BLUE, shadow = true}}
}},
G.F_EXTERNAL_LINKS and {n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
UIBox_button({label = {'Instagram'}, button = 'louisf_insta'})
}} or nil,
{n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={
{n=G.UIT.T, config={text = "Modified with their permission", scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.C, config={align = "tm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Porting", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "PlayStation", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Xbox", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Android", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Apple Platforms", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Maarten De Meyer', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Mac (Steam)", scale = text_scale*0.45, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'william341', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Localization", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Universally Speaking", scale = text_scale*0.6, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'German', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Spanish Latam', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'French', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Indonesian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Italian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Japanese', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Korean', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Dutch', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Polish', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Portuguese Brasilian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Russian', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Simplified Chinese', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Traditional Chinese', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Project managers', scale = text_scale*0.35, colour = G.C.FILTER, shadow = true}},
}},
}},
{n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Dominik May, Lisa-Marie Beck', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Román René Orozco, Javier Gómez', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Romain Vervaecke, Claire Gérard', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Yopi Jalu Paksi, Sutarto Mohammad', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Oliver Cozzio, Giulia Benassi', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Takashi Fujimoto, Ai Parlow', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Haejung Lee, Sanghyun Bae', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Ellis Jongsma, Erik Nusselder', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Mariusz Wlodarczyk, Bartosz Klofik', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Samuel Modesto, R. Cali', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Yuliia Tatsenko, Natalia Rudane', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Shuai Fang, Liqi Ye', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Pauline Lin, AngelRabbitBB', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Ruoyang Yuan, Tania Carè', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
}},
{n=G.UIT.C, config={align = "tm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Testing/QA", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.03}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Vishwak Kondapalli', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Basha Syed', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'CampfireCollective', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'drspectred', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'TheRealEvab', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Brightqwerty', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'MrWizzrd', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'mcpower', scale = text_scale*0.35, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
}},
}}
end,
},
{
label = "Publishing",
tab_definition_function = function() return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Playstack", scale = text_scale*0.6, colour = G.C.RED, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Harvey Elliott', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Kevin Shrapnell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Rob Crossley', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Liz Cheng-Moore', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Will Newell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Charlotte Riley', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Alexander Saunders', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Naman Budhwar', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Tomasz Wisniowski', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Patrick Johnson', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Tom Verney', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Wouter van Halderen', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Shawn Cotter', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.C, config={align = "tl", padding = 0.093}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'CEO', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'COO', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'VP of Publishing', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Lead Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Lead Visual Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Producer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Senior Discovery Scout', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Discovery Scout', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'PR Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
}},
{n=G.UIT.B, config={align = "tl", w=0.25, h=0}, nodes={}},
{n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Marta Matyjewicz', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Rebecca Bell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Alex Flynn', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Justas Pugaciauskas', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Jessica Chu', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Millicent Su', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Carla Malavasi', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Pawel Kwietniak', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Ela Müller', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Edgar Khoo', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Dami Ajiboye', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Aaron Ludlow', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Jenny Quintero', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.C, config={align = "tl", padding = 0.093}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Marketing Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Finance', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Creative Director', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Graphic Designer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Lead Video Artist', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Senior User Acquisition Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Director of Publishing Services', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Front-end Developer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Graphic Designer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Video Editor', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Data Analyst', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Product Director', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Senior Partnerships Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
}},
{n=G.UIT.B, config={align = "tl", w=0.25, h=0}, nodes={}},
{n=G.UIT.C, config={align = "tl", padding = 0.05}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Stephanie Marti', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Emma Smith-Bodie', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Moe Abrams', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Piotr Kowalik', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Carmen Martino', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Rong Lin', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Bea Gomez', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Jose Olivares', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Joanna Kieronska', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Zuzanna Dawidowska', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Jean-Claude Vidanes ', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'AJ Purnell', scale = text_scale*0.42, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.C, config={align = "tl", padding = 0.093}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Senior Video Artist', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Community Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Customer Support', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Software Engineer', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'HR & Office Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Finance Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Video Editor', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'QA & Localisation Manager', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'QA Tester', scale = text_scale*0.35, colour = G.C.GOLD, shadow = true}},
}},
}},
}},
}}
}}
end,
},
{
label = "Collabs",
tab_definition_function = function()
G.collab_credits = G.collab_credits or {
['Vault-Tec'] = {
artist = 'Franek',
ml_text = {
'© 2025 ZeniMax. ZeniMax and Bethesda Game Studios',
'are trademarks of the ZeniMax group of companies. ',
'All rights reserved.',
},
art = 'collab_FO'
},
['The Witcher'] = {
artist = nil,
ml_text = {
'© 2024 CD PROJEKT S.A. All rights reserved. CD PROJEKT,',
'the CD PROJEKT logo, The Witcher and The Witcher Logo,',
'Geralt, Geralt of Rivia and Yennefer are trademarks and/or',
'registered trademarks of CD PROJEKT S.A. in the US and/or',
'other countries. The Witcher game is set in the universe',
'created by Andrzej Sapkowski in his series of books.'
},
art = 'collab_TW'
},
['Cyberpunk 2077'] = {
artist = nil,
ml_text = {
'Cyberpunk 2077 © 2024 CD PROJEKT S.A. All rights reserved.'
},
art = 'collab_CYP'
},
['Shovel Knight'] = {
artist = 'Neato',
artist_link = 'twitch.tv/neato',
ml_text = {
'Shovel Knight © 2024 Yacht Club Games, LLC. All Rights Reserved.'
},
art = 'collab_SK'
},
['Don\'t Starve'] = {
artist = nil,
ml_text = {
'“KLEI” “DON\'T STARVE” © 2024 All Rights Reserved',
'Klei Entertainment 2024'
},
art = 'collab_DS'
},
['Assassin\'s Creed'] = {
artist = 'Franek',
ml_text = {
'Assassin\'s Creed © 2025 Ubisoft Entertainment.',
'All Rights Reserved.'
},
art = 'collab_AC'
},
['Slay the Princess'] = {
artist = 'Franek',
ml_text = {
'Slay the Princess (c) 2025 Black Tabby Games. All Rights Reserved.',
'"SLAY THE PRINCESS" - Canadian Trademark App: 2351515',
'SLAY THE PRINCESS LOGO - Canadian Trademark App: 2351516',
'"BLACK TABBY GAMES" - Canadian Trademark App: 2351514'
},
art = 'collab_STP'
},
['Among Us'] = {
artist = nil,
ml_text = {
'Among Us © 2024 Innersloth LLC. All Rights Reserved.'
},
art = 'collab_AU'
},
['The Binding of Isaac'] = {
artist = 'Neato',
artist_link = 'twitch.tv/neato',
ml_text = {
'The Binding of Isaac is copyright McMillen Games, Inc.',
'All Rights Reserved'
},
art = 'collab_TBoI'
},
['Cult of the Lamb'] = {
artist = nil,
ml_text = {
'Cult of the Lamb © 2024 Massive Monster All Rights Reserved'
},
art = 'collab_CL'
},
['Divinity Original Sin 2'] = {
artist = nil,
ml_text = {
'©2024 Larian Studios. Larian Studios, Divinity, Divinity: Original Sin',
'and the Larian Studios logo are registered trademarks of Larian Studios',
'Games Limited affiliates. All rights reserved.'
},
art = 'collab_D2'
},
['Critical Role'] = {
artist = 'Grace Berrios',
artist_link = '@lassflores',
ml_text = {
'2025 © Gilmores Glorious Goods LLC. All Rights Reserved.',
'Critical Role, Vox Machina, Mighty Nein, Bells Hells, character names,',
'associated logos and images are all trademarks of Critical Role LLC."'
},
art = 'collab_CR'
},
['Bugsnax'] = {
artist = 'Neato',
artist_link = 'twitch.tv/neato',
ml_text = {
'© 2025 Bugsnax © Young Horses Inc. All Rights Reserved.'
},
art = 'collab_BUG'
},
['Vampire Survivors'] = {
artist = nil,
ml_text = nil,
art = 'collab_VS'
},
['Slay the Spire'] = {
artist = 'Neato',
artist_link = 'twitch.tv/neato',
ml_text = {
'Slay the Spire ©2024 Mega Crit Games, LLC. All Rights Reserved.'
},
art = 'collab_STS'
},
['Potion Craft'] = {
artist = nil,
ml_text = {
'Potion Craft © 2024 tinyBuild, LLC. All Rights Reserved.'
},
art = 'collab_PC'
},
['Warframe'] = {
artist = nil,
ml_text = {
'Warframe ©2024 Digital Extremes Ltd. All rights reserved. Warframe',
'and the Warframe logo are registered trademarks of Digital Extremes Ltd.'
},
art = 'collab_WF'
},
['Dead By Daylight'] = {
artist = nil,
ml_text = {
'© 2015-2025 and BEHAVIOUR, DEAD BY DAYLIGHT and other related trademarks',
'and logos belong to Behaviour Interactive Inc. All rights reserved.'
},
art = 'collab_DBD'
},
['Dave the Diver'] = {
artist = nil,
ml_text = {
'Dave the Diver © Mintrocket. All Rights Reserved.'
},
art = 'collab_DTD'
},
['Stardew Valley'] = {
artist = 'ConcernedApe',
ml_text = {
'"Stardew Valley" is a trademark of ConcernedApe LLC. All Rights Reserved'
},
art = 'collab_SV'
},
['Enter the Gungeon'] = {
artist = nil,
ml_text = {
'Enter the Gungeon © 2024 Devolver Digital Inc.All Rights Reserved.'
},
art = 'collab_EG'
},
['1000xRESIST'] = {
artist = nil,
ml_text = nil,
art = 'collab_XR'
},
['Civilization VII'] = {
artist = nil,
ml_text = {
'CIVILIZATION Licensed Assets Courtesy of 2K Games, Inc.',
'© 2025 Take-Two Interactive Software, Inc. and its subsidiaries.'
},
art = 'collab_C7'
},
['Rust'] = {
artist = nil,
ml_text = {
'Rust (c) 2025 Facepunch Studios Ltd. All Rights Reserved.'
},
art = 'collab_R'
},
}
local middle = {n=G.UIT.R, config={align = "cm", minh = 4.8, minw = 12.3}, nodes={
{n=G.UIT.O, config={id = nil, func = 'CREDITS_check_collab', object = Moveable()}},
}}
local collab_options = {}
for k, v in pairs(G.collab_credits) do
collab_options[#collab_options+1] = k
end
table.sort(collab_options)
G.viewed_collab = collab_options[1]
return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.L_BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.2,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
create_option_cycle({options =
collab_options, opt_callback = 'change_viewed_collab', current_option = 1, colour = G.C.RED, w = 4, mid = middle
})
}}
}}
end,
},
{
label = "Sounds",
tab_definition_function = function() return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "All sounds not listed here fall under ", scale = text_scale*0.6, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Creative Commons - CC0", scale = text_scale*0.6, colour = G.C.BLUE, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = '"chamber_choir_chord_o.wav" (Used for Polychrome sound) by uair01 (https://freesound.org/people/uair01/sounds/65195/)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Attribution 3.0 License", scale = text_scale*0.5, colour = G.C.GOLD, shadow = true}},
{n=G.UIT.T, config={text = '. This work has been modified from its original state', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = '"Coffee1.wav" (Used for Tarot card sound) by Nathan Gibson (https://nathangibson.myportfolio.com)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Attribution 4.0 License", scale = text_scale*0.5, colour = G.C.ORANGE, shadow = true}},
{n=G.UIT.T, config={text = '.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = '"Wood Block1.wav" (Used for Tarot card sound) by Nathan Gibson (https://nathangibson.myportfolio.com)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Attribution 4.0 License", scale = text_scale*0.5, colour = G.C.ORANGE, shadow = true}},
{n=G.UIT.T, config={text = '.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = '"Toy records#06-E3-02.wav" (Used for Mult sounds) by poissonmort (https://freesound.org/people/poissonmort/sounds/253249/)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'is licensed under ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Attribution 4.0 License", scale = text_scale*0.5, colour = G.C.ORANGE, shadow = true}},
{n=G.UIT.T, config={text = '. This work has been modified from its original state', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}}
end,
},
{
label = "Imagery",
tab_definition_function = function() return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 10}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'The font "m6x11.ttf" by Daniel Linssen (https://managore.itch.io/m6x11)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'is licensed under an ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Attribution License", scale = text_scale*0.5, colour = G.C.GOLD, shadow = true}},
{n=G.UIT.T, config={text = '.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
not G.F_BASIC_CREDITS and
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Check out his itch.io profile, he has made an incredible catalogue of games.', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}} or nil,
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'The Joker "Vagabond" was created by Lumpy Touch', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'The Collab art for Slay the Spire and The Binding of Isaac was', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'created by ', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
{n=G.UIT.T, config={text = "Neato", scale = text_scale*0.5, colour = G.C.GOLD, shadow = true}},
{n=G.UIT.T, config={text = ' (twitch.tv/neato)', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "All sprites, shaders, and any other visual assets", scale = text_scale*0.6, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "not listed here were created by LocalThunk.", scale = text_scale*0.6, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "©2024 - All rights reserved", scale = text_scale*0.6, colour = G.C.BLUE, shadow = true}},
}},
}}
end,
},
{
label = "Misc",
tab_definition_function = function() return
{n=G.UIT.ROOT, config={align = "cm", padding = 0.2, colour = G.C.BLACK, r = 0.1, emboss = 0.05, minh = 6, minw = 6}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "For Marshal", scale = text_scale*0.6, colour = G.C.WHITE, shadow = true}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1,outline_colour = G.C.JOKER_GREY, r = 0.1, outline = 1}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = "Special Thanks", scale = text_scale*0.6, colour = G.C.GREEN, shadow = true}},
}},
{n=G.UIT.R, config={align = "tm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "tl", padding = 0.05, minw = 2.5}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Nicole', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Josh', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Jeremy', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Dylan', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Justin', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Daniel', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Colby', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Thomas', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Mom & Dad', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Luc & Donna', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
{n=G.UIT.C, config={align = "tl", padding = 0.05, minw = 2.5}, nodes={
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'GothicLordUK', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Big Simple', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'MALF', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Northernlion', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Purple Moss Collectors', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Dan Gheesling', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Fabian Fischer', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'newobject', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'MurphyObv', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", padding = 0}, nodes={
{n=G.UIT.T, config={text = 'Love2D', scale = text_scale*0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
}},
}},
}}
}}
end,
},
},
snap_to_nav = true}),
}}
}})
return t
end
function G.UIDEF.challenges(from_game_over)
if G.PROFILES[G.SETTINGS.profile].all_unlocked then G.PROFILES[G.SETTINGS.profile].challenges_unlocked = #G.CHALLENGES end
if not G.PROFILES[G.SETTINGS.profile].challenges_unlocked then
local deck_wins = 0
for k, v in pairs(G.PROFILES[G.SETTINGS.profile].deck_usage) do
if v.wins and v.wins[1] then
deck_wins = deck_wins + 1
end
end
local loc_nodes = {}
localize{type = 'descriptions', key = 'challenge_locked', set = 'Other', nodes = loc_nodes, vars = {G.CHALLENGE_WINS, deck_wins}, default_col = G.C.WHITE}
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR, minh = 8.02, minw = 7}, nodes={
transparent_multiline_text(loc_nodes)
}}
end
G.run_setup_seed = nil
if G.OVERLAY_MENU then
local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed')
if seed_toggle then seed_toggle.states.visible = false end
end
local _ch_comp, _ch_tot = 0,#G.CHALLENGES
for k, v in ipairs(G.CHALLENGES) do
if v.id and G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] then
_ch_comp = _ch_comp + 1
end
end
local _ch_tab = {comp = _ch_comp, unlocked = G.PROFILES[G.SETTINGS.profile].challenges_unlocked}
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR, minh = 8, minw = 7}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1 ,colour = G.C.BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.T, config={text = localize('k_challenge_mode'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", minw = 8.5, minh = 1.5, padding = 0.2}, nodes={
UIBox_button({id = from_game_over and 'from_game_over' or nil, label = {localize('b_new_challenge')}, button = 'challenge_list', minw = 4, scale = 0.4, minh = 0.6}),
}},
{n=G.UIT.R, config={align = "cm", minh = 0.8, r = 0.1, minw = 4.5, colour = G.C.L_BLACK, emboss = 0.05,
progress_bar = {
max = _ch_tot, ref_table = _ch_tab, ref_value = 'unlocked', empty_col = G.C.L_BLACK, filled_col = G.C.FILTER
}}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 4.5}, nodes={
{n=G.UIT.T, config={text = localize{type = 'variable', key = 'unlocked', vars = {_ch_tab.unlocked, _ch_tot}}, scale = 0.3, colour = G.C.WHITE, shadow =true}},
}},
}},
{n=G.UIT.R, config={align = "cm", minh = 0.8, r = 0.1, minw = 4.5, colour = G.C.L_BLACK, emboss = 0.05,
progress_bar = {
max = _ch_tot, ref_table = _ch_tab, ref_value = 'comp', empty_col = G.C.L_BLACK, filled_col = adjust_alpha(G.C.GREEN, 0.5)
}}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, minw = 4.5}, nodes={
{n=G.UIT.T, config={text = localize{type = 'variable', key = 'completed', vars = {_ch_comp, _ch_tot}}, scale = 0.3, colour = G.C.WHITE, shadow = true}},
}},
}},
}},
G.F_DAILIES and {n=G.UIT.R, config={align = "cm", padding = 0.1, r = 0.1 ,colour = G.C.BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.T, config={text = localize('k_daily_run'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cl", minw = 8.5, minh = 4}, nodes={
G.UIDEF.daily_overview()
}}
}} or nil,
}}
end
function G.UIDEF.daily_overview()
local hist_height, hist_width = 3, 3
local daily_results = {
score = {
me = {val = 20000, percentile = 75},
hist = {
0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.05,0.15,0.1,0.1,0.05,0.05,0.05,0.05,0.05
}
}
}
local score_hist, max_score_hist = {}, 0
for k, v in ipairs(daily_results.score.hist) do if max_score_hist < v then max_score_hist = v end end
for k, v in ipairs(daily_results.score.hist) do
score_hist[#score_hist+1] = {n=G.UIT.C, config={align = 'bm'}, nodes ={{n=G.UIT.C, config={colour = G.C.BLUE, minw = hist_width/#daily_results.score.hist, minh = (v + 0.05*math.random())/max_score_hist*hist_height}}}}
end
return {n=G.UIT.R, config={align = "cm"}, nodes=score_hist}
end
function G.UIDEF.run_setup(from_game_over)
G.run_setup_seed = nil
local _challenge_chosen = from_game_over == 'challenge_list'
from_game_over = from_game_over and not (from_game_over == 'challenge_list')
local _can_continue = G.MAIN_MENU_UI and G.FUNCS.can_continue({config = {func = true}})
G.FUNCS.false_ret = function() return false end
local t = create_UIBox_generic_options({no_back = from_game_over, no_esc = from_game_over, contents ={
{n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1}, nodes={
create_tabs(
{tabs = {
{
label = localize('b_new_run'),
chosen = (not _challenge_chosen) and (not _can_continue),
tab_definition_function = G.UIDEF.run_setup_option,
tab_definition_function_args = 'New Run'
},
G.STAGE == G.STAGES.MAIN_MENU and {
label = localize('b_continue'),
chosen = (not _challenge_chosen) and _can_continue,
tab_definition_function = G.UIDEF.run_setup_option,
tab_definition_function_args = 'Continue',
func = 'can_continue'
} or {
label = localize('b_challenges'),
tab_definition_function = G.UIDEF.challenges,
tab_definition_function_args = from_game_over,
chosen = _challenge_chosen
},
G.STAGE == G.STAGES.MAIN_MENU and {
label = localize('b_challenges'),
tab_definition_function = G.UIDEF.challenges,
tab_definition_function_args = from_game_over,
chosen = _challenge_chosen
} or nil,
},
snap_to_nav = true}),
}},
}})
return t
end
function G.UIDEF.profile_select()
G.focused_profile = G.focused_profile or G.SETTINGS.profile or 1
local t = create_UIBox_generic_options({padding = 0,contents ={
{n=G.UIT.R, config={align = "cm", padding = 0, draw_layer = 1, minw = 4}, nodes={
create_tabs(
{tabs = {
{
label = 1,
chosen = G.focused_profile == 1,
tab_definition_function = G.UIDEF.profile_option,
tab_definition_function_args = 1
},
{
label = 2,
chosen = G.focused_profile == 2,
tab_definition_function = G.UIDEF.profile_option,
tab_definition_function_args = 2
},
{
label = 3,
chosen = G.focused_profile == 3,
tab_definition_function = G.UIDEF.profile_option,
tab_definition_function_args = 3
}
},
snap_to_nav = true}),
}},
}})
return t
end
function G.UIDEF.profile_option(_profile)
set_discover_tallies()
G.focused_profile = _profile
local profile_data = get_compressed(G.focused_profile..'/'..'profile.jkr')
if profile_data ~= nil then
profile_data = STR_UNPACK(profile_data)
profile_data.name = profile_data.name or ("P".._profile)
end
G.PROFILES[_profile].name = profile_data and profile_data.name or ''
local lwidth, rwidth, scale = 1, 1, 1
G.CHECK_PROFILE_DATA = nil
local t = {n=G.UIT.ROOT, config={align = 'cm', colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = 'cm',padding = 0.1, minh = 0.8}, nodes={
((_profile == G.SETTINGS.profile) or not profile_data) and {n=G.UIT.R, config={align = "cm"}, nodes={
create_text_input({
w = 4, max_length = 16, prompt_text = localize('k_enter_name'),
ref_table = G.PROFILES[_profile], ref_value = 'name',extended_corpus = true, keyboard_offset = 1,
callback = function()
G:save_settings()
G.FILE_HANDLER.force = true
end
}),
}} or {n=G.UIT.R, config={align = 'cm',padding = 0.1, minw = 4, r = 0.1, colour = G.C.BLACK, minh = 0.6}, nodes={
{n=G.UIT.T, config={text = G.PROFILES[_profile].name, scale = 0.45, colour = G.C.WHITE}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 6}, nodes={
(G.PROFILES[_profile].progress and G.PROFILES[_profile].progress.discovered) and create_progress_box(G.PROFILES[_profile].progress, 0.5) or
{n=G.UIT.C, config={align = "cm", minh = 4, minw = 5.2, colour = G.C.BLACK, r = 0.1}, nodes={
{n=G.UIT.T, config={text = localize('k_empty_caps'), scale = 0.5, colour = G.C.UI.TRANSPARENT_LIGHT}}
}},
}},
{n=G.UIT.C, config={align = "cm", minh = 4}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 1}, nodes={
profile_data and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_wins'),colour = G.C.UI.TEXT_LIGHT, scale = scale*0.7}}}},
{n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_LIGHT, scale = scale*0.7}}}},
{n=G.UIT.C, config={align = "cl", minw = rwidth}, nodes={{n=G.UIT.T, config={text = tostring(profile_data.career_stats.c_wins),colour = G.C.RED, shadow = true, scale = 1*scale}}}}
}} or nil,
}},
{n=G.UIT.R, config={align = "cm", padding = 0.2}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.R, config={align = "cm", minw = 4, maxw = 4, minh = 0.8, padding = 0.2, r = 0.1, hover = true, colour = G.C.BLUE,func = 'can_load_profile', button = "load_profile", shadow = true, focus_args = {nav = 'wide'}}, nodes={
{n=G.UIT.T, config={text = _profile == G.SETTINGS.profile and localize('b_current_profile') or profile_data and localize('b_load_profile') or localize('b_create_profile'), ref_value = 'load_button_text', scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}
}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0, minh = 0.7}, nodes={
{n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.6, padding = 0.2, r = 0.1, hover = true, colour = G.C.RED,func = 'can_delete_profile', button = "delete_profile", shadow = true, focus_args = {nav = 'wide'}}, nodes={
{n=G.UIT.T, config={text = _profile == G.SETTINGS.profile and localize('b_reset_profile') or localize('b_delete_profile'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}}
}}
}},
(_profile == G.SETTINGS.profile and not G.PROFILES[G.SETTINGS.profile].all_unlocked) and {n=G.UIT.R, config={align = "cm", padding = 0, minh = 0.7}, nodes={
{n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.6, padding = 0.2, r = 0.1, hover = true, colour = G.C.ORANGE,func = 'can_unlock_all', button = "unlock_all", shadow = true, focus_args = {nav = 'wide'}}, nodes={
{n=G.UIT.T, config={text = localize('b_unlock_all'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}}
}}
}} or {n=G.UIT.R, config={align = "cm", minw = 3, maxw = 4, minh = 0.7}, nodes={
G.PROFILES[_profile].all_unlocked and ((not G.F_NO_ACHIEVEMENTS) and {n=G.UIT.T, config={text = localize(G.F_TROPHIES and 'k_trophies_disabled' or 'k_achievements_disabled'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}} or
nil) or nil
}},
}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={id = 'warning_text', text = localize('ph_click_confirm'), scale = 0.4, colour = G.C.CLEAR}}
}}
}}
return t
end
function G.UIDEF.stake_description(_stake)
local _stake_center = G.P_CENTER_POOLS.Stake[_stake]
local ret_nodes = {}
if _stake_center then localize{type = 'descriptions', key = _stake_center.key, set = _stake_center.set, nodes = ret_nodes} end
local desc_t = {}
for k, v in ipairs(ret_nodes) do
desc_t[#desc_t+1] = {n=G.UIT.R, config={align = "cm", maxw = 5.3}, nodes=v}
end
return {n=G.UIT.C, config={align = "cm", padding = 0.05, r = 0.1, colour = G.C.L_BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize{type = 'name_text', key = _stake_center.key, set = _stake_center.set}, scale = 0.35, colour = G.C.WHITE}}
}},
{n=G.UIT.R, config={align = "cm", padding = 0.03, colour = G.C.WHITE, r = 0.1, minh = 1, minw = 5.5}, nodes=desc_t}
}}
end
function G.UIDEF.stake_option(_type)
local middle = {n=G.UIT.R, config={align = "cm", minh = 1.7, minw = 7.3}, nodes={
{n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake2', object = Moveable()}},
}}
local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key)
if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end
local stake_options = {}
for i = 1, math.min(max_stake+1, 8) do
stake_options[i] = i
end
return {n=G.UIT.ROOT, config={align = "tm", colour = G.C.CLEAR, minh = 2.03, minw = 8.3}, nodes={_type == 'Continue' and middle or create_option_cycle({options =
stake_options,
opt_callback = 'change_stake', current_option = G.viewed_stake, colour = G.C.RED, w = 6, mid = middle
})
}}
end
function G.UIDEF.viewed_stake_option()
G.viewed_stake = G.viewed_stake or 1
local max_stake = get_deck_win_stake(G.GAME.viewed_back.effect.center.key)
if G.PROFILES[G.SETTINGS.profile].all_unlocked then max_stake = 8 end
G.viewed_stake = math.min(max_stake+1, G.viewed_stake)
if _type ~= 'Continue' then G.PROFILES[G.SETTINGS.profile].MEMORY.stake = G.viewed_stake end
local stake_sprite = get_stake_sprite(G.viewed_stake)
return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, r = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize('k_stake'), scale = 0.4, colour = G.C.L_BLACK, vert = true}}
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={colour = G.C.BLUE, object = stake_sprite, hover = true, can_collide = false}},
}},
G.UIDEF.stake_description(G.viewed_stake)
}}
}}
end
function G.UIDEF.challenge_list(from_game_over)
G.CHALLENGE_PAGE_SIZE = 10
local challenge_pages = {}
for i = 1, math.ceil(#G.CHALLENGES/G.CHALLENGE_PAGE_SIZE) do
table.insert(challenge_pages, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#G.CHALLENGES/G.CHALLENGE_PAGE_SIZE)))
end
G.E_MANAGER:add_event(Event({func = (function()
G.FUNCS.change_challenge_list_page{cycle_config = {current_option = 1}}
return true end)}))
local _ch_comp, _ch_tot = 0,#G.CHALLENGES
for k, v in ipairs(G.CHALLENGES) do
if v.id and G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or ''] then
_ch_comp = _ch_comp + 1
end
end
local t = create_UIBox_generic_options({ back_id = from_game_over and 'from_game_over' or nil, back_func = 'setup_run', back_id = 'challenge_list', contents = {
{n=G.UIT.C, config={align = "cm", padding = 0.0}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 7, minw = 4.2}, nodes={
{n=G.UIT.O, config={id = 'challenge_list', object = Moveable()}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
create_option_cycle({id = 'challenge_page',scale = 0.9, h = 0.3, w = 3.5, options = challenge_pages, cycle_shoulders = true, opt_callback = 'change_challenge_list_page', current_option = 1, colour = G.C.RED, no_pips = true, focus_args = {snap_to = true}})
}},
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
{n=G.UIT.T, config={text = localize{type = 'variable', key = 'challenges_completed', vars = {_ch_comp, _ch_tot}}, scale = 0.4, colour = G.C.WHITE}},
}},
}},
{n=G.UIT.C, config={align = "cm", minh = 9, minw = 11.5}, nodes={
{n=G.UIT.O, config={id = 'challenge_area', object = Moveable()}},
}},
}})
return t
end
function G.UIDEF.challenge_list_page(_page)
local snapped = false
local challenge_list = {}
for k, v in ipairs(G.CHALLENGES) do
if k > G.CHALLENGE_PAGE_SIZE*(_page or 0) and k <= G.CHALLENGE_PAGE_SIZE*((_page or 0) + 1) then
if G.CONTROLLER.focused.target and G.CONTROLLER.focused.target.config.id == 'challenge_page' then snapped = true end
local challenge_completed = G.PROFILES[G.SETTINGS.profile].challenge_progress.completed[v.id or '']
local challenge_unlocked = G.PROFILES[G.SETTINGS.profile].challenges_unlocked and (G.PROFILES[G.SETTINGS.profile].challenges_unlocked >= k)
challenge_list[#challenge_list+1] =
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = 'cl', minw = 0.8}, nodes = {
{n=G.UIT.T, config={text = k..'', scale = 0.4, colour = G.C.WHITE}},
}},
UIBox_button({id = k, col = true, label = {challenge_unlocked and localize(v.id, 'challenge_names') or localize('k_locked'),}, button = challenge_unlocked and 'change_challenge_description' or 'nil', colour = challenge_unlocked and G.C.RED or G.C.GREY, minw = 4, scale = 0.4, minh = 0.6, focus_args = {snap_to = not snapped}}),
{n=G.UIT.C, config={align = 'cm', padding = 0.05, minw = 0.6}, nodes = {
{n=G.UIT.C, config={minh = 0.4, minw = 0.4, emboss = 0.05, r = 0.1, colour = challenge_completed and G.C.GREEN or G.C.BLACK}, nodes = {
challenge_completed and {n=G.UIT.O, config={object = Sprite(0,0,0.4,0.4, G.ASSET_ATLAS["icons"], {x=1, y=0})}} or nil
}},
}},
}}
snapped = true
end
end
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.1, colour = G.C.CLEAR}, nodes=challenge_list}
end
function G.UIDEF.challenge_description(_id, daily, is_row)
local challenge = G.CHALLENGES[_id]
if not challenge then return {n=G.UIT.ROOT, config={align = "cm", colour = G.C.BLACK, minh = 8.82, minw = 11.5, r = 0.1}, nodes={{n=G.UIT.T, config={text = localize('ph_select_challenge'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT}}}} end
local joker_size = 0.6
local jokers = CardArea(0,0,
10*joker_size,
0.6*G.CARD_H,
{card_limit = get_challenge_rule(challenge, 'modifiers', 'joker_limit') or 5,
card_w = joker_size*G.CARD_W, type = 'title_2', highlight_limit = 0})
if challenge.jokers then
for k, v in ipairs(challenge.jokers) do
local card = Card(0,0, G.CARD_W*joker_size, G.CARD_H*joker_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true, bypass_lock=true})
if v.edition then card:set_edition({[v.edition] = true}, true, true) end
if v.eternal then card:set_eternal(true) end
if v.pinned then card.pinned = true end
jokers:emplace(card)
end
end
local joker_col = {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK, r = 0.1, maxh = 1.8}, nodes={
{n=G.UIT.T, config={text = localize('k_jokers_cap'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, vert = true, shadow = true}},
{n=G.UIT.C, config={align = "cm", minh = 0.6*G.CARD_H, minw = 5, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={
jokers and {n=G.UIT.O, config={object = jokers}} or {n=G.UIT.T, config={text = localize('k_none'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}}
}}
}}
local consumeables = CardArea(0,0,
3*joker_size,
0.6*G.CARD_H,
{card_limit = get_challenge_rule(challenge, 'modifiers', 'consumable_limit') or 2,
card_w = joker_size*G.CARD_W, type = 'title_2', spread = true, highlight_limit = 0})
if challenge.consumeables then
for k, v in ipairs(challenge.consumeables) do
local card = Card(0,0, G.CARD_W*joker_size, G.CARD_H*joker_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true, bypass_lock=true})
if v.edition then card:set_edition({[v.edition] = true}, true, true) end
if v.eternal then card:set_eternal(true) end
consumeables:emplace(card)
end
end
local consumable_col = {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK, r = 0.1, maxh = 1.8}, nodes={
{n=G.UIT.T, config={text = localize('k_cap_consumables'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, vert = true, shadow = true}},
{n=G.UIT.C, config={align = "cm", minh = 0.6*G.CARD_H, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={
consumeables and {n=G.UIT.O, config={object = consumeables}} or {n=G.UIT.T, config={text = localize('k_none'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}},
}}
}}
local vouchers = CardArea(0,0,
3*joker_size,
0.6*G.CARD_H,
{card_limit = nil,
card_w = joker_size*G.CARD_W, type = 'title_2', spread = true, highlight_limit = 0})
if challenge.vouchers then
for k, v in ipairs(challenge.vouchers) do
local card = Card(0,0, G.CARD_W*joker_size, G.CARD_H*joker_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true, bypass_lock=true})
if v.edition then card:set_edition({[v.edition] = true}, true, true) end
if v.eternal then card:set_eternal(true) end
vouchers:emplace(card)
end
end
local voucher_col = {n=G.UIT.C, config={align = "cm", padding = 0.05, colour = G.C.L_BLACK, r = 0.1, maxh = 1.8}, nodes={
{n=G.UIT.T, config={text = localize('k_vouchers_cap'), scale = 0.33, colour = G.C.UI.TEXT_LIGHT, vert = true, shadow = true}},
{n=G.UIT.C, config={align = "cm", minh = 0.6*G.CARD_H, r = 0.1, colour = G.C.UI.TRANSPARENT_DARK}, nodes={
vouchers and {n=G.UIT.O, config={object = vouchers}} or {n=G.UIT.T, config={text = localize('k_none'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT}},
}}
}}
return {n=is_row and G.UIT.R or G.UIT.ROOT, config={align = "cm", r = 0.1, colour = G.C.BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes={
joker_col, consumable_col, voucher_col
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
create_tabs(
{tabs = {
{
label = localize('b_rules'),
chosen = true,
tab_definition_function = G.UIDEF.challenge_description_tab,
tab_definition_function_args = {_id = _id, _tab = 'Rules'}
},
{
label = localize('b_restrictions'),
tab_definition_function = G.UIDEF.challenge_description_tab,
tab_definition_function_args = {_id = _id, _tab = 'Restrictions'}
},
{
label = localize('b_deck'),
tab_definition_function = G.UIDEF.challenge_description_tab,
tab_definition_function_args = {_id = _id, _tab = 'Deck'}
}
},
tab_h = 5,
padding = 0,
text_scale = 0.36,
scale = 0.85,
no_shoulders = true,
no_loop = true}
)}},
not is_row and {n=G.UIT.R, config={align = "cm", minh = 0.9}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.1, minh = 0.7, minw = 9, r = 0.1, hover = true, colour = G.C.BLUE, button = "start_challenge_run", shadow = true, id = _id}, nodes={
{n=G.UIT.T, config={text = localize('b_play_cap'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT,func = 'set_button_pip', focus_args = {button = 'x',set_button_pip = true}}}
}}
}} or nil,
}}
end
function G.UIDEF.challenge_description_tab(args)
args = args or {}
if args._tab == 'Rules' then
local challenge = G.CHALLENGES[args._id]
local start_rules = {}
local modded_starts = nil
local game_rules = {}
local starting_params = get_starting_params()
local base_modifiers = {
dollars = {value = starting_params.dollars, order = 6},
discards = {value = starting_params.discards, order = 2},
hands = {value = starting_params.hands, order = 1},
reroll_cost = {value = starting_params.reroll_cost, order = 7},
joker_slots = {value = starting_params.joker_slots, order = 4},
consumable_slots = {value = starting_params.consumable_slots, order = 5},
hand_size = {value = starting_params.hand_size, order = 3},
}
local bonus_mods = 100
if challenge.rules then
if challenge.rules.modifiers then
for k, v in ipairs(challenge.rules.modifiers) do
base_modifiers[v.id] = {value = v.value, order = base_modifiers[v.id] and base_modifiers[v.id].order or bonus_mods, custom = true, old_val = base_modifiers[v.id].value}
bonus_mods = bonus_mods + 1
end
end
end
local nu_base_modifiers = {}
for k, v in pairs(base_modifiers) do
v.key = k
nu_base_modifiers[#nu_base_modifiers+1] = v
end
table.sort(nu_base_modifiers, function(a,b) return a.order < b.order end)
for k, v in ipairs(nu_base_modifiers) do
if v.old_val then
modded_starts = modded_starts or {}
modded_starts[#modded_starts+1] = {n=G.UIT.R, config={align = "cl", maxw = 3.5}, nodes= localize{type = 'text', key = 'ch_m_'..v.key, vars = {v.value}, default_col = G.C.L_BLACK}}
else
start_rules[#start_rules+1] = {n=G.UIT.R, config={align = "cl", maxw =3.5}, nodes= localize{type = 'text', key = 'ch_m_'..v.key, vars = {v.value}, default_col = not v.custom and G.C.UI.TEXT_INACTIVE or nil}}
end
end
if modded_starts then
start_rules = {
modded_starts and {n=G.UIT.R, config={align = "cl", padding = 0.05}, nodes=modded_starts} or nil,
{n=G.UIT.R, config={align = "cl", padding = 0.05, colour = G.C.GREY}, nodes={}},
{n=G.UIT.R, config={align = "cl", padding = 0.05}, nodes=start_rules},
}
end
if challenge.rules then
if challenge.rules.custom then
for k, v in ipairs(challenge.rules.custom) do
game_rules[#game_rules+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_'..v.id, vars = {v.value}}}
end
end
end
if (not start_rules[1]) and (not modded_starts) then start_rules[#start_rules+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end
if not game_rules[1] then game_rules[#game_rules+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end
local starting_rule_list = {n=G.UIT.C, config={align = "cm", minw = 3, r = 0.1, colour = G.C.BLUE}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={
{n=G.UIT.T, config={text = localize('k_game_modifiers'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 4.2, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= start_rules}
}}
local override_rule_list = {n=G.UIT.C, config={align = "cm", minw = 3, r = 0.1, colour = G.C.BLUE}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={
{n=G.UIT.T, config={text = localize('k_custom_rules'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 6.8, maxw = 6.7, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes= game_rules}
}}
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1, colour = G.C.L_BLACK, r = 0.1, minw = 3}, nodes={
override_rule_list,starting_rule_list
}}
}}
elseif args._tab == 'Restrictions' then
local challenge = G.CHALLENGES[args._id]
local banned_cards, banned_tags, banned_other = {}, {}, {}
if challenge.restrictions then
if challenge.restrictions.banned_cards then
local row_cards = {}
local n_rows = math.max(1, math.floor(#challenge.restrictions.banned_cards/10) + 2 - math.floor(math.log(6, #challenge.restrictions.banned_cards)))
local max_width = 1
for k, v in ipairs(challenge.restrictions.banned_cards) do
local _row = math.floor((k-1)*n_rows/(#challenge.restrictions.banned_cards)+1)
row_cards[_row] = row_cards[_row] or {}
row_cards[_row][#row_cards[_row]+1] = v
if #row_cards[_row] > max_width then max_width = #row_cards[_row] end
end
local card_size = math.max(0.3, 0.75 - 0.01*(max_width*n_rows))
for _, row_card in ipairs(row_cards) do
local banned_card_area = CardArea(
0,0,
6.7,
3.3/n_rows,
{card_limit = nil, type = 'title_2', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*card_size})
table.insert(banned_cards,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = banned_card_area}}
}}
)
for k, v in ipairs(row_card) do
local card = Card(0,0, G.CARD_W*card_size, G.CARD_H*card_size, nil, G.P_CENTERS[v.id], {bypass_discovery_center = true,bypass_discovery_ui = true})
banned_card_area:emplace(card)
end
end
end
if challenge.restrictions.banned_tags then
local tag_tab = {}
for k, v in pairs(challenge.restrictions.banned_tags) do
tag_tab[#tag_tab+1] = G.P_TAGS[v.id]
end
table.sort(tag_tab, function (a, b) return a.order < b.order end)
for k, v in ipairs(tag_tab) do
local temp_tag = Tag(v.key)
local temp_tag_ui = temp_tag:generate_UI(1.1 - 0.25*(math.sqrt(#challenge.restrictions.banned_tags)))
table.insert(banned_tags,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
temp_tag_ui
}}
)
end
end
if challenge.restrictions.banned_other then
local other_tab = {}
for k, v in pairs(challenge.restrictions.banned_other) do
if v.type == 'blind' then
other_tab[#other_tab+1] = G.P_BLINDS[v.id]
end
end
table.sort(other_tab, function (a, b) return a.order < b.order end)
for k, v in ipairs(other_tab) do
local temp_blind = AnimatedSprite(0,0,1,1, G.ANIMATION_ATLAS['blind_chips'], v.pos)
temp_blind:define_draw_steps({
{shader = 'dissolve', shadow_height = 0.05},
{shader = 'dissolve'}
})
temp_blind.float = true
temp_blind.states.hover.can = true
temp_blind.states.drag.can = false
temp_blind.states.collide.can = true
temp_blind.config = {blind = v, force_focus = true}
temp_blind.hover = function()
if not G.CONTROLLER.dragging.target or G.CONTROLLER.using_touch then
if not temp_blind.hovering and temp_blind.states.visible then
temp_blind.hovering = true
temp_blind.hover_tilt = 3
temp_blind:juice_up(0.05, 0.02)
play_sound('chips1', math.random()*0.1 + 0.55, 0.12)
temp_blind.config.h_popup = create_UIBox_blind_popup(v, true)
temp_blind.config.h_popup_config ={align = 'cl', offset = {x=-0.1,y=0},parent = temp_blind}
Node.hover(temp_blind)
end
end
end
temp_blind.stop_hover = function() temp_blind.hovering = false; Node.stop_hover(temp_blind); temp_blind.hover_tilt = 0 end
table.insert(banned_other,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = temp_blind}}
}}
)
end
end
end
if not banned_cards[1] then banned_cards[#banned_cards+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_m_none', vars = {}}} end
if not banned_tags[1] then banned_tags[#banned_tags+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end
if not banned_other[1] then banned_other[#banned_other+1] = {n=G.UIT.R, config={align = "cl"}, nodes= localize{type = 'text', key = 'ch_c_none', vars = {}}} end
local banned_cards = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6}, nodes={
{n=G.UIT.T, config={text = localize('k_banned_cards'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", minh = 4.1, minw =7.33, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes=
banned_cards
}
}}
local banned_tags = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6, maxw = 1.48}, nodes={
{n=G.UIT.T, config={text = localize('k_banned_tags'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 1.48, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes=
banned_tags}
}}
local banned_other = {n=G.UIT.C, config={align = "cm", r = 0.1, colour = G.C.RED}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.08, minh = 0.6, maxw = 1.84}, nodes={
{n=G.UIT.T, config={text = localize('k_other'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}},
}},
{n=G.UIT.R, config={align = "cm", minh = 4.1, minw = 2, padding = 0.05, r = 0.1, colour = G.C.WHITE}, nodes=
banned_other}
}}
return {n=G.UIT.ROOT, config={align = "cm", padding = 0.05, colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1, colour = G.C.L_BLACK, r = 0.1}, nodes={
banned_cards, banned_tags, banned_other
}}
}}
elseif args._tab == 'Deck' then
local challenge = G.CHALLENGES[args._id]
local deck_tables = {}
local SUITS = {
S = {},
H = {},
C = {},
D = {},
}
local suit_map = {'S', 'H', 'C', 'D'}
local card_protos = nil
local _de = nil
if challenge then
_de = challenge.deck
end
if _de and _de.cards then
card_protos = _de.cards
end
if not card_protos then
card_protos = {}
for k, v in pairs(G.P_CARDS) do
local _r, _s = string.sub(k, 3, 3), string.sub(k, 1, 1)
local keep, _e, _d, _g = true, nil, nil, nil
if _de then
if _de.yes_ranks and not _de.yes_ranks[_r] then keep = false end
if _de.no_ranks and _de.no_ranks[_r] then keep = false end
if _de.yes_suits and not _de.yes_suits[_s] then keep = false end
if _de.no_suits and _de.no_suits[_s] then keep = false end
if _de.enhancement then _e = _de.enhancement end
if _de.edition then _d = _de.edition end
if _de.seal then _g = _de.seal end
end
if keep then card_protos[#card_protos+1] = {s=_s,r=_r,e=_e,d=_d,g=_g} end
end
end
for k, v in ipairs(card_protos) do
local _card = Card(0,0, G.CARD_W*0.45, G.CARD_H*0.45, G.P_CARDS[v.s..'_'..v.r], G.P_CENTERS[v.e or 'c_base'])
if v.d then _card:set_edition({[v.d] = true}, true, true) end
if v.g then _card:set_seal(v.g, true, true) end
SUITS[v.s][#SUITS[v.s]+1] = _card
end
for j = 1, 4 do
if SUITS[suit_map[j]][1] then
table.sort(SUITS[suit_map[j]], function(a,b) return a:get_nominal() > b:get_nominal() end )
local view_deck = CardArea(
0,0,
5.5*G.CARD_W,
0.42*G.CARD_H,
{card_limit = #SUITS[suit_map[j]], type = 'title_2', view_deck = true, highlight_limit = 0, card_w = G.CARD_W*0.5, draw_layers = {'card'}})
table.insert(deck_tables,
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.O, config={object = view_deck}}
}}
)
for i = 1, #SUITS[suit_map[j]] do
if SUITS[suit_map[j]][i] then
view_deck:emplace(SUITS[suit_map[j]][i])
end
end
end
end
return {n=G.UIT.ROOT, config={align = "cm", padding = 0, colour = G.C.BLACK, r = 0.1, minw = 11.4, minh = 4.2}, nodes=deck_tables}
end
end
function G.UIDEF.run_setup_option(type)
if not G.SAVED_GAME then
G.SAVED_GAME = get_compressed(G.SETTINGS.profile..'/'..'save.jkr')
if G.SAVED_GAME ~= nil then G.SAVED_GAME = STR_UNPACK(G.SAVED_GAME) end
end
G.SETTINGS.current_setup = type
G.GAME.viewed_back = Back(get_deck_from_name(G.PROFILES[G.SETTINGS.profile].MEMORY.deck))
G.PROFILES[G.SETTINGS.profile].MEMORY.stake = G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1
if type == 'Continue' then
G.viewed_stake = 1
if G.SAVED_GAME ~= nil then
saved_game = G.SAVED_GAME
local viewed_deck = 'b_red'
for k, v in pairs(G.P_CENTERS) do
if v.name == saved_game.BACK.name then viewed_deck = k end
end
G.GAME.viewed_back:change_to(G.P_CENTERS[viewed_deck])
G.viewed_stake = saved_game.GAME.stake or 1
end
end
if type == 'New Run' then
if G.OVERLAY_MENU then
local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed')
if seed_toggle then seed_toggle.states.visible = true end
end
G.viewed_stake = G.PROFILES[G.SETTINGS.profile].MEMORY.stake or 1
G.FUNCS.change_stake({to_key = G.viewed_stake})
else
G.run_setup_seed = nil
if G.OVERLAY_MENU then
local seed_toggle = G.OVERLAY_MENU:get_UIE_by_ID('run_setup_seed')
if seed_toggle then seed_toggle.states.visible = false end
end
end
local area = CardArea(
G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h,
G.CARD_W,
G.CARD_H,
{card_limit = 5, type = 'deck', highlight_limit = 0, deck_height = 0.75, thin_draw = 1})
for i = 1, 10 do
local card = Card(G.ROOM.T.x + 0.2*G.ROOM.T.w/2,G.ROOM.T.h, G.CARD_W, G.CARD_H, pseudorandom_element(G.P_CARDS), G.P_CENTERS.c_base, {playing_card = i, viewed_back = true})
card.sprite_facing = 'back'
card.facing = 'back'
area:emplace(card)
if i == 10 then G.sticker_card = card; card.sticker = get_deck_win_sticker(G.GAME.viewed_back.effect.center) end
end
local ordered_names, viewed_deck = {}, 1
for k, v in ipairs(G.P_CENTER_POOLS.Back) do
ordered_names[#ordered_names+1] = v.name
if v.name == G.GAME.viewed_back.name then viewed_deck = k end
end
local lwidth, rwidth = 1.4, 1.8
local type_colour = G.C.BLUE
local scale = 0.39
G.setup_seed = ''
local t = {n=G.UIT.ROOT, config={align = "cm", colour = G.C.CLEAR, minh = 6.6, minw = 6}, nodes={
type == 'Continue' and {n=G.UIT.R, config={align = "tm", minh = 3.8, padding = 0.15}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 3.3, minw = 6.8}, nodes={
{n=G.UIT.C, config={align = "cm", colour = G.C.BLACK, padding = 0.15, r = 0.1, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", shadow = false}, nodes={
{n=G.UIT.O, config={object = area}}
}},
}},{n=G.UIT.C, config={align = "cm", minw = 4, maxw = 4, minh = 1.7, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={
{n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}},
}},
{n=G.UIT.R, config={align = "cm", colour = G.C.WHITE,padding = 0.03, minh = 1.75, r = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_round'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.round),colour = G.C.RED, scale = 0.8*scale}}}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_ante'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.round_resets.ante),colour = G.C.BLUE, scale = 0.8*scale}}}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_money'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('$')..tostring(saved_game.GAME.dollars),colour = G.C.ORANGE, scale = 0.8*scale}}}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_best_hand'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = number_format(saved_game.GAME.round_scores.hand.amt),colour = G.C.RED, scale = scale_number(saved_game.GAME.round_scores.hand.amt, 0.8*scale)}}}}
}},
saved_game.GAME.seeded and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", minw = lwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = localize('k_seed'),colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cm"}, nodes={{n=G.UIT.T, config={text = ': ',colour = G.C.UI.TEXT_DARK, scale = scale*0.8}}}},
{n=G.UIT.C, config={align = "cl", minw = rwidth, maxw = lwidth}, nodes={{n=G.UIT.T, config={text = tostring(saved_game.GAME.pseudorandom.seed),colour = G.C.RED, scale = 0.8*scale}}}}
}} or nil,
}}
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_stake_column', object = UIBox{definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), config = {offset = {x=0,y=0}}}}}
}}
}}
}}}} or
{n=G.UIT.R, config={align = "cm", minh = 3.8}, nodes={
create_option_cycle({options = ordered_names, opt_callback = 'change_viewed_back', current_option = viewed_deck, colour = G.C.RED, w = 3.5, mid =
{n=G.UIT.R, config={align = "cm", minh = 3.3, minw = 5}, nodes={
{n=G.UIT.C, config={align = "cm", colour = G.C.BLACK, padding = 0.15, r = 0.1, emboss = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm", shadow = false}, nodes={
{n=G.UIT.O, config={object = area}}
}},
}},{n=G.UIT.C, config={align = "cm", minh = 1.7, r = 0.1, colour = G.C.L_BLACK, padding = 0.1}, nodes={
{n=G.UIT.R, config={align = "cm", r = 0.1, minw = 4, maxw = 4, minh = 0.6}, nodes={
{n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_back_name', object = Moveable()}},
}},
{n=G.UIT.R, config={align = "cm", colour = G.C.WHITE, minh = 1.7, r = 0.1}, nodes={
{n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back', object = UIBox{definition = G.GAME.viewed_back:generate_UI(), config = {offset = {x=0,y=0}}}}}
}}
}},
{n=G.UIT.C, config={align = "cm"}, nodes={
{n=G.UIT.O, config={id = G.GAME.viewed_back.name, func = 'RUN_SETUP_check_back_stake_column', object = UIBox{definition = G.UIDEF.deck_stake_column(G.GAME.viewed_back.effect.center.key), config = {offset = {x=0,y=0}}}}}
}}
}}
}}
})
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
type == 'Continue' and {n=G.UIT.R, config={align = "cm", minh = 2.2, minw = 5}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 0.17}, nodes={}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake', insta_func = true, object = Moveable()}},
}}
}}
or {n=G.UIT.R, config={align = "cm", minh = 2.2, minw = 6.8}, nodes={
{n=G.UIT.O, config={id = nil, func = 'RUN_SETUP_check_stake', insta_func = true, object = Moveable()}},
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0.05, minh = 0.9}, nodes={
{n=G.UIT.O, config={align = "cm", func = 'toggle_seeded_run', object = Moveable()}, nodes={
}},
}},
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.C, config={align = "cm", minw = 2.4, id = 'run_setup_seed'}, nodes={
type == 'New Run' and create_toggle{col = true, label = localize('k_seeded_run'), label_scale = 0.25, w = 0, scale = 0.7, ref_table = G, ref_value = 'run_setup_seed'} or nil
}},
{n=G.UIT.C, config={align = "cm", minw = 5, minh = 0.8, padding = 0.2, r = 0.1, hover = true, colour = G.C.BLUE, button = "start_setup_run", shadow = true, func = 'can_start_run'}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0}, nodes={
{n=G.UIT.T, config={text = localize('b_play_cap'), scale = 0.8, colour = G.C.UI.TEXT_LIGHT,func = 'set_button_pip', focus_args = {button = 'x',set_button_pip = true}}}
}}
}},
{n=G.UIT.C, config={align = "cm", minw = 2.5}, nodes={}}
}}
}}
return t
end
function create_button_binding_pip(args)
local button_sprite_map = {
['a'] = G.F_SWAP_AB_PIPS and 1 or 0,
['b'] = G.F_SWAP_AB_PIPS and 0 or 1,
['x'] = 2,
['y'] = 3,
['leftshoulder'] = 4,
['rightshoulder'] = 5,
['triggerleft'] = 6,
['triggerright'] = 7,
['start'] = 8,
['back'] = 9,
['dpadup'] = 10,
['dpadright'] = 11,
['dpaddown'] = 12,
['dpadleft'] = 13,
['left'] = 14,
['right'] = 15,
['leftstick'] = 16,
['rightstick'] = 17,
['guide'] = 19
}
local BUTTON_SPRITE = Sprite(0,0,args.scale or 0.45,args.scale or 0.45,G.ASSET_ATLAS["gamepad_ui"],
{x=button_sprite_map[args.button],
y=G.CONTROLLER.GAMEPAD_CONSOLE == 'Nintendo' and 2 or G.CONTROLLER.GAMEPAD_CONSOLE == 'Playstation' and (G.F_PS4_PLAYSTATION_GLYPHS and 3 or 1) or 0})
return {n=G.UIT.ROOT, config = {align = 'cm', colour = G.C.CLEAR}, nodes={
{n=G.UIT.O, config={object = BUTTON_SPRITE}},
}}
end
function create_UIBox_profile_button()
local letters = {}
if G.F_DISP_USERNAME then
for _, c in utf8.chars(G.F_DISP_USERNAME) do
local _char = c
local leng = G.LANGUAGES['all1'].font.FONT:hasGlyphs(c)
letters[#letters+1] = {n=G.UIT.T, config={lang = G.LANGUAGES[leng and 'all1' or 'all2'],text = _char, scale = 0.3, colour = mix_colours(G.C.GREEN, G.C.WHITE, 0.7), shadow = true}}
end
end
if not G.PROFILES[G.SETTINGS.profile].name then
G.PROFILES[G.SETTINGS.profile].name = "P"..G.SETTINGS.profile
end
return {n=G.UIT.ROOT, config = {align = "cm", colour = G.C.CLEAR}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('k_profile'), scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.15, minw = 2, minh = 0.8, maxw = 2, r = 0.1, hover = true, colour = mix_colours(G.C.WHITE, G.C.GREY, 0.2), button = 'profile_select', shadow = true}, nodes={
{n=G.UIT.T, config={ref_table = G.PROFILES[G.SETTINGS.profile], ref_value = 'name', scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
}}
}},
G.F_DISP_USERNAME and {n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = localize('k_playing_as'), scale = 0.3, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
{n=G.UIT.R, config={align = "cm", minh = 0.12}, nodes={}},
{n=G.UIT.R, config={align = "cm", maxw = 2}, nodes=letters}
}} or nil,
}}
end
function create_UIBox_main_menu_buttons()
local text_scale = 0.45
local language = nil
if not G.F_ENGLISH_ONLY then
language = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=2, y=0})
language.states.drag.can = false
end
local discord = nil
local twitter = nil
if G.F_DISCORD then
discord = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=0, y=0})
discord.states.drag.can = false
twitter = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=0, y=1})
twitter.states.drag.can = false
end
local quit_func = 'quit'
local t = {
n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={align = "bm"}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK, mid = true}, nodes={
UIBox_button{id = 'main_menu_play', button = not G.SETTINGS.tutorial_complete and "start_run" or "setup_run", colour = G.C.BLUE, minw = 3.65, minh = 1.55, label = {localize('b_play_cap')}, scale = text_scale*2, col = true},
{n=G.UIT.C, config={align = "cm"}, nodes={
UIBox_button{button = 'options', colour = G.C.ORANGE, minw = 2.65, minh = 1.35, label = {localize('b_options_cap')}, scale = text_scale * 1.2, col = true},
G.F_QUIT_BUTTON and {n=G.UIT.C, config={align = "cm", minw = 0.2}, nodes={}} or nil,
G.F_QUIT_BUTTON and UIBox_button{button = quit_func, colour = G.C.RED, minw = 2.65, minh = 1.35, label = {localize('b_quit_cap')}, scale = text_scale * 1.2, col = true} or nil,
}},
UIBox_button{id = 'collection_button', button = "your_collection", colour = G.C.PALE_GREEN, minw = 3.65, minh = 1.55, label = {localize('b_collection_cap')}, scale = text_scale*1.5, col = true},
}},
}},
{n=G.UIT.C, config={align = "br", minw = 3.2, padding = 0.1}, nodes={
G.F_DISCORD and {n=G.UIT.R, config = {align = "cm", padding = 0.2}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, hover = true, colour = mix_colours(G.C.BLUE, G.C.GREY, 0.4), button = 'go_to_discord', shadow = true}, nodes={
{n=G.UIT.O, config={object = discord}},
}},
{n=G.UIT.C, config={align = "cm", padding = 0.1, r = 0.1, hover = true, colour = G.C.BLACK, button = 'go_to_twitter', shadow = true}, nodes={
{n=G.UIT.O, config={object = twitter}},
}}
}} or nil,
not G.F_ENGLISH_ONLY and {n=G.UIT.R, config = {align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0.15, minw = 1, r = 0.1, hover = true, colour = mix_colours(G.C.WHITE, G.C.GREY, 0.2), button = 'language_selection', shadow = true}, nodes={
{n=G.UIT.O, config={object = language}},
{n=G.UIT.T, config={text = G.LANG.label, scale = 0.4, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}} or nil,
}},
}}
return t
end
function create_UIBox_main_menu_competittion_name()
G.SETTINGS.COMP.name = ''
local t = {
n=G.UIT.ROOT, config = {align = "cm",colour = G.C.CLEAR}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.2, r = 0.1, emboss = 0.1, colour = G.C.L_BLACK, mid = true}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
create_text_input({
w = 4, max_length = 16,prompt_text = 'Enter Name',
ref_table = G.SETTINGS.COMP, ref_value = 'name'
}),
}},
UIBox_button{button = "confirm_contest_name", colour = G.C.PALE_GREEN, minw = 2.65, minh = 1, label = {'Confirm'}, scale = 0.5},
}},
}}
return t
end
function G.UIDEF.language_selector()
local rows = {}
local langs = {}
for k, v in pairs(G.LANGUAGES) do
if not v.omit then
langs[#langs+1] = v
end
end
table.sort(langs, (function(a, b) return a.label < b.label end))
local _row = {}
for k, v in ipairs(langs) do
if not G.F_HIDE_BETA_LANGS or (not v.beta) then
_row[#_row+1] = {n=G.UIT.C, config={align = "cm", func = 'beta_lang_alert', padding = 0.05, r = 0.1, minh = 0.7, minw = 4.5, button = v.beta and 'warn_lang' or 'change_lang', ref_table = v, colour = v.beta and G.C.RED or G.C.BLUE, hover = true, shadow = true, focus_args = {snap_to = (k == 1)}}, nodes={
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.T, config={text = v.label, lang = v, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}}
}}
end
if _row[3] or (k == #langs) then
rows[#rows+1] = {n=G.UIT.R, config={align = "cm", padding = 0.1}, nodes=_row}
_row = {}
end
end
local discord = nil
discord = Sprite(0,0,0.6,0.6,G.ASSET_ATLAS["icons"], {x=2, y=0})
discord.states.drag.can = false
local t = create_UIBox_generic_options({contents ={
{n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes=rows},
G.F_EXTERNAL_LINKS and {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={
{n=G.UIT.C, config={align = "cm", padding = 0.1, minw = 4, maxw = 4, r = 0.1, minh = 0.8, hover = true, colour = mix_colours(G.C.GREEN, G.C.GREY, 0.4), button = 'loc_survey', shadow = true}, nodes={
{n=G.UIT.O, config={object = discord}},
{n=G.UIT.T, config={text = G.LANG.button, scale = 0.45, colour = G.C.UI.TEXT_LIGHT, shadow = true}}
}},
}} or nil
}})
return t
end
function create_UIBox_highlight(rect)
local t = {n=G.UIT.ROOT, config = {align = "cm", minh = rect.T.h+0.1, minw = rect.T.w+0.15, r = 0.15, colour = G.C.DARK_EDITION}, nodes={
}}
return t
end
function create_UIBox_generic_options(args)
args = args or {}
local back_func = args.back_func or "exit_overlay_menu"
local contents = args.contents or ({n=G.UIT.T, config={text = "EMPTY",colour = G.C.UI.RED, scale = 0.4}})
if args.infotip then
G.E_MANAGER:add_event(Event({
blocking = false,
blockable = false,
timer = 'REAL',
func = function()
if G.OVERLAY_MENU then
local _infotip_object = G.OVERLAY_MENU:get_UIE_by_ID('overlay_menu_infotip')
if _infotip_object then
_infotip_object.config.object:remove()
_infotip_object.config.object = UIBox{
definition = overlay_infotip(args.infotip),
config = {offset = {x=0,y=0}, align = 'bm', parent = _infotip_object}
}
end
end
return true
end
}))
end
return {n=G.UIT.ROOT, config = {align = "cm", minw = G.ROOM.T.w*5, minh = G.ROOM.T.h*5,padding = 0.1, r = 0.1, colour = args.bg_colour or {G.C.GREY[1], G.C.GREY[2], G.C.GREY[3],0.7}}, nodes={
{n=G.UIT.R, config={align = "cm", minh = 1,r = 0.3, padding = 0.07, minw = 1, colour = args.outline_colour or G.C.JOKER_GREY, emboss = 0.1}, nodes={
{n=G.UIT.C, config={align = "cm", minh = 1,r = 0.2, padding = 0.2, minw = 1, colour = args.colour or G.C.L_BLACK}, nodes={
{n=G.UIT.R, config={align = "cm",padding = args.padding or 0.2, minw = args.minw or 7}, nodes=
contents
},
not args.no_back and {n=G.UIT.R, config={id = args.back_id or 'overlay_menu_back_button', align = "cm", minw = 2.5, button_delay = args.back_delay, padding =0.1, r = 0.1, hover = true, colour = args.back_colour or G.C.ORANGE, button = back_func, shadow = true, focus_args = {nav = 'wide', button = 'b', snap_to = args.snap_back}}, nodes={
{n=G.UIT.R, config={align = "cm", padding = 0, no_fill = true}, nodes={
{n=G.UIT.T, config={id = args.back_id or nil, text = args.back_label or localize('b_back'), scale = 0.5, colour = G.C.UI.TEXT_LIGHT, shadow = true, func = not args.no_pip and 'set_button_pip' or nil, focus_args = not args.no_pip and {button = args.back_button or 'b'} or nil}}
}}
}} or nil
}},
}},
{n=G.UIT.R, config={align = "cm"}, nodes={
{n=G.UIT.O, config={id = 'overlay_menu_infotip', object = Moveable()}},
}},
}}
end
function UIBox_dyn_container(inner_table, horizontal, colour_override, background_override, flipped, padding)
return {n=G.UIT.R, config = {align = "cm", padding= 0.03, colour = G.C.UI.TRANSPARENT_DARK, r=0.1}, nodes={
{n=G.UIT.R, config = {align = "cm", padding= 0.05, colour = colour_override or G.C.DYN_UI.MAIN, r=0.1}, nodes={
{n=G.UIT.R, config={align = horizontal and "cl" or (flipped and 'bm' or "tm"), colour = background_override or G.C.DYN_UI.BOSS_DARK, minw = horizontal and 100 or 0, minh = horizontal and 0 or 30, r=0.1, padding = padding or 0.08}, nodes=
inner_table
}}}}}
end
function simple_text_container(_loc, args)
if not _loc then return nil end
args = args or {}
local container = {}
local loc_result = localize(_loc)
if loc_result and type(loc_result) == 'table' then
for k, v in ipairs(loc_result) do
container[#container+1] =
{n=G.UIT.R, config = {align = "cm", padding= 0}, nodes={
{n=G.UIT.T, config={text = v, scale = args.scale or 0.35, colour = args.colour or G.C.UI.TEXT_DARK, shadow = args.shadow}}
}}
end
return {n=args.col and G.UIT.C or G.UIT.R, config = {align = "cm", padding= args.padding or 0.03}, nodes=container}
end
end
function UIBox_button(args)
args = args or {}
args.button = args.button or "exit_overlay_menu"
args.func = args.func or nil
args.colour = args.colour or G.C.RED
args.choice = args.choice or nil
args.chosen = args.chosen or nil
args.label = args.label or {'LABEL'}
args.minw = args.minw or 2.7
args.maxw = args.maxw or (args.minw - 0.2)
if args.minw < args.maxw then args.maxw = args.minw - 0.2 end
args.minh = args.minh or 0.9
args.scale = args.scale or 0.5
args.focus_args = args.focus_args or nil
args.text_colour = args.text_colour or G.C.UI.TEXT_LIGHT
local but_UIT = args.col == true and G.UIT.C or G.UIT.R
local but_UI_label = {}
local button_pip = nil
for k, v in ipairs(args.label) do
if k == #args.label and args.focus_args and args.focus_args.set_button_pip then
button_pip ='set_button_pip'
end
table.insert(but_UI_label, {n=G.UIT.R, config={align = "cm", padding = 0, minw = args.minw, maxw = args.maxw}, nodes={
{n=G.UIT.T, config={text = v, scale = args.scale, colour = args.text_colour, shadow = args.shadow, focus_args = button_pip and args.focus_args or nil, func = button_pip, ref_table = args.ref_table}}
}})
end
if args.count then
table.insert(but_UI_label,
{n=G.UIT.R, config={align = "cm", minh = 0.4}, nodes={
{n=G.UIT.T, config={scale = 0.35,text = args.count.tally..' / '..args.count.of, colour = {1,1,1,0.9}}}
}}
)
end
return
{n= but_UIT, config = {align = 'cm'}, nodes={
{n= G.UIT.C, config={
align = "cm",
padding = args.padding or 0,
r = 0.1,
hover = true,
colour = args.colour,
one_press = args.one_press,
button = (args.button ~= 'nil') and args.button or nil,
choice = args.choice,
chosen = args.chosen,
focus_args = args.focus_args,
minh = args.minh - 0.3*(args.count and 1 or 0),
shadow = true,
func = args.func,
id = args.id,
back_func = args.back_func,
ref_table = args.ref_table,
mid = args.mid
}, nodes=
but_UI_label
}}}
end