LOVELY_INTEGRITY = '6dc6391935253a5dba5a3febb135e71775ed356629edd2463e2d01e436702ddd' --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() local debugplus = require("debugplus.core") debugplus.registerButtons() 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 = "hold [" .. require("debugplus.util").ctrlText .. "] (togglable in config)", 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.T, config={text = "press [W] to cycle Enhancement", 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 = "press [E] to cycle Seal", 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 = "press [A/S/D] to toggle Eternal/Perishable/Rental", scale = 0.2, colour = G.C.WHITE, shadow = true}} }}, {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ {n=G.UIT.T, config={text = "press [F] to toggle Coupon (make free)", 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 = "press [R/C] to destroy/copy 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 = "press [M] to reload atlases", 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 = "press [UP/DOWN] to cycle rank", scale = 0.2, colour = G.C.WHITE, shadow = true}} }}, {n=G.UIT.R, config={align = "cm", padding = 0.00}, nodes={ {n=G.UIT.T, config={text = "press [RIGHT/LEFT] to cycle suit", scale = 0.2, colour = G.C.WHITE, shadow = true}} }}, {n=G.UIT.R, config={align = "cm", padding = 0.05}, nodes={ {n=G.UIT.T, config={text = "press [z] plus [1-3] to save a save state", scale = 0.2, colour = G.C.WHITE, shadow = true}} }}, {n=G.UIT.R, config={align = "cm", padding = 0.00}, nodes={ {n=G.UIT.T, config={text = "press [x] plus [1-3] to load a save state", scale = 0.2, 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}, UIBox_button{ label = {"Win Blind"}, button = "DT_win_blind", minw = 1.7, minh = 0.4, scale = 0.35}, UIBox_button{ label = {"Double Tag"}, button = "DT_double_tag", 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 _smods_atlas = _c and ((G.SETTINGS.colourblind_option and _c.hc_atlas or _c.lc_atlas) or _c.atlas) if _smods_atlas then _atlas = G.ASSET_ATLAS[_smods_atlas] or _atlas end if SMODS.Achievements[_achievement] then _c = SMODS.Achievements[_achievement]; _atlas = G.ASSET_ATLAS[_c.atlas] end 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 SUITS_SORTED = Cartomancer.tablecopy(SUITS) 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, math.min(G.GAME.shop.joker_max,4)*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.playing_card_rate for _,v in ipairs(SMODS.ConsumableType.ctype_buffer) do total_rate = total_rate + G.GAME[v:lower()..'_rate'] end local polled_rate = pseudorandom(pseudoseed('cdt'..G.GAME.round_resets.ante))*total_rate local check_rate = 0 -- need to preserve order to leave RNG unchanged local rates = { {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}, } for _, v in ipairs(SMODS.ConsumableType.ctype_buffer) do if not (v == 'Tarot' or v == 'Planet' or v == 'Spectral') then table.insert(rates, { type = v, val = G.GAME[v:lower()..'_rate'] }) end end for _, v in ipairs(rates) 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() if G.hand and G.hand.cart_sorting == nil then G.hand.cart_sorting = true end 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={ Cartomancer.SETTINGS.improved_hand_sorting and create_toggle{ col = true, label = localize('b_sort_hand'), label_scale = text_scale*0.8, scale = 0.30, w = 0, shadow = true, ref_table = G.hand, ref_value = 'cart_sorting', callback = function () G.FUNCS.cartomancer_sort_hand_off() end } or {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 = desc_nodes.background_colour or 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 = desc_nodes.background_colour or 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 = SMODS.Rarity:get_rarity_badge(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 = {} local obj = card.config.center if AUT.badges.card_type or AUT.badges.force_rarity then if obj and (obj.set_card_type_badge or obj.type and obj.type.set_card_type_badge) then if obj.type and type(obj.type.set_card_type_badge) == 'function' then obj.type:set_card_type_badge(obj, card, badges) end if type(obj.set_card_type_badge) == 'function' then obj:set_card_type_badge(card, badges) end else 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 end if obj and obj.set_badges and type(obj.set_badges) == 'function' then obj:set_badges(card, badges) end local function is_bad_badge(string) local bad_badges = {'cry_pinned_booster', 'cry_pinned_voucher', 'cry_pinned_consumeable'} for i = 1, #bad_badges do if string == bad_badges[i] then return true end end return false end if AUT.badges then for k, v in ipairs(AUT.badges) do if v == 'negative_consumable' or v == 'negative_playing_card' then v = 'negative' end if not is_bad_badge(v) then badges[#badges + 1] = create_badge(localize(v, "labels"), get_badge_colour(v)) end end end if AUT.card_type ~= 'Locked' and AUT.card_type ~= 'Undiscovered' then SMODS.create_mod_badges(card.config.center, badges) if card.base then SMODS.create_mod_badges(SMODS.Ranks[card.base.value], badges) SMODS.create_mod_badges(SMODS.Suits[card.base.suit], badges) end if card.config and card.config.tag then SMODS.create_mod_badges(SMODS.Tags[card.config.tag.key], badges) end badges.mod_set = nil end -- if AUT.badges then -- for k, v in ipairs(AUT.badges) do -- local replaced = false -- if v == 'cry_pinned_booster' or v == 'cry_pinned_voucher' or v == 'cry_pinned_consumeable' then replaced = true; v = 'pinned_left' end -- if replaced == true then badges[#badges + 1] = create_badge(localize(v, "labels"), get_badge_colour(v)) end -- 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 local cols if #info_boxes <= 3 then cols = 1 elseif #info_boxes <= 10 then cols = 2 elseif #info_boxes <= 24 then cols = 3 else cols = 4 end local nodes_per_col = math.ceil(#info_boxes/cols) local info_cols = {} for i = 0, cols-1 do local col = {} for j = 1, nodes_per_col do local info_box = info_boxes[i*nodes_per_col+j] if info_box then table.insert(col, info_box) else break end end table.insert(info_cols, {n=G.UIT.C, config = {align="cm"}, nodes = col}) end info_boxes = {{n=G.UIT.R, config = {align="cm", padding = 0.05, card_pos = card.T.x }, nodes = info_cols}} 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, } for _, v in ipairs(G.P_CENTER_POOLS.Edition) do G.BADGE_COL[v.key:sub(3)] = v.badge_colour end for k, v in pairs(SMODS.Rarity.obj_buffer) do G.BADGE_COL[k] = G.C.RARITY[v] end for k, v in pairs(SMODS.Seals) do G.BADGE_COL[k:lower()..'_seal'] = v.badge_colour end for k, v in pairs(SMODS.Stickers) do G.BADGE_COL[k] = v.badge_colour end 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", id = 'HUD_blind_debuff', func = 'HUD_blind_debuff'}, nodes={}}, {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('$')}}, scale_function = function () return scale_number(G.GAME.dollars, 2.2 * scale, 99999, 1000000) end, 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_disp'}}, colours = {G.C.IMPORTANT},shadow = true, font = G.LANGUAGES['en-us'].font, scale = scale_number(G.GAME.round_resets.ante, 2*scale, 100)}),id = 'ante_UI_count'}},--{n=G.UIT.T, config={text = number_format(G.GAME.round_resets.ante), lang = G.LANGUAGES['en-us'], scale = scale_number(G.GAME.round_resets.ante, 2*scale, 100), colour = G.C.IMPORTANT, shadow = true,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 = 'cry_asc', func = 'cry_asc_UI_set',object = DynaText({string = {{ref_table = G.GAME.current_round.current_hand, ref_value = "cry_asc_num_text"}}, colours = {G.C.GOLD}, shadow = true, float = true, scale = scale*1})}}, {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={ {n=G.UIT.B, config={w=0, h=3.64, id = 'row_blind_bottom'}, 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('$')..cry_cheapest_boss_reroll()}, 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 = G.GAME.modifiers.cry_no_small_blind and 'Big' or '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_choice.config.atlas] or 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' and not G.GAME.modifiers.cry_no_tags then extras = create_UIBox_blind_tag(type, run_info) elseif type == 'Big' and not G.GAME.modifiers.cry_no_tags then extras = create_UIBox_blind_tag(type, run_info) elseif type == 'Boss' and 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_vars = nil if blind_choice.config.name == 'The Ox' then loc_vars = {localize(G.GAME.current_round.most_played_poker_hand, 'poker_hands')} end local obj = blind_choice.config if obj.loc_vars and _G['type'](obj.loc_vars) == 'function' then local res = obj:loc_vars() or {} loc_vars = res.vars or {} end local loc_target = localize{type = 'raw_descriptions', key = blind_choice.config.key, set = 'Blind', vars = loc_vars or blind_choice.config.vars} 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 blind_desc_nodes = {} for k, v in ipairs(text_table) do blind_desc_nodes[#blind_desc_nodes+1] = {n=G.UIT.R, config={align = "cm", maxw = 2.8}, nodes={ {n=G.UIT.T, config={text = v or '-', scale = 0.32, colour = disabled and G.C.UI.TEXT_INACTIVE or G.C.WHITE, shadow = not disabled}} }} 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 = blind_desc_nodes} 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, math.max(1,math.min(_size,5))*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, math.max(1,math.min(_size,5))*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, math.max(1,math.min(_size,5))*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, math.max(1,math.min(_size,5))*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, math.max(1,math.min(_size,5))*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={id = args.id, w=startval,h=args.h, r = 0.1, colour = args.colour, ref_table = args, refresh_movement = true}}, }}, not args.hide_val and {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}} }} or nil }} 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, colour = args.colour, 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 = '' args.id = args.id or "text_input" 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 = args.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 = args.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 = args.id..'_position', func = 'flash'}} local t = {n=G.UIT.C, config={align = "cm", colour = G.C.CLEAR}, nodes = { {n=G.UIT.C, config={id = args.id, align = "cm", padding = 0.05, r = 0.1, 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 mods = 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} mods = UIBox_button{ id = "mods_button", label = {localize('b_mods')}, button = "mods_button", 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, mods, 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' } if not require("debugplus.config").SMODSLoaded then tabs[#tabs+1] = { label = "DebugPlus", tab_definition_function = require("debugplus.config").fakeConfigTab, } end local settings_icon = Cartomancer.add_settings_icon() if settings_icon then tabs[#tabs+1] = { colour = G.C.MONEY, custom_button = {settings_icon}, tab_definition_function = Cartomancer.config_tab, tab_definition_function_args = '' } end 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}), create_option_cycle({label = localize('b_graphics_mipmap_level'),scale = 0.8, options = SMODS.config.graphics_mipmap_level_options, opt_callback = 'SMODS_change_mipmap', current_option = SMODS.config.graphics_mipmap_level}), }} 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 suitTabs = {} local index = 1 for i, suit in ipairs(SMODS.Suit:obj_list(true)) do if G.COLLABS.options[suit.key] then suitTabs[index] = { label = localize(suit.key, 'suits_plural'), tab_definition_function = G.UIDEF.custom_deck_tab, tab_definition_function_args = suit.key } index = index + 1 end end if suitTabs[1] then suitTabs[1].chosen = true end 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 = suitTabs, snap_to_nav = true, no_shoulders = true} )}}} }) return t end function G.UIDEF.custom_deck_tab(_suit) local t = {} local rankCount = 0 local lookup = {} local options = G.COLLABS.options[_suit] for i = 2, #options do local skin = SMODS.DeckSkins[options[i]] for j = 1, #skin.ranks do if not lookup[skin.ranks[j]] then lookup[skin.ranks[j]] = true rankCount = rankCount + 1 end end end local face_cards = CardArea( 0,0, math.min(math.max(rankCount*G.CARD_W*0.6, 4*G.CARD_W), 10*G.CARD_W), 1.4*G.CARD_H, {card_limit = rankCount, 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'} local rank = SMODS.Ranks['2'] local cards = {} local smodSuit = SMODS.Suits[_suit] repeat if lookup[rank.key] then local card_code = smodSuit.card_key .. '_' .. rank.card_key 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 cards[#cards + 1] = card end rank = SMODS.Ranks[rank.next[1]] until rank == SMODS.Ranks['2'] for i = #cards, 1, -1 do face_cards:emplace(cards[i]) 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_choice.config.atlas] or 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[v[3] or '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 = number_format(G.GAME.hands[handname].chips, 1000000), 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 = number_format(G.GAME.hands[handname].mult, 1000000), 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}} }} } if false then 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 end SMODS.applied_stakes_UI(G.GAME.stake, stake_desc_rows) 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'} local SUITS_SORTED = Cartomancer.tablecopy(SUITS) for k, v in ipairs(G.playing_cards) do local greyed if unplayed_only and not ((v.area and v.area == G.deck) or v.ability.wheel_flipped) then greyed = true end local card_string = v:cart_to_string() if greyed then card_string = card_string .. "Greyed" end if greyed and Cartomancer.SETTINGS.deck_view_hide_drawn_cards then -- Ignore this card. elseif not SUITS[v.base.suit][card_string] then table.insert(SUITS_SORTED[v.base.suit], card_string) local _scale = 0.7 local copy = copy_card(v, nil, _scale) copy.greyed = greyed copy.stacked_quantity = 1 SUITS[v.base.suit][card_string] = copy else local stacked_card = SUITS[v.base.suit][card_string] stacked_card.stacked_quantity = stacked_card.stacked_quantity + 1 end end for j = 1, 4 do if SUITS_SORTED[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_SORTED[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_SORTED[suit_map[j]] do local card_string = SUITS_SORTED[suit_map[j]][i] local card = SUITS[suit_map[j]][card_string] card.T.x = view_deck.T.x + view_deck.T.w/2 card.T.y = view_deck.T.y card:create_quantity_display() card:hard_set_T() view_deck:emplace(card) 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={ not unplayed_only and Cartomancer.add_unique_count() or nil, 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, suit) 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[suit and SMODS.Suits[suit][G.SETTINGS.colourblind_option and "hc_ui_atlas" or "lc_ui_atlas"]] or 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 if not G.GAME.cry_owned_vouchers[v.key] then G.GAME.cry_owned_vouchers[v.key] = G.GAME.used_vouchers[v.key] end end if G.GAME.cry_owned_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 if G.GAME.voucher_edition_index[card.ability.name] then -- i just made it a function so i can look at it less local edition = cry_edition_to_table(G.GAME.voucher_edition_index[card.ability.name]) if edition then card:set_edition(edition, true, true) end end if G.GAME.voucher_sticker_index.eternal[card.ability.name] then card:set_eternal(true) card.ability.eternal = true end if G.GAME.voucher_sticker_index.perishable[card.ability.name] then card:set_perishable(true) card.ability.perish_tally = G.GAME.voucher_sticker_index.perishable[card.ability.name] card.ability.perishable = true if G.GAME.voucher_sticker_index.perishable[card.ability.name] == 0 then card.debuff = true end end if G.GAME.voucher_sticker_index.rental[card.ability.name] then card:set_rental(true) card.ability.rental = true end if G.GAME.voucher_sticker_index.pinned[card.ability.name] then card.pinned = true end if G.GAME.voucher_sticker_index.banana[card.ability.name] then card.ability.banana = true end card.ability.extra = G.GAME.cry_voucher_centers[card.config.center_key].config.extra if card.ability.extra_disp then card.ability.extra_disp = G.GAME.cry_voucher_centers[card.config.center_key].config.extra_disp end 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 consumable_nodes = {} if #SMODS.ConsumableType.ctype_buffer <= 3 then for _, key in ipairs(SMODS.ConsumableType.ctype_buffer) do local id = 'your_collection_'..key:lower()..'s' consumable_nodes[#consumable_nodes+1] = UIBox_button({button = id, label = {localize('b_'..key:lower()..'_cards')}, count = G.DISCOVER_TALLIES[key:lower()..'s'], minw = 4, id = id, colour = G.C.SECONDARY_SET[key]}) end else consumable_nodes[#consumable_nodes+1] = UIBox_button({ button = 'your_collection_consumables', label = {localize('b_stat_consumables'), localize{ type = 'variable', key = 'c_types', vars = {#SMODS.ConsumableType.ctype_buffer} } }, count = G.DISCOVER_TALLIES['consumeables'], minw = 4, minh = 4, id = 'your_collection_consumables', colour = G.C.FILTER }) 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 = consumable_nodes} }}, }}, {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}}),UIBox_button({button = 'your_collection_other_gameobjects', label = {localize('k_other')}, minw = 5, id = 'your_collection_other_gameobjects', 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_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Joker) local joker_options = {} for i = 1, math.ceil(#joker_pool/(5*#G.your_collection)) do table.insert(joker_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#joker_pool/(5*#G.your_collection)))) end for i = 1, 5 do for j = 1, #G.your_collection do local center = joker_pool[i+(j-1)*5] if not center then break end 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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or '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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id 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 = 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_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Booster) local booster_options = {} for i = 1, math.ceil(#booster_pool/8) do table.insert(booster_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#booster_pool/8))) end for j = 1, #G.your_collection do for i = 1, 4 do local center = booster_pool[i+(j-1)*4] if not center then break end 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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id 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 = 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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id 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", 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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id 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", 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_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Voucher) local voucher_options = {} for i = 1, math.ceil(#voucher_pool/(4*#G.your_collection)) do table.insert(voucher_options, localize('k_page')..' '..tostring(i)..'/'..tostring(math.ceil(#voucher_pool/(4*#G.your_collection)))) end for i = 1, 4 do for j = 1, #G.your_collection do local center = voucher_pool[i+(j-1)*4] if not center then break end 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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or 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, 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}} }} ) 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, 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 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() local deck_pool = SMODS.collection_pool(G.P_CENTER_POOLS.Back) G.GAME.viewed_back = Back(G.ACTIVE_MOD_UI and deck_pool[1] or 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(deck_pool) do ordered_names[#ordered_names+1] = v.key end local t = create_UIBox_generic_options({ back_func = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or '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 counter = 0 local tag_tab = {} local tag_pool = {} if G.ACTIVE_MOD_UI then for k, v in pairs(G.P_TAGS) do if v.mod and G.ACTIVE_MOD_UI.id == v.mod.id then tag_pool[k] = v end end else tag_pool = G.P_TAGS end for k, v in pairs(tag_pool) do counter = counter + 1 tag_tab[#tag_tab+1] = v end for i = 1, math.ceil(counter / 6) do table.insert(tag_matrix, {}) 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 table_nodes = {} for i = 1, math.ceil(counter / 6) do table.insert(table_nodes, {n=G.UIT.R, config={align = "cm"}, nodes=tag_matrix[i]}) 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=table_nodes} }} }} }}) 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 + (a.boss and a.boss.showdown and 1000 or 0) < b.order + (b.boss and b.boss.showdown and 1000 or 0) end) local blinds_to_be_alerted = {} for k, v in ipairs(blind_tab) do local discovered = v.discovered local s = 1.3 if math.ceil(#blind_tab/6) > 6 then s = s * 6/math.ceil(#blind_tab/6) end local temp_blind = AnimatedSprite(0,0,s,s, G.ANIMATION_ATLAS[discovered and v.atlas or '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 local blinds_per_row = math.ceil(#blind_tab / 6) local row = math.ceil((k - 1) / blinds_per_row + 0.001) table.insert(blind_matrix[row], { n = G.UIT.C, config = { align = "cm", padding = 0.1 }, nodes = { ((k - blinds_per_row) % (2 * blinds_per_row) == 1) 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 - blinds_per_row) % (2 * blinds_per_row) == 0) 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 min_ante = 1 local max_ante = 16 local spacing = 1 - 15*0.06 if G.GAME and G.GAME.round_resets and G.GAME.round_resets.ante then local current_ante = G.GAME.round_resets.ante if current_ante > 8 then min_ante = current_ante - 8 + 1 max_ante = current_ante + 8 end end local ante_amounts = {} for i = min_ante, max_ante do -- :3 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 = G.ACTIVE_MOD_UI and "openModUI_"..G.ACTIVE_MOD_UI.id or 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_vars = nil if blind.collection_loc_vars and type(blind.collection_loc_vars) == 'function' then local res = blind:collection_loc_vars() or {} loc_vars = res.vars end local loc_target = localize{type = 'raw_descriptions', key = blind.key, set = 'Blind', vars = loc_vars or 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 = 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.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 = "Music", 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 = 6}, 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}}, }}, }} 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 = "Production", 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 = "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 = "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 = #G.P_CENTER_POOLS['Stake'] end local stake_options = {} for i = 1, math.min(max_stake+1, #G.P_CENTER_POOLS['Stake']) 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 = #G.P_CENTER_POOLS['Stake'] end G.viewed_stake = math.min(max_stake+1, G.viewed_stake) if G.viewed_stake > #G.P_CENTER_POOLS.Stake then G.viewed_stake = #G.P_CENTER_POOLS.Stake end 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) if v.unlocked and type(v.unlocked) == 'function' then challenge_unlocked = v:unlocked() elseif type(v.unlocked) == 'boolean' then challenge_unlocked = v.unlocked end challenge_unlocked = challenge_unlocked or G.PROFILES[G.SETTINGS.profile].all_unlocked 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[v.atlas or ''] or 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 = {} local suit_map = {} for i = #SMODS.Suit.obj_buffer, 1, -1 do local suit = SMODS.Suits[SMODS.Suit.obj_buffer[i]] SUITS[suit.card_key] = {} suit_map[#suit_map+1] = suit.card_key end 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 = SMODS.Ranks[v.value].card_key, SMODS.Suits[v.suit].card_key local keep, _e, _d, _g = true, nil, nil, nil if type(SMODS.Ranks[v.value].in_pool) == 'function' and not SMODS.Ranks[v.value]:in_pool({initial_deck = true}) then keep = false end if type(SMODS.Suits[v.suit].in_pool) == 'function' and not SMODS.Suits[v.suit]:in_pool({initial_deck = true}) then keep = false end 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 local num_suits = 0 for j = 1, #suit_map do if SUITS[suit_map[j]][1] then num_suits = num_suits + 1 end end for j = 1, #suit_map 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 - (num_suits <= 4 and 0 or num_suits >= 8 and 0.28 or 0.07 * (num_suits - 4))) * 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('$')..format_ui_value(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, 100000000000)}}}} }}, 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 if args.dynamic_label then but_UI_label = {} 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={ref_table = args.dynamic_label, ref_value = 'text', scale = args.scale, colour = args.text_colour, shadow = args.shadow, focus_args = button_pip and args.focus_args or nil, func = button_pip,}} }}) end 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.ref_table and args.ref_table.colour or args.colour, -- Cartomancer 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= args.ref_table and args.ref_table.custom_button or but_UI_label -- Cartomancer }}} end